klog-1.8.6/0000755000175000017500000000000014166020421011436 5ustar develdevelklog-1.8.6/updatesatsdata.h0000644000175000017500000000450114166020407014622 0ustar develdevel#ifndef UPDATESATSDATA_H #define UPDATESATSDATA_H /*************************************************************************** updatesatsdata.h - description ------------------- begin : sep 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" class UpdateSatsData : public QObject { Q_OBJECT public: explicit UpdateSatsData(DataProxy_SQLite *dp, QObject *parent = nullptr); bool readSatDataFile(); bool satDataFileRead(const QString& tfileName); private: Utilities *util; DataProxy_SQLite *dataProxy; signals: void satsUpdatedSignal(const bool _p); // void clearError(); public slots: }; #endif // UPDATESATSDATA_H klog-1.8.6/logwindow.h0000644000175000017500000001500114166020407013621 0ustar develdevel#ifndef LOGWINDOW_H #define LOGWINDOW_H /*************************************************************************** logwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "logmodel.h" #include "awards.h" //#include "dxccstatuswidget.h" //#include "elogclublog.h" #include "utilities.h" //#include "logviewsortfilterproxymodel.h" //class LogViewSortFilterProxyModel; //class ItemDelegate; class LogWindow : public QWidget { Q_OBJECT public: explicit LogWindow(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~LogWindow(); void createlogPanel(const int _currentLog); void clear(); void refresh(); void setCurrentLog(const int _currentLog); void qslSentViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaDirect(const int _qsoId); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); //void setProxyModel (const bool _p); void sortColumn(const int _c); void setColumns(const QStringList &_columns); signals: void actionQSODoubleClicked(const int _qsoid); void actionDeleteQSO(const int _qsoid); void updateAwards(); void updateSearchText(); //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution //void clearError(); void deleteTheseQSOs(QList _qsos); void exportToADIFTheseQSOs(QList _qsos); void uploadToQRZcomTheseQSOs(QList _qsos); private slots: void slotDoubleClickLog(const QModelIndex & index); void slotRighButtonFromLog(const QPoint& pos); void slotQSLSentViaBureauFromLog(); void slotQSLSentViaDirectFromLog(); void slotQSLRecViaDirectFromLog(); void slotQSLRecViaBureauFromLog(); void slotQsoDeleteFromLog(); void slotQSOToEditFromLog(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotCheckQRZCom(); void slotCheckDXHeatCom(); void slotQSOsDeselectAll(); void slotQSOsSelectAll(); void slotQSOsDeleteFromLog(); void slotQSOsExportFromLog(); void slotQSOsUploadToLoTWFromLog(); void slotQSOsUploadToClubLogFromLog(); void slotQSOsUploadToEQSLFromLog(); void slotMultipleQSLSentViaBureauFromLog(); void slotMultipleQSLSentViaDirectFromLog(); void slotMultipleQSLRecViaBureauFromLog(); void slotMultipleQSLRecViaDirectFromLog(); void slotQSOsQRZUploadFromLog(); private: void createUI(); void createActionsCommon(); void createActions(); void deleteQSO(const int _qsoID); void rightButtonFromLogMenu(const int trow); void rightButtonMultipleFromLogMenu(); void showMenuRightButtonFromLogCreateActions(); void showColumn(const QString &_columnName); void setDefaultData(); void setColumnsOfLog(const QStringList &_columns); DataProxy_SQLite *dataProxy; LogModel *logModel; //QItemSelectionModel *selectionModel; Awards *awards; //DXCCStatusWidget *dxccStatusWidget; //eLogClubLog *elogClublog; QTableView *logView; QLabel *logLabel; QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; QAction *checkQRZCOMFromLogAct; QAction *checkDXHeatFromLogAct; //Multiple selection actions QAction *multipleDeselectAll; QAction *multipleSelectAll; QAction *multipleDelQSOsFromLogAct; QAction *multipleExportToADIFFromLogAct; QAction *multipleQueueForLoTWFromLogAct; QAction *multipleQueueForClubLogFromLogAct; QAction *multipleQueueForQRZCOMFromLogAct; QAction *multipleQueueForEQSLFromLogAct; QAction *multipleQslSentViaBureauFromLogAct; QAction *multipleQslSentViaDirectFromLogAct; QAction *multipleQslRecViaBureauFromLogAct; QAction *multipleQslRecViaDirectFromLogAct; //QAction *moveToAnotherLog; // MOves the selected QSOs to another log. int currentLog; Utilities *util; QStringList columns; //LogViewSortFilterProxyModel *proxyModel; //bool sortingThroughProxyModel; }; /* class ItemDelegate: public QStyledItemDelegate { Q_OBJECT public: ItemDelegate(QWidget *parent=nullptr){} QString displayText(const QVariant &value, const QLocale &locale) const; //QString displayText (const QVariant &value); }; */ #endif // LOGWINDOW_H klog-1.8.6/dataproxy_sqlite.cpp0000644000175000017500000117077114166020421015554 0ustar develdevel/*************************************************************************** dataproxy_sqlite.cpp - description ------------------- begin : sept 2014 copyright : (C) 2014 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy_sqlite.h" #include "utilities.h" //#include DataProxy_SQLite::DataProxy_SQLite(const QString &_parentFunction, const QString &_softVersion) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << _softVersion << _parentFunction << QT_ENDL; #else //qDebug() << Q_FUNC_INFO << "Running a release build"; #endif //qDebug() << "DataProxy_SQLite::DataProxy_SQLite" << _softVersion << _parentFunction << QT_ENDL; //qDebug() << "DataProxy_SQLite::DataProxy_SQLite 1" << QT_ENDL; util = new Utilities(); util->setVersion(_softVersion); qso = new QSO; db = new DataBase(Q_FUNC_INFO, _softVersion, util->getKLogDBFile()); dbCreated = db->createConnection(Q_FUNC_INFO); //dbCreated = db->createBandModeMaps(); //qDebug() << "DataProxy_SQLite::DataProxy_SQLite - END" << QT_ENDL; searching = false; executionN = 0; //preparedQuery = new QSqlQuery; //db = new DataBase(0); //DataProxy_SQLite = new DataProxy_SQLite(); //qDebug() << "DataProxy_SQLite::DataProxy_SQLite END" << QT_ENDL; //connect(db, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotCaptureDebugLogs(QString, QString, int)) ); } DataProxy_SQLite::~DataProxy_SQLite() { delete(util); delete(qso); //qDebug() << "DataProxy_SQLite::~DataProxy_SQLite" << QT_ENDL; } int DataProxy_SQLite::getHowManyQSOPerPropMode(const QString &_p, const int _logn) { //qDebug() << "DataProxy_SQLite::getHowManyQSOPerPropMode: " << _p << "/" << QString::number(_logn) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logn < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log WHERE prop_mode='%1'").arg(_p); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND prop_mode='%2'").arg(_logn).arg(_p); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getHowManyQSOPerPropMode: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getHowManyQSOPerPropMode: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getHowManyQSOPerPropModer: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getHowManyQSOPerPropMode: Query error" << QT_ENDL; query.finish(); return 0; } } QString DataProxy_SQLite::getSoftVersion() { //SELECT MAX (softversion) FROM softwarecontrol QSqlQuery query; QString stQuery = QString("SELECT MAX (softversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: DATA: " << v << QT_ENDL; if (v.length()<1) { //The following is not a query error but if the softwareversion value is lower than 0 or empty queryError(Q_FUNC_INFO, tr("Software version in DB is null"), "-1", tr("Query didn't failed")); // To alert about any failed query execution } return v; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: version empty-1" << QT_ENDL; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: version empty-1 - ERROR" << QT_ENDL; return QString(); } } QString DataProxy_SQLite::getDBVersion() { //SELECT MAX (dbversion) FROM softwarecontrol QSqlQuery query; QString stQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } bool DataProxy_SQLite::reconnectDB() { return db->reConnect(util->getKLogDBFile()); } void DataProxy_SQLite::createLogModel() { //qDebug() << "DataProxy_SQLite::createLogModel" << QT_ENDL; } void DataProxy_SQLite::createLogPanel(){ //qDebug() << "DataProxy_SQLite::createLogPanel" << QT_ENDL; } int DataProxy_SQLite::getIdFromModeName(const QString& _modeName) { //qDebug() << "DataProxy_SQLite::getIdFromModeName: " << _modeName << "/" << QString::number(db->getModeIDFromName2(_modeName)) << QT_ENDL; if (_modeName.length()<2) { return -4; } return db->getModeIDFromName2(_modeName); } int DataProxy_SQLite::getSubModeIdFromSubMode(const QString &_subModeName) { //qDebug() << "DataProxy_SQLite::getSubModeIdFromSubMode: " << _subModeName << QT_ENDL; if (_subModeName.length()<2) { return -3; } QSqlQuery query; QString stQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(_subModeName.toUpper()); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getModeIdFromSubModeId(const int _sm) { return getIdFromModeName(getNameFromSubMode(getSubModeFromId(_sm))); } bool DataProxy_SQLite::isModeDeprecated (const QString &_sm) { if (_sm.length()<2) { return -3; } QSqlQuery query; QString stQuery = QString("SELECT deprecated FROM mode WHERE submode='%1'").arg(_sm); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1 ) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; // In case we can't check, we don't state it as deprecated } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; // In case we can't check, we don't state it as deprecated } } int DataProxy_SQLite::getIdFromBandName(const QString& _bandName) { //qDebug() << "DataProxy_SQLite::getIdFromBandName: " << _bandName << "/" << QString::number(db->getBandIDFromName2(_bandName))<< QT_ENDL; if (_bandName.length()<1) { //qDebug() << "DataProxy_SQLite::getIdFromBandName:-4: " << _bandName << "/" << QString::number(db->getBandIDFromName2(_bandName))<< QT_ENDL; return -4; } return db->getBandIDFromName2(_bandName); } QString DataProxy_SQLite::getNameFromBandId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromBandId: " << QString::number(_id) << QT_ENDL; return db->getBandNameFromID2(_id); } QString DataProxy_SQLite::getNameFromModeId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromModeId" << QT_ENDL; //return db->getModeNameFromID2(_id); return db->getModeNameFromNumber(_id); } QString DataProxy_SQLite::getNameFromSubModeId (const int _id) { //qDebug() << "DataProxy_SQLite::getNameFromSubModeId: " << QString::number(_id) << "DB: " << db->getModeNameFromID2(_id) << QT_ENDL; return db->getSubModeNameFromID2(_id); /* QSqlQuery query; QString queryString = QString("SELECT submode, name, deprecated FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(2)).toInt()<0 ) { // DEPRECATED VALUE, return the MODE return (query.value(1)).toString(); } else { return (query.value(0)).toString(); } } else { return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return QString(); } */ } QString DataProxy_SQLite::getSubModeFromId (const int _id) { //qDebug() << "DataProxy_SQLite::getSubModeFromId: " << QString::number(_id) << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getNameFromSubMode (const QString &_sm) { QSqlQuery query; QString queryString = QString("SELECT name FROM mode WHERE submode='%1'").arg(_sm.toUpper()); //QString queryString = QString("SELECT name, deprecated FROM mode WHERE submode='%1'").arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getFreqFromBandId(const int _id) { //qDebug() << "DataProxy_SQLite::getFreqFromBandId: " << QString::number(_id) << QT_ENDL; return db->getFreqFromBandId(_id); } int DataProxy_SQLite::getBandIdFromFreq(const double _n) { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: " << QString::number(_n) << QT_ENDL; //Freq should be in MHz bool sqlOk = false; QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(_n).arg(_n); QSqlQuery query(queryString); sqlOk = query.exec(); //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query OK" << QT_ENDL; query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query NOK" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } //return -3; } QString DataProxy_SQLite::getBandNameFromFreq(const double _n) { //qDebug() << "DataProxy_SQLite::getBandNameFromFreq: " << QString::number(_n) << QT_ENDL; return getNameFromBandId(getBandIdFromFreq(_n)); } double DataProxy_SQLite::getLowLimitBandFromBandName(const QString &_sm) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: " << _sm << QT_ENDL; if (_sm.length ()<2) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: length <2" << QT_ENDL; return -1.0; } QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE name='%1' OR name='%2'").arg(_sm).arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { double fr = (query.value(0)).toDouble(); query.finish(); if ( fr < 0 ) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-1" << QT_ENDL; return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName(value found): " << QString::number(fr) << QT_ENDL; return fr; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-2" << QT_ENDL; query.finish(); return -1.0; } //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-3" << QT_ENDL; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: SQL Error" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1.0; } //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-5" << QT_ENDL; } double DataProxy_SQLite::getLowLimitBandFromBandId(const int _sm) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId" << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE id='%1'").arg(_sm); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(1)).toDouble()<0 ) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-1" << QT_ENDL; query.finish(); return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: " << QString::number((query.value(0)).toDouble()) << QT_ENDL; double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-2" << QT_ENDL; query.finish(); return -1.0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1.0; } } double DataProxy_SQLite::getUpperLimitBandFromBandName(const QString &_sm) { //qDebug() << Q_FUNC_INFO << ": " << _sm << QT_ENDL; if (_sm.length ()<2) { return -1.0; } QSqlQuery query; QString queryString = QString("SELECT upper FROM band WHERE name='%1' OR name='%2'").arg(_sm).arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toDouble()<0 ) { //qDebug() << Q_FUNC_INFO << ": -1.0-1" << QT_ENDL; query.finish(); return -1.0; } else { //qDebug() << Q_FUNC_INFO << ": (else): " << QString::number((query.value(0)).toDouble()) << QT_ENDL; double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << Q_FUNC_INFO << ": -1.0-2" << QT_ENDL; query.finish(); return -1.0; } //qDebug() << Q_FUNC_INFO << ": -1.0-3" << QT_ENDL; //query.finish(); //return -1.0; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1.0; } //return -1.0; } bool DataProxy_SQLite::isThisFreqInBand(const QString &_band, const QString &_fr) { return db->isThisFreqInBand(_band, _fr); } QStringList DataProxy_SQLite::getFields() { //qDebug() << Q_FUNC_INFO; QStringList fields; fields.clear(); QSqlQuery q; QSqlRecord localRecord = q.driver()->record("log"); for (int var = 0; var < localRecord.count(); ++var) { QString fieldName = localRecord.fieldName(var); fields << fieldName; //qDebug() << fieldName; } /* QString LogWindow::getColumnName(int col) { return logModel->record().fieldName(col); } */ return fields; } QStringList DataProxy_SQLite::getBands() { //qDebug() << "DataProxy_SQLite::getBands - DEPRECATED please use getBandNames - TODO: Remove this function and change the calls" << QT_ENDL; return getBandNames(); /* QStringList bands = QStringList(); QSqlQuery query("SELECT name FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } //return bands; return sortBandNamesBottonUp(bands); */ } QStringList DataProxy_SQLite::getBandNames() { //qDebug() << "DataProxy_SQLite::getBandNames" << QT_ENDL; QStringList bands = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name FROM band"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getBandNames: " << queryString << QT_ENDL; bands.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getModes() { QStringList modes = QStringList(); QSqlQuery query("SELECT submode FROM mode ORDER BY submode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); modes.sort(); return modes; } QStringList DataProxy_SQLite::sortBandNamesBottonUp(const QStringList _qs) { //Receives a list of band names, sorts it from the lower band to the upper band and returns //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp: " << QString::number(_qs.length()) << QT_ENDL; if (_qs.length()<2) { return _qs; } QMap map; map.clear(); QStringList qs; qs.clear(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-00" << QT_ENDL; for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandName(_qs.at(j)), _qs.at(j)); } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-10" << QT_ENDL; QMap::const_iterator i = map.constBegin(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-20" << QT_ENDL; while (i != map.constEnd()) { qs << i.value(); ++i; } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp - END -lengh = " << QString::number(qs.length()) << QT_ENDL; qs.removeDuplicates(); return qs; } QStringList DataProxy_SQLite::getBandIDs() { //qDebug() << "DataProxy_SQLite::getBandIDs" << QT_ENDL; QStringList bands = QStringList(); QSqlQuery query("SELECT id FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandIdBottonUp(bands); } QStringList DataProxy_SQLite::sortBandIdBottonUp(const QStringList _qs) { //Receives a list of band id, sorts it from the lower band to the upper band and returns QMap map; QStringList qs; qs.clear(); for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandId(_qs.at(j).toInt()), _qs.at(j)); } QMap::const_iterator i = map.constBegin(); while (i != map.constEnd()) { qs << i.value(); ++i; } return qs; } QStringList DataProxy_SQLite::getModesIDs() { QStringList modes = QStringList(); QSqlQuery query("SELECT id FROM mode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); return modes; } QStringList DataProxy_SQLite::getBandsInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getBandsInLog: " << QT_ENDL; QStringList bands = QStringList(); QString queryString = QString(); if (_log <= 0) { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid ORDER BY band.id DESC"); } else { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' ORDER BY band.id DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } QStringList DataProxy_SQLite::getModesInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getModesInLog: " << QT_ENDL; QStringList modes = QStringList(); QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ modes << query.value(1).toString(); } } query.finish(); //qDebug() << "DataProxy_SQLite::getModesInLog: " << modes.join(" - ") << QT_ENDL; modes.sort(); return modes; } int DataProxy_SQLite::getMostUsedBand(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedBand: " << QT_ENDL; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1"); } else { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-OK: " << QString::number(v)<< QT_ENDL; return v; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-1: " << QT_ENDL; return -1; } //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-2: " << QT_ENDL; return -2; } int DataProxy_SQLite::getMostUsedMode(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedMode: " << QT_ENDL; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } } query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } return -2; } int DataProxy_SQLite::getLastQSOid() { //qDebug() << "DataProxy_SQLite::getLastQSOid" << QT_ENDL; QSqlQuery query; bool sqlOK = query.exec("SELECT MAX(id) from log"); if (sqlOK) { query.next(); if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } QDate DataProxy_SQLite::getFirstQSODateFromCall (const QString &_call) { //qDebug() << "DataProxy_SQLite::getFirstQSODateFromCall: " << _call << QT_ENDL; QSqlQuery query; QString stringQuery; QDate _date; if (util->isValidCall(_call)) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date ASC LIMIT 1").arg(_call); } else { stringQuery = QString("SELECT qso_date from log where 1 ORDER BY qso_date ASC LIMIT 1"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { _date = util->getDateFromSQliteString((query.value(0)).toString()); //_date = QDate::fromString((query.value(0)).toString(), "yyyy-MM-dd"); //stringQuery = query.value(0).toString(); query.finish(); if (_date.isValid()) { //qDebug() << "DataProxy_SQLite::getFirstQSODateFromCall: END OK" << QT_ENDL; return _date; } else { //qDebug() << "DataProxy_SQLite::getFirstQSODateFromCall: END-1 " << QT_ENDL; return QDate(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getFirstQSODateFromCall: END-2" << QT_ENDL; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getFirstQSODateFromCall: END-3" << QT_ENDL; return QDate(); } } QDate DataProxy_SQLite::getLastQSODateFromCall (const QString &_call) { //qDebug() << "DataProxy_SQLite::getLastQSODateFromCall: " << _call << QT_ENDL; QSqlQuery query; QString stringQuery; QDate _date; if (util->isValidCall(_call)) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date DESC LIMIT 1").arg(_call); } else { stringQuery = QString("SELECT qso_date from log where 1 ORDER BY qso_date DESC LIMIT 1"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { _date = util->getDateFromSQliteString((query.value(0)).toString()); //_date = QDate::fromString((query.value(0)).toString(), "yyyy-MM-dd"); //stringQuery = query.value(0).toString(); query.finish(); if (_date.isValid()) { //qDebug() << "DataProxy_SQLite::getLastQSODateFromCall: OK" << QT_ENDL; return _date; } else { //qDebug() << "DataProxy_SQLite::getLastQSODateFromCall: END-1" << QT_ENDL; return QDate(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getLastQSODateFromCall: END-2" << QT_ENDL; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getLastQSODateFromCall: END-3" << QT_ENDL; return QDate(); } } bool DataProxy_SQLite::clearLog() { //qDebug() << "DataProxy_SQLite::clearLog" << QT_ENDL; //int errorCode = 0; QSqlQuery query; bool sqlOK = query.exec("DELETE FROM log"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Log deleted!" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Log deleted FAILED" << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } query.finish(); sqlOK = query.exec("DELETE FROM awarddxcc"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deleted!" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deletedFAILED" << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } query.finish(); if (query.exec("DELETE FROM awardwaz")) { //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted!" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted FAILED" << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } query.finish(); //query.clear(); if (query.isActive()) { //qDebug() << "DataProxy_SQLite::clearLog: Query Active!" << QT_ENDL; query.finish(); return false; } else { query.prepare("VACUUM;"); //qDebug() << "DataProxy_SQLite::clearLog: Query Not Active!" << QT_ENDL; if (query.exec()) { //qDebug() << "DataProxy_SQLite::clearLog: VACUUM OK!" << QT_ENDL; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: VACUUM FAILED" << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } } query.finish(); return false; } bool DataProxy_SQLite::qslSentViaDirect(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaDirect" << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'D', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentViaDirect: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::qslSentViaBureau(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaBureau" << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'B', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslSentViaBureau - OK" << QT_ENDL; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::qslSentViaBureau - NOK" << QT_ENDL; } return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::" << QString::number (_qsoId) << "/" << _updateDate << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite:: TRUE" << QT_ENDL; //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite:: FALSE" << QT_ENDL; return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: " << _updateDate << QT_ENDL; QSqlQuery query; QString queryString; //bool requestQSL = false; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaBureau: QSL already requested" << QT_ENDL; //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-1" << QT_ENDL; //requestQSL = true; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-2" << QT_ENDL; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //requestQSL = true; } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-3" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //requestQSL = true; } } else { //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); //queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau TRUE" << QT_ENDL; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaBureau FALSE" << QT_ENDL; query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect" << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: " << _updateDate << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if(sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaDirect: QSL already requested" << QT_ENDL; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-1" << QT_ENDL; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-2" << QT_ENDL; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-3" << QT_ENDL; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect TRUE" << QT_ENDL; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaDirect FALSE" << QT_ENDL; query.finish(); return false; } bool DataProxy_SQLite::qslSentAsRequested(const int _qsoId, const QDate &_updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslSentAsRequested" << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentAsRequested: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslSentAsRequested" << QT_ENDL; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecAsRequested(const int _qsoId, const QDate &_updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslRecAsRequested" << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslRecAsRequested: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecAsRequested OK" << QT_ENDL; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::qslRecAsRequested NOK" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::setClubLogSent(const int _qsoId, const QString &_st, const QDate &_updateDate) { // Updates the QSO with the ClubLog status & date QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET clublog_qso_upload_status = '%1', clublog_qso_upload_date = '%2' WHERE id = '%3'").arg(_st).arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::setClubLogSent: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::setClubLogSent - TRUE" << QT_ENDL; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::setClubLogSent - FALSE" << QT_ENDL; query.finish(); return false; } bool DataProxy_SQLite::setLoTWQSLRec (const int _qsoId, const QString &_st, const QDate &_updateDate) { QSqlQuery query; QString queryString; if (!util->isValidQSL_Rcvd(_st)) { return false; } if (!_updateDate.isValid()) { return false; } queryString = QString("UPDATE log SET lotw_qsl_rcvd = '%1', lotw_qslrdate = '%2' WHERE id = '%3'").arg(_st).arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::setLoTWQSLRec: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::setLoTWQSLRec - TRUE" << QT_ENDL; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::setLoTWQSLRec - FALSE" << QT_ENDL; query.finish(); return false; } bool DataProxy_SQLite::isQSOConfirmed(const int _qsoId, const bool _checkPaper, const bool _checkLoTW) { // Returns true if the QSO has been confirmed via paper and/or LoTW QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE id = '%1'").arg(_qsoId); if (!query.exec(queryString)) { return false; } if (!query.next ()) { return false; } if (!query.isValid ()) { return false; } QString paperQSL = (query.value(0)).toString(); QString lotwQSL = (query.value(1)).toString(); query.finish(); if (_checkPaper && _checkLoTW) { return ((paperQSL == "Y") || (lotwQSL == "Y")); } else if (_checkPaper && !_checkLoTW) { return (paperQSL == "Y"); } else if (!_checkPaper && _checkLoTW) { return (lotwQSL == "Y"); } else { return false; } } bool DataProxy_SQLite::isQSLReceived(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLReceived" << QString::number(_qsoId) << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_rcvd FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLitew::isQSLReceived: " << QString::number(_qsoId) << "QSL Received" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-1" << QT_ENDL; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-2" << QT_ENDL; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return false; } bool DataProxy_SQLite::isQSLSent(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << QT_ENDL; QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL Sent" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-1" << QT_ENDL; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-2" << QT_ENDL; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } int DataProxy_SQLite::getBandFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT bandid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getModeFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT modeid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getDXCCFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT dxcc FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getCQZFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } QList DataProxy_SQLite::getBandModeDXCCCQZlogIDFromId(const int _qsoId) { QList result; result.clear(); QSqlQuery query; QString queryString = QString("SELECT bandid, modeid, dxcc, cqz, lognumber FROM log WHERE id='%1'").arg(_qsoId); if (!query.exec(queryString)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish (); return result; } if (!query.next ()) { query.finish (); return result; } if (!query.isValid ()) { query.finish (); return result; } QSqlRecord rec = query.record(); int nameCol = rec.indexOf("bandid"); int v = (query.value(nameCol)).toInt(); if (v<1) { return result; } result.append (v); nameCol = rec.indexOf("modeid"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("dxcc"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("cqz"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("lognumber"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); query.finish (); return result; } QString DataProxy_SQLite::getCallFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getCallFromId" << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT call FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return QString(); } QStringList DataProxy_SQLite::getClubLogRealTimeFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: " << QString::number(_qsoId) << QT_ENDL; /* Return a QStringList with 16 fields with these data: QSO_DATE, TIME_ON, QSLRDATE, QSLSDATE, CALL, OPERATOR, MODE, BAND, BAND_RX, FREQ, QSL_RCVD, LOTW_QSL_RCVD, QSL_SENT, DXCC, PROP_MODE, CREDIT_GRANTED */ QSqlQuery query; int nameCol = -1; QStringList dataC = QStringList(); //QString aux1 = QString(); //QString aux2 = QString(); //QString call = QString(); // IMPORTANT: band_rx is not always present, and if it is not present, the query with INNER JOIN will fail. // To fix that we will do two queries, one to check if I have all the data and if not another one with a reduced scope. QString queryString = QString("SELECT band_rx FROM log WHERE id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); bool haveBandRX = false; if (sqlOk) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: sqlOK -1" << QT_ENDL; if (query.next()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: qsl next -1" << QT_ENDL; if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: sql valid -1" << QT_ENDL; QSqlRecord rec = query.record(); nameCol = rec.indexOf("band_rx"); QString aux = (query.value(nameCol)).toString(); if (aux.length()<1) { // We DON'T have a band_rx available query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: without BAND-RX" << QT_ENDL; queryString = QString("SELECT qso_date, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); } else { haveBandRX = true; queryString = QString("SELECT qso_date, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, R.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN band as R ON band_rx = R.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); } } else { // We have a band_rx available query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: NO VALID" << QT_ENDL; return QStringList(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-1" << QT_ENDL; return QStringList(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-2" << QT_ENDL; return QStringList(); } sqlOk = query.exec(queryString); dataC << QString::number(_qsoId); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: lastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId sqlOK-1" << QT_ENDL; if (query.next()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId query next = OK" << QT_ENDL; if (query.isValid()) { QSqlRecord rec = query.record(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId query valid = OK" << QT_ENDL; QString aux; nameCol = rec.indexOf("qso_date"); aux = util->getADIFDateFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-3: " << aux << QT_ENDL; return QStringList(); } dataC << aux; aux = util->getADIFTimeFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-4: " << aux<< endl; return QStringList(); } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId Time_on: " << aux << QT_ENDL; dataC << aux; //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslrdate"); dataC << util->getADIFDateFromQDate( util->getDateFromSQliteString((query.value(nameCol)).toString()) ); //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslsdate"); dataC << util->getADIFDateFromQDate( util->getDateFromSQliteString((query.value(nameCol)).toString()) ); //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-5: " << aux << QT_ENDL; return QStringList(); } QString call = (query.value(nameCol)).toString(); dataC << call; nameCol = rec.indexOf("operator"); dataC << (query.value(nameCol)).toString(); //nameCol = rec.indexOf("M.name"); //MODE //TODO: Fix this to get the proper column aux = (query.value(6)).toString(); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-6: " << aux<< endl; return QStringList(); } dataC << aux; //nameCol = rec.indexOf("B.name"); // BAND aux = (query.value(7)).toString(); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-7: " << aux << QT_ENDL; return QStringList(); } dataC << aux; if (haveBandRX) { dataC << (query.value(8)).toString(); } else { dataC << ""; } //nameCol = rec.indexOf("R.name"); //BAND_RX //TODO: Fix this to get the proper column (use an index instead of a number) nameCol = rec.indexOf("freq"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("lotw_qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_sent"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("dxcc"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("prop_mode"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("credit_granted"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("station_callsign"); QString aux2 = (query.value(nameCol)).toString(); if (util->isValidCall(aux2)) { dataC << aux2; } else { dataC << call; } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: RETURNING ... OK" << QT_ENDL; query.finish(); return dataC; } else { //NO VALID //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO VALID NOT OK" << QT_ENDL; query.finish(); return QStringList(); } } } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NOT sqlOK" << QT_ENDL; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-10" << QT_ENDL; return QStringList(); } QString DataProxy_SQLite::getNameFromQRZ(const QString &_call) { if (_call.length() <= 0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ return 0" << QT_ENDL; return QString(); } QSqlQuery query; QString queryString = QString("SELECT name FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ: " << (query.value(0)).toString() << QT_ENDL; QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); //qDebug() << "DataProxy_SQLite::getNameFromQRZ: NO NAME" << QT_ENDL; return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQTHFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT qth FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getLocatorFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT gridsquare FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getIOTAFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT iota FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQSLViaFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT DISTINCT qsl_via FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString();; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } bool DataProxy_SQLite::updateAwardDXCC() { //qDebug() << "DataProxy_SQLite::updateAwardDXCC" << QT_ENDL; fillEmptyDXCCInTheLog(); return db->updateAwardDXCCTable(); //qDebug() << "DataProxy_SQLite::updateAwardDXCC-END" << QT_ENDL; } bool DataProxy_SQLite::updateAwardWAZ() { //qDebug() << "DataProxy_SQLite::updateAwardWAZ" << QT_ENDL; return db->updateAwardWAZTable(); } bool DataProxy_SQLite::QRZCOMModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog" << QString::number(_currentLog) << QT_ENDL; if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET qrzcom_qso_upload_status = 'M', qrzcom_qso_upload_date = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END TRUE" << QT_ENDL; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END FALSE: " << query.lastError().databaseText() << QT_ENDL; return false; } //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END TRUE" << QT_ENDL; //return false; } bool DataProxy_SQLite::QRZCOMSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs" << QString::number(_qsos.count()) << QT_ENDL; if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::QRZCOMLSentQSOs: updating QSO: " << QString::number(_qsos.at(i)) << QT_ENDL; queryString = QString("UPDATE log SET qrzcom_qso_upload_status = 'Y', qrzcom_qso_upload_date = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: exec: " << query.lastQuery() << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: END FALSE" << QT_ENDL; return false; } } //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: END TRUE" << QT_ENDL; return true; } bool DataProxy_SQLite::clublogSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::clublogSentQSOs" << QString::number(_qsos.count()) << QT_ENDL; if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: updating QSO: " << QString::number(_qsos.at(i)) << QT_ENDL; queryString = QString("UPDATE log SET clublog_qso_upload_status = 'Y', clublog_qso_upload_date = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::clublogSentQSOs: exec: " << query.lastQuery() << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::clublogSentQSOs: END FALSE" << QT_ENDL; return false; } } //qDebug() << " DataProxy_SQLite::clublogSentQSOs: END TRUE" << QT_ENDL; return true; } bool DataProxy_SQLite::clublogModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::clublogModifyFullLog" << QString::number(_currentLog) << QT_ENDL; if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET clublog_qso_upload_status = 'M', clublog_qso_upload_date = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::clublogModifyFullLog: END FALSE" << QT_ENDL; return false; } //qDebug() << " DataProxy_SQLite::clublogModifyFullLog: END TRUE" << QT_ENDL; //return false; } bool DataProxy_SQLite::eQSLModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog" << QString::number(_currentLog) << QT_ENDL; if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET eqsl_qsl_sent = 'Q', eqsl_qslsdate = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END TRUE" << QT_ENDL; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END FALSE: " << query.lastError().databaseText() << QT_ENDL; return false; } //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END TRUE" << QT_ENDL; } bool DataProxy_SQLite::eQSLSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs" << QString::number(_qsos.count()) << QT_ENDL; if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: updating QSO: " << QString::number(_qsos.at(i)) << QT_ENDL; queryString = QString("UPDATE log SET eqsl_qsl_sent = 'Y', eqsl_qslsdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: exec: " << query.lastQuery() << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: END FALSE" << QT_ENDL; return false; } } //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: END TRUE" << QT_ENDL; return true; } bool DataProxy_SQLite::addQSOFromWSJTX (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_sRX, const QString &_sTX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_operator, const QDateTime &_datetime, const QDateTime &_datetime_off, const double txpower, const int _dxcc, const int _logNumber, bool _sendQSL) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: " << _dxcall << QT_ENDL; //void MainWindow::slotWSJTXloggedQSO(const int _type, const QString &_dxcall, const quint64 _freq, const QString &_mode, // const QString &_dx_grid, const QString &_time_off, const QString &_report_sent, const QString &_report_rec, // const QString &_tx_power, const QString &_comments, const QString &_name, const QString &_time_on) //_qso format: Date/TimeOn/call/bandid/modeid/freq/dxgrid/timeOff/rsttx/rstrx/txpower/comments/name /* Mandatory data: "qso_date VARCHAR(10) NOT NULL, " "call VARCHAR(40) NOT NULL, " "bandid INTEGER NOT NULL, " "modeid INTEGER NOT NULL, " */ QString stringFields = QString(); QString stringData = QString(); QString stringQuery = QString(); QSqlQuery query; if (util->isValidCall(_dxcall)) { stringFields = "call, "; stringData = "'" + _dxcall + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: call" << QT_ENDL; return false; } if (_datetime.isValid()) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << _datetime << QT_ENDL; stringFields = stringFields + "qso_date, "; QDateTime _dateTime; //_dateTime.setDate(QDate::currentDate()); //_dateTime.setTime(QTime::fromString(_time_on, "yyyyMMddhhmmss")); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << _datetime << QT_ENDL; //stringData = stringData + "'" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("yyyy-MM-dd") + "', '" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("hh:mm:ss") + "', "; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "', "; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << stringData << QT_ENDL; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: time-on_ " << _datetime << QT_ENDL; return false; } QString band = getBandNameFromFreq(_freq); if (band != _band) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: FREQ / BAND inconsistency " << _band << "/" << QString::number(_freq) << QT_ENDL; } if (band.length()>0) { stringFields = stringFields + "bandid, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "freq, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; // EA5WA fix to add the freq RX into the log stringFields = stringFields + "freq_rx, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: band" << QT_ENDL; emit queryError(Q_FUNC_INFO, "Incorrect band: " + _band, "-1000", "No query error"); return false; } int _modeid = getSubModeIdFromSubMode(_mode); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: mode: " << _mode << QT_ENDL; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: modeid: " << QString::number(_modeid) << QT_ENDL; if (util->isValidModeId(_modeid)) { stringFields = stringFields + "modeid, "; stringData = stringData + "'" + QString::number(_modeid) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: mode" << QT_ENDL; emit queryError(Q_FUNC_INFO, "Incorrect mode: " + _mode, "-1000", "No query error"); return false; } if (_datetime_off.isValid()) { stringFields = stringFields + "qso_date_off, "; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime_off) + "', "; } if (util->isValidRST(_rstTX)) { stringFields = stringFields + "rst_sent, "; stringData = stringData + "'" + _rstTX + "', "; } if (util->isValidRST(_rstRX)) { stringFields = stringFields + "rst_rcvd, "; stringData = stringData + "'" + _rstRX + "', "; } if (_sTX.length()>0) { stringFields = stringFields + "stx_string, "; stringData = stringData + "'" + _sTX + "', "; } if (_sRX.length()>0) { stringFields = stringFields + "srx_string, "; stringData = stringData + "'" + _sRX + "', "; } if (_comment.length()>0) { stringFields = stringFields + "comment, "; stringData = stringData + "'" + _comment + "', "; } if (_name.length()>0) { stringFields = stringFields + "name, "; stringData = stringData + "'" + _name + "', "; } if (util->isValidGrid(_dxgrid)) { stringFields = stringFields + "gridsquare, "; stringData = stringData + "'" + _dxgrid + "', "; } if (util->isValidGrid(_mygrid)) { stringFields = stringFields + "my_gridsquare, "; stringData = stringData + "'" + _mygrid + "', "; } if (util->isValidPower(QString::number(txpower))) { stringFields = stringFields + "tx_pwr, "; stringData = stringData + "'" + QString::number(txpower) + "', "; } if (util->isValidCall(_operator)) { stringFields = stringFields + "operator, "; stringData = stringData + "'" + _operator + "', "; } if (util->isValidCall(_stationcallsign)) { stringFields = stringFields + "station_callsign, "; stringData = stringData + "'" + _stationcallsign + "', "; } if (_dxcc>0) { stringFields = stringFields + "dxcc, "; stringData = stringData + "'" + QString::number(_dxcc) + "', "; int _cqz, _ituz; _cqz = getCQzFromEntity(_dxcc); _ituz = getITUzFromEntity(_dxcc); if (_cqz >0) { stringFields = stringFields + "cqz, "; stringData = stringData + "'" + QString::number(_cqz) + "', "; } if (_ituz >0) { stringFields = stringFields + "ituz, "; stringData = stringData + "'" + QString::number(_ituz) + "', "; } } if (_sendQSL) { stringFields = stringFields + "qsl_via, "; stringData = stringData + "'B', "; stringFields = stringFields + "lotw_qsl_sent, "; stringData = stringData + "'Q', "; stringFields = stringFields + "eqsl_qsl_sent, "; stringData = stringData + "'Q', "; stringFields = stringFields + "hrdlog_qso_upload_status, "; stringData = stringData + "'M', "; stringFields = stringFields + "clublog_qso_upload_status, "; stringData = stringData + "'M', "; stringFields = stringFields + "qrzcom_qso_upload_status, "; stringData = stringData + "'M', "; } stringFields = stringFields + "lognumber"; stringData = stringData + "'" + QString::number(_logNumber) + "'"; stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Query: " << stringQuery << QT_ENDL; bool sqlOK = query.exec(stringQuery); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOK) { query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: SQL OK" << QT_ENDL; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: SQL " << QT_ENDL; return false; } } int DataProxy_SQLite::addQSOFromLoTW(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate, const QString &_stationcallsign, const int _logn) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: " << _call << QT_ENDL; /* Mandatory data: "qso_date VARCHAR(10) NOT NULL, " "call VARCHAR(40) NOT NULL, " "bandid INTEGER NOT NULL, " "modeid INTEGER NOT NULL, " "lognumber" */ QString stringFields = QString(); QString stringData = QString(); QString stringQuery = QString(); //getITUzFromEntity() QSqlQuery query; if (util->isValidCall(_call)) { stringFields = "call, "; stringData = "'" + _call + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: call" << QT_ENDL; return -1; } if (_datetime.isValid()) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: time-on: " << _datetime << QT_ENDL; stringFields = stringFields + "qso_date, "; QDateTime _dateTime; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "', "; //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: time-on: " << stringData << QT_ENDL; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: time-on_ " << _datetime << QT_ENDL; return -2; } QString band = getBandNameFromFreq(_freq); if (band != _band) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: FREQ / BAND inconsistency " << _band << "/" << QString::number(_freq) << QT_ENDL; } if (band.length()>0) { stringFields = stringFields + "bandid, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "freq, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: band" << QT_ENDL; emit queryError(Q_FUNC_INFO, "Incorrect band: " + _band, "-1000", "No query error"); return -3; } int _modeid = getSubModeIdFromSubMode(_mode); if (util->isValidModeId(_modeid)) { stringFields = stringFields + "modeid, "; stringData = stringData + "'" + QString::number(_modeid) + "', "; QString rst = util->getDefaultRST(_mode); if (rst.length()>0) { stringFields = stringFields + "rst_sent, "; stringData = stringData + "'" + rst + "', "; stringFields = stringFields + "rst_rcvd, "; stringData = stringData + "'" + rst + "', "; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: mode" << QT_ENDL; emit queryError(Q_FUNC_INFO, "Incorrect mode: " + _mode, "-1000", "No query error"); return -4; } if (_qslrdate.isValid()) { stringFields = stringFields + "lotw_qslrdate, "; stringData = stringData + "'" + util->getDateSQLiteStringFromDate(_qslrdate) + "', "; stringFields = stringFields + "lotw_qsl_rcvd, "; stringData = stringData + "'Y', "; stringFields = stringFields + "lotw_qsl_sent, "; stringData = stringData + "'Q', "; } if (util->isValidCall(_stationcallsign)) { stringFields = stringFields + "station_callsign, "; stringData = stringData + "'" + _stationcallsign + "', "; } int _dxcc = getDXCCFromPrefix(_call); if (_dxcc>0) { stringFields = stringFields + "dxcc, "; stringData = stringData + "'" + QString::number(_dxcc) + "', "; int _cqz, _ituz; _cqz = getCQzFromEntity(_dxcc); _ituz = getITUzFromEntity(_dxcc); if (_cqz >0) { stringFields = stringFields + "cqz, "; stringData = stringData + "'" + QString::number(_cqz) + "', "; } if (_ituz >0) { stringFields = stringFields + "ituz, "; stringData = stringData + "'" + QString::number(_ituz) + "', "; } } stringFields = stringFields + "lognumber"; stringData = stringData + "'" + QString::number(_logn) + "'"; stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Query: " << stringQuery << QT_ENDL; bool sqlOK = query.exec(stringQuery); //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOK) { //query.finish(); if (query.exec("SELECT MAX(id) FROM log")) { if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT VALID" << QT_ENDL; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: QUERY EXEC NOT NEXT" << QT_ENDL; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT OK: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT OK: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; } //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: SQL OK" << QT_ENDL; return -5; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: SQL " << QT_ENDL; return -100; } } bool DataProxy_SQLite::deleteQSO(const int _qsoId) { //qDebug() << "DataProxy_SQLite::deleteQSO" << QT_ENDL; QSqlQuery query; QString queryString = QString("DELETE FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::isWorkedB4(const QString &_qrz, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isWorkedB4" << QT_ENDL; //Returns the QSO id QSqlQuery query; QString queryString; if (_currentLog < 0) { queryString = QString("SELECT id FROM log WHERE call='%1'").arg(_qrz); } else { queryString = QString("SELECT id FROM log WHERE call='%1' AND lognumber='%2'").arg(_qrz).arg(_currentLog); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } QList DataProxy_SQLite::isThisQSODuplicated(const QString &_callingFunc, const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs) //QList DataProxy_SQLite::isThisQSODuplicated(const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode) { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated" << QT_ENDL; QSqlQuery query; QString queryString; QList dupeQsos; dupeQsos.clear(); int validityPeriod = 15 * 60; QString initTime = util->getDateTimeSQLiteStringFromDateTime(_dateTime.addSecs(-validityPeriod)); QString endTime = util->getDateTimeSQLiteStringFromDateTime(_dateTime.addSecs(validityPeriod)); //yyyy-MM-dd hh:mm:ss // We will match +-15min queryString = QString("SELECT id, qso_date FROM log WHERE call='%1' AND bandid='%2' AND modeid='%3' AND qso_date>'%4' AND qso_date<'%5'").arg(_qrz).arg(_band).arg(_mode).arg(initTime).arg(endTime); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { int dupeQSO = (query.value(0)).toInt(); if (dupeQSO>0) { dupeQsos.append(dupeQSO); } } else { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated - not valid" << QT_ENDL; } } return dupeQsos; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return dupeQsos; } } int DataProxy_SQLite::getDuplicatedQSOId(const QString &_qrz, const QDateTime &_datetime, const int _band, const int _mode) { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated" << QT_ENDL; QSqlQuery query; QString queryString; QString datetime = util->getDateTimeSQLiteStringFromDateTime(_datetime); queryString = QString("SELECT id FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_qrz).arg(datetime).arg(_band).arg(_mode); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int qsoId = (query.value(0)).toInt(); if (qsoId) { query.finish(); return qsoId; } else { query.finish(); return -1; } } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } bool DataProxy_SQLite::isDXCCConfirmed(const int _dxcc, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isDXCCConfirmed: " << QString::number(_dxcc) << "/" << QString::number(_currentLog) << QT_ENDL; QString queryString = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND lognumber='%2'").arg(_dxcc).arg(_currentLog); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1) { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: TRUE" << QT_ENDL; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE1" << QT_ENDL; query.finish(); return false; } } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE2" << QT_ENDL; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE3" << QT_ENDL; query.finish(); return false; } } bool DataProxy_SQLite::isHF(const int _band) {// 160M is considered as HF if ( (_band>=getIdFromBandName("10M")) && (_band<=getIdFromBandName("160M")) ) { //qDebug() << "DataProxy_SQLite::isHF: TRUE" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isHF: FALSE" << QT_ENDL; return false; } } bool DataProxy_SQLite::isWARC(const int _band) { if ( (_band==getIdFromBandName("12M")) || (_band==getIdFromBandName("17M")) || ((_band==getIdFromBandName("30M")) ) ) { //qDebug() << "DataProxy_SQLite::isWARC: tRUE" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isWARC: FALSE" << QT_ENDL; return false; } } bool DataProxy_SQLite::isVHF(const int _band) { if (_band<=getIdFromBandName("6M")) { //qDebug() << "DataProxy_SQLite::isVHF: TRUE" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isVHF: FALSE" << QT_ENDL; return false; } } bool DataProxy_SQLite::isUHF(const int _band) { if (_band<=getIdFromBandName("70CM")) { //qDebug() << "DataProxy_SQLite::isUHF: TRUE" << QT_ENDL; return true; } else { //qDebug() << "DataProxy_SQLite::isUHF: FALSE" << QT_ENDL; return false; } } QStringList DataProxy_SQLite::getOperatingYears(const int _currentLog) { //qDebug() << "DataProxy_SQLite::getYearsOperating: " << QString::number(_currentLog) << QT_ENDL; QStringList years = QStringList(); //QStringList yearsSorted = QStringList(); QSqlQuery query; QString queryString; if (_currentLog<0) { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log ORDER BY 'qso_date'"); } else { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log WHERE lognumber='%0' ORDER BY 'qso_date'").arg(_currentLog); } QString year = QString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: -1" << QT_ENDL; bool sqlOk = query.exec(queryString); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getYearsOperating: sqlOk = true" << QT_ENDL; while (query.next()) { if (query.isValid()) { year = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: year=" << year << QT_ENDL; years << year; year.clear(); } else { //qDebug() << "DataProxy_SQLite::getYearsOperating: NOT VALID" << QT_ENDL; } } //qDebug() << "DataProxy_SQLite::getYearsOperating: END OK - " << QString::number(years.size())<< QT_ENDL; query.finish(); //return years; if (years.length()>0) { years.sort(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getYearsOperating: sqlOk = false" << QT_ENDL; } return years; } void DataProxy_SQLite::compressDB() { db->compress(); } bool DataProxy_SQLite::unMarkAllQSO() { return db->unMarkAllQSO(); } bool DataProxy_SQLite::lotwSentQueue(const QDate &_updateDate, const int _currentLog) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: Date:" << _updateDate << " /" << QString::number(_currentLog) << QT_ENDL; QString queryString; if (_currentLog<1) { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q'").arg(util->getDateSQLiteStringFromDate(_updateDate)); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog); } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentYes(const QDate &_updateDate, const int _currentLog, const QString &_station) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: " << QString::number(_currentLog) << QT_ENDL; QString queryString; if (_currentLog<1) { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q'"); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q' AND station_callsign='%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_station); } } else { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q' AND station_callsign='%3'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog).arg(_station); } } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs" << QString::number(_qsos.count()) << QT_ENDL; if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: updating QSO: " << QString::number(_qsos.at(i)) << QT_ENDL; //queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE id='%2'").arg((QDate::currentDate()).toString("yyyy-MM-dd")).arg(QString::number(_qsos.at(i))); queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: exec: " << query.lastQuery() << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::lotwSentQSOs: END FALSE" << QT_ENDL; return false; } } //qDebug() << " DataProxy_SQLite::lotwSentQSOs: END TRUE" << QT_ENDL; return true; } int DataProxy_SQLite::lotwUpdateQSLReception (const QString &_call, const QDateTime &_dateTime, const QString &_band, const QString &_mode, const QDate &_qslrdate) { //Returns the QSO id updated or -1 if none was updated. //qDebug() << " DataProxy_SQLite::lotwUpdateQSLReception: " << _call << "/" << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << "/" <<_band <<"/"<<_mode << "/" << util->getADIFDateFromQDate(_qslrdate) << endl ; int bandid = getIdFromBandName(_band); int modeid = getIdFromModeName(_mode); QString qso_date; qso_date = util->getDateTimeSQLiteStringFromDateTime(_dateTime); QString queryString; //queryString = QString("SELECT id, lotw_qsl_rcvd FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_call).arg(qso_date).arg(bandid).arg(modeid); queryString = QString("SELECT id, lotw_qsl_rcvd FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_call).arg(qso_date).arg(bandid).arg(modeid); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int id = (query.value(0)).toInt(); QString _lotwQSLReceived = (query.value(1).toString()); if (( id > 0) && (_lotwQSLReceived!="Y")) { query.finish(); //QString qslsdate = (QDate::fromString(_qslsdate, "yyyyMMdd")).toString("yyyy-MM-dd"); //QString qslrdate = (QDate::fromString(_qslrdate, "yyyyMMdd")).toString("yyyy-MM-dd"); queryString = QString("UPDATE log SET lotw_qsl_rcvd = 'Y', lotw_qslrdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(_qslrdate)).arg(QString::number(id)); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception: Modified Id: " << QString::number(id) << QT_ENDL; return id; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception: SQL ERROR" << QT_ENDL; return -4; } } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception ID Not found" << QT_ENDL; query.finish(); return -5; } } else if (query.lastError().nativeErrorCode() == -1) { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception QSO not found " << query.lastQuery() << QT_ENDL; return -1; } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Unknown error " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Error: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; query.finish(); return -3; } } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Query error: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return -100; } QList DataProxy_SQLite::getQSOsListLoTWToSend(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued, int _logN) { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } QString _query_justQueued; if (_justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend justQueued TRUE" << QT_ENDL; _query_justQueued = QString("lotw_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend justQueued FALSE" << QT_ENDL; _query_justQueued = QString("lotw_qsl_sent!='1'"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3").arg(_queryST_string).arg(_query_justQueued).arg(_query_logNumber); // queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justQueued; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListClubLogToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent justQueued TRUE" << QT_ENDL; _query_justModified = QString("clublog_qso_upload_status='M'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent justQueued FALSE" << QT_ENDL; _query_justModified = QString("clublog_qso_upload_status!='M'"); } //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent logN: " << QString::number(_logN) << QT_ENDL; QString _query_logNumber; if (doesThisLogExist (_logN)) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent log DOES exist" << QT_ENDL; _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent log DOES NOT exist" << QT_ENDL; _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber); //queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justModified; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Adding: " << QString::number((query.value(0)).toInt()) << QT_ENDL; qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Returning: #" << QString::number(qsoList.length()) << QT_ENDL; return qsoList; } QList DataProxy_SQLite::getQSOsListEQSLToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent justQueued TRUE" << QT_ENDL; _query_justModified = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent justQueued FALSE" << QT_ENDL; _query_justModified = QString("eqsl_qsl_sent!='M'"); } /* Modify accordingly to add log number support QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 '%3'").arg(_queryST_string).arg(_query_justQueued).arg(_query_logNumber); */ queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justModified; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified) { //qDebug() << "DataProxy_SQLite::QList getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true); Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent justQueued TRUE" << QT_ENDL; _query_justModified = QString("qrzcom_qso_upload_status='M'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent justQueued FALSE" << QT_ENDL; _query_justModified = QString("qrzcom_qso_upload_status!='-'"); } /* QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber); */ queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justModified; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListToBeExported(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate) { //qDebug() << Q_FUNC_INFO << ": Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } /* Modify accordingly to add log number support QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 '%3'").arg(_queryST_string).arg(_query_justQueued).arg(_logN); */ queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string ; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << Q_FUNC_INFO << ": QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListeQSLNotSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("station_callsign!='ALL'"); } else { _queryST_string = QString("station_callsign=''"); } QString _query_justQueued; if (_justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent justQueued TRUE" << QT_ENDL; _query_justQueued = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent justQueued FALSE" << QT_ENDL; _query_justQueued = QString("eqsl_qsl_sent!='1'"); } /* Modify accordingly to add log number support QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 '%3'").arg(_queryST_string).arg(_query_justQueued).arg(_logN); */ queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justQueued; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Query: " << query.lastQuery() << QT_ENDL; while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd") << QT_ENDL; //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QStringList DataProxy_SQLite::getQSODetailsForLoTWDownload(const int _id) { //Returns QRZ << date+time << Band (txt) << mode (txt) //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload" << QString::number(_id) << QT_ENDL; QStringList result; result.clear(); //getNameFromBandId QSqlQuery query; QString queryString = QString("SELECT call, qso_date, bandid, modeid FROM log WHERE id='%0'").arg(_id); bool sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { QString call = query.value(0).toString(); QString date = query.value(1).toString(); //QString date = util->getDateTimeFromSQLiteString(query.value(1).toString()); //QString time = query.value(2).toString(); QString bandid = query.value(2).toString(); QString modeid = query.value(3).toString(); query.finish(); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - date: " << date << QT_ENDL; //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - time: " << time << QT_ENDL; //getDateTimeSQLiteStringFromDateTime //QString dateTime = (QDateTime::fromString(date, "yyyy-MM-dd hh:mm:ss")).toString("yyyy-MM-dd hh:mm"); QString dateTime = (util->getDateTimeFromSQLiteString(date)).toString("yyyy-MM-dd hh:mm"); bandid = getNameFromBandId(bandid.toInt()); modeid = getNameFromModeId(modeid.toInt()); result.append(call); result.append(dateTime); result.append(bandid); result.append(modeid); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: call: " << call << QT_ENDL; return result; } //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: no valid " << QT_ENDL; } query.finish(); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: no next " << QT_ENDL; return result; } else { //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: SQL NOK " << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return result; } } int DataProxy_SQLite::getQSOonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number(_year) << "/" << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log WHERE qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOonYear: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOonYear: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getDXCConYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number(_year) << "/" << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getDXCConYear: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getDXCConYear: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getCQzonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number(_year) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where qso_date LIKE '%1%' AND cqz>'0' AND cqz < '41'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where lognumber='%1' AND cqz>'0' AND cqz<'41' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getCQzonYear: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getCQzonYear: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getCQzonYear: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithDXCC(const int _dxcc, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number(_dxcc) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc LIKE '%1'").arg(_dxcc); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc LIKE '%2'").arg(_logNumber).arg(_dxcc); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHour(const int _hour, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number(_hour) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '% %1:%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND qso_date LIKE '% %2:%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHourOnBand(const int _hour, const int _band, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number(_hour) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '% %1:%' AND bandid='%2'").arg(aux).arg(_band); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND qso_date LIKE '% %2:%' AND bandid='%3'").arg(_log).arg(aux).arg(_band); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBandç: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsOnMonth(const int _month, const int _log) { //qDebug() << "DataProxy_SQLite::getgetQSOsOnMonth: " << QString::number(_month) << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_month < 10) { aux = "0" + QString::number(_month); } else { aux = QString::number(_month); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '%-%1-%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND qso_date LIKE '%-%2-%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error" << QT_ENDL; query.finish(); return 0; } } bool DataProxy_SQLite::updateQSONumberPerLog() { //qDebug() << Q_FUNC_INFO << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; QList _logsInLogs; _logsInLogs.clear(); queryString = QString("SELECT id FROM logs"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { if ( (query.value(0)).toInt() >= 1) { _logsInLogs.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - TRUE2" << QT_ENDL; query.finish(); return false; } query.finish(); foreach(int i, _logsInLogs) { int _qsos = getHowManyQSOInLog(i); if (_qsos>0) { queryString = QString("UPDATE logs set logtypen = '%1' WHERE id = '%2'").arg(_qsos).arg(i); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); return false; } query.finish(); } } return true; } bool DataProxy_SQLite::newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::newDXMarathon" << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; bool existingDXCC = false; bool existingCQz = false; queryString = QString("SELECT dxcc, cqz FROM log WHERE (lognumber='%1' AND qso_date LIKE'%%2%') AND (dxcc ='%3' OR cqz ='%4')").arg(_logNumber).arg(_year).arg(_dxcc).arg(_cq); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { if ( (query.value(0)).toInt() == _dxcc) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing DXCC" << QT_ENDL; existingDXCC = true; } if ( (query.value(1)).toInt() == _cq) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing CQz" << QT_ENDL; existingCQz = true; } } } if (existingDXCC && existingCQz) { //qDebug() << "DataProxy_SQLite::newDXMarathon - FALSE" << QT_ENDL; query.finish(); return false; } else { //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE1" << QT_ENDL; query.finish(); return true; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE2" << QT_ENDL; query.finish(); return true; // It is an error inthe query but Work First Worry Later, let us work that QSO. } } QStringList DataProxy_SQLite::getContestNames() { //qDebug() << "DataProxy_SQLite::getContestNames() " << QT_ENDL; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from supportedcontests ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestNames: " << queryString << QT_ENDL; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); contests.sort(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //return QStringList(); } QStringList DataProxy_SQLite::getContestCat(const int _catn) { QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; switch (_catn) { case 1: queryString = QString("SELECT DISTINCT name from contestcatoperator ORDER BY id ASC"); break; case 2: queryString = QString("SELECT DISTINCT name from contestcatassisted ORDER BY id ASC"); break; case 3: queryString = QString("SELECT DISTINCT name from contestcatpower ORDER BY id ASC"); break; case 4: queryString = QString("SELECT DISTINCT name from contestcatband ORDER BY id ASC"); break; case 5: queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); break; case 6: queryString = QString("SELECT DISTINCT name from contestcatmode ORDER BY id ASC"); break; default: return QStringList(); //break; } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getContestOverlays() { //qDebug() << "DataProxy_SQLite::getContestOverlays: "<< QT_ENDL; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestOverlays: " << queryString << QT_ENDL; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getPropModeList() { //qDebug() << "DataProxy_SQLite::getPropModeLists" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT id, shortname, name FROM prop_mode_enumeration ORDER BY name"); QSqlQuery query; bool sqlOK = query.exec(queryString); QString num; if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(2)).toString(); if (valueToTranslate == "Aircraft Scatter") { translatedValue = tr("Aircraft Scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Aurora") { translatedValue = tr("Aurora"); } else if(valueToTranslate == "Aurora-E") { translatedValue = tr("Aurora-E"); } else if(valueToTranslate == "Back scatter") { translatedValue = tr("Back scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Earth-Moon-Earth") { translatedValue = tr("Earth-Moon-Earth"); } else if(valueToTranslate == "Sporadic E") { translatedValue = tr("Sporadic E"); } else if(valueToTranslate == "Field Aligned Irregularities") { translatedValue = tr("Field Aligned Irregularities", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "F2 Reflection") { translatedValue = tr("F2 Reflection", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Internet-assisted") { translatedValue = tr("Internet-assisted"); } else if(valueToTranslate == "Ionoscatter") { translatedValue = tr("Ionoscatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Meteor scatter") { translatedValue = tr("Meteor scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Terrestrial or atmospheric repeater or transponder") { translatedValue = tr("Terrestrial or atmospheric repeater or transponder"); } else if(valueToTranslate == "Rain scatter") { translatedValue = tr("Rain scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Satellite") { translatedValue = tr("Satellite"); } else if(valueToTranslate == "Trans-equatorial") { translatedValue = tr("Trans-equatorial", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Tropospheric ducting") { translatedValue = tr("Tropospheric ducting", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "") { translatedValue = tr(""); } else { translatedValue = valueToTranslate; } aux.clear(); num = (query.value(0)).toString(); if (num.toInt() <= 9) { num = "0" + num; } aux = num + " - " + (query.value(1)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } bool DataProxy_SQLite::clearSatList() { QSqlQuery query; bool sqlOK = query.exec("DELETE FROM satellites"); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } bool DataProxy_SQLite::addSatellite(const QString &_arrlId, const QString &_name, const QString &_downLink, const QString &_upLink, const QString &_mode, int id) { //qDebug() << "DataProxy_SQLite::addSatellite: " << QString::number(id) << QT_ENDL; QSqlQuery query; QString queryString; if (id>0) { queryString = QString("UPDATE satellites set satarrlid = '%1', satname = '%2', uplink = '%3', downlink = '%4', satmode = '%5' WHERE id = '%6'").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode).arg(id); } else { queryString = QString("INSERT INTO satellites (satarrlid, satname, uplink, downlink, satmode) VALUES ('%1', '%2', '%3', '%4', '%5')").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode); } bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::addSatellite - query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { //qDebug() << "DataProxy_SQLite::addSatellite - TRUE" << QT_ENDL; //qDebug() << "DataProxy_SQLite::addSatellite - TRUE - ERROR: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::addSatellite - FALSE" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getDBSatId(const QString &_arrlId) { //qDebug() << "DataProxy_SQLite::getDBSatId: " << _arrlId << QT_ENDL; int aux = -1; QString queryString = QString("SELECT id FROM satellites WHERE satarrlid='%1'").arg(_arrlId); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toInt(); } else { //qDebug() << "DataProxy_SQLite::getDBSatId: query not valid" << QT_ENDL; query.finish(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } //qDebug() << "DataProxy_SQLite::getSatelliteUplink: final: " << aux << QT_ENDL; query.finish(); return aux; } QStringList DataProxy_SQLite::getSatellitesList() { //qDebug() << "DataProxy_SQLite::getSatellitesList" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT satarrlid, satname FROM satellites"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString() + " - " + (query.value(1)).toString(); qs << aux; } else { } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } QString DataProxy_SQLite::getSatelliteUplink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: " << _sat << QT_ENDL; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteUplink: final: " << aux << QT_ENDL; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteDownlink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: " << _sat << QT_ENDL; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: final: " << aux << QT_ENDL; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteMode(const QString &_sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); if (aux.contains(',')) { // Potentially somethink like: SSB,CW // We select the first one aux = aux.section(',', 0, 0); // We select the first package } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux << QT_ENDL; return aux; } QString DataProxy_SQLite::getSatelliteFullUplink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: " << _sat << QT_ENDL; QString aux = QString(); QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: final: " << aux << QT_ENDL; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullDownlink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: " << _sat << QT_ENDL; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: final: " << aux << QT_ENDL; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullMode(const QString &_sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux << QT_ENDL; return aux; } QString DataProxy_SQLite::getSatelliteName(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteName: " << _sat << QT_ENDL; QString aux = QString(); QString queryString = QString("SELECT satname FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteName: final: " << aux << QT_ENDL; query.finish(); return aux; } QString DataProxy_SQLite::getSateliteArrlIdFromId(const int _id) { QString aux = QString(); QString queryString = QString("SELECT satarrlid FROM satellites WHERE id='%1'").arg(_id); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query not valid" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query failed: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: final: " << aux << QT_ENDL; return aux; } double DataProxy_SQLite::getFreqFromRange(QString _fr) { //May even receive: 145.900-146.00 and should return the mid in the range (145.950) //qDebug() << "DataProxy_SQLite::getFreqFromRange: " << _fr << QT_ENDL; QString fr1, fr2, aux; double f1, f2; fr1.clear(); fr2.clear(); f1 = 0.0; f2 = 0.0; aux.clear(); aux = _fr; if (aux.contains(',')) { // Potentially somethink like: 435.030-435.456,146.180 // We select the first range //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux << QT_ENDL; aux = aux.section(',', 0, 0); // We select the first package } if (aux.contains('-')) // Potentially somethink like: 435.030-435.456 { //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux << QT_ENDL; fr2 = aux.section('-', 1, 1); // We select the second freq fr1 = aux.section('-', 0, 0); // We select the first freq //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr1: " << fr1 << QT_ENDL; //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr2: " << fr2 << QT_ENDL; f1 = fr1.toDouble(); f2 = fr2.toDouble(); //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1: " << QString::number(f1) << QT_ENDL; //qDebug() << "DataProxy_SQLite::getFreqFromRange: f2: " << QString::number(f2) << QT_ENDL; f1 = (f2 + f1)/2; //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1 after calc: " << QString::number(f1) << QT_ENDL; } else { // It is only one freq 145.950 so this is what must be returned f1 = aux.toDouble(); } //qDebug() << "DataProxy_SQLite::getFreqFromRange: Return: " << QString::number(f1) << QT_ENDL; return f1; } QStringList DataProxy_SQLite::getQSLRcvdList() { //qDebug() << "DataProxy_SQLite::getQSLRcvdList" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_rec_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else if(valueToTranslate == "Validated") { translatedValue = tr("Validated"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLSentList() { //qDebug() << "DataProxy_SQLite::getQSLSentList" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_sent_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Queued") { translatedValue = tr("Queued"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getClubLogStatusList() { //qDebug() << "DataProxy_SQLite::getClubLogStatusList" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM clublog_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); QString translatedValue = QString(); QString valueToTranslate = QString(); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Uploaded") { translatedValue = tr("Uploaded"); } else if(valueToTranslate == "Do not upload") { translatedValue = tr("Do not upload"); } else if(valueToTranslate == "Modified") { translatedValue = tr("Modified"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLViaList() { //qDebug() << "DataProxy_SQLite::getQSLViaList" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_via_enumeration"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Bureau") { translatedValue = tr("Bureau", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Direct") { translatedValue = tr("Direct"); } else if(valueToTranslate == "Electronic") { translatedValue = tr("Electronic"); } else if(valueToTranslate == "Manager") { translatedValue = tr("Manager", "Common term in hamradio, do not translate if not sure"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } bool DataProxy_SQLite::haveAtLeastOneLog() { //qDebug() << "DataProxy_SQLite::haveAtLeastOneLog()" << QT_ENDL; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT(id) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { if((query.value(0)).toInt()>0) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } QStringList DataProxy_SQLite::getColumnNamesFromTableLog() { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTableLog" << QT_ENDL; return getColumnNamesFromTable("log"); } QStringList DataProxy_SQLite::getColumnNamesFromTable(const QString &_tableName) { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTable" << QT_ENDL; return db->getColumnNamesFromTable(_tableName); } bool DataProxy_SQLite::setDXCCAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId) << QT_ENDL; if (_qsoId <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: QSOid <=0 " << QString::number(_qsoId) << QT_ENDL; return false; } QList values; values.clear(); values << getBandModeDXCCCQZlogIDFromId(_qsoId); if (values.length ()!=5) { return false; } // bandid, modeid, dxcc, cqz, lognumber int _dxcc = values.at(2); //int _dxcc = getDXCCFromId(_qsoId); if (_dxcc <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: DXCC <= 0: DXCC: " << QString::number(_dxcc) << " - " << QString::number(_qsoId) << QT_ENDL; return false; } int _band = values.at(0); //int _band = getBandFromId(_qsoId); if (_band <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Band <= 0: BAND: " << QString::number(_band) << " - " << QString::number(_qsoId) << QT_ENDL; return false; } int _mode = values.at(1); //int _mode = getModeFromId(_qsoId); if (_mode <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Mode <= 0: Mode: " << QString::number(_mode) << " - " << QString::number(_qsoId) << QT_ENDL; return false; } int _log = values.at(4); //int _log = getLogNumberFromQSOId(_qsoId); if (_log <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Log <= 0: Log: " << QString::number(_log) << " - " << QString::number(_qsoId) << QT_ENDL; return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-1: " << queryString << QT_ENDL; queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); //int nameCol = -1; if (query.isValid()) { int nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSOConfirmed(_qsoId, true, true)) //if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awarddxcc SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','0', '%4', '%5')").arg(_dxcc).arg(_band).arg(_mode).arg(_qsoId).arg(_log); } if (queryString.length()>5) { if (query.exec(queryString)) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-2: " << queryString << QT_ENDL; query.finish(); return true; } else { if(query.lastError().nativeErrorCode()!=QString::number(19)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool DataProxy_SQLite::setWAZAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId) << QT_ENDL; if (_qsoId <= 0) { return false; } QList values; values.clear(); values << getBandModeDXCCCQZlogIDFromId(_qsoId); if (values.length ()!=5) { return false; } // bandid, modeid, dxcc, cqz, lognumber int _cqz = values.at(3); //int _cqz = getCQZFromId(_qsoId); if (_cqz <= 0) { return false; } //int _band = getBandFromId(_qsoId); int _band = values.at(0); if (_band <= 0) { return false; } //int _mode = getModeFromId(_qsoId); int _mode = values.at(1); if (_mode <= 0) { return false; } //int _log = getLogNumberFromQSOId(_qsoId); int _log = values.at(4); if (_log <= 0) { return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awardwaz WHERE band='%1' AND mode='%2' AND cqz='%3'").arg(_band).arg(_mode).arg(_cqz); bool sqlOK = query.exec(queryString); queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); int nameCol = -1; if (query.isValid()) { nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSOConfirmed(_qsoId, true, true)) //if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awardwaz SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','0', '%4', '%5')").arg(_cqz).arg(_band).arg(_mode).arg(_qsoId).arg(_log); } if (queryString.length()>5) { if (query.exec(queryString)) { query.finish(); return true; } else { if(query.lastError().nativeErrorCode()!=QString::number(19)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool DataProxy_SQLite::addDXCCEntitySubdivision(const QString &_name, const QString &_short, const QString &_pref, const QString &_group, const int _regId, const int _dxcc, const int _cq, const int _itu, const QDate &_startDate, const QDate &_endDate, const bool _deleted) { //qDebug() << "DataProxy_SQLite::addDXCCEntitySubdivision: length: " << _name << QT_ENDL; // id / name / shortname / prefix / regionalgroup / regionalid / dxcc / cqz / ituz / start_date / end_date / deleted QString queryString; QSqlQuery query; bool sqlOK = false; //qDebug() << "DataProxy_SQLite::addRegionalAward: Importing: " << _regionalAward.getRegionalAwardRefName(i) << QT_ENDL; queryString = QString("INSERT INTO primary_subdivisions (name, shortname, prefix, regionalgroup, " "regionalid, dxcc, cqz, ituz, start_date, end_date, deleted) " "values ('%1','%2','%3', '%4','%5','%6', '%7','%8', '%9', '%10','%11')") .arg(_name).arg(_short).arg(_pref).arg(_group).arg(_regId).arg(_dxcc) .arg(_cq).arg(_itu).arg(util->getDateSQLiteStringFromDate(_startDate)) .arg(util->getDateSQLiteStringFromDate(_endDate)).arg(util->boolToCharToSQLite(_deleted)); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addRegionalAward: " << query.lastQuery() << QT_ENDL; query.finish(); } else { //qDebug() << "DataProxy_SQLite::addRegionalAward: ERROR " << QT_ENDL; //qDebug() << "DataProxy_SQLite::addRegionalAward: - query error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //qDebug() << "DataProxy_SQLite::addDXCCEntitySubdivision: END" << QT_ENDL; return true; } int DataProxy_SQLite::getNumberOfManagedLogs() { //qDebug() << "DataProxy_SQLite::getNumberOfManagedLogs" << QT_ENDL; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT (*) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } int DataProxy_SQLite::getMaxLogNumber() { QSqlQuery query; QString queryString = QString("SELECT MAX(id) FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } QStringList DataProxy_SQLite::getListOfManagedLogs() { //This function returns the list of log IDs that are being managed //qDebug() << "DataProxy_SQLite::getListOfManagedLogs" << QT_ENDL; QSqlQuery query; QStringList qs; qs.clear(); QString queryString = QString("SELECT id FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { qs << (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getListOfManagedLogs: " << (query.value(0)).toString() << QT_ENDL; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); qs.clear(); } query.finish(); return qs; } QString DataProxy_SQLite::getStationCallSignFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT stationcall FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << (query.value(0)).toString() << QT_ENDL; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: Not valid" << QT_ENDL; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: query failed" << QT_ENDL; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: END" << QT_ENDL; //return QString(); } QStringList DataProxy_SQLite::getStationCallSignsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog" << QT_ENDL; QStringList calls = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; if (doesThisLogExist(_log)) { queryString = QString("SELECT DISTINCT station_callsign FROM log WHERE lognumber='%1'").arg(_log); } else { queryString = QString("SELECT DISTINCT station_callsign FROM log"); } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); if (queryString.length()>2) { calls.append(queryString); } //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog: " << queryString << QT_ENDL; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END-1 - fail" << QT_ENDL; return QStringList(); } } query.finish(); calls.removeDuplicates(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END-2 - fail" << QT_ENDL; return QStringList(); } calls.sort(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END" << QT_ENDL; return calls; } QString DataProxy_SQLite::getOperatorsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT operators FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << (query.value(0)).toString() << QT_ENDL; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: Not valid" << QT_ENDL; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: query failed" << QT_ENDL; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: END" << QT_ENDL; //return QString(); } QString DataProxy_SQLite::getCommentsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT comment FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getCommentsFromLog: " << (query.value(0)).toString() << QT_ENDL; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getCommentsFromLog: Not valid" << QT_ENDL; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed" << QT_ENDL; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getCommentsFromLog: END" << QT_ENDL; //return QString(); } QString DataProxy_SQLite::getLogDateFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT logdate FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << (query.value(0)).toString() << QT_ENDL; QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: Not valid" << QT_ENDL; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed" << QT_ENDL; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getLogDateFromLog: END" << QT_ENDL; //return QString(); } int DataProxy_SQLite::getLogNumberFromQSOId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT lognumber FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::fillEmptyDXCCInTheLog() { //qDebug() << "DataProxy_SQLite::fillEmptyDXCCInTheLog" << QT_ENDL; QSqlQuery query; QSqlQuery query2; QString queryString = QString("SELECT COUNT (id) FROM log WHERE dxcc IS NULL OR dxcc<'1' OR cont IS NULL"); bool sqlOK = query.exec(queryString); int qsos = -1; if (sqlOK) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } if (qsos < 1) { return true; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); queryString = QString("SELECT id, call FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); sqlOK = query.exec(queryString); if (sqlOK) { int nameCol = -1; QSqlRecord rec = query.record(); QString _call = QString(); QString _id = QString(); QString _dxcc = QString(); QString _aux = QString(); QString _continent = QString(); int j = 0; while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); _call = (query.value(nameCol)).toString(); _dxcc = QString::number(getPrefixId(_call)); _continent = getContinentShortNameFromEntity(_dxcc.toInt()); //qDebug() << "DataBase::fillEmptyDXCCInTheLog: DXCC: " << _dxcc << QT_ENDL; //qDebug() << "DataBase::fillEmptyDXCCInTheLog: Cont: " << _continent << QT_ENDL; // UPDATE THE ID WITH THE DXCC queryString = QString("UPDATE log SET dxcc = '%1', cont = '%2' WHERE id = '%3'").arg(_dxcc).arg(_continent).arg(_id); sqlOK = query2.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); return false; } query2.finish(); if (( (j % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs _aux = QObject::tr("Updating DXCC and Continent information...") + "\n" + QObject::tr("QSO: ") + QString::number(j) + "/" + QString::number(qsos); //_aux = "Updating ..."; progress.setLabelText(_aux); progress.setValue(j); } if ( progress.wasCanceled() ) { //qDebug() << "DataBase::fillEmptyDXCCInTheLog: progress canceled" << QT_ENDL; query.finish(); return true; } j++; } } progress.setValue(qsos); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog DXCC")); msgBox.setText(tr("All QSOs have been updated with a DXCC and the Continent.") ); msgBox.exec(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } int DataProxy_SQLite::getHowManyQSOInLog(const int _log) { QString queryString = QString(); QSqlQuery query = QSqlQuery(); if (_log < 0) { queryString = QString("SELECT count(id) FROM log"); } else { queryString = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyConfirmedQSLInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')"); } else { queryString = QString("SELECT count(id) FROM log WHERE (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y') AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyQSLSentInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y'"); } else { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y' AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithContinent(const QString &_cont, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << _cont << QT_ENDL; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where cont LIKE '%1'").arg(_cont); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont LIKE '%2'").arg(_logNumber).arg(_cont); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: queryString: " << queryString << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: 0" << QT_ENDL; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: Query error" << QT_ENDL; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInBand(const QString &_band, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int bandId = getIdFromBandName(_band); if ( bandId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1'").arg(bandId); } else { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1' AND lognumber='%2'").arg(bandId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInMode(const QString &_mode, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int modeId = getIdFromModeName(_mode); if ( modeId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1'").arg(modeId); } else { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1' AND lognumber='%2'").arg(modeId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } QList> DataProxy_SQLite::getTop10QSOPerDXCC(const int _log) { //qDebug() << Q_FUNC_INFO << " : " << QString::number(_log) << QT_ENDL; QList> result; result.clear(); QSqlQuery query; QString queryString; if (_log <0) { queryString = "SELECT log.dxcc, COUNT(log.dxcc) FROM log GROUP BY log.dxcc ORDER BY COUNT(log.dxcc) DESC LIMIT 10"; } else { queryString = QString("select log.dxcc, count(log.dxcc) from log WHERE log.lognumber = '%1' group by log.dxcc ORDER BY count(log.dxcc) DESC limit 10").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { QList temp; while (query.next()) { if (query.isValid()) { temp.clear(); temp.append(query.value(0).toInt()); temp.append(query.value(1).toInt()); result.append(temp); //_id = (query.value(nameCol)).toString(); } } return result; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return result; } //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; //return result; } bool DataProxy_SQLite::addNewLog (const QStringList _qs) { //qDebug() << "DataProxy_SQLite::addNewLog: " << _qs.at(2) << "/" << _qs.at(5) << "/" << _qs.at(6) << QT_ENDL; //qDebug() << "DataProxy_SQLite::addNewLog: Size: " << QString::number(_qs.size()) << QT_ENDL; // newLogq << dateString << stationCallsign << operators << comment << QString::number(selectedLog) << _qs.at(4) ; (last field is 1 or 0 editing) if (_qs.size()!=6) { //qDebug() << "DataProxy_SQLite::addNewLog: != 6" << QT_ENDL; return false; } //qDebug() << "DataProxy_SQLite::addNewLog: Has the appropriate length" << QT_ENDL; QString aux = QString(); QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _operators = _qs.at(2); QString _comment = _qs.at(3); QString id = _qs.at(4); QString editing = _qs.at(5); QString queryString; QSqlQuery query; bool sqlOK; if (editing == "1") { // We are editing //qDebug() << "DataProxy_SQLite::addNewLog: We are editing!" << QT_ENDL; //queryString = QString("UPDATE logs SET logdate = '%1', stationcall = '%2', operators = '%3', comment = '%4', logtype = '%5', logtypen = '%6' WHERE id = '%7'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(_typeContest).arg(_typeContestN).arg(id); queryString = QString("UPDATE logs SET logdate = '%1', stationcall = '%2', operators = '%3', comment = '%4' WHERE id = '%5'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(id); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addNewLog: Editing OK!" << QT_ENDL; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::addNewLog: Editing NOK!" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } //qDebug() << "DataProxy_SQLite::addNewLog: We are adding a new log" << QT_ENDL; // First we check if the log is already there queryString = QString("SELECT id FROM logs WHERE logdate='%1' AND stationcall='%2' AND operators = '%3' AND comment = '%4'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString << QT_ENDL; sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::addNewLog query error: " << queryString << QT_ENDL; // It seems that the log is already existing! return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //Now we add the new log queryString = QString("INSERT INTO logs (logdate, stationcall, operators, comment) values('%1','%2','%3','%4')").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment); //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString << QT_ENDL; sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } bool DataProxy_SQLite::doesThisLogExist(const int _log) { //qDebug() << "DataProxy_SQLite::doesThisLogExist: " << QString::number(_log) << QT_ENDL; //qDebug() << "DataProxy_SQLite::doesThisLogExist - Name:" << db->getDBName() << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT id FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::doesThisLogExist: query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END TRUE" << QT_ENDL; return true; } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 1" << QT_ENDL; return false; } } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 2" << QT_ENDL; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 3" << QT_ENDL; return false; } //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 4" << QT_ENDL; //return false; } int DataProxy_SQLite::getContinentIdFromContinentShortName(const QString &_n) { if (_n.length()!=2) { return -3; } QSqlQuery query; QString queryString = QString("SELECT id FROM continent WHERE shortname=='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getContinentShortNameFromEntity(const int _n) { QSqlQuery query; QString queryString= QString("SELECT continent FROM entity WHERE dxcc='%1'").arg(_n); //QString queryString= QString("SELECT continent.shortname FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } int DataProxy_SQLite::getContinentIdFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT continent.id FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); //aux = QString("SELECT continent.id FROM entity JOIN continent ON entity.continent=continent.shortname WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_n); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QStringList DataProxy_SQLite::getContinentShortNames() { QSqlQuery query; QStringList continents; continents.clear(); QString queryString = QString("SELECT shortname FROM continent"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { continents << query.value(0).toString(); } } query.finish(); continents.sort(); return continents; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //return QStringList(); } bool DataProxy_SQLite::isValidContinentShortName(const QString &_n) { QString queryString = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_n); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } bool DataProxy_SQLite::isValidDXCC(const int _e) { QString queryString = QString("SELECT id FROM entity WHERE dxcc ='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { if (query.value(0).toInt()==1) query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } QStringList DataProxy_SQLite::filterValidFields(const QStringList &_fields) { //qDebug() << Q_FUNC_INFO << ": Length: " << QString::number(_fields.length()); QStringList validFields; validFields.clear(); validFields << getFields(); QString aux; //foreach(aux, validFields) //{ // //qDebug() << Q_FUNC_INFO << ": validFields: " << aux; //} foreach(aux, _fields) { //qDebug() << Q_FUNC_INFO << ": _fields: " << aux; } QStringList returningFields; returningFields.clear(); QString field; foreach (field, _fields) { //qDebug() << Q_FUNC_INFO << ": Field:-1: " << field; field = field.trimmed(); if (field.endsWith(';')) { field.chop(1); } //qDebug() << Q_FUNC_INFO << ": Field:-2: " << field; if (validFields.contains(field)) { returningFields << field; } } if (returningFields.isEmpty()) { returningFields << util->getDefaultLogFields(); } return returningFields; } int DataProxy_SQLite::getITUzFromPrefix(const QString &_p) { QSqlQuery query; QString queryString = QString("SELECT ituz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromPrefix(const QString &_p) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getITUzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT ituz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getEntityNameFromId(const int _n) { //qDebug() << "DataProxy_SQLite::getEntityNameFromId: " << QString::number(_n) << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(_n); QString motherEntName = QString(); bool sqlOK; if (_n > 1000) { QString aux = (QString::number(_n)).right(3); QString queryString2 = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(aux); sqlOK = query.exec(queryString2); if (sqlOK) { if (query.next()) { if (query.isValid()) { motherEntName = (query.value(0)).toString(); } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { if (_n>1000) { motherEntName = (query.value(0)).toString() + " (" + motherEntName + ")"; } else { motherEntName = (query.value(0)).toString(); } query.finish(); return motherEntName; } else { query.finish(); return QString(); } } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //return QString(); } int DataProxy_SQLite::getEntityIdFromName(const QString &_e) { //qDebug() << "DataProxy_SQLite::getEntityIdFromName:" << _e << QT_ENDL; int id = -1; QString queryString; QSqlQuery query; //queryString = QString("SELECT mainprefix FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_entityN); queryString = QString("SELECT dxcc FROM entity WHERE name='%1'").arg(_e); //queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return id; } else { query.next(); if (query.isValid()) { id = (query.value(0)).toInt(); query.finish(); return id; } else { query.finish(); return -1; } } } QStringList DataProxy_SQLite::getEntiNameISOAndPrefixFromId(const int _dxcc) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_dxcc); if (_dxcc <= 0 ) { return QStringList(); } bool sqlOK; QString queryString; QSqlQuery query; QString motherEntName = QString(); if (_dxcc > 1000) { QString aux = (QString::number(_dxcc)).right(3); QString queryString2 = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(aux); sqlOK = query.exec(queryString2); if (sqlOK) { if (query.next()) { if (query.isValid()) { motherEntName = (query.value(0)).toString(); if (motherEntName.length ()<1) { return QStringList(); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish (); return QStringList(); } } query.finish (); QStringList result; result.clear(); queryString = QString("SELECT mainprefix, name, isoname FROM entity WHERE dxcc='%1'").arg(_dxcc); sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } else { query.next(); if (query.isValid()) { //queryString = (query.value(0)).toString(); QString prefix = (query.value(0)).toString(); QString name = (query.value(1)).toString(); QString isoName = (query.value(2)).toString(); query.finish(); if (prefix.length ()<1) { return QStringList(); } if (name.length ()<1) { return QStringList(); } if ((_dxcc>1000) && (motherEntName.length ()>2)) { name = name + "(" + motherEntName + ")"; } if (isoName.length ()<2) { return QStringList(); } result << prefix << name << isoName; return result; } else { query.finish(); return QStringList(); } } } QString DataProxy_SQLite::getEntityMainPrefix(const int _entityN) { //qDebug() << "DataProxy_SQLite::getEntityMainPrefix:" << QString::number(_entityN) << QT_ENDL; if (_entityN <= 0 ) { return QString(); } QString queryString; QSqlQuery query; queryString = QString("SELECT mainprefix FROM entity WHERE dxcc='%1'").arg(_entityN); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } else { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } //return QString(); } int DataProxy_SQLite::getEntityIdFromMainPrefix(const QString &_e) { //qDebug() << "DataProxy_SQLite::getEntityIdFromMainPrefix:" << _e << QT_ENDL; int id = -1; QString queryString; QSqlQuery query; queryString = QString("SELECT dxcc FROM entity WHERE mainprefix='%1'").arg(_e); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return id; } else { query.next(); if (query.isValid()) { id = (query.value(0)).toInt(); query.finish(); return id; } else { query.finish(); return -1; } } } int DataProxy_SQLite::getDXCCFromPrefix(const QString &_p) { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix - " << Q_FUNC_INFO << "-" << _p << "-" << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT dxcc FROM prefixesofentity WHERE prefix='%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: query OK: query: " << queryString << QT_ENDL; if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return 0: " << QString::number(v) << QT_ENDL; return v; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -1: " << QT_ENDL; return -1; } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -2: " << QT_ENDL; return -2; } } else { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: query NOK: query: " << queryString << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -3: " << QT_ENDL; return -3; } //return -4; } bool DataProxy_SQLite::isNewCQz(int _c) { QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE cqz='%1'").arg(_c); //queryString = "SELECT id FROM log WHERE cqz=='" + QString::number(_cqz) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } else { query.next(); return query.isValid(); } } bool DataProxy_SQLite::isNewEntity(int _e) { if (_e <= 0) { return false; } //QString queryString; QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE dxcc='%1'").arg(_e); //queryString = "SELECT id FROM log WHERE dxcc=='" + QString::number(_entityN) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } else { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } //return false; } double DataProxy_SQLite::getLongitudeFromEntity(const int _e) { QString queryString = QString("SELECT longitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return v; } } } double DataProxy_SQLite::getLatitudeFromEntity(const int _e) { QString queryString = QString("SELECT latitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return v; } } } QString DataProxy_SQLite::getEntityPrefixes(const int _enti) { if (_enti<=0) { return QString(); } QString result; result = QString(); QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } else { while ( (query.next())) { if (query.isValid()) { result = result + ", " + (query.value(0)).toString(); } } if (result.length() < 1) { return result; } else { result = result.remove(0,2); query.finish(); return result; } } } QStringList DataProxy_SQLite::getEntitiesNames() { //qDebug() << "DataProxy_SQLite::getEntitiesNames" << QT_ENDL; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT mainprefix, name, dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(2).toInt()<1000) { aux.clear(); aux = (query.value(0)).toString() + "-" + (query.value(1)).toString()+" ("+(query.value(2)).toString()+")"; //result = result + ", " + (query.value(0)).toString(); qs << aux; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } QStringList DataProxy_SQLite::getEntitiesIds() { QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(0).toInt()>0) { aux.clear(); aux = (query.value(0)).toString(); qs << aux; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } int DataProxy_SQLite::getHowManyEntities() { QSqlQuery query; QString queryString = QString("SELECT count(id) FROM entity"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getMaxEntityID(bool limit) { //SELECT MAX (dxcc) FROM entity WHERE dxcc<1000 QSqlQuery query; QString queryString; if (limit) { queryString = QString("SELECT MAX (dxcc) FROM entity WHERE dxcc<1000"); } else { queryString = QString("SELECT MAX (dxcc) FROM entity"); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::updateISONames() { //qDebug() << "DataProxy_SQLite::updateISONames" << QT_ENDL; return db->updateTheEntityTableISONames(); } QString DataProxy_SQLite::getISOName(const int _n) { //qDebug() << "DataProxy_SQLite::getISONames: " << QString::number(_n) << QT_ENDL; if (_n <= 0 ) { //qDebug() << "DataProxy_SQLite::getISONames: NOT KNOWN - UN" << QT_ENDL; return "un"; // When no flag is known, we return the UN flag } int n = _n; if (_n<1000) { n = _n; } else if (_n>=2000) { n = _n - 2000; } else { n = _n - 1000; } QString queryString, aux; QSqlQuery query; aux.clear(); queryString = QString("SELECT isoname FROM entity WHERE dxcc='%1'").arg(n); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getISOName: Query error - UN" << QT_ENDL; query.finish(); return "un"; // When no flag is known, we return the UN flag } else { query.next(); if (query.isValid()){ //qDebug() << "DataProxy_SQLite::getISOName: " << "N: " << QString::number(_n) << "- ISO Name: " << (query.value(0)).toString() << QT_ENDL; aux = (query.value(0)).toString(); query.finish(); if (aux.length()>1) { return aux; } else { return "un"; // When no flag is known, we return the UN flag } } else { //qDebug() << "DataProxy_SQLite::getISOName: NO ISO Name: " << QT_ENDL; query.finish(); return "un"; // When no flag is known, we return the UN flag } } } int DataProxy_SQLite::getPrefixId(const QString &_qrz) { //qDebug() << "DataProxy_SQLite::getPrefixId: -" << _qrz <<"-" << QT_ENDL; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number if (_qrz.length() < 1) { return -1; } int entityID = 0; QString aux = changeSlashAndFindPrefix((_qrz).toUpper()); while ((entityID <= 0) && (aux.length()>=1) ) { entityID = getDXCCFromPrefix(aux); //qDebug() << "DataProxy_SQLite::getPrefixId: in the while" << aux << " = " << QString::number(entityID) << QT_ENDL; if (entityID<=0) { aux.chop(1); } } //qDebug() << "DataProxy_SQLite::getPrefixId: " << _qrz << QString::number(entityID) << QT_ENDL; return entityID; } QString DataProxy_SQLite::changeSlashAndFindPrefix(const QString &_qrz) { //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: -" << _qrz <<"-" << QT_ENDL; int iaux1, iaux2; QString aux = _qrz.toUpper(); if ((aux).count('\\')) // Replaces \ by / to ease operation. { aux.replace(QChar('\\'), QChar('/')); } else { return aux; } if (aux.count('/')) // / found! Checking different options { if (aux.endsWith("/") ) { // We look for calls ending in slash "/" or "\" aux.remove(aux.length()-1,1); } iaux1 = aux.indexOf('/'); //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: Slash found at: " << QString::number(iaux1) << QT_ENDL; iaux2 = (aux.length())- iaux1; // iaux2 is the length of the second part if (iaux2 < 0){ iaux2 = -iaux2; } if ( iaux1 < iaux2 ) { //Like in F/EA0K, we can simply take the first part as the prefix aux = aux.left(iaux1); } else { aux = aux.right(iaux2 -1); } } return aux; } void DataProxy_SQLite::slotCaptureDebugLogs(const QString &_func, const QString &_msg, const DebugLogLevel _level) { emit debugLog(_func, _msg, _level); } QString DataProxy_SQLite::getADIFQSO(const int _qsoId) { QString ADIFqso; ADIFqso.clear(); //qDebug() << "DataProxy_SQLite::getADIFQSO: " << QString::number(_qsoId) << QT_ENDL; int nameCol; QString aux; bool propsat = false; // Reset the QSO in case it is a Satellite QSO QSqlQuery query; QString queryString = QString("SELECT * FROM log WHERE id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query OK: " << query.lastQuery() << QT_ENDL; } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query isValid FAILED: " << query.lastQuery() << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query NEXT FAILED: " << query.lastQuery() << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query FAILED: " << query.lastQuery() << QT_ENDL; query.finish(); return QString(); } QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO: " << QString::number(nameCol) << "/" << aux1 << QT_ENDL; if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } else { if (showInvalidCallMessage(aux)) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qso_date"); QDateTime tDateTime; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); aux = util->getADIFTimeFromQDateTime(tDateTime); //aux.chop(2); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("bandid"); QString bandst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = getNameFromBandId(aux.toInt()); if (getIdFromBandName(aux)>=0) { bandst = aux; } } nameCol = rec.indexOf("freq"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqTX = aux.toDouble(); if (freqTX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (getBandIdFromFreq(freqTX) != getIdFromBandName(bandst)) { bandst = getBandNameFromFreq(freqTX); } ADIFqso.append("" + aux + " "); } if (getIdFromBandName(bandst)>0) { ADIFqso.append("" + bandst + " "); } } // Now the BAND RX nameCol = rec.indexOf("band_rx"); QString bandrxst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = getNameFromBandId(aux.toInt()); if (getIdFromBandName(aux)>=0) { bandrxst = aux; } } nameCol = rec.indexOf("freq_rx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqRX = aux.toDouble(); if (freqRX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (getBandIdFromFreq(freqRX) != getIdFromBandName(bandrxst)) { bandrxst = getBandNameFromFreq(freqRX); } ADIFqso.append("" + aux + " "); } if (getIdFromBandName(bandrxst)>0) { ADIFqso.append("" + bandrxst + " "); } // END of Band RX } nameCol = rec.indexOf("modeid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); // get SubModeId to check if it is the same or not from modeid QString aux2 = getSubModeFromId(aux.toInt()); //aux = db->getModeNameFromID2(aux.toInt()); aux = getNameFromSubMode(aux2); if ((aux.length()>1) && (getIdFromModeName(aux)>=0)) { ADIFqso.append("" + aux + " "); } if ((aux != aux2) && (aux.length()>1) && (getSubModeIdFromSubMode(aux2)>=0) ) { ADIFqso.append("" + aux2 + " "); } } nameCol = rec.indexOf("prop_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>1) { ADIFqso.append("" + aux + " "); if (aux == "SAT") { propsat = true; } } //qDebug() << "DataProxy_SQLite::getADIFQSO: PROP_MODE" << QT_ENDL; } nameCol = rec.indexOf("sat_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); if (!propsat) { ADIFqso.append("SAT "); propsat = false; } } //qDebug() << "DataProxy_SQLite::getADIFQSO: SAT_NAME" << QT_ENDL; } nameCol = rec.indexOf("gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("station_callsign"); if ((nameCol>=0) ) { aux = (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getADIFQSO: StationCallSign: " << aux << QT_ENDL; if ((util->isValidCall(aux))) { // User selected one station callsign from the log ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_date_off"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); aux = util->getADIFTimeFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("srx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("srx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("stx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("stx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } //qDebug() << "DataProxy_SQLite::getADIFQSO - 100" << QT_ENDL; nameCol = rec.indexOf("cqz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < CQZones+1) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ituz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < ITUZones+1) ) { ADIFqso.append("" + aux + " "); } //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC - Now..." << QT_ENDL; } nameCol = rec.indexOf("dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC " << aux << QT_ENDL; } //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC - Exported!" << QT_ENDL; } nameCol = rec.indexOf("address"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("age"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("comment"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } //qDebug() << "DataProxy_SQLite::getADIFQSO - 200" << QT_ENDL; } nameCol = rec.indexOf("a_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_az"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_el"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_path"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("arrl_sect"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("checkcontest"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } //qDebug() << "DataProxy_SQLite::getADIFQSO - 30" << QT_ENDL; nameCol = rec.indexOf("class"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("cont"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("contacted_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("contest_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("points"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("multiplier"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } //qDebug() << "DataProxy_SQLite::getADIFQSO - 40" << QT_ENDL; } nameCol = rec.indexOf("transmiterid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("credit_submitted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("credit_granted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("distance"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("darc_dok"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eq_call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("email"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { if (aux.contains("@") && (aux.contains("."))) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("eqsl_qslrdate"); QDate date; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("fists_cc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("force_init"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("guest_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("hrdlog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_antenna"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO (IOTA): " << aux << QT_ENDL; if (((aux.length())>=4) && ((aux.length())<=6)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO (IOTA_ID): " << aux << QT_ENDL; if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>=4) && ((aux.length())<=6)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("k_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_itu_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("clublog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("clublog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qrzcom_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("max_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ms_shower"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_city"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_cq_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.toInt()>0) && (aux.toInt()<41)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("operator"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("owner_callsign"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_street"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("notes"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { aux.replace("\n", "---"); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("nr_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("nr_pings"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("pfx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("precedence"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("public_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslmsg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); nameCol = rec.indexOf("qsl_rcvd_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); nameCol = rec.indexOf("qsl_sent_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qsl_via"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_complete"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_random"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qth"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rst_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rst_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("region"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>0) && (aux.toDouble()>0) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("tx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (aux.toDouble()>0)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sat_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sfi"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sig_info"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("silent_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("skcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("swl"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("uksmg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ve_prov"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("web"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lognumber"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } ADIFqso.append(""); return ADIFqso; } bool DataProxy_SQLite::showInvalidCallMessage(const QString &_call){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Invalid call detected")); QString aux = _call; if (aux.length()<1) { aux = QString(tr("An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record?")); } else { aux = QString(tr("An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log?").arg(aux)); } msgBox.setText(aux); msgBox.setInformativeText(tr("Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } } QList DataProxy_SQLite::getSatDXCCStats(int _log) { //qDebug() << Q_FUNC_INFO << ": log = " << QString::number(_log) << QT_ENDL; QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ": log exists " << QT_ENDL; stringQuery = QString("SELECT call, qso_date, band.name, mode.name, entity.name, log.dxcc, lotw_qsl_rcvd, qsl_rcvd, sat_name from log, entity, band, mode where log.dxcc <>'' AND sat_name <>'' AND log.dxcc=entity.dxcc AND log.bandid=band.id AND log.modeid=mode.id AND lognumber='%1' ORDER BY entity.name").arg(_log); } else { //qDebug() << Q_FUNC_INFO << ": log does not exist " << QT_ENDL; stringQuery = QString("SELECT call, qso_date, band.name, mode.name, entity.name, log.dxcc, lotw_qsl_rcvd, qsl_rcvd, sat_name from log, entity, band, mode where log.dxcc <>'' AND sat_name <>'' AND log.dxcc=entity.dxcc AND log.bandid=band.id AND log.modeid=mode.id ORDER BY entity.name"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query NOK" << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText() << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) { int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); _qso->setDateTimeOn (util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); nameCol = rec.indexOf("bandid"); //qDebug() << "DataProxy_SQLite::getGridStats: bandid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setBand(query.value(2).toString()); //nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setMode(query.value(3).toString()); nameCol = rec.indexOf("sat_name"); _qso->setSatName((query.value(nameCol)).toString()); nameCol = rec.indexOf("log.dxcc"); _qso->setDXCC((query.value(nameCol)).toInt()); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); } else { _qsos.clear(); query.finish(); return _qsos; } } } //qDebug() << Q_FUNC_INFO << "- END" << QT_ENDL; return _qsos; } QList DataProxy_SQLite::getGridStats(int _log) { //qDebug() << Q_FUNC_INFO << ": log = " << QString::number(_log) << QT_ENDL; QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ":: log exists " << QT_ENDL; stringQuery = QString("SELECT call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd from log where gridsquare <>'' AND lognumber='%1'").arg(_log); } else { //qDebug() << Q_FUNC_INFO << ": log does not exist " << QT_ENDL; stringQuery = QString("SELECT call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd from log where gridsquare <>''"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query NOK" << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText() << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) {// call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("substr(gridsquare, 1, 4)"); _qso->setGridSquare((query.value(nameCol)).toString()); nameCol = rec.indexOf("bandid"); //qDebug() << Q_FUNC_INFO << ": bandid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); //qDebug() << Q_FUNC_INFO << ": call: " << _call << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": band: " << _band << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": mode: " << _mode << QT_ENDL; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << "DataProxy_SQLite::addQSO: Query OK" << QT_ENDL; } //qDebug() << "DataProxy_SQLite::getGridStats - END" << QT_ENDL; return _qsos; } QList DataProxy_SQLite::getSatGridStats(int _log) { //qDebug() << "DataProxy_SQLite::getGridStats: log = " << QString::number(_log) << QT_ENDL; QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << "DataProxy_SQLite::getGridStats: log exists " << QT_ENDL; stringQuery = QString("SELECT call, qso_date, bandid, modeid, substr(gridsquare, 1, 4), lotw_qsl_rcvd, qsl_rcvd, sat_name from log where gridsquare <>'' AND sat_name <>'' AND lognumber='%1'").arg(_log); } else { //qDebug() << "DataProxy_SQLite::getGridStats: log does not exist " << QT_ENDL; stringQuery = QString("SELECT call, qso_date, bandid, modeid, substr(gridsquare, 1, 4), lotw_qsl_rcvd, qsl_rcvd, sat_name from log where gridsquare <>'' AND sat_name <>''"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "DataProxy_SQLite::getGridStats: Query NOK" << QT_ENDL; //qDebug() << "DataProxy_SQLite::getGridStats: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::getGridStats: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) { int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); _qso->setDateTimeOn (util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); nameCol = rec.indexOf("bandid"); //qDebug() << "DataProxy_SQLite::getGridStats: bandid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << "DataProxy_SQLite::getGridStats: modeid" << QString::number((query.value(nameCol)).toInt()) << QT_ENDL; _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("sat_name"); _qso->setSatName((query.value(nameCol)).toString()); nameCol = rec.indexOf("substr(gridsquare, 1, 4)"); _qso->setGridSquare((query.value(nameCol)).toString()); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); //qDebug() << "DataProxy_SQLite::getGridStats: call: " << _call << QT_ENDL; //qDebug() << "DataProxy_SQLite::getGridStats: band: " << _band << QT_ENDL; //qDebug() << "DataProxy_SQLite::getGridStats: mode: " << _mode << QT_ENDL; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << "DataProxy_SQLite::addQSO: Query OK" << QT_ENDL; } //qDebug() << "DataProxy_SQLite::getGridStats - END" << QT_ENDL; return _qsos; } int DataProxy_SQLite::getFieldInBand(ValidFieldsForStats _field, const QString &_band, bool confirmedOnly, QString _mode, int _log) { //qDebug() << Q_FUNC_INFO << ": " << _band << "/" << _mode << "/" << QString::number(_log) ; if ((!doesThisLogExist(_log)) && !(_log == -1)) { //qDebug() << Q_FUNC_INFO << ": Exit no log"; return 0; } int bandId = getIdFromBandName (_band); QString bandString = QString(); if (!(_band.toUpper () == "ALL")) { if (bandId<1) { //qDebug() << Q_FUNC_INFO << ": Exit band"; return 0; } bandString = QString(" AND bandid='%1'").arg(bandId); } QString field = QString(); QString specialField = QString(); switch (_field) { case DXCC: field = "dxcc"; specialField = field + " <>'' AND dxcc<1000 AND dxcc>0"; break; case GridSquare: field = "gridsquare"; specialField = field + " <>''"; break; } QString stringQuery; QSqlQuery query; QString modeString = QString(); int modeId = getIdFromModeName(_mode); if (_mode.toUpper() == "ALL") { //qDebug() << Q_FUNC_INFO << ": ALL Modes" ; } else if (util->isValidModeId(modeId)) { //qDebug() << Q_FUNC_INFO << ": Valid Mode" ; modeString = QString(" AND modeid='%1' ").arg(modeId); } else { //qDebug() << Q_FUNC_INFO << ": Mode not valid!" ; return 0; } QString logString = QString(); if (!(_log == -1)) { logString = QString(" AND lognumber='%1'").arg(_log); } QString confirmedString = QString(); if (confirmedOnly) { confirmedString = QString(" AND (lotw_qsl_rcvd='Y' OR qsl_rcvd='Y')"); } stringQuery = QString("SELECT COUNT (DISTINCT %1) from log WHERE %2 %3 %4 %5 %6").arg(field).arg(specialField).arg(modeString).arg(bandString).arg(confirmedString).arg(logString); //qDebug() << Q_FUNC_INFO << " : Query: " << stringQuery << QT_ENDL; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " : Query NOK" << QT_ENDL; //qDebug() << Q_FUNC_INFO << " : " << query.lastError().databaseText() << QT_ENDL; //qDebug() << Q_FUNC_INFO << " : " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } else { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " : " << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } } query.finish(); return 0; } int DataProxy_SQLite::addQSO(QSO &_qso) { //qDebug() << "DataProxy_SQLite::addQSO: " << _qso.getCall() << QT_ENDL; qso = &_qso; //qDebug() << "DataProxy_SQLite::addQSO: " << qso->getCall() << QT_ENDL; //qso = _qso; bool havePropMode = false; bool haveRSTRX = false; bool haveRSTTX = false; QString stringQuery; QString stringFields, stringData; stringFields.clear(); stringData.clear(); //qDebug() << "DataProxy_SQLite::addQSO: QDateTime: " << util->getDateTimeSQLiteStringFromDateTime(qso->getDateTimeOn()) << QT_ENDL; if (qso->getDateTimeOn().isValid()) { stringFields.append("qso_date, "); stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(qso->getDateTimeOn()) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-1" << QT_ENDL; return -1; } if (util->isValidCall(qso->getCall())) { stringFields.append("call, "); stringData = stringData + "'" + qso->getCall() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-2" << QT_ENDL; return -2; } //qDebug() << "DataProxy_SQLite::addQSO: Band: " << qso->getBand() << QT_ENDL; if (util->isValidBandId(getIdFromBandName(qso->getBand()))) { stringFields.append("bandid, "); stringData = stringData + "'" + QString::number(getIdFromBandName(qso->getBand())) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-3" << QT_ENDL; return -3; } if (util->isValidModeId(getIdFromModeName(qso->getMode()))) { stringFields.append("modeid, "); stringData = stringData + "'" + QString::number(getIdFromModeName(qso->getMode())) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-4" << QT_ENDL; return -4; } if (util->isValidBandId(getIdFromBandName(qso->getBandRX()))) { stringFields.append("band_rx, "); stringData = stringData + "'" + QString::number(getIdFromBandName(qso->getBandRX())) + "', "; } if (qso->getFreqTX () > 0) { stringFields.append("freq, "); stringData = stringData + "'" + QString::number(qso->getFreqTX()) + "', "; } if (qso->getFreqRX() > 0) { stringFields.append("freq_rx, "); stringData = stringData + "'" + QString::number(qso->getFreqRX()) + "', "; } if (util->isValidCall(qso->getStationCallsign())) { stringFields.append("station_callsign, "); stringData = stringData + "'" + qso->getStationCallsign() + "', "; } if (qso->getQSLRDate().isValid()) { stringFields.append("qslrdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getQSLRDate()) + "', "; } //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: " << qso->getQSL_RCVD() << QT_ENDL; if (util->isValidQSL_Rcvd(qso->getQSL_RCVD())) { //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: VALID " << QT_ENDL; stringFields.append("qsl_rcvd, "); stringData = stringData + "'" + qso->getQSL_RCVD() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: NOT valid" << QT_ENDL; } //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD: " << qso->getLoTWQSL_RCVD() << QT_ENDL; if (util->isValidQSL_Rcvd(qso->getLoTWQSL_RCVD())) { //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - VALID" << QT_ENDL; stringFields.append("lotw_qsl_rcvd, "); stringData = stringData + "'" + qso->getLoTWQSL_RCVD() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - NOT valid" << QT_ENDL; } //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - END" << QT_ENDL; if (qso->getLoTWQSLRDate().isValid()) { stringFields.append("lotw_qslrdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getLoTWQSLRDate()) + "', "; } if (util->isValidQSL_Sent (qso->getLoTWQSL_SENT ())) { stringFields.append("lotw_qsl_sent, "); stringData = stringData + "'" + qso->getLoTWQSL_SENT ()+ "', "; } if (qso->getLoTWQSLSDate().isValid()) { stringFields.append("lotw_qslsdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getLoTWQSLSDate()) + "', "; } if ( getSatelliteName(qso->getSatName()).length()>0 ) { stringFields.append("sat_name, "); stringData = stringData + "'" + qso->getSatName() + "', "; if (!havePropMode) { havePropMode = true; stringFields.append("prop_mode, "); stringData = stringData + "'SAT', "; } } if ( !havePropMode && (qso->getPropMode().length()>0) ) { stringFields.append("prop_mode, "); stringData = stringData + "'" + qso->getPropMode() + "', "; havePropMode = true; } if (!haveRSTRX) { stringFields.append("rst_rcvd, "); stringData = stringData + "'" + util->getDefaultRST(qso->getMode())+ "', "; } if (!haveRSTTX) { stringFields.append("rst_sent, "); stringData = stringData + "'" + util->getDefaultRST(qso->getMode())+ "', "; } if (qso->getLogId()>0) { stringFields.append("lognumber"); stringData = stringData + QString::number(qso->getLogId()); } else { //qDebug() << "DataProxy_SQLite::addQSO: No LogNumber" << QT_ENDL; return -2; } stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "DataProxy_SQLite::addQSO: Query NOK" << QT_ENDL; //qDebug() << "DataProxy_SQLite::addQSO: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataProxy_SQLite::addQSO: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return -1; } else { //qDebug() << "DataProxy_SQLite::addQSO: Query OK" << QT_ENDL; } //qDebug() << "DataProxy_SQLite::addQSO: " << stringQuery << QT_ENDL; return getLastQSOid(); //return 1; } klog-1.8.6/tipsdialog.h0000644000175000017500000000545014166020407013756 0ustar develdevel#ifndef TIPSDIALOG_H #define TIPSDIALOG_H /*************************************************************************** tipsdialog.h - description ------------------- begin : sept 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "klogdefinitions.h" class TipsDialog : public QDialog { Q_OBJECT public: explicit TipsDialog(QWidget *parent = nullptr); ~TipsDialog(); void setSeverity(const DebugLogLevel _sev); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void fillInQSOSignal(); void fillInDXCCSignal(); void findQSL2QSOSignal(); void fileExportToPrintSignal(); //void fileExportForLoTWSignal(); void fileOpenKLogFolderSignal(); void toolSendPendingQSLSignal(); void toolRecPendingQSLSignal(); void toolRecRecPendingQSLSignal(); void toolsUploadLoTWSignal(); private slots: void slotPrevButtonClicked(); void slotNextButtonClicked(); void slotLinkActivated(const QString &_link); private: void setTip(const int _t); QLabel *tipTextQLabel; //QTextEdit *tipTextEdit; QWidget *tip; DebugLogLevel logSeverity; int tipId, tipMax; QString description; }; #endif // TIPSDIALOG_H klog-1.8.6/startwizard.h0000644000175000017500000001135614166020407014177 0ustar develdevel#ifndef STARTWIZARD_H #define STARTWIZARD_H /*************************************************************************** startwizard.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include #include #include #include #include "downloadcty.h" class FileOrMemoryPage; class CTYPage; class StartWizard : public QWizard { Q_OBJECT public: enum { Page_Intro, Page_Lic, Page_Mem, Page_CTY }; StartWizard(const QString &_klogDir, const QString &_softVersion, QWidget *parent = nullptr); void setVersion(const QString &tversion); //~StartWizard(); protected: private slots: void slotCancelWizard(); void slotRunInMemory(bool checked); void slotButtonFinishedClicked(); private: FileOrMemoryPage *fileOrMemoryPage; CTYPage *ctyPage; QString version; bool inMemory; QString klogDir; }; class IntroPage : public QWizardPage { Q_OBJECT public: IntroPage(QWidget *parent = nullptr); int nextId() const; private: QLabel *topLabel; QTextEdit *welcomeBrowser; }; class LicPage : public QWizardPage { Q_OBJECT public: LicPage(QWidget *parent = nullptr); //void setNextButtonActive(const bool _active); int nextId() const; private: QLabel *topLabel; QTextEdit *licenseBrowser; QCheckBox *aceptLicCheckBox; }; /* class FileOrMemoryPage : public QWizardPage { Q_OBJECT public: FileOrMemoryPage(QWidget *parent = 0); int nextId() const; //int nextId() const; private slots: void slotRunningModeSelectedFile(bool checked); void slotRunningModeSelectedMemory(bool checked); signals: void exeInMemory(const bool mem); private: bool downloadCTYFile(); QLabel *topLabel; QCheckBox *memoryQCheckbox; QCheckBox *fileQCheckbox; bool runInMemory; }; */ class CTYPage : public QWizardPage { Q_OBJECT public: CTYPage(const QString &_klogDir, const QString &_version, QWidget *parent = nullptr); void updateProgress (qint64 v,qint64 t); private slots: /* void slotCTYCheckButtonTogled(int state); void slotDownloadCTY(bool checked); void slotDownloadFinished(); void slotValueReturnedFromDownload(int value); void slotDownloadButtonClicked(); */ void slotUpdateDownloadProgress(qint64 received, qint64 total); void slotDownloadButtonClicked(); void slotIgnoreDownloadButtonClicked(); void slotDownloadFinished(const int ret); void slotDownloadError(const int ret); void slotStopProgressBar(); signals: void downloadTheFileSignal(const bool mem); private: bool prepareTheDownload(); bool doTheDownload(); //bool isComplete(); bool downloadCTYFile, CTYFileDownloaded; int downloadValueResult; //QString klogDir; int total; //bool completed; DownLoadCTY *dl; QLabel *topLabel; QTextEdit *ctyBrowser; QCheckBox *downloadCTYCheckBox; QProgressBar *progressBar; QPushButton *downloadButton, *ignoreDownloadButton; QCheckBox *hiddenCheckBox; }; #endif // STARTWIZARD_H klog-1.8.6/infowidget.h0000644000175000017500000000666514166020407013767 0ustar develdevel#ifndef INFOWIDGET_H #define INFOWIDGET_H /*************************************************************************** infowidget.h - description ------------------- begin : ago 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the Info widget where the band, bearing, CQ & ITU zones.... are shown // #include #include #include "locator.h" #include "awards.h" #include "world.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" class InfoWidget : public QWidget { Q_OBJECT public: InfoWidget(DataProxy_SQLite *dp, QWidget *parent = 0); void createUI(); void clear(); void setCurrentLog(const int _log); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setImperialSystem (const bool _imp); void showInfo(const int _entity); void showDistanceAndBearing(const QString &_locLocal, const QString &_loc2); void showEntityInfo(const int _enti, int _cq=-1, int _itu=-1); void setLocalLocator(const QString &_loc); //MAYBE NOT NEEDED void setDXLocator(const QString &_loc); //MAYBE NOT NEEDED private: void clearBandLabels(); void clearInfoFromLocators(); QString getStyleColorToLabelFromBand(const QString &_b, const QString &_q); QLabel *bandLabel1, *bandLabel2, *bandLabel3, *bandLabel4; QLabel *bandLabel5, *bandLabel6, *bandLabel7, *bandLabel8; QLabel *bandLabel9, *bandLabel10, *bandLabel11, *bandLabel12; QLabel *continentLabel, *prefixLabel, *cqzLabel, *ituzLabel; QLabel *gradShortLabel, *distShortLabel; QLabel *gradLongLabel, *distLongLabel; QLabel *distShortLabelN; QLabel *distLongLabelN; Awards *awards; DataProxy_SQLite *dataProxy; Locator *locator; World *world; int currentLog; bool imperialSystem; QString dxLocator, localLocator; }; #endif // INFOWIDGET_H klog-1.8.6/lotwutilities.cpp0000644000175000017500000007011014166020407015066 0ustar develdevel/*************************************************************************** lotwutilities.cpp - description ------------------- begin : apr 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "lotwutilities.h" #include #include #include #include //#include LoTWUtilities::LoTWUtilities(const QString &_klogDir, const QString &_klogVersion, const QString &_parentFunction, DataProxy_SQLite *dp) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _klogDir << " - " << _parentFunction; #else #endif dataProxy = dp; calendar = new QCalendarWidget; util = new Utilities; manager = new QNetworkAccessManager(this); reply = nullptr; file = new QFile; //url = new QUrl; klogDir = _klogDir; klogVersion = _klogVersion; downloadAborted = false; stationCallsign.clear(); startDate.clear(); lotwQuery.clear(); lotwUser.clear(); lotwPassword.clear(); fileName = "lotwDownload.adi"; pDialog = new QProgressDialog(nullptr); pDialog->cancel(); firstDate = QDate::currentDate(); calendar->setToolTip(tr("Double click on the date that you want to use as the start date for downloading QSOs.")); connect(calendar, SIGNAL(activated(QDate)), this, SLOT(slotCalendarDateSelected(QDate))); //qDebug() << "LoTWUtilities::LoTWUtilities(): - END" << QT_ENDL; } LoTWUtilities::~LoTWUtilities() { //qDebug() << "LoTWUtilities::~LoTWUtilities" << QT_ENDL; } void LoTWUtilities::slotCalendarDateSelected(const QDate _d) { //qDebug() << "LoTWUtilities::slotCalendarDateSelected: " << _d.toString("yyyyMMdd") << QT_ENDL; firstDate = _d; startThefullDownload(); } void LoTWUtilities::setFileName(const QString &_fn) { //qDebug() << "LoTWUtilities::setFileName: " << _fn << QT_ENDL; if (_fn.length()>0) { fileName = _fn; } //qDebug() << "LoTWUtilities::setFileName - END" << QT_ENDL; } QString LoTWUtilities::getFileName() { //qDebug() << "LoTWUtilities::getFileName: " << fileName << QT_ENDL; return fileName; } bool LoTWUtilities::selectQuery(const int _queryId) { //qDebug() << "LoTWUtilities::selectQuery: - Start: " << QString::number(_queryId) << QT_ENDL; bool savePassword = true; if (lotwPassword.length()<1) { savePassword = false; bool ok; lotwPassword = QInputDialog::getText(nullptr, tr("KLog - LoTW password needed"), tr("Please enter your LoTW password: "), QLineEdit::Password, "", &ok); if (!ok) { //qDebug() << "LoTWUtilities::selectQuery: - END 1" << QT_ENDL; return false; } } switch (_queryId) { case 1: // Normal query lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(startDate); break; case 2: lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(firstDate.toString("yyyyMMdd")); break; default: { lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(startDate); } } if (!savePassword) {// We delete the password as soon as possible if the user is not willing to save it lotwPassword = QString(); } url = QUrl(lotwQuery); //qDebug() << "LoTWUtilities::selectQuery: - END" << QT_ENDL; return true; } bool LoTWUtilities::setStationCallSign(const QString &_call) { //qDebug() << "LoTWUtilities::setStationCallSign: " << _call << QT_ENDL; if (!util->isValidCall(_call)) { //qDebug() << "LoTWUtilities::setStationCallSign: FALSE 1" << QT_ENDL; return false; } if (((dataProxy->getStationCallSignsFromLog(-1)).contains(_call))) { //qDebug() << "LoTWUtilities::setStationCallSign: TRUE" << QT_ENDL; stationCallsign = _call; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << "LoTWUtilities::setStationCallSign: Date: " << startDate << QT_ENDL; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << "LoTWUtilities::setStationCallSign: StartDate" << startDate << QT_ENDL; } else { startDate.clear(); //qDebug() << "LoTWUtilities::setStationCallSign: StartDate not valid Date" << QT_ENDL; //qDebug() << Q_FUNC_INFO << "False 2 - END"; return false; } //qDebug() << "LoTWUtilities::setStationCallSign: startDate: " << startDate << QT_ENDL; //qDebug() << Q_FUNC_INFO << "True 1 - END"; return true; } else if (dataProxy->getHowManyQSOInLog(-1) <1) { //qDebug() << "LoTWUtilities::setStationCallSign:TRUE Empty log" << QT_ENDL; stationCallsign = _call; //qDebug() << Q_FUNC_INFO << "True 2 - END"; return true; } else { //qDebug() << "LoTWUtilities::setStationCallSign: Not a single QSO in the log with that StationCallsign: " << stationCallsign << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Station callsign")); QString aux = QString(tr("There is not a single QSO in the log with that station callsign.") ); msgBox.setText(tr("Are you sure that you want to use that station callsign (%1)?").arg(_call)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { stationCallsign = _call; //qDebug() << Q_FUNC_INFO << "True 3 - END"; return true; } else { //qDebug() << "LoTWUtilities::setStationCallSign: FALSE 2" << QT_ENDL; //qDebug() << Q_FUNC_INFO << "FALSE 3 - END"; return false; } } } void LoTWUtilities::startRequest(QUrl url) { //qDebug() << "LoTWUtilities::startRequest: " << url.toString() << QT_ENDL; QByteArray agent = QString("KLog-" + klogVersion).toUtf8(); QNetworkRequest request; request.setUrl(url); request.setHeader(QNetworkRequest::UserAgentHeader, agent); //request.setRawHeader("User-Agent", agent); //reply = manager->get(QNetworkRequest(url)); reply = manager->get(request); //qDebug() << "LoTWUtilities::startRequest - 10" << QT_ENDL; // Whenever more data is received from the network, // this readyRead() signal is emitted connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); // Also, downloadProgress() signal is emitted when data is received connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(slotDownloadProgress(qint64))); // This signal is emitted when the reply has finished processing. // After this signal is emitted, // there will be no more updates to the reply's data or metadata. connect(reply, SIGNAL(finished()), this, SLOT(slotFinished())); //qDebug() << "LoTWUtilities::startRequest: - END" << QT_ENDL; } int LoTWUtilities::download() { //qDebug() << "LoTWUtilities::download - Start" << QT_ENDL; if (!selectQuery(-1)) { //qDebug() << "LoTWUtilities::download - END-1" << QT_ENDL; return -1; } //qDebug() << "LoTWUtilities::download: - 10" << QT_ENDL; QFileInfo fileInfo(url.path()); //qDebug() << "LoTWUtilities::download: - 11" << QT_ENDL; if (QFile::exists(fileName)) { //qDebug() << "LoTWUtilities::download: - 12" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW File already exists")); QString aux = QString(tr("There is a file already existing with the name that will be used.") ); msgBox.setText(tr("The file %1 already exist. Do you want to overwrite?").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); //qDebug() << "LoTWUtilities::download: - 13" << QT_ENDL; if (ret == QMessageBox::No) { //qDebug() << "LoTWUtilities::download - END- 2" << QT_ENDL; return -2; } } //qDebug() << "LoTWUtilities::download: - 20 Filename: -" << fileName << "-" << QT_ENDL; if (!file->isOpen()) { //qDebug() << "LoTWUtilities::download: - 21 Filename: -" << QT_ENDL; file->setFileName(fileName); //qDebug() << "LoTWUtilities::download: - 22 Filename: -" << QT_ENDL; } //qDebug() << "LoTWUtilities::download: - 23 Filename: -" << QT_ENDL; if (!file->open(QIODevice::WriteOnly)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Can't write the file")); QString aux = QString(tr("KLog was not able to save the file %1.\nError returned: %2") ).arg(fileName).arg(file->errorString()); msgBox.setText(tr("The file %1 already exists.").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //file->close(); //delete file; //file = nullptr; //qDebug() << "LoTWUtilities::download - END - 3" << QT_ENDL; return -3; } //qDebug() << "LoTWUtilities::download: - 30" << QT_ENDL; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << "LoTWUtilities::download: - 31" << QT_ENDL; //progressDialog = new QProgressDialog(nullptr); //qDebug() << "LoTWUtilities::download: - 40" << QT_ENDL; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << "LoTWUtilities::download: - 41" << QT_ENDL; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << "LoTWUtilities::download: - 42" << QT_ENDL; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << "LoTWUtilities::download: - 43" << QT_ENDL; pDialog->reset(); //qDebug() << "LoTWUtilities::download: - 44" << QT_ENDL; pDialog->setRange(0, 0); //qDebug() << "LoTWUtilities::download: - 45" << QT_ENDL; pDialog->setMinimumDuration(0); //qDebug() << "LoTWUtilities::download: - 46" << QT_ENDL; pDialog->show(); //qDebug() << "LoTWUtilities::download: - 47" << QT_ENDL; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << "LoTWUtilities::download: - 50" << QT_ENDL; startRequest(url); //qDebug() << "LoTWUtilities::download - END" << QT_ENDL; return 1; } int LoTWUtilities::fullDownload() { //qDebug() << "LoTWUtilities::fullDownload" << QT_ENDL; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << "LoTWUtilities::fullDownload: Date: " << startDate << QT_ENDL; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << "LoTWUtilities::fullDownload: StartDate" << startDate << QT_ENDL; } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Start date selection")); QString aux = QString(tr("This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No.").arg(stationCallsign) ); msgBox.setText(tr("Do you want to use this date (%1) as start date?").arg(startDate)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { //qDebug() << "LoTWUtilities::fulldownload - Yes" << QT_ENDL; firstDate = date; startThefullDownload(); return 1; } calendar->setSelectedDate(firstDate); calendar->setGridVisible(true); calendar->setMaximumDate(QDate::currentDate()); calendar->show(); //qDebug() << "LoTWUtilities::fullDownload - END" << QT_ENDL; return 2; } int LoTWUtilities::startThefullDownload() { //qDebug() << "LoTWUtilities::startThefulldownload - Start" << QT_ENDL; if (calendar->isVisible()) { calendar->close(); } if (!selectQuery(2)) { //qDebug() << "LoTWUtilities::startThefulldownload - END-1" << QT_ENDL; return -1; } //qDebug() << "LoTWUtilities::startThefulldownload: - 10" << QT_ENDL; QFileInfo fileInfo(url.path()); //qDebug() << "LoTWUtilities::startThefulldownload: - 11" << QT_ENDL; if (QFile::exists(fileName)) { //qDebug() << "LoTWUtilities::startThefulldownload: - 12" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW File already exists")); QString aux = QString(tr("There is a file already existing with the name that will be used.") ); msgBox.setText(tr("The file %1 already exist. Do you want to overwrite?").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); //qDebug() << "LoTWUtilities::startThefulldownload: - 13" << QT_ENDL; if (ret == QMessageBox::No) { //qDebug() << "LoTWUtilities::startThefulldownload - END- 2" << QT_ENDL; return -2; } } //qDebug() << "LoTWUtilities::startThefulldownload: - 20 Filename: -" << fileName << "-" << QT_ENDL; if (!file->isOpen()) { //qDebug() << "LoTWUtilities::startThefulldownload: - 21 Filename: -" << QT_ENDL; file->setFileName(fileName); //qDebug() << "LoTWUtilities::startThefulldownload: - 22 Filename: -" << QT_ENDL; } //qDebug() << "LoTWUtilities::startThefulldownload: - 23 Filename: -" << QT_ENDL; if (!file->open(QIODevice::WriteOnly)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Can't write the file")); QString aux = QString(tr("KLog was not able to save the file %1.\nError returned: %2") ).arg(fileName).arg(file->errorString()); msgBox.setText(tr("The file %1 already exists.").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //file->close(); //delete file; //file = nullptr; //qDebug() << "LoTWUtilities::startThefulldownload - END - 3" << QT_ENDL; return -3; } //qDebug() << "LoTWUtilities::startThefulldownload: - 30" << QT_ENDL; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << "LoTWUtilities::startThefulldownload: - 31" << QT_ENDL; //progressDialog = new QProgressDialog(nullptr); //qDebug() << "LoTWUtilities::startThefulldownload: - 40" << QT_ENDL; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << "LoTWUtilities::startThefulldownload: - 41" << QT_ENDL; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << "LoTWUtilities::startThefulldownload: - 42" << QT_ENDL; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << "LoTWUtilities::startThefulldownload: - 43" << QT_ENDL; pDialog->reset(); //qDebug() << "LoTWUtilities::startThefulldownload: - 44" << QT_ENDL; pDialog->setRange(0, 0); //qDebug() << "LoTWUtilities::startThefulldownload: - 45" << QT_ENDL; pDialog->setMinimumDuration(0); //qDebug() << "LoTWUtilities::startThefulldownload: - 46" << QT_ENDL; pDialog->show(); //qDebug() << "LoTWUtilities::startThefulldownload: - 47" << QT_ENDL; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << "LoTWUtilities::startThefulldownload: - 50" << QT_ENDL; startRequest(url); //qDebug() << "LoTWUtilities::startThefulldownload - END" << QT_ENDL; return 1; } void LoTWUtilities::slotDownloadProgress(qint64 bytesRead) { //qDebug() << "LoTWUtilities::slotDownloadProgress: " << QString::number(bytesRead) << QT_ENDL; if (downloadAborted) { //qDebug() << "LoTWUtilities::slotDownloadProgress: CANCELLED" << QT_ENDL; return; } pDialog->setValue(bytesRead); //qDebug() << "LoTWUtilities::slotDownloadProgress - END " << QT_ENDL; } void LoTWUtilities::slotReadyRead() { //qDebug() << "LoTWUtilities::slotReadyRead: " << reply->readLine() << QT_ENDL; if (file) { file->write(reply->readAll()); } //qDebug() << "LoTWUtilities::slotReadyRead - END" << QT_ENDL; } void LoTWUtilities::slotFinished() { //qDebug() << "LoTWUtilities::slotFinished - Started" << QT_ENDL; // when canceled if (downloadAborted) { if (file) { file->close(); file->remove(); //delete file; //file = nullptr; } //reply->deleteLater(); pDialog->cancel(); reply->close(); //qDebug() << "LoTWUtilities::slotFinished - END Canceled" << QT_ENDL; return; } //qDebug() << "LoTWUtilities::slotFinished - 10" << QT_ENDL; // download finished normally pDialog->cancel(); //qDebug() << "LoTWUtilities::slotFinished - 11" << QT_ENDL; file->flush(); //qDebug() << "LoTWUtilities::slotFinished - 12" << QT_ENDL; file->close(); //qDebug() << "LoTWUtilities::slotFinished - 13" << QT_ENDL; // get redirection url QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); //qDebug() << "LoTWUtilities::slotFinished - 14" << QT_ENDL; if (reply->error()) { file->remove(); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Download error")); QString aux; msgBox.setText(tr("There was an error (%1) while downloading the file from LoTW.").arg(QString::number(reply->error()))); aux = QString(tr("The downloading error details are: %1") ).arg(reply->errorString()); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else if (!redirectionTarget.isNull()) { //qDebug() << "LoTWUtilities::slotFinished - Redirection" << QT_ENDL; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Redirection found")); QString aux = QString(tr("The remote server redirected our connection to %1") ).arg(newUrl.toString()); msgBox.setText(tr("Do you want to follow the redirection?")); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { url = newUrl; //reply->deleteLater(); file->open(QIODevice::WriteOnly); /* Flawfinder: ignore */ file->resize(0); startRequest(url); //qDebug() << "LoTWUtilities::slotFinished - END-1" << QT_ENDL; return; } } else { //qDebug() << "LoTWUtilities::slotFinished: " << QT_ENDL; } //qDebug() << "LoTWUtilities::slotReadyRead - Going to parse ..." << QT_ENDL; parseDownloadedFile(file->fileName()); //qDebug() << "LoTWUtilities::slotReadyRead - END" << QT_ENDL; } void LoTWUtilities::slotCancelDownload() { //qDebug() << "LoTWUtilities::slotCancelDownload - Start" << QT_ENDL; downloadAborted = true; reply->abort(); //qDebug() << "LoTWUtilities::slotCancelDownload - END" << QT_ENDL; } void LoTWUtilities::setUser(const QString &_call) { //qDebug() << "LoTWUtilities::setUser: " << _call << QT_ENDL; lotwUser = _call; //qDebug() << "LoTWUtilities::setUser: END" << QT_ENDL; } void LoTWUtilities::setPass(const QString &_pass) { //qDebug() << "LoTWUtilities::setPass: " << _pass << QT_ENDL; lotwPassword = _pass; //qDebug() << "LoTWUtilities::setPass: END" << QT_ENDL; } bool LoTWUtilities::getIsReady() { //qDebug() << "LoTWUtilities::getIsReady: user/station: -" << lotwUser <<"/" << stationCallsign << "-" << QT_ENDL; if ((lotwUser.length()>1) && (stationCallsign.length()>1)) { //qDebug() << "LoTWUtilities::getIsReady: true" << QT_ENDL; return true; } else { //qDebug() << "LoTWUtilities::getIsReady: false" << QT_ENDL; return false; } } void LoTWUtilities::parseDownloadedFile(const QString &_fn) { //qDebug() << "LoTWUtilities::parseDownloadedFile: " << _fn << QT_ENDL; QString _fileName = _fn; QMessageBox msgBox; QString aux; QFile file( _fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "LoTWUtilities::parseDownloadedFile File not found" << _fileName << QT_ENDL; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW File not found")); msgBox.setText(tr("KLog can't find the downloaded file.")); aux = QString(tr("It was not possible for find the file %1 that has been just downloaded.") ).arg(_fn); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "LoTWUtilities::parseDownloadedFile: END-1" << QT_ENDL; return ; } else { //qint64 startOfFile = file.pos(); // Look for a Header bool hasHeader = false; int numQSO = 0; QString Lotw_owncall = QString("OWNCALL: %1").arg(stationCallsign.toUpper()); //bool hasOwnCall = false; //bool hasProgramID = false; bool userPasswordError = false; while ((!file.atEnd()) && (!hasHeader)) { QByteArray line = file.readLine(); QString lineU = line.toUpper(); //qDebug() << "LoTWUtilities::parseDownloadedFile: lineU: " << lineU << QT_ENDL; if (lineU.contains("")) { //qDebug() << "LoTWUtilities::parseDownloadedFile: EOH found" << QT_ENDL; hasHeader = true; } //else if (lineU.contains("LOTW")) //{ // //qDebug() << "LoTWUtilities::parseDownloadedFile: ProgramID found" << QT_ENDL; // hasProgramID = true; //} //else if (lineU.contains(Lotw_owncall)) //{ // //qDebug() << "LoTWUtilities::parseDownloadedFile: OWNCALL found" << QT_ENDL; // hasOwnCall = true; //} else if (lineU.contains("', QT_SKIP); numQSO = (data.at(1)).toInt(); //qDebug() << "LoTWUtilities::parseDownloadedFile: QSOs: " << QString::number(numQSO) << QT_ENDL; } else if (lineU.contains("USERNAME/PASSWORD INCORRECT")) { userPasswordError = true; } } // WE HAVE JUST FINISHED TO READ THE HEADER OR THE FILE, IF IT IS NOT AN ADIF if (!hasHeader || (numQSO<1)) { //qDebug() << "LoTWUtilities::parseDownloadedFile Header not found" << _fileName << QT_ENDL; QString aux; if (userPasswordError) { msgBox.setWindowTitle(tr("KLog - LoTW user/password error")); msgBox.setText(tr("LoTW server did not recognized your user/password")); aux = QString(tr("Check your user and password and ensure your are using the right one before trying again.") ); } else if(numQSO<1) { msgBox.setWindowTitle(tr("KLog - LoTW No QSOs ")); msgBox.setText(tr("LoTW sent no QSOs")); aux = QString(tr("It seems that LoTW has no QSO with the Station Callsign you are using (%1).") ).arg(stationCallsign); } else { msgBox.setWindowTitle(tr("KLog - LoTW Unknown error")); msgBox.setText(tr("KLog can't recognize the file that has been downloaded from LoTW.")); aux = QString(tr("Try again and send the downloaded file (%1) to the KLog developer for analysis.") ).arg(_fileName); } msgBox.setIcon(QMessageBox::Warning); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "LoTWUtilities::parseDownloadedFile: END-2" << QT_ENDL; file.remove(); return ; } msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - LoTW download")); msgBox.setText(tr("KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data?").arg(QString::number(numQSO))); aux = QString(tr("Now KLog will process the downloaded QSO and update your local log.") ); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); if (msgBox.exec() == QMessageBox::No) { //qDebug() << "LoTWUtilities::parseDownloadedFile: END-2" << QT_ENDL; return ; } //file.seek(startOfFile); emit actionProcessLoTWDownloadedFile(_fileName); } //Procesar los QSOs y meterlos en una tabla? o en un QStringList o alguna otra estructura //qDebug() << "LoTWUtilities::parseDownloadedFile - END" << QT_ENDL; } /*void LoTWUtilities::showMessage(const int _messageIcon, const QString &_msg, const QString &_msgExt) { } */ klog-1.8.6/NEWS0000644000175000017500000000017514166020407012144 0ustar develdevelLook at https://www.klog.xyz for NEWS of KLog. You can also check the Changelog file for the latest updates in the software. klog-1.8.6/klog.rc0000644000175000017500000000007314166020407012724 0ustar develdevelIDI_ICON1 ICON DISCARDABLE "klog.ico" klog-1.8.6/inputwidgets/0000755000175000017500000000000014166020421014164 5ustar develdevelklog-1.8.6/inputwidgets/mainwindowinputqsl.h0000644000175000017500000000710614166020407020321 0ustar develdevel#ifndef MAINWINDOWINPUTQSL_H #define MAINWINDOWINPUTQSL_H /*************************************************************************** mainwindowinputqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class MainWindowInputQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSL(); QString getQSLRecStatus(); QString getQSLSenStatus(); QString getSentVia(); QString getRecVia(); QString getQSLVia(); QString getQSLMsg(); void setQSLRecStatus(const QString &_qs); void setQSLSenStatus(const QString &_qs); void setQSLRecVia(const QString &_qs); void setQSLSenVia(const QString &_qs); void setQSLVia(const QString &_qs, QColor qColor=Qt::black); void setQSLMsg(const QString &_qs); QDate getQSLRecDate(); QDate getQSLSenDate(); void setQSLRecDate(const QDate _qs); void setQSLSenDate(const QDate _qs); void clear(); void qslViaClear(); signals: void returnPressed(); private slots: void slotQSLViaTextChanged(); void slotQSLSentComboBoxChanged(); void slotQSLRecvComboBoxChanged(); void slotQSLViaLineEditReturnPressed(); /* void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); */ private: void createUI(); void setDefaultData(); QComboBox *qslSentComboBox, *qslRecComboBox, *qslSentViaComboBox, *qslRecViaComboBox; QDateEdit *qslSentQDateEdit, *qslRecQDateEdit; QTextEdit *qslmsgTextEdit; QLineEdit *qslViaLineEdit; DataProxy_SQLite *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, qslViaList; QPalette palette; // To color some widgets }; #endif // MAINWINDOWINPUTQSL_H klog-1.8.6/inputwidgets/mainwindowinputqso.cpp0000644000175000017500000005161014166020421020652 0ustar develdevel/*************************************************************************** mainwindowinputqso.cpp - description ------------------- begin : may 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include "mainwindowinputqso.h" MainWindowInputQSO::MainWindowInputQSO(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputQSO::MainWindowInputQSO" << QT_ENDL; dataProxy = dp; locator = new Locator(); nameLineEdit = new QLineEdit; qthLineEdit = new QLineEdit; locatorLineEdit = new QLineEdit; rstTXLineEdit = new QLineEdit; rstRXLineEdit = new QLineEdit; txFreqSpinBox = new QDoubleSpinBox; rxFreqSpinBox = new QDoubleSpinBox; splitCheckBox = new QCheckBox; rxPowerSpinBox = new QDoubleSpinBox; dataProxy = dp; createUI(); setDefaultData(); //installEventFilter (this); clear(); //qDebug() << "MainWindowInputQSO::MainWindowInputQSO - END" << QT_ENDL; } MainWindowInputQSO::~MainWindowInputQSO() { delete(locator); } void MainWindowInputQSO::setModifying(const bool _m) { modify = _m; } void MainWindowInputQSO::createUI() { rstTXLineEdit->setToolTip(tr("TX RST.")); rstRXLineEdit->setToolTip(tr("RX RST.")); txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); rxPowerSpinBox->setToolTip(tr("Power used by the contacted station.")); nameLineEdit->setToolTip(tr("Name of the contacted operator.")); qthLineEdit->setToolTip(tr("QTH of the contacted station.")); locatorLineEdit->setToolTip(tr("Locator of the contacted station.")); rxPowerSpinBox->setDecimals(2); rxPowerSpinBox->setMaximum(9999); rxPowerSpinBox->setSuffix(" " + tr("Watts")); txFreqSpinBox->setDecimals(3); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox->setDecimals(3); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); splitCheckBox->setText(tr("Split", "Translator: Split is a common hamradio term. Do not translate unless you are sure.")); splitCheckBox->setChecked(false); QLabel *nameLabel = new QLabel(this); nameLabel->setText(tr("Name")); nameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *qthLabel = new QLabel(this); qthLabel->setText(tr("QTH")); qthLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *locLabel = new QLabel(this); locLabel->setText(tr("DX Locator")); locLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rxPowerSpinBoxLabelN = new QLabel(this); rxPowerSpinBoxLabelN->setText(tr("Power(rx)")); rxPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstTxLabelN = new QLabel(this); rstTxLabelN->setText(tr("RST(tx)")); rstTxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstRxLabelN = new QLabel(this); rstRxLabelN->setText(tr("RST(rx)")); rstRxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QGridLayout *RSTLayout = new QGridLayout; RSTLayout->addWidget(rstTxLabelN, 0, 0); RSTLayout->addWidget(rstTXLineEdit, 1, 0); RSTLayout->addWidget(rstRxLabelN, 0, 1); RSTLayout->addWidget(rstRXLineEdit, 1, 1); QVBoxLayout *qthLayout = new QVBoxLayout; qthLayout->addWidget(qthLabel); qthLayout->addWidget(qthLineEdit); QVBoxLayout *rstQTHLayout = new QVBoxLayout; rstQTHLayout->addLayout(RSTLayout); rstQTHLayout->addLayout(qthLayout); QLabel *txfreqLabelN = new QLabel(this); txfreqLabelN->setText(tr("Freq TX")); txfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); txfreqLabelN->setAlignment(Qt::AlignLeft); QLabel *rxfreqLabelN = new QLabel(this); rxfreqLabelN->setText(tr("Freq RX")); rxfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); rxfreqLabelN->setAlignment(Qt::AlignRight); QHBoxLayout *freqTitleLayout = new QHBoxLayout; freqTitleLayout->addWidget(txfreqLabelN); freqTitleLayout->addWidget(splitCheckBox); freqTitleLayout->addWidget(rxfreqLabelN); QHBoxLayout *freqDataLayout = new QHBoxLayout; freqDataLayout->addWidget(txFreqSpinBox); //freqDataLayout->addStretch(1); freqDataLayout->addWidget(rxFreqSpinBox); QVBoxLayout *freqLayout = new QVBoxLayout; freqLayout->addLayout(freqTitleLayout); freqLayout->addLayout(freqDataLayout); QVBoxLayout *locVLayout = new QVBoxLayout; locVLayout->addWidget(locLabel); locVLayout->addWidget(locatorLineEdit); QVBoxLayout *freqLocLayout = new QVBoxLayout; freqLocLayout->addLayout(freqLayout); freqLocLayout->addLayout(locVLayout); QHBoxLayout *rstfreqLayout = new QHBoxLayout; rstfreqLayout->addLayout(rstQTHLayout); rstfreqLayout->addLayout(freqLocLayout); QVBoxLayout *rxPowerLayout = new QVBoxLayout; rxPowerLayout->addWidget(rxPowerSpinBoxLabelN); rxPowerLayout->addWidget(rxPowerSpinBox); QVBoxLayout *nameLayout = new QVBoxLayout; nameLayout->addWidget(nameLabel); nameLayout->addWidget(nameLineEdit); QVBoxLayout *rxPwrLayout = new QVBoxLayout; rxPwrLayout->addWidget(rxPowerSpinBoxLabelN); rxPwrLayout->addWidget(rxPowerSpinBox); QHBoxLayout *namePwrHLayout = new QHBoxLayout; namePwrHLayout->addLayout(nameLayout); namePwrHLayout->addLayout(rxPwrLayout); QVBoxLayout *namePwrLayout = new QVBoxLayout; namePwrLayout->addStretch(1); namePwrLayout->addLayout(namePwrHLayout); namePwrLayout->addStretch(5); QVBoxLayout *qsoInputTabWidgetMainLayout = new QVBoxLayout; qsoInputTabWidgetMainLayout->addLayout(rstfreqLayout); qsoInputTabWidgetMainLayout->addLayout(namePwrLayout); //qsoInputTabWidgetMainLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(qsoInputTabWidgetMainLayout); connect(rstTXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(rstRXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(qthLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLocatorTextChanged() ) ); connect(txFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqTXChanged(double)) ) ; connect(rxFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqRXChanged(double)) ) ; connect(splitCheckBox, SIGNAL(clicked()), this, SLOT(slotSplitClicked()) ) ; QWidget::setTabOrder (rstTXLineEdit, rstRXLineEdit); QWidget::setTabOrder (rstRXLineEdit, nameLineEdit); QWidget::setTabOrder (nameLineEdit, qthLineEdit); QWidget::setTabOrder (qthLineEdit, locatorLineEdit); QWidget::setTabOrder (locatorLineEdit, rxPowerSpinBox); } void MainWindowInputQSO::setDefaultData() { palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); rxFreqBeingAutoChanged = false; txFreqBeingAutoChanged = false; isSATPropagation = false; propMode = QString(); freqTX = 0.0; freqRX = 0.0; modify = false; } void MainWindowInputQSO::clear() { //qDebug() << Q_FUNC_INFO ; qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); rxPowerSpinBox->setValue(0); modify = false; } void MainWindowInputQSO::cleanQRZCOM() { //qDebug() << Q_FUNC_INFO ; qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); } void MainWindowInputQSO::clearName() { nameLineEdit->clear(); } void MainWindowInputQSO::clearQTH() { qthLineEdit->clear(); } void MainWindowInputQSO::clearDXLocator() { //qDebug() << Q_FUNC_INFO ; locatorLineEdit->clear (); } void MainWindowInputQSO::slotReturnPressed() { emit returnPressed(); } void MainWindowInputQSO::slotLocatorTextChanged() {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << Q_FUNC_INFO << ": " << locatorLineEdit->text() << QT_ENDL; int cursorP = locatorLineEdit->cursorPosition(); locatorLineEdit->setText((util->getClearSQLi(locatorLineEdit->text())).toUpper()); if ( locator->isValidLocator((locatorLineEdit->text()).toUpper()) || locatorLineEdit->text ().isEmpty ()) { //qDebug() << Q_FUNC_INFO << ": VALID: " << locatorLineEdit->text() << QT_ENDL; setPaletteRightDXLocator(true); emit dxLocatorChanged (locatorLineEdit->text()); //dxLocator = (locatorLineEdit->text()); //infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), dxLocator); //satTabWidget->setLocator(dxLocator); locatorLineEdit->setToolTip(tr("DX QTH locator.")); //qDebug() << Q_FUNC_INFO << ": " << locator->getLat(locatorLineEdit->text()) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": LON: " << locator->getLon(locatorLineEdit->text()) << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << ": NOT VALID: " << locatorLineEdit->text() << QT_ENDL; setPaletteRightDXLocator(false); locatorLineEdit->setToolTip(tr("DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters.")); locatorLineEdit->setCursorPosition(cursorP); return; } locatorLineEdit->setCursorPosition(cursorP); } QString MainWindowInputQSO::getDXLocator() { //qDebug() << Q_FUNC_INFO << " - returning: " << locatorLineEdit->text (); return locatorLineEdit->text(); } void MainWindowInputQSO::setDXLocator(const QString &_loc) { //qDebug() << Q_FUNC_INFO << ": " << _loc; if (locator->isValidLocator (_loc)) { locatorLineEdit->setText (_loc.toUpper ()); } } QString MainWindowInputQSO::getName() { return nameLineEdit->text (); } void MainWindowInputQSO::setName(const QString &_st) { nameLineEdit->setText (_st); } double MainWindowInputQSO::getTXFreq() { return txFreqSpinBox->value(); } void MainWindowInputQSO::setTXFreq(const double _ft) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_ft) << QT_ENDL; if ( (_ft >= double(0)) && (_ft <= txFreqSpinBox->maximum())) { //qDebug() << Q_FUNC_INFO << ": defining FR: " << QString::number(_ft) << QT_ENDL; txFreqSpinBox->setValue(_ft); } else { //qDebug() << Q_FUNC_INFO << ": defining FR: 0" << QT_ENDL; txFreqSpinBox->setValue(0); } //qDebug() << Q_FUNC_INFO << QT_ENDL; } double MainWindowInputQSO::getRXFreq() { return rxFreqSpinBox->value(); } void MainWindowInputQSO::setRXFreq(const double _ft) { if ( (_ft >= double(0)) && (_ft <= rxFreqSpinBox->maximum())) { rxFreqSpinBox->setValue(_ft); } else { rxFreqSpinBox->setValue(0); } } double MainWindowInputQSO::getRXPwr() { return rxPowerSpinBox->value(); } void MainWindowInputQSO::setRXPwr(const double _pw) { if (_pw>=0) { rxPowerSpinBox->setValue(_pw); } } QString MainWindowInputQSO::getQTH() { return qthLineEdit->text(); } void MainWindowInputQSO::setQTH(const QString &_st) { qthLineEdit->setText(_st); } QString MainWindowInputQSO::getRSTTX() { return rstTXLineEdit->text(); } void MainWindowInputQSO::setRSTTX(const QString &_st) { rstTXLineEdit->setText (_st); } QString MainWindowInputQSO::getRSTRX() { return rstRXLineEdit->text(); } void MainWindowInputQSO::setRSTRX(const QString &_st) { rstRXLineEdit->setText (_st); } void MainWindowInputQSO::setRSTToMode(const QString &_m, const bool _reading) { //qDebug() << Q_FUNC_INFO << ": " << _m ; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") || (_m == "FM") || (_m == "AM") ) { //qDebug() << Q_FUNC_INFO << ": Detected SSB/LSB/USB" << QT_ENDL; rstTXLineEdit->setInputMask("#DD"); rstRXLineEdit->setInputMask("#DD"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(2); rstRXLineEdit->setMaxLength(2); } else if ((_m == "CW") || (_m == "RTTY")) { rstTXLineEdit->setInputMask("DDD"); rstRXLineEdit->setInputMask("DDD"); //rstTXLineEdit->setText("599"); //rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(3); rstRXLineEdit->setMaxLength(3); } else if (_m == "PSK31") { rstTXLineEdit->setInputMask("#DD0"); rstRXLineEdit->setInputMask("#DD0"); //rstTXLineEdit->setText("599"); //rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } else if ( (_m.contains("FT", Qt::CaseInsensitive)) || (_m.contains("JT", Qt::CaseInsensitive)) || (_m.contains("QRA64", Qt::CaseInsensitive)) || (_m.contains("JS", Qt::CaseInsensitive))) { rstTXLineEdit->setInputMask("#99"); rstRXLineEdit->setInputMask("#99"); //rstTXLineEdit->setText("0"); //rstRXLineEdit->setText("0"); rstTXLineEdit->setMaxLength(3); rstRXLineEdit->setMaxLength(3); } else { // By default SSB RST is configured but anything could be added rstTXLineEdit->setInputMask("#xxx"); rstRXLineEdit->setInputMask("#xxx"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } if (!_reading) { //qDebug() << Q_FUNC_INFO << ": reading the UI" << QT_ENDL; rstTXLineEdit->setText(util->getDefaultRST(_m)); rstRXLineEdit->setText(util->getDefaultRST(_m)); } } bool MainWindowInputQSO::getDarkMode() { if (nameLineEdit->palette().color(QPalette::Base) == "#646464") { return true; } else { return false; } } void MainWindowInputQSO::setPaletteRightName(const bool _ok) { if (_ok) { if (getDarkMode()) { nameLineEdit->setPalette (palWhite); } else { nameLineEdit->setPalette (palBlack); } } else { nameLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightQTH(const bool _ok) { if (_ok) { if (getDarkMode()) { qthLineEdit->setPalette (palWhite); } else { qthLineEdit->setPalette (palBlack); } } else { qthLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightDXLocator(const bool _ok) { if (_ok) { if (getDarkMode()) { locatorLineEdit->setPalette (palWhite); } else { locatorLineEdit->setPalette (palBlack); } } else { locatorLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPropModeFromSat(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p << QT_ENDL; propMode = _p; if (propMode == "SAT") { splitCheckBox->setChecked (true); } else { splitCheckBox->setChecked (false); } } void MainWindowInputQSO::slotFreqTXChanged (double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f) << QT_ENDL; if (util->isSameFreq (_f, freqTX)) { //qDebug() << Q_FUNC_INFO << ": Same Freq return" << QT_ENDL; return; } freqTX = _f; int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); if (getDarkMode()) { txFreqSpinBox->setPalette(palWhite); } else { txFreqSpinBox->setPalette(palBlack); } //qDebug() << Q_FUNC_INFO << ": emitting: " << QString::number(_f) << QT_ENDL; emit txFreqChanged (_f); } else { txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.\nFrequency is not in a hamradio band!")); txFreqSpinBox->setPalette(palRed); //qDebug() << Q_FUNC_INFO << ":RED - Not in band " << QT_ENDL; } if ((!splitCheckBox->isChecked()) || modify ) { rxFreqSpinBox->setValue (_f); //qDebug() << Q_FUNC_INFO << ": copying to RX Freq " << QT_ENDL; } //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; setSplitCheckBox(); } void MainWindowInputQSO::slotSplitClicked() { if ((!splitCheckBox->isChecked()) ) { rxFreqSpinBox->setValue(txFreqSpinBox->value()); } } void MainWindowInputQSO::slotFreqRXChanged(double _f) { if (util->isSameFreq (_f, freqRX)) { return; } freqRX = _f; int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band if (getDarkMode()) { rxFreqSpinBox->setPalette(palWhite); } else { rxFreqSpinBox->setPalette(palBlack); } rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); emit rxFreqChanged(rxFreqSpinBox->value()); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqRXChanged Freq is not in ANY ham band" << QT_ENDL; } if ((!splitCheckBox->isChecked()) && !modify) { txFreqSpinBox->setValue (_f); } /* int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band rxFreqSpinBox->setPalette(palBlack); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); emit rxFreqChanged(rxFreqSpinBox->value()); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqRXChanged Freq is not in ANY ham band" << QT_ENDL; } if (!rxFreqBeingAutoChanged) { //qDebug() << "MainWindow::slotFreqTXChanged: Updating SAT Downlink" << QT_ENDL; emit rxFreqChangedForSat(rxFreqSpinBox->value()); } */ //qDebug() << "MainWindow::slotFreqRXChanged: END" << QT_ENDL; setSplitCheckBox(); } void MainWindowInputQSO::setSplitCheckBox() { if (util->isSameFreq(txFreqSpinBox->value(), rxFreqSpinBox->value())) { splitCheckBox->setChecked(false); } else { splitCheckBox->setChecked(true); } } void MainWindowInputQSO::receiveFocus() { //qDebug() << Q_FUNC_INFO; rstTXLineEdit->setFocus (); } bool MainWindowInputQSO::eventFilter (QObject *object, QEvent *event) { if (!(event->type() == QEvent::Paint )) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(event->type ()); } if ((event->type() == QEvent::KeyPress) || (event->type() == QEvent::ShortcutOverride)) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED"; QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB"; if (rxPowerSpinBox->hasFocus()) { //qDebug() << Q_FUNC_INFO << "emitting to hand over to mainQSO Input"; emit handOverFocusSignal(); } // special tab handling here return true; } } return QWidget::event(event); } klog-1.8.6/inputwidgets/mainwindowinputcomment.h0000644000175000017500000000471114166020407021163 0ustar develdevel#ifndef MAINWINDOWINPUTCOMMENT_H #define MAINWINDOWINPUTCOMMENT_H /*************************************************************************** mainwindowminputcomment.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Comment // #include #include class MainWindowInputComment : public QWidget { Q_OBJECT public: explicit MainWindowInputComment(QWidget *parent = nullptr); ~MainWindowInputComment(); void createUI(); void setData(const QString &_comment); QString getComment(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setKeep(const bool _b); bool getKeep(); private: QString comment; QLineEdit *commentLineEdit; QCheckBox *keepThisDataForNextQSOQCheckbox; }; #endif // MAINWINDOWINPUTCOMMENT_H klog-1.8.6/inputwidgets/mainwindowsattab.h0000644000175000017500000001210314166020407017711 0ustar develdevel#ifndef MAINWINDOWSATTAB_H #define MAINWINDOWSATTAB_H /*************************************************************************** mainwindowsattab.h - description ------------------- begin : jan 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports Satellites // #include #include #include "../dataproxy_sqlite.h" #include "../locator.h" #include "../utilities.h" class MainWindowSatTab : public QWidget { Q_OBJECT public: explicit MainWindowSatTab(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowSatTab(); QString getSatName(); void setSatName(const QString &_t); void setOtherSatName(const QString &_t); void setNoSat(); QString getOtherSatName(); QString getSatMode(); double getRXFreq(); void setSatMode(const QString &_t); bool getRepeatThis(); void setRepeatThis(const bool _t); void addBands(QStringList _bands); void setDefaultBands(); //Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist in the selected bands void setUpLinkFreq(const double _t); void setDownLinkFreq(const double _t); void setLocator(const QString &_t); void refreshData(); void setModifying (const bool _m); void setKeep(const bool _b); bool getKeep(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything signals: void setPropModeSat(const QString &_p, const bool _keep); //void satBandTXChanged(const QString &_p); //void satBandRXChanged(const QString &_p); void newBandsToBeAdded(const QStringList _p); void satTxFreqChanged(const double _p); void satRxFreqChanged(const double _p); void satTXFreqNeeded(const double _p); void satRXFreqNeeded(const double _p); void dxLocatorChanged(const QString &_p); void returnPressed(); private slots: void slotSatNameTextChanged(); void slotSatModeTextChanged(); void slotSatDXLocTextChanged(); void slotSatNameComboBoxChanged(); void slotSatBandRXComboBoxChanged(); void slotSatBandTXComboBoxChanged(); void slotSatFreqRXChanged(const double _f); void slotSatFreqTXChanged(const double _f); void slotReturnPressed(); void slotSatKeepThisDataClicked(); private: void createUI(); void populateSatComboBox(); void setSatelliteCombo(const QString &_p); int getSatIndex(const QString &_p); void setBandsOfSat(const QString &_p); void addNewBand(const QString &_p); void setUpLink(const QString &_t); QString bandToLetter(const QString &_band); void autofillSatMode(); QLineEdit *satNameLineEdit; QLineEdit *satModeLineEdit; QLineEdit *satDXLocatorLineEdit; QLabel *satOtherLabel; QCheckBox *keepThisDataForNextQSOQcheckbox; //QComboBox *satNameComboBox; //QPushButton *satNamePushButon; //QComboBox *satNameComboBox, *satModeComboBox; QComboBox *satNameComboBox; QComboBox *satBandTXComboBox, *satBandRXComboBox; QStringList satNames, satModes; QStringList satellitesList; //bool txFreqBeingAutoChanged, rxFreqBeingAutoChanged, updatingBands; bool updatingBands; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) QDoubleSpinBox *txFreqSpinBox, *rxFreqSpinBox; DataProxy_SQLite *dataProxy; Locator *locator; Utilities *util; double freqTX, freqRX; int downLinkBandId, upLinkBandId; QString downLinkBand, upLinkBand; bool modifying; bool getDarkMode(); }; #endif // MAINWINDOWSATTAB_H klog-1.8.6/inputwidgets/mainwindowinputcomment.cpp0000644000175000017500000000757114166020407021525 0ustar develdevel/*************************************************************************** mainwindowinputcomment.cpp - description ------------------- begin : Ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputcomment.h" MainWindowInputComment::MainWindowInputComment(QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputComment::MainWindowInputComment" << QT_ENDL; commentLineEdit = new QLineEdit(); keepThisDataForNextQSOQCheckbox = new QCheckBox; comment.clear(); createUI(); //qDebug() << "MainWindowInputComment::MainWindowInputComment - END" << QT_ENDL; } MainWindowInputComment::~MainWindowInputComment(){} void MainWindowInputComment::createUI() { QLabel *commentLabel = new QLabel(tr("Comment")); commentLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); commentLineEdit->setToolTip(tr("Add a comment for this QSO.")); QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSOQCheckbox->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); QGridLayout *tabLayout = new QGridLayout; //QVBoxLayout *tabLayout = new QVBoxLayout; //tabLayout->addWidget(commentLineEdit); tabLayout->addWidget(commentLabel, 0, 0); tabLayout->addWidget(commentLineEdit, 0, 1); tabLayout->addWidget(keepLabel, 2, 1); tabLayout->addWidget(keepThisDataForNextQSOQCheckbox, 2, 2); //tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); } void MainWindowInputComment::setData(const QString &_comment) { comment = _comment; commentLineEdit->setText(comment); } QString MainWindowInputComment::getComment() { return commentLineEdit->text(); } void MainWindowInputComment::clear(bool _full) { if ((!keepThisDataForNextQSOQCheckbox->isChecked()) || _full) { comment.clear(); commentLineEdit->clear(); } if (_full) { keepThisDataForNextQSOQCheckbox->setChecked (false); } } void MainWindowInputComment::setKeep(const bool _b) { keepThisDataForNextQSOQCheckbox->setChecked (_b); } bool MainWindowInputComment::getKeep() { return keepThisDataForNextQSOQCheckbox->isChecked (); } klog-1.8.6/inputwidgets/mainwindowinputothers.cpp0000644000175000017500000004767314166020421021372 0ustar develdevel/*************************************************************************** mainwindowinputothers.cpp - description ------------------- begin : Ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputothers.h" MainWindowInputOthers::MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputOthers::MainWindowInputOthers" << QT_ENDL; entitiesList.clear(); propModeList.clear(); adifValidTypes.clear(); autoUpdating = false; dataProxy = dp; propModeList = dataProxy->getPropModeList(); sota_ref = QString(); age = 0; util = new Utilities; //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; iotaContinentComboBox = new QComboBox(); entityPrimDivComboBox = new QComboBox(); entitySecDivComboBox = new QComboBox(); entityNameComboBox = new QComboBox(); propModeComboBox = new QComboBox(); iotaNumberLineEdit = new QLineEdit(); keepPropCheckBox = new QCheckBox(); userDefinedADIFComboBox = new QComboBox(); userDefinedADIFValueLineEdit = new QLineEdit(); // TODO: I should find the way to connect the SAT tabwidget's signal to set the propmode in this widget // Now it is done though the mainwindow but I should avoid depending on that class for that, if possible //connect(satTabWidget, SIGNAL(setPropModeSat(QString)), this, SLOT(slotSetPropMode(QString)) ) ; connect(propModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPropModeComboBoxChanged() ) ) ; connect(userDefinedADIFComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUSerDefinedADIFComboBoxChanged() ) ) ; connect(userDefinedADIFValueLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentUSerData() ) ); createUI(); setInitialADIFValues (); //qDebug() << "MainWindowInputOthers::MainWindowInputOthers - END" << QT_ENDL; } MainWindowInputOthers::~MainWindowInputOthers(){} void MainWindowInputOthers::createUI() { //qDebug() << "MainWindowInputOthers::createUI" << QT_ENDL; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); QLabel *entityPrimLabel = new QLabel(tr("Primary Div")); QLabel *entitySecLabel = new QLabel(tr("Secondary Div")); QLabel *iotaAwardLabel = new QLabel(tr("IOTA")); QLabel *entityNameLabel = new QLabel(tr("Entity")); QLabel *propModeLabel = new QLabel(tr("Propagation mode")); QLabel *userSelectLabel = new QLabel(tr("Others")); entityPrimLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entitySecLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); iotaAwardLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entityNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); propModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); userSelectLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepPropCheckBox->setText(tr("Keep propagation mode")); entityPrimDivComboBox->setToolTip(tr("Select the primary division for this QSO.")); entitySecDivComboBox->setToolTip(tr("Select the secondary division for this QSO.")); entityNameComboBox->setToolTip(tr("Select the entity for this QSO.")); propModeComboBox->setToolTip(tr("Select the propagation mode for this QSO.")); iotaContinentComboBox->setToolTip(tr("Select the IOTA continent for this QSO.")); iotaNumberLineEdit->setToolTip(tr("Select the IOTA reference number for this QSO.")); keepPropCheckBox->setToolTip(tr("Keeps the same propagation mode for next QSO.")); userDefinedADIFComboBox->setToolTip(tr("Select the appropriate ADIF field for this QSO.")); userDefinedADIFValueLineEdit->setToolTip (tr("Value for the selected ADIF field.")); entityPrimDivComboBox->setEnabled(false); entitySecDivComboBox->setEnabled(false); entityNameComboBox->setEnabled(true); propModeComboBox->setEnabled(true); keepPropCheckBox->setEnabled(true); QHBoxLayout *keepLayout = new QHBoxLayout; keepLayout->addWidget(propModeComboBox); //keepLayout->addWidget(keepPropCheckBox); keepLayout->setSizeConstraint(QLayout::SetFixedSize); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(entityNameLabel, 0, 0); tabLayout->addWidget(entityNameComboBox, 0, 1, 1, 2); tabLayout->addWidget(entityPrimLabel, 1, 0); tabLayout->addWidget(entityPrimDivComboBox, 1, 1, 1, 2); tabLayout->addWidget(entitySecLabel, 2, 0); tabLayout->addWidget(entitySecDivComboBox, 2, 1, 1, 2); tabLayout->addWidget(iotaAwardLabel, 3, 0); tabLayout->addWidget(iotaContinentComboBox, 3, 1); tabLayout->addWidget(iotaNumberLineEdit, 3, 2); tabLayout->addWidget(propModeLabel, 4, 0); tabLayout->addLayout(keepLayout, 4, 1, 1, 2); tabLayout->addWidget(entityPrimLabel, 1, 0); tabLayout->addWidget(entityPrimDivComboBox, 1, 1, 1, 2); tabLayout->addWidget(userSelectLabel, 5, 0); tabLayout->addWidget(userDefinedADIFComboBox, 5, 1); tabLayout->addWidget(userDefinedADIFValueLineEdit, 5, 2); tabLayout->addWidget(keepPropCheckBox, 6, 2); //tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); entityNameComboBox->addItems(entitiesList); } if (propModeList.size()>1) { propModeList.prepend("00 - " + tr("Not - Not Identified")); propModeComboBox->addItems(propModeList); } iotaContinentComboBox->addItems(dataProxy->getContinentShortNames()); iotaNumberLineEdit->setInputMask("000"); iotaNumberLineEdit->setText("000"); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } void MainWindowInputOthers::clear(bool _full) { //qDebug() << "MainWindowInputOthers::clear" << QT_ENDL; entityNameComboBox->setCurrentIndex(0); userDefinedADIFComboBox->setCurrentIndex (0); userDefinedADIFValueLineEdit->clear (); sota_ref = QString(); age = 0; iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); if ((!keepPropCheckBox->isChecked()) || _full) { propModeComboBox->setCurrentIndex(0); } if (_full) { keepPropCheckBox->setChecked (false); } } void MainWindowInputOthers::setEntitiesList(const QStringList _qs) { //qDebug() << "MainWindowInputOthers::setEntitiesList: " << QString::number(_qs.length()) << QT_ENDL; entitiesList.clear(); entitiesList << _qs; if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); //entitiesList.prepend("00-Not Identified (000)"); entityNameComboBox->addItems(entitiesList); } } void MainWindowInputOthers::setEntity(const int _ent) {// Select the appropriate entity in the ComboBox //qDebug() << "MainWindowInputOthers::setEntity: " << QString::number(_ent) << QT_ENDL; if (_ent<=0) { entityNameComboBox->setCurrentIndex(0); return; } QString aux = QString(); aux = QString::number(_ent); if (_ent > 1000) { aux = (QString::number(_ent)).right(3); } //QString pref = dataProxy->getEntityNameFromId(_ent); //int indexC = entityNameComboBox->f int indexC = entityNameComboBox->findText("(" + aux + ")", Qt::MatchEndsWith); //qDebug() << "MainWindow::selectCorrectEntity: " << pref << "/" << QString::number(indexC) << QT_ENDL; entityNameComboBox->setCurrentIndex(indexC); setIOTAContinentFromEntity(_ent); } int MainWindowInputOthers::getEntity() { QString aux = entityNameComboBox->currentText(); if (!aux.contains ('(')) { return -1; } //qDebug() << Q_FUNC_INFO << ": " << (aux.split('(').at(1).chopped(1)); //return (aux.split('(').at(1).chopped(1)).toInt (); QString a = aux.split('(').at(1); a.chop(1); //qDebug() << Q_FUNC_INFO << ": " << a; return a.toInt (); } QString MainWindowInputOthers::getEntityPrefix() { //qDebug() << "MainWindowInputOthers::getEntityPrefix: " << (entityNameComboBox->currentText()).split('-').at(0) << QT_ENDL; return (entityNameComboBox->currentText()).split('-').at(0); //return world->getQRZARRLId(pref); } void MainWindowInputOthers::setPropMode(const QString &_qs, bool _keep) { //qDebug() << "MainWindowInputOthers::setPropMode: " << _qs << QT_ENDL; autoUpdating = true; if(( propModeComboBox->findText(_qs+" -", Qt::MatchContains))>0) { propModeComboBox->setCurrentIndex( propModeComboBox->findText(_qs+" -", Qt::MatchContains)); keepPropCheckBox->setChecked(_keep); } else { propModeComboBox->setCurrentIndex(0); keepPropCheckBox->setChecked(false); } autoUpdating = false; } QString MainWindowInputOthers::getPropModeFromComboBox() { QString _pm = QString(); //qDebug() << "MainWindow::getPropModeFromComboBox:" << propModeComboBox->currentText() << QT_ENDL; _pm = (((propModeComboBox->currentText()).split('-')).at(1)).simplified(); QString _n = (((propModeComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindow::getPropModeFromComboBox: " << _pm << QT_ENDL; if (_n == "00") { return QString(); } return _pm; } bool MainWindowInputOthers::isSATPropagation() { if (getPropModeFromComboBox() == "SAT") { return true; } else { return false; } } void MainWindowInputOthers::clearIOTA() { iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); //iotaNumberLineEdit->setPalette(palBlack); } bool MainWindowInputOthers::isIOTAModified() { if ((iotaContinentComboBox->currentIndex()>0) || (iotaNumberLineEdit->text()).toInt()>0) { return true; } else { return false; } } void MainWindowInputOthers::setIOTA(const QString &_qs) {//TODO: Seems to be better to send the color info like in: (it is much more flexible as I can send any color!) //void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) //qDebug() << "MainWindow::setIOTA: " << _qs << QT_ENDL; if ( (checkIfValidIOTA(_qs)).length() !=6 ) { iotaNumberLineEdit->setPalette(palRed); return; } else { QStringList values = _qs.split("-", QT_SKIP); //qDebug() << "MainWindowInputOthers::setIOTA: IOTA " << _qs << QT_ENDL; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); iotaNumberLineEdit->setText(values.at(1)); if (getDarkMode()) { iotaNumberLineEdit->setPalette(palWhite); } else { iotaNumberLineEdit->setPalette(palBlack); } } } QString MainWindowInputOthers::getIOTA() { return (checkIfValidIOTA(iotaContinentComboBox->currentText() + "-" + iotaNumberLineEdit->text())); } void MainWindowInputOthers::setIOTAContinentFromEntity(const int _n) { //qDebug() << "MainWindow::setIOTAContinentFromEntity:" << QString::number(_n) << QT_ENDL; setIOTAContinent(dataProxy->getContinentShortNameFromEntity(_n)) ; } void MainWindowInputOthers::setIOTAContinent(const QString &_qs) { //qDebug() << "MainWindowInputOthers::setIOTAContinent: " << _qs << QT_ENDL; //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index(a): " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)) << QT_ENDL; if(( iotaContinentComboBox->findText(_qs, Qt::MatchContains))>0) { //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index: " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)) << QT_ENDL; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(_qs, Qt::MatchContains)); } else { //qDebug() << "MainWindowInputOthers::setIOTAContinent: setting to index: 00" << QT_ENDL; iotaContinentComboBox->setCurrentIndex(0); } } QString MainWindowInputOthers::checkIfValidIOTA(const QString &_tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << "MainWindowInputOthers::checkIfValidIOTA: " << _tiota << QT_ENDL; //bool _valid = false; QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QT_SKIP); _continent = _values.at(0); _number = _values.at(1); } else { return ""; } //qDebug() << "MainWindowInputOthers::checkIfValidIOTA (cont) " << _continent << QT_ENDL; //qDebug() << "MainWindowInputOthers::checkIfValidIOTA (numb): " << _number << QT_ENDL; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } else { return QString(); } } void MainWindowInputOthers::slotPropModeComboBoxChanged() { if (autoUpdating) { return; } emit setPropMode(getPropModeFromComboBox()); } void MainWindowInputOthers::setKeep(const bool _b) { keepPropCheckBox->setChecked (_b); } bool MainWindowInputOthers::getKeep() { return keepPropCheckBox->isChecked (); } bool MainWindowInputOthers::setUserADIFTypeComboBox(const QString &_value) { if (_value == "SOTA_REF") { userDefinedADIFComboBox->setCurrentIndex (0); } else if (_value == "AGE") { userDefinedADIFComboBox->setCurrentIndex (1); } else { return false; } return true; } QString MainWindowInputOthers::getUserADIFTypeComboBox() { int value = (((userDefinedADIFComboBox->currentText ()).split('-')).at(0)).toInt (); //qDebug() << Q_FUNC_INFO << ": " << QString::number(value); //qDebug() << Q_FUNC_INFO << ": " << QString::number(value); switch (value) { case 1: return "SOTA_REF"; case 2: return "AGE"; case 3: return "VUCC_GRIDS"; default: return QString(); } } bool MainWindowInputOthers::setUserADIFValue(const QString &_adifValue) { userDefinedADIFValueLineEdit->setText (_adifValue); return true; } QString MainWindowInputOthers::getUserADIFValue() { return userDefinedADIFValueLineEdit->text(); } bool MainWindowInputOthers::setInitialADIFValues() { adifValidTypes << "01-" + tr("SOTA Ref") << "02-" + tr ("Age") << "03-" + tr ("VUCC grids"); userDefinedADIFComboBox->clear (); userDefinedADIFComboBox->addItems (adifValidTypes); return true; } void MainWindowInputOthers::slotUSerDefinedADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); QString currentTag = getUserADIFTypeComboBox (); setColorsForUserDefinedADIFValueLineEdit(); if (currentTag == "SOTA_REF") { userDefinedADIFValueLineEdit->setText (sota_ref); } else if (currentTag == "AGE") { userDefinedADIFValueLineEdit->setText (QString::number(age)); } else if (currentTag == "VUCC_GRIDS") { userDefinedADIFValueLineEdit->setText (vucc_grids); } } bool MainWindowInputOthers::setVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; if (checkVUCC_GRIDS(_op)) { vucc_grids = _op; slotUSerDefinedADIFComboBoxChanged(); return true; } return false; } bool MainWindowInputOthers::checkVUCC_GRIDS(const QString &_string) { //qDebug() << Q_FUNC_INFO << ": " << _string; if (util->isValidVUCCGrids (_string)) { setColorsForUserDefinedADIFValueLineEdit(); return true; } else { userDefinedADIFValueLineEdit->setPalette (palRed); return false; } } QString MainWindowInputOthers::getVUCCGrids() { if (checkVUCC_GRIDS (vucc_grids)) { return vucc_grids; } else { return QString(); } } void MainWindowInputOthers::setColorsForUserDefinedADIFValueLineEdit() { if (getDarkMode()) { userDefinedADIFValueLineEdit->setPalette(palWhite); } else { userDefinedADIFValueLineEdit->setPalette(palBlack); } } bool MainWindowInputOthers::setSOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; sota_ref = _op; slotUSerDefinedADIFComboBoxChanged(); return true; } QString MainWindowInputOthers::getSOTA() { //qDebug() << Q_FUNC_INFO; return sota_ref; } bool MainWindowInputOthers::setAge(const double _op) { //qDebug() << Q_FUNC_INFO << ": " << _op; age = _op; slotUSerDefinedADIFComboBoxChanged(); return true; } double MainWindowInputOthers::getAge() { return age; } void MainWindowInputOthers::slotSetCurrentUSerData() { QString currentTag = getUserADIFTypeComboBox (); if (currentTag == "SOTA_REF") { sota_ref = userDefinedADIFValueLineEdit->text(); } else if (currentTag == "AGE") { age = userDefinedADIFValueLineEdit->text().toDouble(); } else if (currentTag == "VUCC_GRIDS") { //if (checkVUCC_GRIDS(userDefinedADIFValueLineEdit->text())) //{} vucc_grids = userDefinedADIFValueLineEdit->text().toUpper(); userDefinedADIFValueLineEdit->setText (vucc_grids); } } bool MainWindowInputOthers::getDarkMode() { if ( iotaNumberLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } klog-1.8.6/inputwidgets/mainwindowinputeqsl.cpp0000644000175000017500000005453214166020407021026 0ustar develdevel/*************************************************************************** mainwindowinputeqsl.cpp - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputeqsl.h" MainWindowInputEQSL::MainWindowInputEQSL(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL" << QT_ENDL; util = new Utilities; dataProxy = dp; eqslSentComboBox = new QComboBox; eqslRecComboBox = new QComboBox; lotwSentComboBox = new QComboBox; lotwRecComboBox = new QComboBox; clublogComboBox = new QComboBox; qrzcomComboBox = new QComboBox; eqslSentQDateEdit = new QDateEdit; eqslRecQDateEdit = new QDateEdit; lotwSentQDateEdit = new QDateEdit; lotwRecQDateEdit = new QDateEdit; clublogQDateEdit = new QDateEdit; qrzcomQDateEdit = new QDateEdit; createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL - END" << QT_ENDL; } void MainWindowInputEQSL::createUI() { qslSentStatusList.clear(); qslRcvdStatusList.clear(); clubLogStatusList.clear(); qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); clubLogStatusList = dataProxy->getClubLogStatusList(); eqslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); eqslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); clublogQDateEdit->setDisplayFormat("dd/MM/yyyy"); qrzcomQDateEdit->setDisplayFormat("dd/MM/yyyy"); clublogQDateEdit->setToolTip(tr("Date of the ClubLog upload.")); qrzcomQDateEdit->setToolTip(tr("Date of the QRZ.com upload.")); eqslSentQDateEdit->setToolTip(tr("Date of the eQSL sending.")); eqslRecQDateEdit->setToolTip(tr("Date of the eQSL reception.")); lotwSentQDateEdit->setToolTip(tr("Date of the LoTW sending.")); lotwRecQDateEdit->setToolTip(tr("Date of the LoTW reception.")); clublogComboBox->setToolTip(tr("Status on ClubLog.")); qrzcomComboBox->setToolTip(tr("Status on QRZ.com.")); eqslSentComboBox->setToolTip(tr("Status of the eQSL sending.")); eqslRecComboBox->setToolTip(tr("Status of the eQSL reception.")); lotwSentComboBox->setToolTip(tr("Status of the LoTW sending.")); lotwRecComboBox->setToolTip(tr("Status of the LoTW reception.")); // eQSL Tab definition starts here QLabel *clublogLabelN = new QLabel(tr("ClubLog")); clublogLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *qrzcomLabelN = new QLabel(tr("QRZ.com")); qrzcomLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLSentLabelN = new QLabel(tr("eQSL Sent")); eQSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLRecLabelN = new QLabel(tr("eQSL Rec")); eQSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWSentLabelN = new QLabel(tr("LoTW Sent")); lotWSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWRecLabelN = new QLabel(tr("LoTW Rec")); lotWRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QGridLayout *eqslInputTabWidgetLayout = new QGridLayout; eqslInputTabWidgetLayout->addWidget(clublogLabelN, 0, 0); eqslInputTabWidgetLayout->addWidget(eQSLSentLabelN, 1, 0); eqslInputTabWidgetLayout->addWidget(eQSLRecLabelN, 2, 0); eqslInputTabWidgetLayout->addWidget(lotWSentLabelN, 3, 0); eqslInputTabWidgetLayout->addWidget(lotWRecLabelN, 4, 0); eqslInputTabWidgetLayout->addWidget(qrzcomLabelN, 5, 0); eqslInputTabWidgetLayout->addWidget(clublogComboBox, 0, 1); eqslInputTabWidgetLayout->addWidget(eqslSentComboBox, 1, 1); eqslInputTabWidgetLayout->addWidget(eqslRecComboBox, 2, 1); eqslInputTabWidgetLayout->addWidget(lotwSentComboBox, 3, 1); eqslInputTabWidgetLayout->addWidget(lotwRecComboBox, 4, 1); eqslInputTabWidgetLayout->addWidget(qrzcomComboBox, 5, 1); eqslInputTabWidgetLayout->addWidget(clublogQDateEdit, 0, 2); eqslInputTabWidgetLayout->addWidget(eqslSentQDateEdit, 1, 2); eqslInputTabWidgetLayout->addWidget(eqslRecQDateEdit, 2, 2); eqslInputTabWidgetLayout->addWidget(lotwSentQDateEdit, 3, 2); eqslInputTabWidgetLayout->addWidget(lotwRecQDateEdit, 4, 2); eqslInputTabWidgetLayout->addWidget(qrzcomQDateEdit, 5, 2); //eqslInputTabWidgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(eqslInputTabWidgetLayout); connect(clublogComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotClubLogComboBoxChanged() ) ) ; connect(eqslSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(sloteQSLSentComboBoxChanged() ) ) ; connect(eqslRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(sloteQSLRecvComboBoxChanged() ) ) ; connect(lotwSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLotwSentComboBoxChanged() ) ) ; connect(lotwRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLotwRecvComboBoxChanged() ) ) ; connect(qrzcomComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQRZCOMComboBoxChanged() ) ) ; } void MainWindowInputEQSL::setDefaultData() { //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Validated"); //eqslRecComboBox->addItems(qsAux); //lotwRecComboBox->addItems(qsAux); eqslRecComboBox->addItems(qslRcvdStatusList); lotwRecComboBox->addItems(qslRcvdStatusList); //qsAux.clear(); //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //eqslSentComboBox->addItems(qsAux); //lotwSentComboBox->addItems(qsAux); eqslSentComboBox->addItems(qslSentStatusList); lotwSentComboBox->addItems(qslSentStatusList); //QStringList qsAux; //qsAux.clear(); //qsAux << tr("Y-Uploaded") << tr("N-Do not upload") << tr("M-Modified"); clublogComboBox->addItems(clubLogStatusList); qrzcomComboBox->addItems(clubLogStatusList); queueSentByDefault = true; } void MainWindowInputEQSL::clear() { //qDebug() << "MainWindowInputEQSL::clear" << QT_ENDL; // Do not upload if (queueSentByDefault) { clublogComboBox->setCurrentIndex( clublogComboBox->findText("M", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("Q", Qt::MatchStartsWith)); lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("Q", Qt::MatchStartsWith)); qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("M", Qt::MatchStartsWith)); } else { clublogComboBox->setCurrentIndex( clublogComboBox->findText("N", Qt::MatchStartsWith)); qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("N", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("N", Qt::MatchStartsWith)); lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("N", Qt::MatchStartsWith)); } eqslRecComboBox->setCurrentIndex(eqslRecComboBox->findText("N", Qt::MatchStartsWith)); lotwRecComboBox->setCurrentIndex(lotwRecComboBox->findText("N", Qt::MatchStartsWith)); eqslSentQDateEdit->setDate(util->getDefaultDate()); eqslRecQDateEdit->setDate(util->getDefaultDate()); lotwSentQDateEdit->setDate(util->getDefaultDate()); lotwRecQDateEdit->setDate(util->getDefaultDate()); clublogQDateEdit->setDate(util->getDefaultDate()); qrzcomQDateEdit->setDate(util->getDefaultDate()); } QString MainWindowInputEQSL::getClubLogStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getClubLogStatus:" << clublogComboBox->currentText() << QT_ENDL; _pm = (((clublogComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputEQSL::getQRZCOMStatus() { QString _pm = QString(); _pm = (((qrzcomComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputEQSL::getEQSLRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus:" << eqslRecComboBox->currentText() << QT_ENDL; _pm = (((eqslRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus: " << _pm << QT_ENDL; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getEQSLSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus:" << eqslSentComboBox->currentText() << QT_ENDL; _pm = (((eqslSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus: " << _pm << QT_ENDL; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus:" << lotwRecComboBox->currentText() << QT_ENDL; _pm = (((lotwRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus: " << _pm << QT_ENDL; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus:" << lotwSentComboBox->currentText() << QT_ENDL; _pm = (((lotwSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus: " << _pm << QT_ENDL; //if (_pm == "Not") //{ // return QString(); //} return _pm; } void MainWindowInputEQSL::setClubLogStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs << QT_ENDL; if((( clublogComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { clublogComboBox->setCurrentIndex( clublogComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { clublogComboBox->setCurrentIndex( clublogComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setQRZCOMStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs << QT_ENDL; if((( qrzcomComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setEQSLRecStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setEQSLRecStatus: " << _qs << QT_ENDL; //if(( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) if((( eqslRecComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { eqslRecComboBox->setCurrentIndex( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { eqslRecComboBox->setCurrentIndex( eqslRecComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setEQSLSenStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: #" << _qs+" -" << QT_ENDL; if((( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: found: " << _qs << " - Index: " << QString::number(eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)) << QT_ENDL; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found" << QT_ENDL; if (queueSentByDefault) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is defined by default" << QT_ENDL; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("Q", Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is NOT defined by default" << QT_ENDL; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("N", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found" << QT_ENDL; //eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus - END" << QT_ENDL; } void MainWindowInputEQSL::setLOTWRecStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setLOTWRecStatus: " << _qs << QT_ENDL; if((( lotwRecComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) //if(( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwRecComboBox->setCurrentIndex( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { lotwRecComboBox->setCurrentIndex(lotwRecComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setLOTWSenStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setLOTWSenStatus: " << _qs << QT_ENDL; if((( lotwSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) //if(( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { if (queueSentByDefault) { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("Q", Qt::MatchStartsWith)); } else { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("N", Qt::MatchStartsWith)); } //lotwSentComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::slotLotwRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwRecvComboBoxChanged" << QT_ENDL; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = lotwRecComboBox->currentIndex(); switch (i) { case 0: lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwRecQDateEdit->setEnabled(true); break; case 4: lotwRecQDateEdit->setEnabled(true); break; default: //NO lotwRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotLotwSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwSentComboBoxChanged" << QT_ENDL; int i = lotwSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO lotwSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLRecvComboBoxChanged" << QT_ENDL; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = eqslRecComboBox->currentIndex(); switch (i) { case 0: eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO eqslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLSentComboBoxChanged" << QT_ENDL; int i = eqslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO eqslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotClubLogComboBoxChanged() { int i = clublogComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO clublogQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setClubLogDate(const QDate _qs) { if (_qs.isValid()) { clublogQDateEdit->setDate(_qs); } else { clublogQDateEdit->clear(); } } void MainWindowInputEQSL::slotQRZCOMComboBoxChanged() { int i = qrzcomComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO qrzcomQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setQRZCOMDate(const QDate _qs) { if (_qs.isValid()) { qrzcomQDateEdit->setDate(_qs); } else { qrzcomQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLRecDate(const QDate _qs) { if (_qs.isValid()) { eqslRecQDateEdit->setDate(_qs); } else { eqslRecQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLSenDate(const QDate _qs) { if (_qs.isValid()) { eqslSentQDateEdit->setDate(_qs); } else { eqslSentQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWRecDate(const QDate _qs) { if (_qs.isValid()) { lotwRecQDateEdit->setDate(_qs); } else { lotwRecQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWSenDate(const QDate _qs) { if (_qs.isValid()) { lotwSentQDateEdit->setDate(_qs); } else { lotwSentQDateEdit->clear(); } } QDate MainWindowInputEQSL::getClubLogDate() { return clublogQDateEdit->date(); } QDate MainWindowInputEQSL::getQRZCOMDate() { return qrzcomQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLRecDate() { return eqslRecQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLSenDate() { return eqslSentQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWRecDate() { return lotwRecQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWSenDate() { return lotwSentQDateEdit->date(); } void MainWindowInputEQSL::setQueueSentByDefault(const bool _b) { queueSentByDefault = _b; } klog-1.8.6/inputwidgets/mainwindowinputothers.h0000644000175000017500000001065114166020407021025 0ustar develdevel#ifndef MAINWINDOWINPUTOTHERS_H #define MAINWINDOWINPUTOTHERS_H /*************************************************************************** mainwindowminputothers.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Others tab // #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" #include "../klogdefinitions.h" class MainWindowInputOthers : public QWidget { Q_OBJECT public: MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputOthers(); void setEntitiesList(const QStringList _qs); void setEntity(const int _n); int getEntity(); QString getEntityPrefix(); void setPropMode(const QString &_qs, bool _keep); QString getPropModeFromComboBox(); bool isSATPropagation(); bool setUserADIFTypeComboBox(const QString &_value); QString getUserADIFTypeComboBox(); bool setUserADIFValue(const QString &_adifValue); QString getUserADIFValue(); bool setSOTA(const QString &_op); QString getSOTA(); bool setAge(const double _op); double getAge(); bool setVUCCGrids(const QString &_op); QString getVUCCGrids(); void setIOTA(const QString &_qs); QString getIOTA(); void setIOTAContinentFromEntity(const int _n); void setIOTAContinent(const QString &_qs); bool isIOTAModified(); void clearIOTA(); void setKeep(const bool _b); bool getKeep(); void createUI(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything signals: void setPropMode(const QString _p); private slots: //void slotSetPropMode(const QString &_p); // To receive the signal from the SAT widget and set "SAT" propagation mode, of needed. void slotPropModeComboBoxChanged(); void slotUSerDefinedADIFComboBoxChanged(); void slotSetCurrentUSerData(); private: QString checkIfValidIOTA(const QString &_tiota); //TODO: There is an equivalent function in the Awards class. I should use only one! void setColorsForUserDefinedADIFValueLineEdit(); bool checkVUCC_GRIDS(const QString &_string); bool setInitialADIFValues(); bool getDarkMode(); Utilities *util; DataProxy_SQLite *dataProxy; QStringList entitiesList, propModeList; //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; QLineEdit *iotaNumberLineEdit; QCheckBox *keepPropCheckBox; QPalette palRed, palBlack, palWhite; bool autoUpdating; QComboBox *userDefinedADIFComboBox; QLineEdit *userDefinedADIFValueLineEdit; QStringList adifValidTypes; QString sota_ref, vucc_grids; double age; }; #endif // MAINWINDOWINPUTOTHERS_H klog-1.8.6/inputwidgets/mainwindowinputeqsl.h0000644000175000017500000000763414166020407020474 0ustar develdevel#ifndef MAINWINDOWINPUTEQSL_H #define MAINWINDOWINPUTEQSL_H /*************************************************************************** mainwindowinputeqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the eQSL options // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class MainWindowInputEQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputEQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); //~MainWindowInputEQSL(); //void setData(const QString &_comment); //QString getComment(); void clear(); QString getQRZCOMStatus(); QString getClubLogStatus(); QString getEQSLRecStatus(); QString getEQSLSenStatus(); QString getLOTWRecStatus(); QString getLOTWSenStatus(); void setQRZCOMStatus(const QString &_qs); void setClubLogStatus(const QString &_qs); void setEQSLRecStatus(const QString &_qs); void setEQSLSenStatus(const QString &_qs); void setLOTWRecStatus(const QString &_qs); void setLOTWSenStatus(const QString &_qs); QDate getQRZCOMDate(); QDate getClubLogDate(); QDate getEQSLRecDate(); QDate getEQSLSenDate(); QDate getLOTWRecDate(); QDate getLOTWSenDate(); void setQRZCOMDate(const QDate _qs); void setClubLogDate(const QDate _qs); void setEQSLRecDate(const QDate _qs); void setEQSLSenDate(const QDate _qs); void setLOTWRecDate(const QDate _qs); void setLOTWSenDate(const QDate _qs); void setQueueSentByDefault(const bool _b); signals: private slots: void slotQRZCOMComboBoxChanged(); void slotClubLogComboBoxChanged(); void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); private: void createUI(); void setDefaultData(); QComboBox *eqslSentComboBox, *eqslRecComboBox, *lotwSentComboBox, *lotwRecComboBox, *clublogComboBox, *qrzcomComboBox; QDateEdit *eqslSentQDateEdit, *eqslRecQDateEdit, *lotwSentQDateEdit, *lotwRecQDateEdit, *clublogQDateEdit, *qrzcomQDateEdit; DataProxy_SQLite *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, clubLogStatusList; bool queueSentByDefault; }; #endif // MAINWINDOWINPUTEQSL_H klog-1.8.6/inputwidgets/mainwindowinputqsl.cpp0000644000175000017500000002600514166020407020653 0ustar develdevel/*************************************************************************** mainwindowinputqsl.cpp - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include "mainwindowinputqsl.h" MainWindowInputQSL::MainWindowInputQSL(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputQSL::MainWindowInputQSL" << QT_ENDL; util = new Utilities; qslSentComboBox = new QComboBox; qslRecComboBox = new QComboBox; qslSentViaComboBox = new QComboBox; qslRecViaComboBox = new QComboBox; qslSentQDateEdit = new QDateEdit; qslRecQDateEdit = new QDateEdit; qslViaLineEdit = new QLineEdit; qslmsgTextEdit = new QTextEdit; dataProxy = dp; createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputQSL::MainWindowInputQSL - END" << QT_ENDL; } MainWindowInputQSL::~MainWindowInputQSL(){} void MainWindowInputQSL::createUI() { // QSL Tab definition starts here qslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); qslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); QLabel *QSLSentLabelN = new QLabel(tr("QSL Sent")); QSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLRecLabelN = new QLabel(tr("QSL Rec")); QSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLViaLabelN = new QLabel(tr("QSL Via")); QSLViaLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLMsgLabelN = new QLabel(tr("QSL Msg")); QSLMsgLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); qslSentComboBox->setToolTip(tr("Status of the QSL sending.")); qslRecComboBox->setToolTip(tr("Status of the QSL reception.")); qslSentViaComboBox->setToolTip(tr("QSL sending information.")); qslRecViaComboBox->setToolTip(tr("QSL reception information.")); qslSentQDateEdit->setToolTip(tr("Date of the QSL sending.")); qslRecQDateEdit->setToolTip(tr("Date of the QSL reception.")); qslmsgTextEdit->setToolTip(tr("Message of the QSL.")); qslViaLineEdit->setToolTip(tr("QSL via information.")); QGridLayout *QSLLayout = new QGridLayout; QSLLayout->addWidget(QSLSentLabelN, 0, 0); QSLLayout->addWidget(QSLRecLabelN, 1, 0); QSLLayout->addWidget(QSLViaLabelN, 2, 0); QSLLayout->addWidget(QSLMsgLabelN, 3, 0); QSLLayout->addWidget(qslSentComboBox, 0, 1); QSLLayout->addWidget(qslRecComboBox, 1, 1); QSLLayout->addWidget(qslViaLineEdit, 2, 1, 1, -1); QSLLayout->addWidget(qslmsgTextEdit, 3, 1, 1, -1); QSLLayout->addWidget(qslSentQDateEdit, 0, 2); QSLLayout->addWidget(qslRecQDateEdit, 1, 2); QSLLayout->addWidget(qslSentViaComboBox, 0, 3); QSLLayout->addWidget(qslRecViaComboBox, 1, 3); //QSLLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(QSLLayout); connect(qslViaLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQSLViaTextChanged() ) ) ; connect(qslRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQSLRecvComboBoxChanged() ) ) ; connect(qslSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQSLSentComboBoxChanged() ) ) ; connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQSLViaLineEditReturnPressed() ) ); } void MainWindowInputQSL::setDefaultData() { qslSentStatusList.clear(); qslRcvdStatusList.clear(); qslViaList.clear(); qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); qslViaList = dataProxy->getQSLViaList(); qslSentComboBox->addItems(qslSentStatusList); qslRecComboBox->addItems(qslRcvdStatusList); qslRecViaComboBox->addItems(qslViaList); qslSentViaComboBox->addItems(qslViaList); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); } void MainWindowInputQSL::clear() { qslSentComboBox->setCurrentIndex(1); qslRecComboBox->setCurrentIndex(1); qslRecViaComboBox->setCurrentIndex(0); qslSentViaComboBox->setCurrentIndex(0); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); qslmsgTextEdit->clear(); qslViaLineEdit->clear(); } void MainWindowInputQSL::qslViaClear() { qslViaLineEdit->clear(); } QString MainWindowInputQSL::getQSLRecStatus() { QString _pm = QString(); _pm = (((qslRecComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getQSLSenStatus() { QString _pm = QString(); _pm = (((qslSentComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getSentVia() { QString _pm = QString(); _pm = (((qslSentViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindow::getSentVia: " << _pm << QT_ENDL; return _pm; } QString MainWindowInputQSL::getRecVia() { QString _pm = QString(); _pm = (((qslRecViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputQSL::getRecVia: " << _pm << QT_ENDL; return _pm; } QString MainWindowInputQSL::getQSLVia() { return qslViaLineEdit->text(); } QString MainWindowInputQSL::getQSLMsg() { return qslmsgTextEdit->toPlainText(); } void MainWindowInputQSL::setQSLRecStatus(const QString &_qs) { if(( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecComboBox->setCurrentIndex( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLSenStatus(const QString &_qs) { if(( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentComboBox->setCurrentIndex( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLRecVia(const QString &_qs) { if(( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecViaComboBox->setCurrentIndex( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLSenVia(const QString &_qs) { //qDebug() << "MainWindowInputQSL::setQSLSenVia: " << _qs << QT_ENDL; if(( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentViaComboBox->setCurrentIndex( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) { palette.setColor(QPalette::Text, qColor); qslViaLineEdit->setPalette(palette); if (_qs.length()>0) { qslViaLineEdit->setText(_qs); } else { qslViaLineEdit->clear(); } } void MainWindowInputQSL::setQSLMsg(const QString &_qs) { if (_qs.length()>0) { qslmsgTextEdit->setText(_qs); } else { qslmsgTextEdit->clear(); } } QDate MainWindowInputQSL::getQSLRecDate() { return qslRecQDateEdit->date(); } QDate MainWindowInputQSL::getQSLSenDate() { return qslSentQDateEdit->date(); } void MainWindowInputQSL::setQSLRecDate(const QDate _qs) { if (_qs.isValid()) { qslRecQDateEdit->setDate(_qs); } else { qslRecQDateEdit->clear(); } } void MainWindowInputQSL::setQSLSenDate(const QDate _qs) { if (_qs.isValid()) { qslSentQDateEdit->setDate(_qs); } else { qslSentQDateEdit->clear(); } } void MainWindowInputQSL::slotQSLViaTextChanged() { //qDebug() << "MainWindow::slotQSLViaTextChanged: " << qslViaLineEdit->text() << " / Length: " << QString::number((qslViaLineEdit->text()).size()) << QT_ENDL; qslViaLineEdit->setText((util->getClearSQLi(qslViaLineEdit->text())).toUpper()); } void MainWindowInputQSL::slotQSLSentComboBoxChanged(){ int i = qslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslSentQDateEdit->setEnabled(true); qslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslSentQDateEdit->setEnabled(true); break; case 4: qslSentQDateEdit->setEnabled(true); break; default: //NO qslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLRecvComboBoxChanged(){ int i = qslRecComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslRecQDateEdit->setEnabled(true); qslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslRecQDateEdit->setEnabled(true); break; case 4: qslRecQDateEdit->setEnabled(true); break; default: //NO qslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLViaLineEditReturnPressed() { emit returnPressed(); } klog-1.8.6/inputwidgets/mainwindowmydatatab.cpp0000644000175000017500000005060414166020407020744 0ustar develdevel/*************************************************************************** mainwindowmydatatab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowmydatatab.h" MainWindowMyDataTab::MainWindowMyDataTab(QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab" << QT_ENDL; myPowerSpinBox = new QDoubleSpinBox; operatorLineEdit = new QLineEdit; stationCallSignLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; myUserADIFLineEdit = new QLineEdit; myUserADIFComboBox = new QComboBox; keepThisDataForNextQSOQCheckbox = new QCheckBox; locator = new Locator(); lastOperatorQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not //lastStationQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not lastMyLocator = QString(); // Last locator used by the user, will remain if the button is checked and removed if not stationCallsign = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup operatorQRZ = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup myLocator = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup util = new Utilities; modify = false; createUI(); setInitialADIFValues(); myPower = 0; lastPower = 0; //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab - END" << QT_ENDL; } MainWindowMyDataTab::~MainWindowMyDataTab(){} void MainWindowMyDataTab::createUI() { //qDebug() << Q_FUNC_INFO; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); myPowerSpinBox->setSuffix(" " + tr("Watts")); keepThisDataForNextQSOQCheckbox->setText(tr("Keep this data")); QLabel *myPowerSpinBoxLabelN = new QLabel(tr("Power")); myPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *operatorLabelN = new QLabel(tr("Operator callsign")); operatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *stationCallSignLabelN = new QLabel(tr("Station Callsign")); stationCallSignLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *myLocatorLabelN = new QLabel(tr("My Locator")); myLocatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QGridLayout *myDataInputTabWidgetLayout = new QGridLayout; myDataInputTabWidgetLayout->addWidget(myPowerSpinBoxLabelN, 0, 2); myDataInputTabWidgetLayout->addWidget(myPowerSpinBox, 0, 3); myDataInputTabWidgetLayout->addWidget(operatorLabelN, 1, 0); myDataInputTabWidgetLayout->addWidget(operatorLineEdit, 1, 1); myDataInputTabWidgetLayout->addWidget(stationCallSignLabelN, 1, 2); myDataInputTabWidgetLayout->addWidget(stationCallSignLineEdit, 1, 3); myDataInputTabWidgetLayout->addWidget(myUserADIFComboBox, 2, 0); myDataInputTabWidgetLayout->addWidget(myUserADIFLineEdit, 2, 1); myDataInputTabWidgetLayout->addWidget(myLocatorLabelN, 2, 2); myDataInputTabWidgetLayout->addWidget(myLocatorLineEdit, 2, 3); //myDataInputTabWidgetLayout->addWidget(keepLabel, 4, 2); myDataInputTabWidgetLayout->addWidget(keepThisDataForNextQSOQCheckbox, 4, 3); //myDataInputTabWidgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(myDataInputTabWidgetLayout); //myDataInputTabWidget->setLayout(myDataInputTabWidgetLayout); // i = dxUpLeftTab->addTab(myDataInputTabWidget, tr("My Data")); //connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(operatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(operatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorTextChanged()) ); connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(stationCallSignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(myUserADIFComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotMyUserADIFComboBoxChanged() ) ) ; connect(myUserADIFLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentMyUSerData() ) ); } void MainWindowMyDataTab::clear(bool _full) { //qDebug() << Q_FUNC_INFO; modify = false; if (!keepThisDataForNextQSOQCheckbox->isChecked()) { //qDebug() << "MainWindowMyDataTab::clear: NOT checked" << QT_ENDL; myPowerSpinBox->setValue(myPower); if (util->isValidCall(operatorQRZ)) { //qDebug() << Q_FUNC_INFO << ": " << operatorQRZ; operatorLineEdit->setText(operatorQRZ); } else { operatorLineEdit->clear(); } if (util->isValidCall(stationCallsign)) { stationCallSignLineEdit->setText(stationCallsign); } else { stationCallSignLineEdit->clear(); } if (util->isValidGrid(myLocator)) { myLocatorLineEdit->setText(myLocator); } else { myLocatorLineEdit->clear(); } my_rig = QString(); my_sota = QString(); my_antenna = QString(); myUserADIFComboBox->setCurrentIndex(0); myUserADIFLineEdit->clear(); } if (_full) { operatorLineEdit->clear (); stationCallSignLineEdit->clear (); myLocatorLineEdit->clear (); myPowerSpinBox->clear (); my_rig = QString(); my_sota = QString(); my_antenna = QString(); my_vucc_grids = QString(); myUserADIFComboBox->setCurrentIndex(0); myUserADIFLineEdit->clear(); keepThisDataForNextQSOQCheckbox->setChecked (false); } } void MainWindowMyDataTab::show() { //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::show: " << QString::number(myPower) << "/" << operatorQRZ << "/" << stationCallsign << "/" << myLocator << QT_ENDL; myPowerSpinBox->setValue(myPower); operatorLineEdit->setText(operatorQRZ); stationCallSignLineEdit->setText(stationCallsign); //qDebug() << "MainWindowMyDataTab::show: setMyLocator: " << myLocator << QT_ENDL; myLocatorLineEdit->setText(myLocator); } void MainWindowMyDataTab::slotMyLocatorTextChanged() { //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::slotMyLocatorTextChanged: " << myLocatorLineEdit->text() << QT_ENDL; //logEvent(Q_FUNC_INFO, "Start", logSeverity); int cursorP = myLocatorLineEdit->cursorPosition(); myLocatorLineEdit->setText(util->getClearSQLi(myLocatorLineEdit->text()).toUpper()); //qDebug() << "MainWindowMyDataTab::clear: setMyLocator: " << myLocatorLineEdit->text() << QT_ENDL; if ( locator->isValidLocator(myLocatorLineEdit->text())) { if (!modify) { myLocator = (myLocatorLineEdit->text()).toUpper(); } if (getDarkMode()) { myLocatorLineEdit->setPalette(palWhite); } else { myLocatorLineEdit->setPalette(palBlack); } myLocatorLineEdit->setToolTip(tr("My QTH locator.")); myLocatorLineEdit->setCursorPosition(cursorP); emit myLocChangedSignal(myLocatorLineEdit->text()); //dxccStatusWidget->setMyLocator(myLocator); //qDebug() << "MainWindowMyDataTab::slotMyLocatorTextChanged: My LOCATOR CHANGED TO: " << myLocator << QT_ENDL; //slotLocatorTextChanged(); } else { //logEvent(Q_FUNC_INFO, "END-2", logSeverity); myLocatorLineEdit->setPalette(palRed); myLocatorLineEdit->setToolTip(tr("My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters.")); myLocatorLineEdit->setCursorPosition(cursorP); return; } //logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindowMyDataTab::slotReturnPressed() { //qDebug() << Q_FUNC_INFO; emit returnPressed(); } void MainWindowMyDataTab::setSetupMyPower(const double _power) { //qDebug() << Q_FUNC_INFO; myPower = _power; myPowerSpinBox->setValue(_power); } void MainWindowMyDataTab::setSetupOperator(const QString &_op) { //qDebug() << Q_FUNC_INFO; if (!util->isValidCall (_op)) { return; } operatorQRZ = _op.toUpper(); operatorLineEdit->setText (operatorQRZ); } /* void MainWindowMyDataTab::setSetupStationQRZ(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op ; if (!util->isValidCall (_op)) { return; } stationQRZ = _op.toUpper(); stationCallSignLineEdit->setText(stationQRZ); } */ void MainWindowMyDataTab::setSetupMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO; if (!locator->isValidLocator (_op)) { return; } myLocator = _op.toUpper(); myLocatorLineEdit->setText (myLocator); } void MainWindowMyDataTab::setMyPower(const double _power) { //qDebug() << "MainWindowMyDataTab::setMyPower: " << QString::number(_power) << QT_ENDL; //qDebug() << Q_FUNC_INFO; myPowerSpinBox->setValue(_power); } double MainWindowMyDataTab::getMyPower() { //qDebug() << Q_FUNC_INFO; if (myPowerSpinBox->value() > 0) { lastPower = myPowerSpinBox->value(); return lastPower; } else { return 0.0; } //return myPowerSpinBox->value(); } void MainWindowMyDataTab::setOperator(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; //qDebug() << Q_FUNC_INFO; operatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getOperator() { //qDebug() << Q_FUNC_INFO << ": " << (operatorLineEdit->text()).toUpper(); lastOperatorQRZ = (operatorLineEdit->text()).toUpper(); return lastOperatorQRZ; } void MainWindowMyDataTab::setStationCallsign(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; if (util->isValidCall (_op)) { stationCallSignLineEdit->setText(_op); } else { stationCallsign.clear (); } } QString MainWindowMyDataTab::getStationCallsign() { //qDebug() << Q_FUNC_INFO << ": " << (stationCallSignLineEdit->text()).toUpper(); return (stationCallSignLineEdit->text()).toUpper(); //return lastStationQRZ; } void MainWindowMyDataTab::setMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; myLocatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getMyLocator() { //qDebug() << Q_FUNC_INFO; lastMyLocator = (myLocatorLineEdit->text()).toUpper(); return lastMyLocator.toUpper(); } void MainWindowMyDataTab::setData(const double _power, const QString &_stationCallsign, const QString &_operator, const QString &_myLocator) { //qDebug() << Q_FUNC_INFO; if (_power > 0.0) { myPower = _power; } else { myPower = 0; } if (util->isValidCall (_stationCallsign)) { stationCallsign = _stationCallsign; } else { stationCallsign = QString(); } //qDebug() << Q_FUNC_INFO << ": Setting station Callsign: " << stationCallsign; setStationCallsign (stationCallsign); if (_operator.length()>0) { setOperator (_operator); //operatorQRZ = _operator; } else { operatorQRZ = QString(); } if (_myLocator.length()>0) { myLocator = _myLocator; setMyLocator (_myLocator); } else { myLocator = QString(); } } void MainWindowMyDataTab::slotOperatorTextChanged() { //qDebug() << Q_FUNC_INFO << operatorLineEdit->text(); int cursorP = operatorLineEdit->cursorPosition(); operatorLineEdit->setText(util->getClearSQLi(operatorLineEdit->text()).toUpper()); if (util->isValidCall(operatorLineEdit->text())) { if (getDarkMode()) { operatorLineEdit->setPalette(palWhite); } else { operatorLineEdit->setPalette(palBlack); } if (!modify) { operatorQRZ = (operatorLineEdit->text()); } } else if (operatorLineEdit->text ().isEmpty ()) { if (!modify) { operatorQRZ.clear (); } } else { operatorLineEdit->setPalette(palRed); } operatorLineEdit->setCursorPosition(cursorP); } void MainWindowMyDataTab::slotStationCallSignTextChanged() { //qDebug() << Q_FUNC_INFO; int cursorP = stationCallSignLineEdit->cursorPosition(); stationCallSignLineEdit->setText(util->getClearSQLi(stationCallSignLineEdit->text()).toUpper()); if (util->isValidCall(stationCallSignLineEdit->text())) { if (getDarkMode()) { stationCallSignLineEdit->setPalette(palWhite); } else { stationCallSignLineEdit->setPalette(palBlack); } //if (!modify) //{ // stationCallsign = (stationCallSignLineEdit->text()); //} } else { stationCallSignLineEdit->setPalette(palRed); } stationCallSignLineEdit->setCursorPosition(cursorP); } void MainWindowMyDataTab::setKeep(const bool _b) { //qDebug() << Q_FUNC_INFO; keepThisDataForNextQSOQCheckbox->setChecked (_b); } bool MainWindowMyDataTab::getKeep() { //qDebug() << Q_FUNC_INFO; return keepThisDataForNextQSOQCheckbox->isChecked (); } bool MainWindowMyDataTab::setInitialADIFValues() { //qDebug() << Q_FUNC_INFO; adifValidTypes.clear (); adifValidTypes << "01-" + tr("My Rig") << "02-" + tr("My Antenna") << "03-" + tr("My SOTA_Ref")<< "04-" + tr("My VUCC_GRIDS"); myUserADIFComboBox->clear (); myUserADIFComboBox->addItems (adifValidTypes); return true; } bool MainWindowMyDataTab::setUserADIFTypeComboBox(const QString &_value) { //qDebug() << Q_FUNC_INFO << ": " << _value; if (_value == "MY_RIG") { myUserADIFComboBox->setCurrentIndex (0); } else if (_value == "MY_ANTENNA") { myUserADIFComboBox->setCurrentIndex (1); } else if (_value == "MY_SOTA_REF") { myUserADIFComboBox->setCurrentIndex (2); } else if (_value == "MY_VUCC_GRIDS") { myUserADIFComboBox->setCurrentIndex (3); } else { myUserADIFComboBox->setCurrentIndex (0); return false; } return true; } QString MainWindowMyDataTab::getUserADIFTypeComboBox() { //qDebug() << Q_FUNC_INFO; int value = (((myUserADIFComboBox->currentText ()).split('-')).at(0)).toInt (); switch (value) { case 1: return "MY_RIG"; case 2: return "MY_ANTENNA"; case 3: return "MY_SOTA_REF"; case 4: return "MY_VUCC_GRIDS"; default: return QString(); } } bool MainWindowMyDataTab::setUserADIFValue(const QString &_adifValue) { //qDebug() << Q_FUNC_INFO; myUserADIFLineEdit->setText (_adifValue); return true; } QString MainWindowMyDataTab::getUserADIFValue() { //qDebug() << Q_FUNC_INFO; return myUserADIFLineEdit->text(); } bool MainWindowMyDataTab::setMyRig(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; my_rig = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyRig() { //qDebug() << Q_FUNC_INFO; return my_rig; } bool MainWindowMyDataTab::setMyAntenna(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; my_antenna = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyAntenna() { //qDebug() << Q_FUNC_INFO; return my_antenna; } bool MainWindowMyDataTab::setMySOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; my_sota = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMySOTA() { //qDebug() << Q_FUNC_INFO; return my_sota; } bool MainWindowMyDataTab::setMyVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; if (checkMyVUCC_GRIDS(_op)) { my_vucc_grids = _op; slotMyUserADIFComboBoxChanged(); return true; } return false; } bool MainWindowMyDataTab::checkMyVUCC_GRIDS(const QString &_string) { //qDebug() << Q_FUNC_INFO << ": " << _string; if (util->isValidVUCCGrids (_string)) { setColorsForMyUserADIFLineEdit(); return true; } else { myUserADIFLineEdit->setPalette (palRed); return false; } } QString MainWindowMyDataTab::getMyVUCCGrids() { if (checkMyVUCC_GRIDS (my_vucc_grids)) { return my_vucc_grids; } else { return QString(); } } void MainWindowMyDataTab::setColorsForMyUserADIFLineEdit() { if (getDarkMode()) { myUserADIFLineEdit->setPalette(palWhite); } else { myUserADIFLineEdit->setPalette(palBlack); } } void MainWindowMyDataTab::slotMyUserADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); QString currentTag = getUserADIFTypeComboBox (); setColorsForMyUserADIFLineEdit(); if (currentTag == "MY_RIG") { myUserADIFLineEdit->setText (my_rig); } else if (currentTag == "MY_ANTENNA") { myUserADIFLineEdit->setText (my_antenna); } else if (currentTag == "MY_SOTA_REF") { myUserADIFLineEdit->setText (my_sota); } else if (currentTag == "MY_VUCC_GRIDS") { myUserADIFLineEdit->setText (my_vucc_grids); } } void MainWindowMyDataTab::slotSetCurrentMyUSerData() { QString currentTag = getUserADIFTypeComboBox (); //qDebug() << Q_FUNC_INFO << ": " << currentTag; int currentPos = myUserADIFLineEdit->cursorPosition (); if (currentTag == "MY_RIG") { my_rig = myUserADIFLineEdit->text(); } else if (currentTag == "MY_ANTENNA") { my_antenna = myUserADIFLineEdit->text(); } else if (currentTag == "MY_SOTA_REF") { my_sota = myUserADIFLineEdit->text(); } else if (currentTag == "MY_VUCC_GRIDS") { //if (checkMyVUCC_GRIDS(myUserADIFLineEdit->text())) //{} my_vucc_grids = myUserADIFLineEdit->text().toUpper(); myUserADIFLineEdit->setText (my_vucc_grids); } myUserADIFLineEdit->setCursorPosition (currentPos); } void MainWindowMyDataTab::setModify(const bool _modify) { //emit debugLog(Q_FUNC_INFO, "Start", Debug); modify = _modify; //emit debugLog(Q_FUNC_INFO, "END", Debug); } bool MainWindowMyDataTab::getDarkMode() { if (operatorLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } klog-1.8.6/inputwidgets/mainwindowmydatatab.h0000644000175000017500000001166414166020407020414 0ustar develdevel#ifndef MAINWINDOWMYDATATAB_H #define MAINWINDOWMYDATATAB_H /*************************************************************************** mainwindowmydatatab.h - description ------------------- begin : jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports MY DATA // #include #include #include "../locator.h" #include "../utilities.h" //#include "dataproxy_sqlite.h" //#include "dataproxy_sqlite.h" class MainWindowMyDataTab : public QWidget { Q_OBJECT public: explicit MainWindowMyDataTab(QWidget *parent = nullptr); ~MainWindowMyDataTab(); void createUI(); void setData(const double _power, const QString &_stationCallsign, const QString &_operator, const QString &_myLocator); void setSetupMyPower(const double _power); void setSetupOperator(const QString &_op); //void setSetupStationQRZ(const QString &_op); void setSetupMyLocator(const QString &_op); void setMyPower(const double _power); double getMyPower(); //double getLastPower(); void setOperator(const QString &_op); QString getOperator(); //QString getLastOperator(); void setStationCallsign(const QString &_op); // Sets ONLY the LineEdit, not the internal/configured stationCallsign QString getStationCallsign(); //QString getLastStationQRZ(); void setMyLocator(const QString &_op); QString getMyLocator(); bool setMyRig(const QString &_op); QString getMyRig(); bool setMyAntenna(const QString &_op); QString getMyAntenna(); bool setMySOTA(const QString &_op); QString getMySOTA(); bool setMyVUCCGrids(const QString &_op); QString getMyVUCCGrids(); // Returns the VUCC list in LOC1, LOC2 or LOC1,LOC2, LOC3, LOC4 format bool setUserADIFTypeComboBox(const QString &_value); QString getUserADIFTypeComboBox(); bool setUserADIFValue(const QString &_adifValue); QString getUserADIFValue(); void show(); //Shows the values into the widget void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setKeep(const bool _b); bool getKeep(); void setModify(const bool _modify); signals: void myLocChangedSignal(const QString &_q); // MyLocator once updated void returnPressed(); private slots: void slotMyLocatorTextChanged(); void slotOperatorTextChanged(); void slotStationCallSignTextChanged(); void slotReturnPressed(); void slotMyUserADIFComboBoxChanged(); void slotSetCurrentMyUSerData(); private: bool setInitialADIFValues(); void setColorsForMyUserADIFLineEdit(); bool checkMyVUCC_GRIDS(const QString &_string); QStringList adifValidTypes; QDoubleSpinBox *myPowerSpinBox; QString stationCallsign, operatorQRZ, myLocator; //Not changed during normal operations. They come from the configuration QString lastOperatorQRZ, lastMyLocator; //lastStationQRZ, Change dinamically during execution double myPower, lastPower; QLineEdit *operatorLineEdit, *stationCallSignLineEdit, *myLocatorLineEdit, *myUserADIFLineEdit; QComboBox *myUserADIFComboBox; QCheckBox *keepThisDataForNextQSOQCheckbox; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) Locator *locator; Utilities *util; bool modify; QString my_rig, my_sota, my_antenna, my_vucc_grids; bool getDarkMode(); }; #endif // MAINWINDOWMYDATATAB_H klog-1.8.6/inputwidgets/mainwindowinputqso.h0000644000175000017500000001035014166020407020317 0ustar develdevel#ifndef MAINWINDOWINPUTQSO_H #define MAINWINDOWINPUTQSO_H /*************************************************************************** mainwindowinputqso.h - description ------------------- begin : may 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include #include #include "../dataproxy_sqlite.h" #include "../locator.h" #include "../utilities.h" class MainWindowInputQSO : public QWidget { Q_OBJECT public: explicit MainWindowInputQSO(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSO(); void setPaletteRightName(const bool _ok); void setPaletteRightQTH(const bool _ok); void setPaletteRightDXLocator(const bool _ok); QString getDXLocator(); void setDXLocator(const QString &_loc); QString getName(); void setName(const QString &_st); QString getQTH(); void setQTH(const QString &_st); void setRSTToMode(const QString &_m, const bool _reading = true); QString getRSTTX(); void setRSTTX(const QString &_st); QString getRSTRX(); void setRSTRX(const QString &_st); double getTXFreq(); void setTXFreq(const double _ft); double getRXFreq(); void setRXFreq(const double _ft); void setPropModeFromSat(const QString &_p); double getRXPwr(); void setRXPwr(const double _pw); void setModifying(const bool _m); void receiveFocus(); void clear(); void cleanQRZCOM(); void clearName(); void clearQTH(); void clearDXLocator(); signals: void returnPressed(); void dxLocatorChanged(QString _loc); void rxFreqChanged(double _f); //void rxFreqChangedForSat(double _f); //void txFreqBeingChanged(bool _f); void txFreqChanged(double _f); void handOverFocusSignal(); //void txFreqChangedForSat(double _f); private slots: void slotReturnPressed(); void slotLocatorTextChanged(); void slotFreqTXChanged (double _f); void slotFreqRXChanged (double _f); void slotSplitClicked(); private: bool eventFilter(QObject *object, QEvent *event); void createUI(); void setDefaultData(); bool getDarkMode(); void setSplitCheckBox(); QLineEdit *rstTXLineEdit, *rstRXLineEdit, *qthLineEdit, *locatorLineEdit, *nameLineEdit; QDoubleSpinBox *rxPowerSpinBox, *txFreqSpinBox, *rxFreqSpinBox; QCheckBox *splitCheckBox; Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) bool rxFreqBeingAutoChanged, txFreqBeingAutoChanged, isSATPropagation; QString propMode; double freqTX, freqRX; bool modify; }; #endif // MAINWINDOWINPUTQSO_H klog-1.8.6/inputwidgets/mainwindowsattab.cpp0000644000175000017500000007706414166020421020261 0ustar develdevel /*************************************************************************** mainwindowsattab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowsattab.h" /* This class implements the Satellite TAB of the MainWindow */ MainWindowSatTab::MainWindowSatTab(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowSatTab::MainWindowSatTab" << QT_ENDL; satNameComboBox = new QComboBox; satNameLineEdit = new QLineEdit; satModeLineEdit = new QLineEdit; satDXLocatorLineEdit = new QLineEdit; satOtherLabel = new QLabel; satBandTXComboBox = new QComboBox; satBandRXComboBox = new QComboBox; txFreqSpinBox = new QDoubleSpinBox; rxFreqSpinBox = new QDoubleSpinBox; keepThisDataForNextQSOQcheckbox = new QCheckBox; dataProxy = dp; locator = new Locator; util = new Utilities; createUI(); populateSatComboBox(); //txBandBeingChanged = false; //rxBandBeingChanged = false; modifying = false; //txBandsBeingChanged = false; updatingBands = false; satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); setDefaultBands(); //TODO: Check how the bands are included not to create an inconsistence with the selected (in the setup) bands //qDebug() << "MainWindowSatTab::MainWindowSatTab - END" << QT_ENDL; } MainWindowSatTab::~MainWindowSatTab(){} void MainWindowSatTab::createUI() { connect(satNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatNameTextChanged() ) ); connect(satModeLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatModeTextChanged() ) ); connect(satDXLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatDXLocTextChanged() ) ); connect(satNameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); connect(satModeLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); connect(satDXLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); connect(satNameComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatNameComboBoxChanged() ) ) ; connect(satBandRXComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatBandRXComboBoxChanged()) ) ; connect(satBandTXComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatBandTXComboBoxChanged()) ) ; connect(txFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotSatFreqTXChanged(double)) ) ; connect(rxFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotSatFreqRXChanged(double)) ) ; connect (keepThisDataForNextQSOQcheckbox, SIGNAL(clicked()), this, SLOT(slotSatKeepThisDataClicked()) ); QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSOQcheckbox->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); QString othersat = tr("Other - Sat not in the list"); QString aux; aux.clear(); aux = QString(tr("Name of the Satellite if not in the list. Select: \"%1\" to enable this box. (format like AO-51).").arg(othersat)); satNameLineEdit->setToolTip(aux); //satNameLineEdit->setToolTip(tr("Name of the Satellite if not in the list. Select Other Sat (format like AO-51)")); satModeLineEdit->setToolTip(tr("Satellite mode used.")); satNameComboBox->setToolTip(tr("Select the satellite you are using.")); satBandTXComboBox->setToolTip(tr("UpLink band.")); satBandRXComboBox->setToolTip(tr("DownLink band.")); satDXLocatorLineEdit->setToolTip(tr("Locator of the DX station. This box is synchronized with the Locator box in the QSO tab.")); QLabel *upLinkLabel = new QLabel(); upLinkLabel->setText(tr("UpLink")); upLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *downLinkLabel = new QLabel(); downLinkLabel->setText(tr("DownLink")); downLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satNameLabel = new QLabel(); satNameLabel->setText(tr("Satellite")); satNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satModeLabel = new QLabel(); satModeLabel->setText(tr("Mode")); satModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satDXLocLabel = new QLabel(); satDXLocLabel->setText(tr("DX Locator")); satDXLocLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); //QLabel *satOtherLabel = new QLabel(); satOtherLabel->setText(tr("Other")); satOtherLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); txFreqSpinBox->setDecimals(3); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox->setDecimals(3); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); QHBoxLayout *keepLayout = new QHBoxLayout; keepLayout->addWidget(keepLabel); keepLayout->addWidget(keepThisDataForNextQSOQcheckbox); QHBoxLayout *lastlineLayout = new QHBoxLayout; //lastlineLayout->addWidget(satModeLabel); lastlineLayout->addWidget(satModeLineEdit); lastlineLayout->addWidget(satDXLocLabel); lastlineLayout->addWidget(satDXLocatorLineEdit); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(satNameLabel,0,0); tabLayout->addWidget(upLinkLabel,1,0); tabLayout->addWidget(downLinkLabel,2,0); tabLayout->addWidget(satModeLabel,3,0); tabLayout->addLayout(lastlineLayout,3,1); tabLayout->addWidget(satNameComboBox,0,1); tabLayout->addWidget(satBandTXComboBox,1,1); tabLayout->addWidget(satBandRXComboBox,2,1); //tabLayout->addWidget(satModeLineEdit,3,1); //tabLayout->addWidget(satModeLineEdit,3,1,1,-1); tabLayout->addWidget(satNameLineEdit,0,2); tabLayout->addWidget(txFreqSpinBox,1,2); tabLayout->addWidget(rxFreqSpinBox,2,2); tabLayout->addLayout(keepLayout,3,2); tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); } void MainWindowSatTab::slotSatNameComboBoxChanged() { //qDebug() << "MainWindowSatTab::slotSatNameComboBoxChanged: " << satNameComboBox->currentText() << QT_ENDL; if (modifying || (satNameComboBox->currentText().length()<4)) { return; } int i = satNameComboBox->currentIndex(); //qDebug() << "MainWindowSatTab::slotSatNameComboBoxChanged: " << QString::number(i) << QT_ENDL; //QString _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); satNameLineEdit->clear(); if (i == 0) { emit setPropModeSat("Not", false); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); satModeLineEdit->clear(); } else if(i == 1) { emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(true); satOtherLabel->setEnabled(true); } else { emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); setBandsOfSat(satNameComboBox->currentText()); //dataProxy->getSatelliteMode(satNameComboBox->currentText()) } //autofillSatMode(); } void MainWindowSatTab::slotSatNameTextChanged() { //qDebug() << "MainWindowSatTab::slotSatNameTextChanged: " << satNameLineEdit->text() << QT_ENDL; int cursor = satNameLineEdit->cursorPosition (); satNameLineEdit->setText((util->getClearSQLi (satNameLineEdit->text())).toUpper()); if (modifying ) { satNameLineEdit->setCursorPosition (cursor); return; } if ((satNameLineEdit->text()).length()>0) { emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); } else if ((satModeLineEdit->text()).length()<1) { emit setPropModeSat("Not", false); } satNameLineEdit->setCursorPosition (cursor); } void MainWindowSatTab::slotSatModeTextChanged() { //qDebug() << "MainWindowSatTab::slotSatModeTextChanged: " << satModeLineEdit->text() << QT_ENDL; /* satModeLineEdit->setText((satModeLineEdit->text()).toUpper()); if ((satModeLineEdit->text()).length()>0) { emit setPropModeSat("SAT"); } else if ((satNameLineEdit->text()).length()<1) { emit setPropModeSat("Not"); } */ } void MainWindowSatTab::setLocator(const QString &_t) { //qDebug() << "MainWindowSatTab::setLocator: " << _t << QT_ENDL; satDXLocatorLineEdit->setText(_t.toUpper()); //qDebug() << "MainWindowSatTab::setLocator - END: " << QT_ENDL; } void MainWindowSatTab::slotSatDXLocTextChanged() { //qDebug() << "MainWindowSatTab::slotSatDXLocTextChanged: " << satDXLocatorLineEdit->text() << QT_ENDL; int cursorP = satDXLocatorLineEdit->cursorPosition(); satDXLocatorLineEdit->setText((util->getClearSQLi(satDXLocatorLineEdit->text())).toUpper()); if ( locator->isValidLocator(satDXLocatorLineEdit->text()) ) { if (getDarkMode()) { satDXLocatorLineEdit->setPalette(palWhite); } else { satDXLocatorLineEdit->setPalette(palBlack); } satDXLocatorLineEdit->setToolTip(tr("Locator of the DX station. This box is synchronized with the Locator box in the QSO tab.")); //if (!modifying) //{ // emit dxLocatorChanged((satDXLocatorLineEdit->text()).toUpper()); //} } else { satDXLocatorLineEdit->setPalette(palRed); satDXLocatorLineEdit->setToolTip(tr("Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters.")); } satDXLocatorLineEdit->setCursorPosition(cursorP); emit dxLocatorChanged(satDXLocatorLineEdit->text()); //qDebug() << "MainWindowSatTab::slotSatDXLocTextChanged - END" << QT_ENDL; } QString MainWindowSatTab::getSatName() { // Sat name must follow the format CC-NN to make it compatible with LOTW // C = Character // N = Number /* QString satName; satName = satNameLineEdit->text(); //TODO: Check that the format is OK return satName; */ //qDebug() << "MainWindowSatTab::getSatName:" << satNameComboBox->currentText() << QT_ENDL; QString _pm = QString(); QString satName = QString(); _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); //qDebug() << "MainWindowSatTab::satNameComboBox: " << _pm << QT_ENDL; if (satNameComboBox->currentIndex() == 0) { return QString(); } else if(satNameComboBox->currentIndex() == 1) { satName = satNameLineEdit->text(); if (satName.length()>0) { return satName; } else { return QString(); } } else { return _pm; } } void MainWindowSatTab::setNoSat() { satNameComboBox->setCurrentIndex(0); keepThisDataForNextQSOQcheckbox->setChecked(false); } void MainWindowSatTab::setSatName(const QString &_t) { //TODO: Check that the format is OK //qDebug() << "MainWindowSatTab::setSatName: " << _t << QT_ENDL; //satNameLineEdit->setText(_t); if (getSatIndex(_t) > 0) { setSatelliteCombo(_t); } else { satNameComboBox->setCurrentIndex(1); satNameLineEdit->setText(_t); } } QString MainWindowSatTab::getSatMode() { //qDebug() << "MainWindowSatTab::getSatMode: " << satModeLineEdit->text() << QT_ENDL; return satModeLineEdit->text(); } void MainWindowSatTab::setSatMode(const QString &_t) { //qDebug() << "MainWindowSatTab::setSatMode: " << _t ; if (_t == "-CLEAR-") { satModeLineEdit->clear(); } else { satModeLineEdit->setText(_t); } } bool MainWindowSatTab::getRepeatThis() { //qDebug() << "MainWindowSatTab::getRepeatThis: " << QT_ENDL; return keepThisDataForNextQSOQcheckbox->isChecked(); } void MainWindowSatTab::setRepeatThis(const bool _t) { //qDebug() << "MainWindowSatTab::setRepeatThis: " << QT_ENDL; keepThisDataForNextQSOQcheckbox->setChecked(_t); } void MainWindowSatTab::clear(bool _full) { //qDebug() << "MainWindowSatTab::clear" << QT_ENDL; modifying = false; if ((keepThisDataForNextQSOQcheckbox->isChecked()) || (!_full)) { satDXLocatorLineEdit->clear(); } else { satModeLineEdit->clear(); satNameComboBox->setCurrentIndex(0); satNameLineEdit->clear(); satDXLocatorLineEdit->clear(); } if (_full) { keepThisDataForNextQSOQcheckbox->setChecked (false); } } void MainWindowSatTab::refreshData() { //qDebug() << "MainWindowSatTab::refreshData" << QT_ENDL; populateSatComboBox(); //autofillSatMode(); } void MainWindowSatTab::populateSatComboBox() { //qDebug() << "MainWindowSatTab::populateSatComboBox: " << QT_ENDL; QString nosat = tr("Not Sat QSO"); QString othersat = tr("Other - Sat not in the list"); satellitesList.clear(); satellitesList = dataProxy->getSatellitesList(); satellitesList.prepend(othersat); satellitesList.prepend("No-SAT - " + nosat); if (satellitesList.size()>1) { satNameComboBox->clear(); satNameComboBox->addItems(satellitesList); } else { //TODO: Check how to do it better... now I could simply remove the if satNameComboBox->addItems(satellitesList); } } void MainWindowSatTab::setSatelliteCombo(const QString &_p) { //qDebug() << "MainWindowsatTab::setSatelliteCombo: " << _p << QT_ENDL; QString aux = QString(); int indexC = getSatIndex(_p); //int indexC = satNameComboBox->findText(_p, Qt::MatchContains); //qDebug() << "MainWindowsatTab::setSatelliteCombo: N=" << QString::number(indexC) << QT_ENDL; if (indexC>0) { satNameComboBox->setCurrentIndex(indexC); } else { satNameComboBox->setCurrentIndex(0); if (_p.length()>0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); aux = tr("KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name.") + "\n\n"; msgBox.setText(aux + tr("The satellite you have in your QSO is: ") + _p + "\n\n" + tr("Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost!")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } } void MainWindowSatTab::setOtherSatName(const QString &_t) { //qDebug() << "MainWindowsatTab::setOtherSatName: " << _t << QT_ENDL; satNameLineEdit->setText(_t); } QString MainWindowSatTab::getOtherSatName() { //qDebug() << "MainWindowSatTab::getOtherSatName" << QT_ENDL; return QString(); } int MainWindowSatTab::getSatIndex(const QString &_p) { //qDebug() << "MainWindowSatTab::getSatIndex: " << QString::number(satNameComboBox->findText(_p, Qt::MatchContains)) << QT_ENDL; return satNameComboBox->findText(_p, Qt::MatchContains); } void MainWindowSatTab::addBands(QStringList _bands) { //qDebug() << "MainWindowSatTab::addBands: " << QString::number(_bands.length()) << QT_ENDL; updatingBands = true; QString _txBand = satBandTXComboBox->currentText(); QString _rxBand = satBandRXComboBox->currentText(); //txBandsBeingChanged = true; satBandRXComboBox->clear(); satBandTXComboBox->clear(); satBandTXComboBox->addItems(_bands); satBandRXComboBox->addItems(_bands); satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(_txBand, Qt::MatchCaseSensitive)); satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(_rxBand, Qt::MatchCaseSensitive)); //txBandsBeingChanged = false; updatingBands = false; //qDebug() << "MainWindowSatTab::addBands - END" << QT_ENDL; } void MainWindowSatTab::setDefaultBands() {//Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist in the selected bands //qDebug() << "MainWindowsatTab::setDefaultBands: " << QT_ENDL; QStringList _b; _b.clear(); _b << "10M" << "2M" << "70CM" << "23CM"; satBandRXComboBox->addItems(_b); satBandTXComboBox->addItems(_b); } void MainWindowSatTab::slotSatBandRXComboBoxChanged() { //qDebug() << "MainWindowsatTab::slotSatBandRXComboBoxChanged" << QT_ENDL; if (updatingBands || modifying) { return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(rxFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band rxFreqSpinBox->setValue(dataProxy->getLowLimitBandFromBandName(satBandRXComboBox->currentText())); } //qDebug() << "MainWindowsatTab::slotSatBandRXComboBoxChanged-END" << QT_ENDL; autofillSatMode(); } void MainWindowSatTab::slotSatFreqRXChanged(const double _f) { //qDebug() << Q_FUNC_INFO << ": spingBox: " << QString::number(rxFreqSpinBox->value()) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": f: " << QString::number(_f) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": freqRx:" << QString::number(freqRX) << QT_ENDL; if (util->isSameFreq (freqRX, _f)) { return; } freqRX = _f; if (getDarkMode()) { rxFreqSpinBox->setPalette(palWhite); } else { rxFreqSpinBox->setPalette(palBlack); } if (modifying) { return; } int bandId = dataProxy->getBandIdFromFreq(rxFreqSpinBox->value()); if (bandId<1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << Q_FUNC_INFO << ": Not in band, exiting... " << QT_ENDL; rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(rxFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(dataProxy->getBandNameFromFreq(rxFreqSpinBox->value()), Qt::MatchCaseSensitive)); } } emit satRxFreqChanged(rxFreqSpinBox->value()); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatBandTXComboBoxChanged() { //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged: -" << satBandTXComboBox->currentText() << QT_ENDL; if (updatingBands || modifying || (satBandTXComboBox->currentText().length()<2)) { return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(txFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged changing to: Band: " << satBandTXComboBox->currentText() << QT_ENDL; //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged changing to: " << QString::number(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())) << QT_ENDL; txFreqSpinBox->setValue(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged-END" << QT_ENDL; autofillSatMode(); } void MainWindowSatTab::slotSatFreqTXChanged(const double _f) { //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; // user changes TX Freq // If band is real and band is configured, bandcombo is selected // If band is real and not configured, we launch the band config and select the band. // if band is real emit the band if (util->isSameFreq (freqTX, _f)) { return; } freqTX = _f; if (getDarkMode()) { txFreqSpinBox->setPalette(palWhite); } else { txFreqSpinBox->setPalette(palBlack); } if (modifying) { return; } int bandId = dataProxy->getBandIdFromFreq(txFreqSpinBox->value()); if (bandId<1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: Not in band, exiting... " << QT_ENDL; txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.\nFrequency is not in a hamradio band!")); txFreqSpinBox->setPalette(palRed); } else { txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(txFreqSpinBox->value())); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: If the freq does not belong to the current band, we need to update the band" << QT_ENDL; //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: We define UoLink to: " << dataProxy->getBandNameFromFreq(txFreqSpinBox->value()) << QT_ENDL; satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(dataProxy->getBandNameFromFreq(txFreqSpinBox->value()), Qt::MatchCaseSensitive)); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } //autofillSatMode(); } //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged: Emitting: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; emit satTxFreqChanged(txFreqSpinBox->value()); //qDebug() << "MainWindowsatTab::slotSatFreqTXChanged-END" << QT_ENDL; } void MainWindowSatTab::setUpLink(const QString &_t) { //qDebug() << "MainWindowsatTab::setUpLink: " << _t << QT_ENDL; if (satBandTXComboBox->currentText () == _t) { return; } int index = satBandTXComboBox->findText(_t, Qt::MatchCaseSensitive); //qDebug() << "MainWindowsatTab::setUpLink: new index: " << QString::number(index) << QT_ENDL; //qDebug() << "MainWindowsatTab::setUpLink: current index: " << QString::number(satBandTXComboBox->currentIndex()) << QT_ENDL; int indexRX; if (index>=0) { satBandTXComboBox->setCurrentIndex(index); if ( dataProxy->getIdFromBandName("2M") == dataProxy->getIdFromBandName(_t) ) { //qDebug() << satNameComboBox->currentText() << QT_ENDL; if (satNameComboBox->findText("AO-7 - AMSAT-OSCAT 7", Qt::MatchCaseSensitive)) { indexRX = satBandRXComboBox->findText("10M", Qt::MatchCaseSensitive); } else { indexRX = satBandRXComboBox->findText("70CM", Qt::MatchCaseSensitive); } satBandRXComboBox->setCurrentIndex(indexRX); } else if ( dataProxy->getIdFromBandName("70CM") == dataProxy->getIdFromBandName(_t) ) { indexRX = satBandRXComboBox->findText("2M", Qt::MatchCaseSensitive); satBandRXComboBox->setCurrentIndex(indexRX); } } } void MainWindowSatTab::setUpLinkFreq(const double _t) { //qDebug() << "MainWindowsatTab::setUpLinkFreq: " << QString::number(_t) << QT_ENDL; if (util->isSameFreq (freqTX, _t)) { return; } txFreqSpinBox->setValue(_t); setUpLink(dataProxy->getBandNameFromFreq(_t)); //qDebug() << "MainWindowsatTab::setUpLinkFreq END" << QT_ENDL; } double MainWindowSatTab::getRXFreq() { //qDebug() << "MainWindowsatTab::getRXFreq " << QT_ENDL; return rxFreqSpinBox->value(); } void MainWindowSatTab::setDownLinkFreq(const double _t) { //qDebug() << "MainWindowsatTab::setDownLinkFreq: " << QString::number(_t) << QT_ENDL; if (util->isSameFreq (freqRX, _t)) { //qDebug() << Q_FUNC_INFO << " - I same freq"; return; } rxFreqSpinBox->setValue(_t); QString downLinkBand = dataProxy->getBandNameFromFreq(_t); int index = satBandRXComboBox->findText(downLinkBand, Qt::MatchCaseSensitive); if (index>=0) { satBandRXComboBox->setCurrentIndex(index); } //qDebug() << "MainWindowsatTab::setDownLinkFreq END" << QT_ENDL; } void MainWindowSatTab::setBandsOfSat(const QString &_p) { // Until the data is in the DB, this function tries to solve data of active sats from: http://www.amsat.org/status/ // This functio: // - identifies the freqs & bands that the sat is using //qDebug() << "MainWindowSatTab::setBandsOfSat: " << _p << " - Short: " << _p.section(' ', 0, 0) << QT_ENDL; //"AO-7 - AMSAT-OSCAT 7" //2M/10M << 2M/70CM if (modifying) { return; } double upLink = (dataProxy->getSatelliteUplink(_p.section(' ', 0, 0))).toDouble(); double downLink = (dataProxy->getSatelliteDownlink(_p.section(' ', 0, 0))).toDouble(); //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: " << QString::number(upLink)<< QT_ENDL; //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: " << QString::number(downLink)<< QT_ENDL; if (upLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitting: " << QString::number(upLink)<< QT_ENDL; emit satTXFreqNeeded(upLink); //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitted: " << QString::number(upLink)<< QT_ENDL; } else { //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: setting to ZERO (should be = RX) " << QT_ENDL; txFreqSpinBox->setValue(0); //satBandTXComboBox->setCurrentIndex(0); } if (downLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitting: " << QString::number(downLink)<< QT_ENDL; emit satRXFreqNeeded(downLink); //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitted: " << QString::number(downLink)<< QT_ENDL; } else { //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: setting to ZERO" << QT_ENDL; rxFreqSpinBox->setValue(0); //satBandRXComboBox->setCurrentIndex(0); } //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emiting: " << QString::number(downLink)<< QT_ENDL; //emit satRxFreqChanged(downLink); //qDebug() << "MainWindowSatTab::setBandsOfSat: " << _p << " - END " << QT_ENDL; } void MainWindowSatTab::addNewBand(const QString &_p) { //qDebug() << "MainWindowSatTab::addNewBand: " << _p << QT_ENDL; if (dataProxy->getIdFromBandName(_p)<0) { //qDebug() << "MainWindowSatTab::addNewBand: Id: " << QString::number(dataProxy->getIdFromBandName(_p)) << QT_ENDL; return; } QStringList bands; bands.clear(); //qDebug() << "MainWindowSatTab::addNewBand: RX Id: " << QString::number(satBandRXComboBox->count()) << QT_ENDL; //qDebug() << "MainWindowSatTab::addNewBand: TX Id: " << QString::number(satBandTXComboBox->count()) << QT_ENDL; for (int i = 0; i < satBandTXComboBox->count(); i++) { bands << satBandTXComboBox->itemText(i); for (int ii = 0; ii < satBandRXComboBox->count(); ii++) { bands << satBandRXComboBox->itemText(ii); } } bands << _p; //bands.removeDuplicates(); emit newBandsToBeAdded(bands); //addBands(bands); //qDebug() << "MainWindowSatTab::addNewBand: 2 RX Id: " << QString::number(satBandRXComboBox->count()) << QT_ENDL; //qDebug() << "MainWindowSatTab::addNewBand: 2 TX Id: " << QString::number(satBandTXComboBox->count()) << QT_ENDL; } void MainWindowSatTab::setModifying (const bool _m) { //qDebug() << "MainWindowsatTab::setModifying" << QT_ENDL; modifying = _m; } void MainWindowSatTab::slotReturnPressed() { //qDebug() << "MainWindowsatTab::slotReturnPressed" << QT_ENDL; emit returnPressed(); } void MainWindowSatTab::slotSatKeepThisDataClicked() { //qDebug() << Q_FUNC_INFO << QT_ENDL; if (keepThisDataForNextQSOQcheckbox->isChecked()) { //qDebug() << Q_FUNC_INFO << ": True" << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << ": False" << QT_ENDL; } slotSatNameComboBoxChanged(); } void MainWindowSatTab::autofillSatMode() { //qDebug() << Q_FUNC_INFO ; QString downLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(rxFreqSpinBox->value())); QString upLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(txFreqSpinBox->value())); satModeLineEdit->setText(upLinkBand + "/" + downLinkBand); } QString MainWindowSatTab::bandToLetter(const QString &_band) { //qDebug() << Q_FUNC_INFO << ": " << _band; QString letter = ""; if (_band == "15M") { letter = "H"; } else if (_band == "10M") { letter = "A"; } else if (_band == "2M") { letter = "V"; } else if (_band == "70CM") { letter = "U"; } else if (_band == "23CM") { letter = "L"; } else if (_band == "13CM") { letter = "S"; } else if (_band == "5CM") { letter = "C"; } else if (_band == "3CM") { letter = "X"; } else if (_band == "1.25CM") { letter = "K"; } else { letter = "-"; } //qDebug() << Q_FUNC_INFO << ": " << _band << " -> " << letter; return letter; } void MainWindowSatTab::setKeep(const bool _b) { keepThisDataForNextQSOQcheckbox->setChecked (_b); } bool MainWindowSatTab::getKeep() { return keepThisDataForNextQSOQcheckbox->isChecked (); } bool MainWindowSatTab::getDarkMode() { if (satNameLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } klog-1.8.6/awards.cpp0000644000175000017500000020041414166020421013424 0ustar develdevel#include "awards.h" /*************************************************************************** awards.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include Awards::Awards(DataProxy_SQLite *dp, const QString &_parentFunction) { //qDebug() << "Awards::Awards- from: " << _parentFunction << QT_ENDL; dataProxy = dp; //QSqlDatabase db = QSqlDatabase::database("QSQLITE"); world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << "Awards::Awards - Before DXMarathon" << QT_ENDL; dxMarathon = new DXMarathon(dataProxy); //qDebug() << "Awards::Awards - After DXMarathon" << QT_ENDL; util = new Utilities(); //world->create(); /* newOneColor.setNamedColor("#ff0000"); neededColor.setNamedColor("#ff8c00"); workedColor.setNamedColor("#ffd700"); confirmedColor.setNamedColor("#32cd32"); defaultColor.setNamedColor("#00bfff"); */ //"Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; //Awards::setColors: "#ff0000" / "#ff8c00" / "#ffd700" / "#32cd32" / "#00bfff" newOneColor = Qt::black; neededColor = Qt::black; workedColor = Qt::black; confirmedColor = Qt::black; defaultColor = Qt::black; dxccWorked.clear(); dxccConfirmed.clear(); wazWorked.clear(); wazConfirmed.clear(); manageModes = false; //qDebug() << "Awards::Awards - END" << QT_ENDL; } Awards::~Awards() { delete(world); delete(dxMarathon); delete(util); } void Awards::setAwardDXCC(const int _qsoId) { //qDebug() << "Awards::setAwardDXCC: _qsoId: " << QString::number(_qsoId) << QT_ENDL; dataProxy->setDXCCAwardStatus(_qsoId); } void Awards::setAwardWAZ(const int _qsoId) { //qDebug() << "Awards::setAwardWAZ: _qsoId: " << QString::number(_qsoId) << QT_ENDL; dataProxy->setWAZAwardStatus(_qsoId); } QString Awards::getQSOofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed) {// Returns the QRZ that granted that status in the DXCC //qDebug() << "Awards::getQSOofAward: " << QString::number(_enti) << "/" << QString::number(_bandid) << QT_ENDL; QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; QString answer = QString(); if (_confirmed) { stringQuery = QString("SELECT call, qso_date from log where dxcc='%1' AND bandid='%2' AND lognumber='%3' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(_enti).arg(_bandid).arg(_log); } else { stringQuery = QString("SELECT call, qso_date from log where dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_enti).arg(_bandid).arg(_log); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOofAward: stringQuery: " << stringQuery << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toString() + " / " + query.value(1).toString() ; query.finish(); //qDebug() << "Awards::getQSOofAward: answer: " << answer << QT_ENDL; return answer; } else { query.finish(); //qDebug() << "Awards::getQSOofAward: 0" << QT_ENDL; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOofAward: Query error" << QT_ENDL; return QString(); } } int Awards::getQSOIdofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed) {// Returns the QSOid that granted that status in the DXCC //qDebug() << "Awards::getQSOIdofAward: " << QString::number(_enti) << "/" << QString::number(_bandid) << QT_ENDL; QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; int answer = -1; //stringQuery = QString("SELECT qsoid from awarddxcc where dxcc='%1' and band='%2'").arg(_enti).arg(_bandid); if (_confirmed) { stringQuery = QString("SELECT id from log where dxcc='%1' AND bandid='%2' AND lognumber='%3' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(_enti).arg(_bandid).arg(_log); } else { stringQuery = QString("SELECT id from log where dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_enti).arg(_bandid).arg(_log); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOIdofAward: stringQuery: " << stringQuery << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toInt(); //qDebug() << "Awards::getQSOIdofAward: answer: " << QString::number(answer) << QT_ENDL; query.finish(); if (answer>=1) { return answer; } else { return -1; } } else { query.finish(); //qDebug() << "Awards::getQSOIdofAward: 0" << QT_ENDL; return -2; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOIdofAward: Query error" << QT_ENDL; return -3; } } int Awards::getDXCCWorked(const int _logNumber) { //qDebug() << "Awards::getDXCCWorked (logNumber): " << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString stringQuery; bool sqlOK; if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND dxcc < '1000' AND lognumber='%1'").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND dxcc < '1000' "); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getDXCCWorked: stringQuery: " << stringQuery << QT_ENDL; if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "Awards::getDXCCWorked: " << QString::number((query.value(0)).toInt()) << QT_ENDL; return v; } else { //qDebug() << "Awards::getDXCCWorked: 0" << QT_ENDL; return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getDXCCWorked: Query error" << QT_ENDL; return 0; } } int Awards::getDXCCConfirmed(const int _logNumber) { //qDebug() << "Awards::getDXCCConfirmed (logNumber): " << QString::number(_logNumber) << QT_ENDL; return dataProxy->getFieldInBand (DXCC, "ALL", true, "ALL", _logNumber); } int Awards::getWAZWorked(const int _logNumber) { //qDebug() << "Awards::getWAZWorked (logNumber): " << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString stringQuery; if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND lognumber='%1')").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41')"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int Awards::getWAZConfirmed(const int _logNumber) { //qDebug() << "Awards::getWAZConfirmed (logNumber): " << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString stringQuery; //Usar la siguiente para el confirmed if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y') AND lognumber='%1')").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y'))"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v =(query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } bool Awards::isThisSpotConfirmed(const QStringList &_qs) { return (getDXStatus(_qs) == 13); } int Awards::getDXStatus (const QStringList &_qs) { //qDebug() << "Awards::getDXStatus: Entity: " << _qs.at(0) << "/ Band: " << _qs.at(1) << "/ Mode: " << _qs.at(2) << "/ Log: " << _qs.at(3) << QT_ENDL; // Receives: QStringList _qs; //_qs << Entity << BandId << << ModeId << lognumber; /* Not mode -1 - Error. - ERROR - ERROR 0 - New one - New One - New One - 0 1 - Worked but not in this band nor this mode - Needed One - Needed One - 1 2 - Worked in this band, not this mode - Needed One - Worked One - 3 3 - Worked in this band and in this mode - Worked One - Worked One - 3 4 - Worked in this mode, not this band - Needed One - Needed One - 1 5 - Confirmed in another band/mode but not worked in this band nor this mode - Needed One - Needed One - 1 6 - Confirmed in another band/mode but just worked in this band and not in this mode - Needed One - Worked One - 3 7 - Confirmed in another band/mode but just worked in this mode and not in this band - Needed One - Needed One - 1 8 - Confirmed in another band/mode but just worked in this band and mode - Worked One - Worked One - 3 9 - Confirmed in this mode, but not worked this band - Needed One - Needed One - 1 10 - Confirmed in this mode, but worked this band - Worked One - Worked One - 3 11 - Confirmed in this band but not worked in this mode - Needed One - Confirmed One - 13 12 - Confirmed in this band but worked in this mode - Worked One - Confirmed One - 13 13 - Confirmed in this band and mode - Confirmed One - Confirmed One - 13 14 - New CQ Zone 15 - New CQ Zone on band 16 - New ITU Zone 17 - New ITU Zone on band 18 - New Grid 19 - New Grid on band */ /* 0 - New One - Never worked before - RED 1 - Needed - New one in this band - ORANGE 2 - Worked - Worked in this band but not confirmed - YELLOW 3 - Confirmed - Confirmed in this band - GREEN */ if (_qs.length() != 4 ) { //qDebug() << "Awards::getDXStatus: Length != 4, return -1" << QT_ENDL; return -1; } //int errorCode = 0; int _band = _qs.at(1).toInt(); int _mode = _qs.at(2).toInt(); int _logNumber = _qs.at(3).toInt(); int dxccEntity = (_qs.at(0)).toInt(); //qDebug() << "Awards::getDXStatus: dxccEntity: " << QString::number(dxccEntity) << QT_ENDL; if (dxccEntity<=0) { //qDebug() << "Awards::getDXStatus: dxccEntity <= 0, return -1" << QT_ENDL; return -1; } bool checkingMode = true; if ( (_mode==-1) || (manageModes==false)) { checkingMode = false; //qDebug() << "Awards::getDXStatus: checkingMode = FALSE" << QT_ENDL; } int wb = dxccStatusBand(dxccEntity, _band, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int wm = -1; if (checkingMode) { wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed } // int wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed if (wm==-1) { checkingMode = false; } //qDebug() << "Awards::getDXStatus: wb=" << QString::number(wb) << " - wm=" << QString::number(wm) << QT_ENDL; //qDebug() << "Awards::getDXStatus: dxccStatus: " << QString::number(dxccStatus(dxccEntity, _logNumber)) << QT_ENDL; switch(dxccStatus(dxccEntity, _logNumber)) { case 0: //qDebug() << "Awards::getDXStatus: return 0" << QT_ENDL; return 0; // ATNO //break; case 1: // Worked, not confirmed switch (wb) { case 0: // Not worked in this band but in another band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 4" << QT_ENDL; return 4; } else { //qDebug() << "Awards::getDXStatus: return 1" << QT_ENDL; return 1; } } else { //qDebug() << "Awards::getDXStatus: return 4 nc" << QT_ENDL; return 4; } case 1: // Worked in this band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 3" << QT_ENDL; return 3; } else { //qDebug() << "Awards::getDXStatus: return 2" << QT_ENDL; return 2; } } else { //qDebug() << "Awards::getDXStatus: return 3 nc" << QT_ENDL; return 3; } default: // ERROR //qDebug() << "Awards::getDXStatus: default return -1 - 1" << QT_ENDL; return -1; } case 2: // Confirmed if (wb==2) { if (checkingMode) { if (wm==2) { //qDebug() << "Awards::getDXStatus: return 13" << QT_ENDL; return 13; } else if (wm==1) { //qDebug() << "Awards::getDXStatus: return 12" << QT_ENDL; return 12; } else { //qDebug() << "Awards::getDXStatus: return 11" << QT_ENDL; return 11; } } else { //qDebug() << "Awards::getDXStatus: return 13 nc" << QT_ENDL; return 13; } } else if ((wb ==1) || (wb == 0)) { if (checkingMode) { if (wb==1) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 8" << QT_ENDL; return 8; } else { //qDebug() << "Awards::getDXStatus: return 6" << QT_ENDL; return 6; } } else { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 7" << QT_ENDL; return 7; } else { //qDebug() << "Awards::getDXStatus: return 5" << QT_ENDL; return 5; } } } else { if (wb==0) { //qDebug() << "Awards::getDXStatus: return 7 nc" << QT_ENDL; return 7; } else { //qDebug() << "Awards::getDXStatus: return 8 nc" << QT_ENDL; return 8; } } } else { //qDebug() << "Awards::getDXStatus: return -1 - 2" << QT_ENDL; return -1; } default: //qDebug() << "Awards::getDXStatus: return -1 default2" << QT_ENDL; return -1; } // END OF SWITCH //qDebug() << "Awards::getDXStatus: END, return -1" << QT_ENDL; //return -1; } int Awards::dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBandMode: " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode TRUE" << QT_ENDL; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND modeid='%3' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); } else { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode FALSE" << QT_ENDL; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%3' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); } int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) { //qDebug() << "Awards::dxccStatusBandMode: return - 2" << QT_ENDL; query.finish(); return 2; } status = 1; } } query.finish(); } else { // The query fails... //qDebug() << "Awards::dxccStatusBandMode: return - -1" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBandMode: return - 0-4" << QT_ENDL; return status; } /* int Awards::dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBandMode: " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode TRUE" << QT_ENDL; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); } else { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode FALSE" << QT_ENDL; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); } int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") { //qDebug() << "Awards::dxccStatusBandMode: return - 2" << QT_ENDL; query.finish(); return 2; } else if(query.value(0).toString() == "0") { //qDebug() << "Awards::dxccStatusBandMode: return - 1" << QT_ENDL; if (status < 1) { status = 1; } } } } query.finish(); } else { // The query fails... //qDebug() << "Awards::dxccStatusBandMode: return - -1" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBandMode: return - 0-4" << QT_ENDL; return status; } */ int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatus: " << QString::number(_ent) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); int worked = 0; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND lognumber='%2' ").arg(QString::number(_ent)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { //qDebug() << "Awards::dxccStatus: query exec OK: " << query.lastQuery() << QT_ENDL; while (query.next()) { //qDebug() << "Awards::dxccStatus: query VALUE: " << (query.value(0)).toString() << QT_ENDL; if ( query.isValid() ) { //qDebug() << "Awards::dxccStatus: query valid OK" << QT_ENDL; if(((query.value(0)).toString() == "Y") || ((query.value(1)).toString() == "Y")) { //qDebug() << "Awards::dxccStatus: value = 1 - return 2" << QT_ENDL; query.finish(); return 2; } worked = 1; } } //qDebug() << "Awards::dxccStatus: return "<< QString::number(worked) << QT_ENDL; query.finish(); //qDebug() << "Awards::dxccStatus: END: " << QString::number(worked) << QT_ENDL; return worked; } else { // The query fails... //qDebug() << "Awards::dxccStatus: return -1" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatus: return 0" << QT_ENDL; //return worked; } /* int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatus: " << QString::number(_ent) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); int worked = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND lognumber='%2' ").arg(QString::number(_ent)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { //qDebug() << "Awards::dxccStatus: query exec OK: " << query.lastQuery() << QT_ENDL; while (query.next()) { //qDebug() << "Awards::dxccStatus: query VALUE: " << (query.value(0)).toString() << QT_ENDL; if ( query.isValid() ) { //qDebug() << "Awards::dxccStatus: query valid OK" << QT_ENDL; if((query.value(0)).toString() == "1") { //qDebug() << "Awards::dxccStatus: value = 1 - return 2" << QT_ENDL; query.finish(); return 2; } else if((query.value(0)).toString() == "0") { //qDebug() << "Awards::dxccStatus: value = 0 - worked 1" << QT_ENDL; if (worked <1) { worked = 1; } } } } //qDebug() << "Awards::dxccStatus: return "<< QString::number(worked) << QT_ENDL; query.finish(); //qDebug() << "Awards::dxccStatus: END: " << QString::number(worked) << QT_ENDL; return worked; } else { // The query fails... //qDebug() << "Awards::dxccStatus: return -1" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatus: return 0" << QT_ENDL; //return worked; } */ QColor Awards::getQRZDXStatusColor(const QStringList &_qs) { //qs << Entity << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "Awards::getQRZDXStatusColor qs.length: " << QString::number(_qs.length()) << QT_ENDL; //From Search QSO to QSL: q << _call << bandid << _mode << QString::number(currentLog); //qDebug() << "Awards::getQRZDXStatusColor: " << _qs.at(0) << "/" << _qs.at(1) << "/" << _qs.at(2) << _qs.at(3) << QT_ENDL; // Receives: QStringList _qs; //_qs << Entity << BandID << ModeId << lognumber; /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ QColor returnedColor; int status = getDXStatus(_qs); //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status) << "/" << getDXStatusString(status) << QT_ENDL; //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status) << QT_ENDL; switch (status) { case 0: returnedColor = newOneColor; break; case 1: returnedColor = neededColor; break; case 2: returnedColor = neededColor; break; case 3: returnedColor = workedColor; break; case 4: returnedColor = neededColor; break; case 5: returnedColor = neededColor; break; case 6: returnedColor = neededColor; break; case 7: returnedColor = neededColor; break; case 8: returnedColor = workedColor; break; case 9: returnedColor = neededColor; break; case 10: returnedColor = workedColor; break; case 11: returnedColor = neededColor; break; case 12: returnedColor = workedColor; break; case 13: returnedColor = confirmedColor; break; //break; default: returnedColor = defaultColor; break; } return returnedColor; } QString Awards::getDXStatusString (const int &_status) { //qDebug() << "Awards::getDXStatusString: " << QString::number(_status) << QT_ENDL; QString message = QString(); switch (_status) { case 0: message = QObject::tr("New One, work it!"); //message = QObject::tr("0-new One"); break; case 1: message = QObject::tr("Needed, work it!"); //message = QObject::tr("1-Needed, work it!"); break; case 2: message = QObject::tr("Needed, work it!"); break; case 3: message = QObject::tr("Worked but not confirmed"); break; case 4: message = QObject::tr("Needed, work it!"); break; case 5: message = QObject::tr("Needed, work it!"); break; case 6: message = QObject::tr("Needed, work it!"); break; case 7: message = QObject::tr("Needed, work it!"); break; case 8: message = QObject::tr("Worked but not confirmed"); break; case 9: message = QObject::tr("Needed, work it!"); break; case 10: message = QObject::tr("Worked but not confirmed"); break; case 11: message = QObject::tr("Needed, work it!"); break; case 12: message = QObject::tr("Worked but not confirmed"); break; case 13: message = QObject::tr("Confirmed"); break; //break; default: message = QObject::tr("Not identified"); break; } return message; } QString Awards::getDXCCStatusBand(const int _dxcc, const int _band) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << Q_FUNC_INFO << "DXCC/Band: " << QString::number(_dxcc) << "/" << QString::number(_band); //qDebug() << Q_FUNC_INFO << "dxccStatusList: " << QString::number(dxccStatusList.length ()); EntityBandStatus aux; foreach (aux, dxccStatusList) { //qDebug() << Q_FUNC_INFO << " DXCC: " << QString::number(aux.dxcc); //qDebug() << Q_FUNC_INFO << " Band: " << QString::number(aux.bandid); if (aux.confirmed) { //qDebug() << Q_FUNC_INFO << "Confirmed"; } else { //qDebug() << Q_FUNC_INFO << "Not confirmed"; } if (aux.dxcc == _dxcc) { //qDebug() << Q_FUNC_INFO << " DXCC found: " << QString::number(_dxcc); if (aux.bandid == _band) { //qDebug() << Q_FUNC_INFO << " Band found: " << QString::number(_band); if (aux.confirmed) { //qDebug() << Q_FUNC_INFO << " Confirmed " ; return "C"; } else { //qDebug() << Q_FUNC_INFO << " Worked " ; return "W"; } } } } //qDebug() << Q_FUNC_INFO << " Returnin -" ; return "-"; } QString Awards::getDXCCStatusBand2(const int _dxcc, const int _band, const int _logNumber) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << "Awards::getDXCCStatusBand: log received: " << QString::number(_logNumber) << QT_ENDL; QString stringQuery; if (_logNumber<0) { stringQuery = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2'").arg(_dxcc).arg(_band); } else { stringQuery = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_dxcc).arg(_band).arg(_logNumber); } QString status = "-"; QSqlQuery query; bool sqlOk = query.exec(stringQuery); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString() == "Y") || ((query.value(1)).toString() == "Y")) { query.finish(); return "C"; } status = "W"; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return "-"; } query.finish(); return status; } /* QString Awards::getDXCCStatusBand(const int _dxcc, const int _band, const int _logNumber) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << "Awards::getDXCCStatusBand: log received: " << QString::number(_logNumber) << QT_ENDL; QString stringQuery; if (_logNumber<0) { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2'").arg(_dxcc).arg(_band); } else { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3'").arg(_dxcc).arg(_band).arg(_logNumber); } QString status = "-"; QSqlQuery query; bool sqlOk = query.exec(stringQuery); if (sqlOk) { while (query.next()) { if (query.isValid()) { if ((query.value(0)).toString() == "1") { query.finish(); return "C"; } else if ((query.value(0)).toString() == "0") { if (status == "-") { status = "W"; } } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return "-"; } query.finish(); return status; } */ QString Awards::checkIfValidIOTA(const QString &_tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << "Awards::checkIfValidIOTA: " << _tiota << QT_ENDL; //bool _valid = false; QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QT_SKIP); if (_values.size() != 2) { return ""; } if (dataProxy->isValidContinentShortName(_values.at(0))) { _continent = _values.at(0); } else { return ""; } if ((_values.at(1)).toInt() > 0) { _number = _values.at(1); } else { return ""; } } else { return ""; } //qDebug() << "Awards::checkIfValidIOTA (cont) " << _continent << QT_ENDL; //qDebug() << "Awards::checkIfValidIOTA (numb): " << _number << QT_ENDL; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } else { return QString(); } //return QString(); /* QString stringQuery = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_continent); QSqlQuery query; query.exec(stringQuery); while (query.next()) { if (query.isValid()) { _valid = true; if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } } return ""; */ } void Awards::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; defaultColor = QColor(_default.toUpper()); neededColor = QColor(_needed.toUpper()); workedColor = QColor(_worked.toUpper()); confirmedColor = QColor(_confirmed.toUpper()); newOneColor = QColor(_newOne.toUpper()); if (defaultColor.isValid()) { defaultColor.setNamedColor(_default.toUpper()); } if (neededColor.isValid()) { neededColor.setNamedColor(_needed.toUpper()); } if (confirmedColor.isValid()) { confirmedColor.setNamedColor(_confirmed.toUpper()); } if (newOneColor.isValid()) { newOneColor.setNamedColor(_newOne.toUpper()); } if (workedColor.isValid()) { workedColor.setNamedColor(_worked.toUpper()); } } QColor Awards::getDefaultColor() { return defaultColor; } void Awards::recalculateAwards() { /* TODO: I need to optimize this function. The select & insert of setAwardDXCC are too slow) Should go in a transaction */ //qDebug() << "Awards::recalculateAwards" << QT_ENDL; dataProxy->updateAwardDXCC(); emit awardDXCCUpdated(); dataProxy->updateAwardWAZ(); //qDebug() << "Awards::recalculateAwards - END" << QT_ENDL; } int Awards::getQSOsInLog(const int _logNumber) { //qDebug() << "Awards::getQSOsInLog: " << QString::number(_logNumber) << QT_ENDL; QSqlQuery query; QString queryString; int v; queryString = QString("SELECT COUNT (id) FROM log WHERE lognumber='%1'").arg(_logNumber) ; if( !query.exec(queryString) ) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } else { query.next(); if (query.isValid()) { v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -2; } } } /* void Awards::setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwards: " << QString::number(_dxcc) << QT_ENDL; //_workedOrConfirmed = -1 Remove this pair //_workedOrConfirmed = 0 Set as Worked //_workedOrConfirmed = 1 Set as Confirmed int d = _dxcc; int b = _band; int m = _mode; int w = _workedOrConfirmed; int l = _logNumber; int i = _qsoId; int z = _waz; setAwardDXCC(d, b, m, w, l, i); setAwardWAZ(z, b, m, w, l, i); //setAwardWAZ(_waz, _band, _mode, _workedOrConfirmed, _logNumber); } */ void Awards::setAwards(const int _qsoId) { //qDebug() << "Awards::setAwards: _qsoId: " << QString::number(_qsoId) << QT_ENDL; dataProxy->setDXCCAwardStatus(_qsoId); dataProxy->setWAZAwardStatus(_qsoId); } /* int Awards::setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardDXCCst-0: " << QString::number(_dxcc) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId) << QT_ENDL; int nameCol=-1; QString _refid = QString(); // _confirmedQSO == false QSO is just worked // _confirmedQSO == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_dxcc>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardDXCCst: Not valid data received!" << QT_ENDL; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } //qDebug() << "Awards::setAwardDXCCst: _qsoId: " << QString::number(_qsoId) << "/" << QString::number(_iconfirmed) << QT_ENDL; QString stringQuery = QString(); QSqlQuery query; bool sqlOK = false; int errorCode = -1; stringQuery = QString("SELECT id, confirmed FROM awarddxcc where dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4'").arg(_dxcc).arg(_band).arg(_mode).arg(_logNumber); sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "Awards::setAwardDXCCst-1:" << QT_ENDL; query.next(); QSqlRecord rec = query.record(); if (query.isValid()) {// We have some data, we need to UPDATE - We are only confirming! //qDebug() << "Awards::setAwardDXCCst: We have some data, we neer to update" << QT_ENDL; nameCol = rec.indexOf("id"); _refid = query.value(nameCol).toString(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE id='%2'").arg(_qsoId).arg(_refid); //qDebug() << "Awards::setAwardDXCCst: (UPDATE): " << stringQuery << QT_ENDL; if (sqlOK) { // Set of data updated //qDebug() << "Awards::setAwardDXCCst: Data updated!" << QT_ENDL; query.finish(); return 1; } else { // Something failed. Trace it! errorCode = query.lastError().nativeErrorCode(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } else { // We don't have this set, we need to INSERT stringQuery = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_dxcc).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::setAwardDXCCst: We don't have data... so we INSERT" << QT_ENDL; //qDebug() << "Awards::setAwardDXCCst: (INSERT): " << stringQuery << QT_ENDL; if (sqlOK) { // Set of data included query.finish(); //qDebug() << "Awards::setAwardDXCCst: Data inserted!" << QT_ENDL; } else { // Something failed. Trace it! emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); return -1; } } } else { // Trace the error... what may be happening??? emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); return -1; } return -1; } */ /* int Awards::setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardWAZst(CQZ/BAND/MODE/WORKED/log/qsoid): " << QString::number(_cqz) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId) << QT_ENDL; // _confirmed == false QSO is just worked // _confirmed == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_cqz>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardWAZst: some data was NOK" << QT_ENDL; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } QString stringQuery; QSqlQuery query; bool sqlOK; //int errorCode = -1; stringQuery = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_cqz).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); if ((sqlOK) && (!_confirmed)) // First time a DXCC/Band/mode is worked { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 1" << QT_ENDL; query.finish(); return 1; } else if ((sqlOK) && (_confirmed)) // First time a CQZ/Band/Mode is confirmed { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 2" << QT_ENDL; query.finish(); return 2; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- sqlOK ERROR: " << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardWAZst: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "Awards::setAwardWAZst: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "Awards::setAwardWAZst: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "Awards::setAwardWAZst: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } return -1; } */ /* int Awards::setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid) // Changes the status of a DXCC from worked to confirmed { //qDebug() << "Awards::setAwardDXCCConfirmed: " << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_dxcc)<< "/" << QString::number(_newQSOid)<< QT_ENDL; QString stringQuery; QSqlQuery query = QSqlQuery(); bool sqlOK = false; int errorCode = -1; int nameCol = -1; QString aux = QString(); stringQuery = QString("SELECT qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); sqlOK = query.exec(stringQuery); if (sqlOK) { QSqlRecord rec = query.record(); if (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("qsoid"); aux = (query.value(nameCol)).toString(); query.finish(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE qsoid='%2'").arg(_newQSOid).arg(aux); sqlOK = query.exec(stringQuery); if (sqlOK) { query.finish(); return _newQSOid; } else { // UPDATE failed emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; return errorCode; } } else { // Not valid record //qDebug() << "Awards::setAwardDXCCConfirmed: Not valid record" << QT_ENDL; return -3; } } else { // Not next record //qDebug() << "Awards::setAwardDXCCConfirmed: Not next record" << QT_ENDL; return -2; } } else { // emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; return errorCode; } return 1; } */ int Awards::setDXCCToQSO(const int _dxcc, const int _qsoid) // Defines the DXCC in a QSO { //qDebug() << "Awards::setDXCCToQSO: " << QString::number(_dxcc) << "/" << QString::number(_qsoid) << QT_ENDL; int errorCode = -1; QString queryString = QString("UPDATE log SET dxcc='%1' WHERE id='%2'").arg(_dxcc).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setDXCCToQSO: DXCC Updated in Log but failed...." << QT_ENDL; errorCode = query.lastError().nativeErrorCode().toInt(); query.finish(); //qDebug() << "Awards::setDXCCToQSO: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "Awards::setDXCCToQSO: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "Awards::setDXCCToQSO: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "Awards::setDXCCToQSO: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; return errorCode; } } int Awards::setCQToQSO(const int _cqz, const int _qsoid) // Defines the CQ in a QSO { //qDebug() << "Awards::setCQToQSO: " << QString::number(_cqz) << "/" << QString::number(_qsoid) << QT_ENDL; int errorCode = -1; QString queryString = QString("UPDATE log SET cqz='%1' WHERE id='%2'").arg(_cqz).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setCQToQSO: DXCC Updated in Log but failed...." << QT_ENDL; errorCode = query.lastError().nativeErrorCode().toInt(); query.finish(); //qDebug() << "Awards::setCQToQSO: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "Awards::setCQToQSO: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "Awards::setCQToQSO: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "Awards::setCQToQSO: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; return errorCode; } } bool Awards::getIsDXCCConfirmed(const int _dxcc, const int _logNumber) { // isDXCCConfirmed(const int _dxcc, const int _currentLog); return dataProxy->isDXCCConfirmed(_dxcc, _logNumber); } int Awards::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonQSO: " << QString::number(_year) << QT_ENDL; return dxMarathon->getDXMarathonQSO(_year, _logNumber); } int Awards::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonDXCC: " << QString::number(_year) << QT_ENDL; return dxMarathon->getDXMarathonDXCC(_year, _logNumber); } int Awards::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonCQ: " << QString::number(_year) << QT_ENDL; return dxMarathon->getDXMarathonCQ(_year, _logNumber); } int Awards::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonScore: " << QString::number(_year) << QT_ENDL; return dxMarathon->getDXMarathonScore(_year, _logNumber); } bool Awards::isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dxMarathon->neededForDXMarathon(_dxcc, _cq, _year, _logNumber); } int Awards::dxccStatusBand(const int _ent, const int _band, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBand: " << QString::number(_ent) << "/" << QString::number(_band) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND qsl_rcvd='Y' AND bandid='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; //qDebug() << "Awards::dxccStatusBand: " << queryString << QT_ENDL; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) // Confirmed { query.finish(); return 2; } status = 1; } // Not present => Not worked } query.finish(); } else { //TODO: Manage the query error emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBand: return - 0.3" << QT_ENDL; return status; // if arrives to here decision => not worked } /* int Awards::dxccStatusBand(const int _ent, const int _band, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBand: " << QString::number(_ent) << "/" << QString::number(_band) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { //TODO: Manage the query error emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBand: return - 0.3" << QT_ENDL; return status; // if arrives to here decision => not worked } */ int Awards::dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusMode: " << QString::number(_ent) << "/" << QString::number(_mode) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_mode == -1) { return -1; } int status = 0; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND modeid='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) // Confirmed { query.finish(); return 2; } status = 1; } // Not present => Not worked } query.finish(); } else { // The query fails... emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //TODO: Manage the query error return -1; } return status; // if arrives to here decision => not worked } /* int Awards::dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusMode: " << QString::number(_ent) << "/" << QString::number(_mode) << QT_ENDL; QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_mode == -1) { return -1; } int status = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND mode='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { // The query fails... emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //TODO: Manage the query error return -1; } return status; // if arrives to here decision => not worked } */ void Awards::setManageModes(const bool _manageModes) { manageModes = _manageModes; } bool Awards::updateDXCCBandsStatus(const int _logNumber) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_logNumber); //QList dxccStatus; QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; //QString answer; if (_logNumber>0) { //stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc>0 AND lognumber='%1'ORDER BY dxcc").arg(_logNumber); stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd, id FROM log lognumber='%1'ORDER BY dxcc").arg(_logNumber); } else { stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd, id FROM log ORDER BY dxcc"); } int qsos = 0; sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - exec query: " << query.lastQuery (); dxccStatusList.clear(); while(query.next()) { if (query.isValid()) { qsos++; EntityBandStatus ent; if (query.value(0).toInt()==0) { //qDebug() << Q_FUNC_INFO << " - Returning false for: QSOid" << QString::number(query.value(4).toInt()); return false; } ent.dxcc = query.value(0).toInt(); ent.bandid = query.value(1).toInt(); if ((query.value(2).toString () == "Y") || (query.value(3).toString () == "Y")) { ent.confirmed = true; } else { ent.confirmed = false; } dxccStatusList.append (ent); } else { //qDebug() << Q_FUNC_INFO << ": query NOK: " << query.lastQuery (); query.finish(); return false; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); if ((dxccStatusList.length ()<1) && (qsos>0)) { //qDebug() << Q_FUNC_INFO << " RETURN FALSE" ; // It may be the case that there are not dxcc return false; } else if (dxccStatusList.length ()<1) { //qDebug() << Q_FUNC_INFO << ": dxccStatusList length <1 "; } else if(qsos>0) { //qDebug() << Q_FUNC_INFO << ": qsos>0 "; } else { //qDebug() << Q_FUNC_INFO << ": ELSE"; } //qDebug() << Q_FUNC_INFO << ": dxccStatusList length: " << QString::number(dxccStatusList.length ()) ; //qDebug() << Q_FUNC_INFO << ": QSOs: " << QString::number(qsos) ; return true; } klog-1.8.6/hamlibclass.h0000644000175000017500000001242314166020421014073 0ustar develdevel#ifndef HAMLIBCLASS_H #define HAMLIBCLASS_H /*************************************************************************** hamlibclass.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include //#include #include #include #include #include #include #include "klogdefinitions.h" // Potential fix of hamlib 4.2 migration #ifndef HAMLIB_FILPATHLEN #define HAMLIB_FILPATHLEN FILEPATHLEN #endif #ifndef FILPATHLEN #define FILPATHLEN 100 #endif class HamLibClass : public QObject { Q_OBJECT public: explicit HamLibClass(QObject *parent = nullptr); ~HamLibClass(); QStringList getRigList (); int getModelIdFromName (const QString &_name); QString getNameFromModelId(const int _id); void setModelId(const int _id); void setPort(const QString &_port); void setPoll(const int _milsecs); void setDataBits(const int data); void setStop(const int _stop); void setFlow(const QString &_flow); void setParity(const QString &_parity); void setSpeed(const int _speed); void setRTS(const QString &_state); void setDTR(const QString &_state); void setFreq(const double _fr); void setMode(const QString &_m); void setReadOnly(const bool _r); bool isModeADIFMode(const QString &_m); void setNetworkAddress(const QString &_address); void setNetworkPort(const int _port); bool init(bool _active); bool stop(); bool readRadio(bool _forceRead); bool isRunning(); void initClass(); void clean(); void checkErrorCountAndStop(); double getFrequency(); //void showDebugLog(const QString &_func, const QString &_log); //bool openSerialPort(); //bool closeSerialPort(); signals: void freqChanged(double newFreq); void modeChanged(QString newFreq); public slots: void slotTimer(); private: bool readRadioInternal(bool _forceRead); static int addRigToList(const struct rig_caps* caps, void* data); QString hamlibMode2Mode(rmode_t _rmode); bool errorManage(const QString &_func, const int _errorcode); //rmode_t mode2HamlibMode(const QString &_m); QStringList strings; QTimer *timer; QMap rigName2RigId; QMap rigId2RigName; RIG *my_rig; // handle to rig (instance) freq_t freq, freq_old; // Radio freq rmode_t rmode, mode_old; // Radio mode serial_parity_e sparity; serial_handshake_e shandshake; serial_control_state_e srts, sdtr; int retcode; // generic return code from functions rig_model_t myrig_model; // Integer radio model //hamlib_port_t myport; // Hamlib port pbwidth_t width; //vfo_t vfo; /* vfo selection */ //int strength; /* S-Meter level */ int bauds; // default 9600 int dataBits; // default 8 int stopBits; // default 1 QString flowControl; // default QSerialPort::NoFLowControl QString parity; // default QSerialPort::NoParity QString serialPort; QString networkAddress; int networkPort; int pollInterval; // Poll interval in mSecs int errorCount; // Number of times that the rig has returned an error since last time OK. bool rigLaunched; bool readOnlyMode; // If true, KLog will not modify any parameter (freq/mode...) in the radio. KLog just will follow the radio. bool justEmitted; bool reading; // Just a semaphore to prevent several readings //bool active; //QSerialPort *m_serial; }; #endif // HAMLIBCLASS_H klog-1.8.6/widgets/0000755000175000017500000000000014166020421013104 5ustar develdevelklog-1.8.6/widgets/showkloglogwidget.cpp0000644000175000017500000000556214166020407017367 0ustar develdevel/*************************************************************************** showkloglogwidget.cpp - description ------------------- begin : jan 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showkloglogwidget.h" ShowKLogLogWidget::ShowKLogLogWidget(QWidget *parent) : QWidget(parent) { levelComboBox = new QComboBox; model = new QStringListModel(); //QStringList list; list.clear(); model->setStringList(list); logsView = new QListView; logsView->setModel(model); createUI(); } void ShowKLogLogWidget::createUI() { QStringList levels; levels.clear(); //TODO: Link the Level tags to the utilities.h definition levels << "1-Info" << "2-Debug"; levelComboBox->clear(); levelComboBox->addItems(levels); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(levelComboBox); layout->addWidget(logsView); setLayout(layout); } void ShowKLogLogWidget::addLog(const QString &_func, QString const &_log, const DebugLogLevel _l) { QString msg; msg = QDateTime::currentDateTime().toString("yyyy/MM/dd-hh:mm:ss") + "-" + _func + ": " + _log; //qDebug() << Q_FUNC_INFO << ": " << msg; //QModelIndex index = model->index(0, 0); //model->setData(index, msg); if(model->insertRow(0)) { QModelIndex index = model->index(0, 0); model->setData(index, msg); } } klog-1.8.6/widgets/onlinemessagewidget.h0000644000175000017500000000444414166020407017324 0ustar develdevel#ifndef ONLINEMESSAGEWIDGET_H #define ONLINEMESSAGEWIDGET_H /*************************************************************************** onlinemessagewidget.h - description ------------------- begin : November 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "utilities.h" class OnlineMessageWidget : public QWidget { Q_OBJECT public: explicit OnlineMessageWidget(QWidget *parent = nullptr); int showMessage(QNetworkReply::NetworkError _error, OnLineProvider _prov, OnlineErrorCode _onlineError, OnlineErrorReason _onlineReason, const QString &_msg); signals: public slots: private: QString translate(QNetworkReply::NetworkError _error); }; #endif // ONLINEMESSAGEWIDGET_H klog-1.8.6/widgets/showkloglogwidget.h0000644000175000017500000000465214166020407017033 0ustar develdevel#ifndef SHOWKLOGLOGWIDGET_H #define SHOWKLOGLOGWIDGET_H /*************************************************************************** showkloglogwidget.h - description ------------------- begin : jan 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "utilities.h" // This widget will show the KLog log, the software log, to be able to debug // or see how it is executing. Mainly for debug & development. class ShowKLogLogWidget : public QWidget { Q_OBJECT public: explicit ShowKLogLogWidget(QWidget *parent = nullptr); void addLog(QString const &_func, QString const &_log, const DebugLogLevel _l); signals: public slots: private: void createUI(); QStringList list; QListView *logsView; QStringListModel *model; QComboBox *levelComboBox; }; #endif // SHOWKLOGLOGWIDGET_H klog-1.8.6/widgets/showadifimportwidget.h0000644000175000017500000000525214166020421017524 0ustar develdevel#ifndef SHOWADIFIMPORTPORTWIDGET_H #define SHOWADIFIMPORTPORTWIDGET_H /*************************************************************************** showadifimportwidget.h - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "dataproxy_sqlite.h" #include "utilities.h" class ShowAdifImportWidget : public QWidget { Q_OBJECT public: explicit ShowAdifImportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~ShowAdifImportWidget(); void addQSOToTheList(const QStringList _qso); void clear(); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotOKPushButtonClicked(); // void slotCancelPushButtonClicked(); signals: //void selection(QString _st, QDate _startD, QDate _endD); private: void createUI(); void fillTable(); void addQSO(const QStringList &_qso); QList qsosList; DataProxy_SQLite *dataProxy; Utilities *util; QPushButton *okButton;//, *cancelButton; QTableWidget *tableWidget; QHeaderView *hv, *hh; }; #endif klog-1.8.6/widgets/onlinemessagewidget.cpp0000644000175000017500000001304314166020407017652 0ustar develdevel/*************************************************************************** onlinemessagewidget.cpp - description ------------------- begin : November 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "onlinemessagewidget.h" OnlineMessageWidget::OnlineMessageWidget(QWidget *parent) : QWidget(parent) { } int OnlineMessageWidget::showMessage(QNetworkReply::NetworkError _error, OnLineProvider _prov, OnlineErrorCode _onlineError, OnlineErrorReason _onlineReason, const QString &_msg) { //enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ, HamQTH}; QString message = QString(); QString detailedText = QString(tr("The server returned the following error: %1")).arg(translate(_error)); QString title = QString(); /* switch (_onlineReason) { case OnlineErrorReason::Other: break; case OnlineErrorReason::Auth: break; case OnlineErrorReason::DupeQSO: break; case OnlineErrorReason::WrongLogBook: break; } switch (_prov) { case ClubLog: { } break; case LoTW: {} break; case QRZ: {} break; case eQSL: {} break; } */ if ((title.length()<1) || (message.length()<1) || (detailedText.length()<1)) { return -100; } QMessageBox msgBox; if (_onlineError == OnlineErrorCode::Ok) { msgBox.setIcon(QMessageBox::Warning); } else { msgBox.setIcon(QMessageBox::Information); } msgBox.setWindowTitle(title); msgBox.setText(message); msgBox.setDetailedText(detailedText); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); return msgBox.exec(); } QString OnlineMessageWidget::translate(QNetworkReply::NetworkError _error) { switch (_error) { case QNetworkReply::NoError: return QString::number(_error); break; case QNetworkReply::ConnectionRefusedError: break; case QNetworkReply::RemoteHostClosedError: break; case QNetworkReply::HostNotFoundError: break; case QNetworkReply::TimeoutError: break; case QNetworkReply::OperationCanceledError: break; case QNetworkReply::SslHandshakeFailedError: break; case QNetworkReply::TemporaryNetworkFailureError: break; case QNetworkReply::NetworkSessionFailedError: break; case QNetworkReply::BackgroundRequestNotAllowedError: break; case QNetworkReply::TooManyRedirectsError: break; case QNetworkReply::InsecureRedirectError: break; case QNetworkReply::ProxyConnectionRefusedError: break; case QNetworkReply::ProxyConnectionClosedError: break; case QNetworkReply::ProxyNotFoundError: break; case QNetworkReply::ProxyTimeoutError: break; case QNetworkReply::ProxyAuthenticationRequiredError: break; case QNetworkReply::ContentAccessDenied: break; case QNetworkReply::ContentOperationNotPermittedError: break; case QNetworkReply::ContentNotFoundError: break; case QNetworkReply::AuthenticationRequiredError: break; case QNetworkReply::ContentReSendError: break; case QNetworkReply::ContentConflictError: break; case QNetworkReply::ContentGoneError: break; case QNetworkReply::InternalServerError: break; case QNetworkReply::OperationNotImplementedError: break; case QNetworkReply::ServiceUnavailableError: break; case QNetworkReply::ProtocolUnknownError: break; case QNetworkReply::ProtocolInvalidOperationError: break; case QNetworkReply::UnknownNetworkError: break; case QNetworkReply::UnknownProxyError: break; case QNetworkReply::UnknownContentError: break; case QNetworkReply::ProtocolFailure: break; case QNetworkReply::UnknownServerError: break; default: return QString(tr("Not identified")); break; } return QString::number(_error); } klog-1.8.6/widgets/adiflotwexportwidget.cpp0000644000175000017500000004004414166020421020071 0ustar develdevel/*************************************************************************** adiflotwexportwidget.cpp - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "adiflotwexportwidget.h" AdifLoTWExportWidget::AdifLoTWExportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { #ifdef QT_DEBUG //qDebug() << ": " << _parentFunction; #else #endif dataProxy = dp; util = new Utilities; stationCallsignComboBox = new QComboBox; startDate = new QDateEdit; endDate = new QDateEdit; okButton = new QPushButton; cancelButton = new QPushButton; tableWidget = new QTableWidget; topLabel = new QLabel; numberLabel = new QLabel; selectedEMode = ModeLotW; //By default this widget will be used for LoTW Export. defaultStationCallsign = QString(); createUI(); } AdifLoTWExportWidget::~AdifLoTWExportWidget() { delete(util) ; } void AdifLoTWExportWidget::setDefaultStationCallsign(const QString &_st) { if (util->isValidCall(_st)) { defaultStationCallsign = _st; } } void AdifLoTWExportWidget::createUI() { //fillStationCallsignComboBox(); stationCallsignComboBox->setToolTip(tr("Select the Station Callsign that you want to use to upload the log.")); startDate->clear(); startDate->setToolTip(tr("Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign.")); endDate->clear(); //endDate->setDate(QDate::currentDate()); endDate->setToolTip(tr("Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign.")); QLabel *stationLabel = new QLabel; stationLabel->setText(tr("Station callsign")); QLabel *startLabel = new QLabel; startLabel->setText(tr("Start date")); QLabel *endLabel = new QLabel; endLabel->setText(tr("End date")); okButton->setText(tr("Ok")); cancelButton->setText(tr("Cancel")); hv = tableWidget->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = tableWidget->horizontalHeader(); QStringList header; header.clear(); header << tr("DX") << tr("Date/Time") << tr("Band") << tr("Mode"); tableWidget->setColumnCount(header.length()); tableWidget->setHorizontalHeaderLabels(header); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(topLabel, 0, 0, 1, -1); mainLayout->addWidget(stationLabel, 1, 0); mainLayout->addWidget(stationCallsignComboBox, 2, 0); mainLayout->addWidget(startLabel, 1, 1); mainLayout->addWidget(startDate, 2, 1); mainLayout->addWidget(endLabel, 1, 2); mainLayout->addWidget(endDate, 2, 2); mainLayout->addWidget(tableWidget, 3, 0, 1, -1); mainLayout->addWidget(numberLabel, 4, 0); mainLayout->addWidget(okButton, 4, 1); mainLayout->addWidget(cancelButton, 4, 2); setLayout(mainLayout); connect(startDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged())) ; connect(endDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged() )); connect(stationCallsignComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotStationCallsignChanged() ) ) ; connect(okButton, SIGNAL(clicked()), this, SLOT(slotOKPushButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); } void AdifLoTWExportWidget::setDefaultStationComboBox() { if (!util->isValidCall(defaultStationCallsign)) { return; } if (stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive) >= 0) { stationCallsignComboBox->setCurrentIndex(stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive)); } } void AdifLoTWExportWidget::fillStationCallsignComboBox() { //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox" << QT_ENDL; //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox: " << QString::number(stationCallsignComboBox->count()) << QT_ENDL; stationCallsignComboBox->clear(); //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-1" << QT_ENDL; stationCallsignComboBox->addItem(tr("Not defined")); //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-2" << QT_ENDL; if (currentExportMode == ModeADIF) { //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-3" << QT_ENDL; stationCallsignComboBox->addItem(tr("All")); //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-4" << QT_ENDL; } //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-99" << QT_ENDL; stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(logNumber)); //qDebug() << "AdifLoTWExportWidget::fillStationCallsignComboBox-END" << QT_ENDL; } void AdifLoTWExportWidget::setTopLabel(const QString &_t) { topLabel->setText(_t); } void AdifLoTWExportWidget::fillTable() { //qDebug() << "AdifLoTWExportWidget::fillTable " << QT_ENDL; QList qsos; qsos.clear(); bool justQueued = true; switch (currentExportMode) { case ModeADIF: justQueued = false; //qDebug() << "AdifLoTWExportWidget::fillTable ADIF" << QT_ENDL; break; case ModeLotW: //qDebug() << "AdifLoTWExportWidget::fillTable LoTW" << QT_ENDL; justQueued = true; break; case ModeClubLog: //qDebug() << "AdifLoTWExportWidget::fillTable ClubLog" << QT_ENDL; //justQueued = true; break; case ModeEQSL: //qDebug() << "AdifLoTWExportWidget::fillTable EQSL" << QT_ENDL; justQueued = true; break; case ModeQRZ: //qDebug() << "AdifLoTWExportWidget::fillTable QRZ" << QT_ENDL; justQueued = true; break; } if (stationCallsignComboBox->currentIndex() == 0) { // Not defined station_callsign (blank) //qDebug() << "AdifLoTWExportWidget::fillTable blank station callsign " << QT_ENDL; qsos.append(dataProxy->getQSOsListLoTWToSend(QString(), startDate->date(), endDate->date(), justQueued, logNumber)); } else if((stationCallsignComboBox->currentIndex() == 1) && (currentExportMode == ModeADIF)) { // ALL stations, no matter the station. //qDebug() << "AdifLoTWExportWidget::fillTable ALL station callsign " << QT_ENDL; qsos.append(dataProxy->getQSOsListLoTWToSend("ALL", startDate->date(), endDate->date(), justQueued, logNumber)); } else { //qDebug() << "AdifLoTWExportWidget::fillTable OTHER station callsign " << QT_ENDL; if (currentExportMode == ModeClubLog) { //qDebug() << "AdifLoTWExportWidget::fillTable Mode ClubLog" << QT_ENDL; qsos.append(dataProxy->getQSOsListClubLogToSent(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true, logNumber)); } else if (currentExportMode == ModeEQSL) { //qDebug() << "AdifLoTWExportWidget::fillTable Mode eQSL" << QT_ENDL; qsos.append(dataProxy->getQSOsListEQSLToSent(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true)); } else if (currentExportMode == ModeQRZ) { //qDebug() << "AdifLoTWExportWidget::fillTable Mode QRZ" << QT_ENDL; qsos.append(dataProxy->getQSOsListQRZCOMToSent(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true)); } else if (currentExportMode == ModeLotW) { //qDebug() << "AdifLoTWExportWidget::fillTable Mode QRZ" << QT_ENDL; qsos.append(dataProxy->getQSOsListLoTWToSend (stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListQRZCOMToSent(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true)); } else {//(currentExportMode == ModeADIF) //qDebug() << "AdifLoTWExportWidget::fillTable Mode LoTW" << QT_ENDL; qsos.append(dataProxy->getQSOsListToBeExported(stationCallsignComboBox->currentText(), startDate->date(), endDate->date())); } } //qDebug() << "AdifLoTWExportWidget::fillTable: -3" << QT_ENDL; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << "AdifLoTWExportWidget::fillTable pre FOR" << QT_ENDL; for (int i=0; isetText(tr("QSOs: ") + QString::number(qsos.count())); if (qsos.count()>0) { //qDebug() << "AdifLoTWExportWidget::fillTable Enable OKButton" << QT_ENDL; okButton->setEnabled(true); } else { //qDebug() << "AdifLoTWExportWidget::fillTable Disable OKButton" << QT_ENDL; okButton->setEnabled(false); } //qDebug() << "AdifLoTWExportWidget::fillTable END" << QT_ENDL; } void AdifLoTWExportWidget::addQSO(const int _qsoID) { //qDebug() << "AdifLoTWExportWidget::addQSO: " << QString::number(_qsoID) << QT_ENDL; QStringList qsoToAdd; qsoToAdd.clear(); qsoToAdd << dataProxy->getQSODetailsForLoTWDownload(_qsoID); //qDebug() << "AdifLoTWExportWidget::addQSO: Columns: " << QString::number(tableWidget->columnCount()) << QT_ENDL; //qDebug() << "AdifLoTWExportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()) << QT_ENDL; if (qsoToAdd.length() == tableWidget->columnCount()) { tableWidget->insertRow(tableWidget->rowCount()); for (int i = 0; isetTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); tableWidget->setItem(tableWidget->rowCount()-1, i, newItemID); } } //qDebug() << "AdifLoTWExportWidget::addQSO: - END" << QT_ENDL; } void AdifLoTWExportWidget::slotStationCallsignChanged() { //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged" << QT_ENDL; if (stationCallsignComboBox->count()<1) { //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged count <1 " << QT_ENDL; return; } //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged-01" << QT_ENDL; startDate->setDate(dataProxy->getFirstQSODateFromCall(stationCallsignComboBox->currentText())); //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged-02" << QT_ENDL; endDate->setDate(dataProxy->getLastQSODateFromCall(stationCallsignComboBox->currentText())); //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged-03" << QT_ENDL; fillTable(); //qDebug() << "AdifLoTWExportWidget::slotStationCallsignChanged - END" << QT_ENDL; } void AdifLoTWExportWidget::slotDateChanged() { //slotStationCallsignChanged(); fillTable(); } void AdifLoTWExportWidget::slotOKPushButtonClicked() { //qDebug() << "AdifLoTWExportWidget::slotOKPushButtonClicked" << QT_ENDL; this->hide(); if (stationCallsignComboBox->currentIndex() == 0) { emit selection("NOT", startDate->date(), endDate->date(), currentExportMode); } else if (stationCallsignComboBox->currentIndex() == 1) { if ((currentExportMode == ModeLotW) || (currentExportMode == ModeClubLog) || (currentExportMode == ModeQRZ)|| (currentExportMode == ModeEQSL)) { emit selection(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), currentExportMode); } else { emit selection("ALL", startDate->date(), endDate->date(), currentExportMode); } } else { emit selection(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), currentExportMode); } //qDebug() << "AdifLoTWExportWidget::slotOKPushButtonClicked - END" << QT_ENDL; close(); } void AdifLoTWExportWidget::slotCancelPushButtonClicked() { //qDebug() << "AdifLoTWExportWidget::slotCancelPushButtonClicked" << QT_ENDL; close(); } void AdifLoTWExportWidget::closeEvent(QCloseEvent *event) { //qDebug() << "AdifLoTWExportWidget::closeEvent" << QT_ENDL; event->accept(); } void AdifLoTWExportWidget::showEvent(QShowEvent *event) { //qDebug() << "AdifLoTWExportWidget::showEvent" << QT_ENDL; startDate->setDate(dataProxy->getFirstQSODateFromCall(stationCallsignComboBox->currentText())); endDate->setDate(dataProxy->getLastQSODateFromCall(stationCallsignComboBox->currentText())); setDefaultStationComboBox(); event->accept(); //qDebug() << "AdifLoTWExportWidget::showEvent - END" << QT_ENDL; } void AdifLoTWExportWidget::setExportMode(const ExportMode _EMode) { //qDebug() << "AdifLoTWExportWidget::setExportMode" << QT_ENDL; currentExportMode = _EMode; if (currentExportMode == ModeLotW) { setWindowTitle(tr("KLog - QSOs to be uploaded to LoTW.")); topLabel->setText(tr("This table shows the QSOs that will be sent to LoTW.")); } else if (currentExportMode == ModeClubLog) { setWindowTitle(tr("KLog - QSOs to be uploaded to ClubLog.")); topLabel->setText(tr("This table shows the QSOs that will be sent to ClubLog.")); } else if (currentExportMode == ModeEQSL) { setWindowTitle(tr("KLog - QSOs to be uploaded to eQSL.cc.")); topLabel->setText(tr("This table shows the QSOs that will be sent to eQSL.cc.")); } else if (currentExportMode == ModeQRZ) { setWindowTitle(tr("KLog - QSOs to be uploaded to QRZ.com.")); topLabel->setText(tr("This table shows the QSOs that will be sent to QRZ.com.")); } else { setWindowTitle("KLog - QSOs to be exported to ADIF."); topLabel->setText(tr("This table shows the QSOs that will be exported to ADIF.")); } fillStationCallsignComboBox(); //qDebug() << "AdifLoTWExportWidget::setExportMode-END" << QT_ENDL; } void AdifLoTWExportWidget::setLogNumber(const int _logN) { if (dataProxy->doesThisLogExist (_logN)) { logNumber = _logN; } else { logNumber = -1; } } klog-1.8.6/widgets/adiflotwexportwidget.h0000644000175000017500000000623514166020421017542 0ustar develdevel#ifndef ADIFLOTWEXPORTWIDGET_H #define ADIFLOTWEXPORTWIDGET_H /*************************************************************************** adiflotwexportwidget.h - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "dataproxy_sqlite.h" #include "utilities.h" class AdifLoTWExportWidget : public QWidget { Q_OBJECT public: explicit AdifLoTWExportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~AdifLoTWExportWidget(); void setExportMode(const ExportMode _EMode); void setLogNumber(const int _logN); void setDefaultStationCallsign(const QString &_st); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotOKPushButtonClicked(); void slotCancelPushButtonClicked(); void slotStationCallsignChanged(); void slotDateChanged(); signals: void selection(QString _st, QDate _startD, QDate _endD, ExportMode _exportMode); private: void createUI(); void fillTable(); void setTopLabel(const QString &_t); void addQSO(const int _qsoID); void fillStationCallsignComboBox(); void setDefaultStationComboBox(); DataProxy_SQLite *dataProxy; Utilities *util; QComboBox *stationCallsignComboBox; QDateEdit *startDate, *endDate; QLabel *topLabel, *numberLabel; QLineEdit *searchLineEdit; QPushButton *okButton, *cancelButton; ExportMode selectedEMode; QTableWidget *tableWidget; QHeaderView *hv, *hh; ExportMode currentExportMode; int logNumber; QString defaultStationCallsign; }; #endif klog-1.8.6/widgets/showadifimportwidget.cpp0000644000175000017500000001652614166020421020065 0ustar develdevel/*************************************************************************** showadifimportwidget.cpp - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showadifimportwidget.h" ShowAdifImportWidget::ShowAdifImportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { dataProxy = dp; util = new Utilities; okButton = new QPushButton; //cancelButton = new QPushButton; tableWidget = new QTableWidget; qsosList.clear(); setWindowTitle("ShowAdif"); createUI(); } ShowAdifImportWidget::~ShowAdifImportWidget() { delete(util); } void ShowAdifImportWidget::createUI() { QLabel *msgLabel = new QLabel; msgLabel->setText(tr("The following QSOs are those QSOs that you have received the LoTW confirmation.")); okButton->setText(tr("Ok")); //cancelButton->setText(tr("Cancel")); hv = tableWidget->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = tableWidget->horizontalHeader(); QStringList header; header.clear(); header << tr("DX") << tr("Date/Time") << tr("Band") << tr("Mode"); tableWidget->setColumnCount(header.length()); tableWidget->setHorizontalHeaderLabels(header); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(msgLabel, 0, 0, 1, -1); mainLayout->addWidget(tableWidget, 1, 0, 1, -1); mainLayout->addWidget(okButton, 2, 1); // mainLayout->addWidget(cancelButton, 2, 2); setLayout(mainLayout); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOKPushButtonClicked() ) ); // connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); } void ShowAdifImportWidget::fillTable() { //qDebug() << "ShowAdifImportWidget::fillTable " << QT_ENDL; //header << tr("DX") << tr("Date/Time") << tr("Band") << tr("Mode"); //QList qsos; //qsos.clear(); //qsos.append(dataProxy->getQSOsListLoTWToSend(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true)); //qDebug() << "ShowAdifImportWidget::fillTable QSOS: " << QString::number(qsosList.length()) << QT_ENDL; //QString aux, prefix; //qDebug() << "ShowAdifImportWidget::fillTable: -3" << QT_ENDL; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << "ShowAdifImportWidget::fillTable pre FOR" << QT_ENDL; for (int i=0; icolumnCount()) << QT_ENDL; //qDebug() << "ShowAdifImportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()) << QT_ENDL; if (qsoToAdd.length() == tableWidget->columnCount()) { tableWidget->insertRow(tableWidget->rowCount()); for (int i = 0; isetTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); tableWidget->setItem(tableWidget->rowCount()-1, i, newItemID); } //QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg(pow(row, column+1))); //tableWidget->setItem(row, column, newItem); } //qDebug() << "ShowAdifImportWidget::addQSO: - END" << QT_ENDL; } void ShowAdifImportWidget::slotOKPushButtonClicked() { this->hide(); //emit selection(stationCallsignComboBox->currentText(), startDate->date(), endDate->date()); close(); } void ShowAdifImportWidget::closeEvent(QCloseEvent *event) { //qDebug() << "ShowAdifImportWidget::closeEvent" << QT_ENDL; event->accept(); } void ShowAdifImportWidget::showEvent(QShowEvent *event) { //qDebug() << "ShowAdifImportWidget::showEvent" << QT_ENDL; fillTable(); event->accept(); } void ShowAdifImportWidget::addQSOToTheList(const QStringList _qso) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - Start" << QT_ENDL; // QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qso.length()!=4) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid qso list received" << QT_ENDL; return; } if (!util->isValidCall(_qso.at(0))) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid QRZ received" << QT_ENDL; return; } if (dataProxy->getIdFromBandName(_qso.at(2))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid BAND received" << QT_ENDL; return; } if (dataProxy->getIdFromModeName(_qso.at(3))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid Mode received" << QT_ENDL; return; } QDateTime _dateTime = util->getDateTimeFromSQLiteString(_qso.at(1)); if (!_dateTime.isValid()) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid DateTime received" << QT_ENDL; return; } QStringList _newQSO; _newQSO.clear(); _newQSO << _qso.at(0) << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _qso.at(2) << _qso.at(3); qsosList << _newQSO; //qDebug() << "ShowAdifImportWidget::addQSOToTheList QSO Added! - "<< _qso.at(0) <<" - END" << QT_ENDL; } klog-1.8.6/updatesatsdata.cpp0000644000175000017500000002527114166020407015164 0ustar develdevel/*************************************************************************** updatesatsdata.cpp - description ------------------- begin : sep 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "updatesatsdata.h" UpdateSatsData::UpdateSatsData(DataProxy_SQLite *dp, QObject *parent) : QObject(parent) { util = new Utilities; dataProxy = dp; } bool UpdateSatsData::satDataFileRead(const QString& tfileName) { //qDebug() << "UpdateSatsData::satDataFileRead: " << tfileName << QT_ENDL; QString fileName = tfileName; bool errorFound = true; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "UpdateSatsData::satDataFileRead File not found" << fileName << QT_ENDL; return false; } if (dataProxy->clearSatList()) { //qDebug() << "UpdateSatsData::satDataFileRead Sats YES deleted" << QT_ENDL; } else { //qDebug() << "UpdateSatsData::satDataFileRead Sats NOT deleted" << QT_ENDL; return false; } int numberOfSats = 0; bool hasEOH = false; //bool inHeader = true; QString line = QString(); bool noMoreRegisters = false; qint64 pos; //Position in the file bool haveId = false; bool haveName = false; //bool haveUpLink = false; //bool haveDownLink = false; //bool haveMode = false; pos = file.pos(); while ( !file.atEnd() && !hasEOH) { line = (file.readLine()).toUpper(); numberOfSats = numberOfSats + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { errorFound = false; hasEOH = true; pos = file.pos(); } } file.seek(pos); QProgressDialog progress(tr("Reading Satellites data file..."), tr("Abort reading"), 0, numberOfSats, nullptr); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfSats); //qDebug() << "UpdateSatsData::satDataFileRead: END OF HEADER" << QT_ENDL; //file.seek(pos); //START reading SAT data... //qDebug() << "UpdateSatsData::satDataFileRead: Start reading data" << QT_ENDL; QStringList fields, fieldToAnalyze;//, qsToPass; fields.clear(); fieldToAnalyze.clear(); QString aux = QString(); QString field, data; //int tagLength = 0; //int dataLength = 0; QString satID = QString(); QString satName = QString(); QString satUpLink = QString(); QString satDownLink = QString(); QString satMode = QString(); while (!noMoreRegisters) { //qDebug() << "UpdateSatsData::satDataFileRead: While Start" << QT_ENDL; if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); fields.clear(); //qDebug() << "UpdateSatsData::satDataFileRead-line:" << line << QT_ENDL; fields << line.split("<", QT_SKIP); foreach (aux, fields) { aux = aux.simplified(); //qDebug() << "UpdateSatsData::satDataFileRead-aux:" << aux << QT_ENDL; fieldToAnalyze = util->getValidADIFFieldAndData("<" + aux); if (fieldToAnalyze.size() == 2) { field = fieldToAnalyze.at(0); data = fieldToAnalyze.at(1); //qDebug() << "UpdateSatsData::satDataFileRead-Field:" << field << QT_ENDL; //qDebug() << "UpdateSatsData::satDataFileRead-Data:" << data << QT_ENDL; if (field == "EOR") { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED!" << QT_ENDL; if (haveId && haveName) { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED and have it all!" << QT_ENDL; haveId = false; haveName = false; //haveUpLink = false; //haveDownLink = false; //haveMode = false; if (!dataProxy->addSatellite(satID, satName, satDownLink,satUpLink, satMode)) { //errorFound = true; return false; } //qDebug() << "UpdateSatsData::satDataFileRead - Satellite added: " << satID << QT_ENDL; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } else { haveId = false; haveName = false; //haveUpLink = false; //haveDownLink = false; //haveMode = false; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } } else { if (field == "APP_KLOG_SATS_ARRLID") { satID = data; haveId = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_ARRLID" << QT_ENDL; } else if (field == "APP_KLOG_SATS_NAME") { satName = data; haveName = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_NAME" << QT_ENDL; } else if (field == "APP_KLOG_SATS_UPLINK") { satUpLink = data; //haveUpLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_UPLINK" << QT_ENDL; } else if (field == "APP_KLOG_SATS_DOWNLINK") { satDownLink = data; //haveDownLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_DOWNLINK" << QT_ENDL; } else if (field == "APP_KLOG_SATS_MODE") { satMode = data; //haveMode = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_MODE" << QT_ENDL; } else if (field == "APP_KLOG_DATA") { //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_DATA" << QT_ENDL; if (data != "SATS") { return false; } } } } //qDebug() << "UpdateSatsData::satDataFileRead: foreach end" << QT_ENDL; } //qDebug() << "UpdateSatsData::satDataFileRead: out of foreach" << QT_ENDL; } else { noMoreRegisters = true; } //qDebug() << "UpdateSatsData::satDataFileRead: While END" << QT_ENDL; } if (errorFound) { //qDebug() << "UpdateSatsData::satDataFileRead: errorFound = true" << QT_ENDL; return false; } else { //qDebug() << "UpdateSatsData::satDataFileRead: END" << QT_ENDL; emit satsUpdatedSignal(true); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The Satellites information has been updated.")); msgBox.exec(); } //qDebug() << "UpdateSatsData::satDataFileRead: END " << QT_ENDL; return true; } bool UpdateSatsData::readSatDataFile() { //qDebug() << "UpdateSatsData::readSatDataFile: " << QT_ENDL; //QString fileName = QFileDialog::getOpenFileName(0, tr("Open File"), "/home", "Sat data (*.dat)"); QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), util->getHomeDir(), tr("Sat Data") + "(*.dat)"); if (fileName.isNull()) { return false; } else { //qDebug() << "MainWindow::slotADIFImport -1" << QT_ENDL; return satDataFileRead(fileName); //filemanager->adifReadLog(fileName, currentLog); } //qDebug() << "UpdateSatsData::readSatDataFile: END" << QT_ENDL; } klog-1.8.6/setupdialog.cpp0000644000175000017500000015512014166020421014466 0ustar develdevel/*************************************************************************** setupdialog.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setupdialog.h" #include "setuppages/setuppagemisc.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupDialog::SetupDialog(DataProxy_SQLite *dp, const QString &_configFile, const QString &_softwareVersion, const int _page, const bool _firstTime, QWidget *parent) { //qDebug() << Q_FUNC_INFO << ": " << _configFile << "/" << _softwareVersion << "/" << QString::number(_page) << util->boolToQString(_firstTime) << endl ; logSeverity = Info; constrid = 2; util = new Utilities; firstTime = _firstTime; latestBackup = QString(); dataProxy = dp; configFileName = _configFile; version = _softwareVersion; pageRequested = _page; int logsPageTabN=-1; //qDebug() << Q_FUNC_INFO << ": 01" << QT_ENDL; locator = new Locator(); tabWidget = new QTabWidget; //qDebug() << Q_FUNC_INFO << ": 01.0" << QT_ENDL; userDataPage = new SetupPageUserDataPage(dataProxy); //qDebug() << Q_FUNC_INFO << ": 01.10" << QT_ENDL; bandModePage = new SetupPageBandMode(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.20" << QT_ENDL; dxClusterPage = new SetupPageDxCluster(this); //qDebug() << Q_FUNC_INFO << ": 01.30" << QT_ENDL; colorsPage = new SetupPageColors(this); //qDebug() << Q_FUNC_INFO << ": 01.40" << QT_ENDL; miscPage = new SetupPageMisc(this); //qDebug() << Q_FUNC_INFO << ": 01.50" << QT_ENDL; worldEditorPage = new SetupPageWorldEditor (dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.60" << QT_ENDL; logsPage = new SetupPageLogs(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.70" << QT_ENDL; eLogPage = new SetupPageELog(this); //qDebug() << Q_FUNC_INFO << ": 01.80" << QT_ENDL; UDPPage = new SetupPageUDP(this); //qDebug() << Q_FUNC_INFO << ": 01.90" << QT_ENDL; satsPage = new SetupPageSats(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.100" << QT_ENDL; hamlibPage = new SetupPageHamLib(dataProxy, this); logViewPage = new SetupPageLogView(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 02" << QT_ENDL; tabWidget->addTab(userDataPage, tr("User data")); tabWidget->addTab(bandModePage, tr("Bands/Modes")); tabWidget->addTab(logViewPage, tr("Log widget")); tabWidget->addTab(dxClusterPage, tr("D&X-Cluster")); tabWidget->addTab(colorsPage, tr("Colors")); tabWidget->addTab(miscPage, tr("Misc")); tabWidget->addTab(worldEditorPage, tr("World Editor")); logsPageTabN = tabWidget->addTab(logsPage, tr("Logs")); tabWidget->addTab(eLogPage, tr("eLog")); tabWidget->addTab(UDPPage, tr("WSJT-X")); tabWidget->addTab(satsPage , tr("Satellites")); //qDebug() << Q_FUNC_INFO << ": 02.100" << QT_ENDL; tabWidget->addTab(hamlibPage, tr ("HamLib")); //qDebug() << "SetupDialog::SetupDialog 03" << QT_ENDL; QPushButton *closeButton = new QPushButton(tr("Cancel")); okButton = new QPushButton(tr("OK")); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(tabWidget); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addLayout(buttonsLayout); //qDebug() << Q_FUNC_INFO << ": 04" << QT_ENDL; setLayout(mainLayout); setWindowTitle(tr("Settings")); //qDebug() << Q_FUNC_INFO << ": 05" << QT_ENDL; slotReadConfigData(); //qDebug() << Q_FUNC_INFO << ": 05.1" << QT_ENDL; if ((pageRequested==6) && (logsPageTabN>0))// The user is opening a new log { //qDebug() << Q_FUNC_INFO << ": 5.2" << QT_ENDL; tabWidget->setCurrentIndex(logsPageTabN); } //qDebug() << Q_FUNC_INFO << ": 5.3" << QT_ENDL; nolog = !(haveAtleastOneLog()); hamlibPage->slotTestHamlib (); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connectActions(); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } SetupDialog::~SetupDialog() { //qDebug() << Q_FUNC_INFO << QT_ENDL; } void SetupDialog::connectActions() { emit debugLog (Q_FUNC_INFO, "Start", logSeverity); connect (logsPage, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList))); connect(logsPage, SIGNAL(focusOK()), this, SLOT(slotFocusOK()) ); connect (userDataPage, SIGNAL(mainCallsignSignal(QString)), this, SLOT(slotSetStationCallSign(QString))); connect (userDataPage, SIGNAL(operatorsSignal(QString)), this, SLOT(slotSetOperators(QString))); connect (userDataPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); //connect (lotwPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); connect (eLogPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); //connect (clubLogPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); connect (eLogPage, SIGNAL(qrzcomAuto(bool)), this, SLOT(slotQRZCOMAuto(bool))); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotQRZCOMAuto(const bool _b) { emit qrzcomAuto(_b); } void SetupDialog::setData(const QString &_configFile, const QString &_softwareVersion, const int _page, const bool _firstTime) { //qDebug() << "SetupDialog::setData: " << "/" << _configFile << "/" << _softwareVersion << "/" << QString::number(_page) << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); nolog = !(haveAtleastOneLog()); firstTime = _firstTime; if (firstTime) { //qDebug() << "SetupDialog::setData FIRST TIME! " << QT_ENDL; } else { //qDebug() << "SetupDialog::setData NOT FIRST TIME! " << QT_ENDL; miscPage->setUseDefaultDBPath(miscPage->getDefaultDBPath()); } setConfigFile(_configFile); setSoftVersion(_softwareVersion); slotReadConfigData (); setPage(_page); //removeBandModeDuplicates(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); //qDebug() << "SetupDialog::setData - END" << QT_ENDL; } void SetupDialog::setConfigFile(const QString &_configFile) { //qDebug() << "SetupDialog::setConfigFile" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); configFileName = _configFile; emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::setSoftVersion(const QString &_softwareVersion) { //qDebug() << "SetupDialog::setSoftVersion" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); version = _softwareVersion; emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::setPage(const int _page) { //qDebug() << "SetupDialog::setPage("<0))// The user is opening a new log { tabWidget->setCurrentIndex(pageRequested); } emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotCancelButtonClicked() { //qDebug() << "SetupDialog::slotCancelButtonClicked" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); if (firstTime || nolog) { if (nolog) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setText(tr("You need to enter at least one log in the Logs tab.")); msgBox.setInformativeText(tr("Do you want to add one log in the Logs tab or exit KLog?\n(Click Yes to add a log or No to exit KLog)")); int ret = msgBox.exec(); if (ret == QMessageBox::No) { emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); emit exitSignal(2); return; } else { emit debugLog (Q_FUNC_INFO, "END-2", logSeverity); return; } } } QDialog::reject (); close(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::createIcons() { //qDebug() << "SetupDialog::createIcons" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); QListWidgetItem *configButton = new QListWidgetItem(contentsWidget); configButton->setIcon(QIcon(":/images/config.png")); configButton->setText(tr("User data")); configButton->setTextAlignment(Qt::AlignHCenter); configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *logsButton = new QListWidgetItem(contentsWidget); logsButton->setIcon(QIcon(":/images/config.png")); logsButton->setText(tr("Logs")); logsButton->setTextAlignment(Qt::AlignHCenter); logsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *bandsButton = new QListWidgetItem(contentsWidget); bandsButton->setIcon(QIcon(":/images/query.png")); bandsButton->setText(tr("Bands/Modes")); bandsButton->setTextAlignment(Qt::AlignHCenter); bandsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *dxClusterButton = new QListWidgetItem(contentsWidget); dxClusterButton->setIcon(QIcon(":/images/query.png")); dxClusterButton->setText(tr("DX-Cluster")); dxClusterButton->setTextAlignment(Qt::AlignHCenter); dxClusterButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *colorsButton = new QListWidgetItem(contentsWidget); colorsButton->setIcon(QIcon(":/images/query.png")); colorsButton->setText(tr("Colors")); colorsButton->setTextAlignment(Qt::AlignHCenter); colorsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *miscButton = new QListWidgetItem(contentsWidget); miscButton->setIcon(QIcon(":/images/query.png")); miscButton->setText(tr("Misc")); miscButton->setTextAlignment(Qt::AlignHCenter); miscButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *worldButton = new QListWidgetItem(contentsWidget); worldButton->setIcon(QIcon(":/images/query.png")); worldButton->setText(tr("World")); worldButton->setTextAlignment(Qt::AlignHCenter); worldButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*))); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) { //qDebug() << "SetupDialog::changePage" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current)); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotOkButtonClicked() { //qDebug() << "SetupDialog::slotOkButtonClicked" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); if (!miscPage->areDBPathChangesApplied()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("DB has not been moved to new path.")); msgBox.setInformativeText(tr("Go to the Misc tab and click on Move DB\n or the DB will not be moved to the new location.")); msgBox.exec(); emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); return; } if (!util->isValidCall(userDataPage->getMainCallsign())){ // QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter at least a valid callsign.")); msgBox.setInformativeText(tr("Go to the User tab and enter valid callsign.")); msgBox.exec(); emit debugLog (Q_FUNC_INFO, "END-2", logSeverity); return; } if (!haveAtleastOneLog()) { //qDebug() << "SetupDialog::slotOkButtonClicked - NO LOG!" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You have not selected the kind of log you want.")); msgBox.setInformativeText(tr("You will be redirected to the Log tab.\nPlease add and select the kind of log you want to use.")); msgBox.exec(); tabWidget->setCurrentIndex(tabWidget->indexOf(logsPage)); logsPage->createNewLog(); //emit newLogRequested(true); // Signal to be catched by logsPage true show new log emit debugLog (Q_FUNC_INFO, "END-3", logSeverity); return; } //qDebug() << "SetupDialog::slotOkButtonClicked - 10" << QT_ENDL; QFile file (configFileName); QString tmp; tmp = "true"; if (!file.open (QIODevice::WriteOnly)) /* Flawfinder: ignore */ { QDialog::reject(); } QTextStream stream (&file); //QRZ/CQ/ITU/CONTEST stream << "Version=" << version << ";" << QT_ENDL; stream << "Callsign=" << userDataPage->getMainCallsign() << ";" << QT_ENDL; if ((userDataPage->getOperators()).length() >= 3) { // There are no valid calls with less than 3 Chars stream << "Operators=" << userDataPage->getOperators() << ";" << QT_ENDL; } stream << "CQz=" << QString::number(userDataPage->getCQz()) << ";" << QT_ENDL; stream << "ITUz=" << QString::number(userDataPage->getITUz()) << ";" << QT_ENDL; if ( locator->isValidLocator(userDataPage->getStationLocator()) ) { stream << "StationLocator=" << userDataPage->getStationLocator() << ";" << QT_ENDL; } if ((!(userDataPage->getName()).isNull()) && ( (userDataPage->getName()).length() > 0 )) { stream << "Name=" << userDataPage->getName() <<";" << QT_ENDL; } if ((!(userDataPage->getAddress1()).isNull()) && ( (userDataPage->getAddress1()).length() > 0 )) { stream << "Address1=" << userDataPage->getAddress1() <<";" << QT_ENDL; } if ((!(userDataPage->getAddress2()).isNull()) && ( (userDataPage->getAddress2()).length() > 0 )) { stream << "Address2=" << userDataPage->getAddress2() <<";" << QT_ENDL; } if ((!(userDataPage->getAddress3()).isNull()) && ( (userDataPage->getAddress3()).length() > 0 )) { stream << "Address3=" << userDataPage->getAddress3() <<";" << QT_ENDL; } if ((!(userDataPage->getAddress4()).isNull()) && ( (userDataPage->getAddress4()).length() > 0 )) { stream << "Address4=" << userDataPage->getAddress4() <<";" << QT_ENDL; } if ((!(userDataPage->getCity()).isNull()) && ( (userDataPage->getCity()).length() > 0 )) { stream << "City=" << userDataPage->getCity() <<";" << QT_ENDL; } if ((!(userDataPage->getZipCode()).isNull()) && ( (userDataPage->getZipCode()).length() > 0 )) { stream << "ZipCode=" << userDataPage->getZipCode() <<";" << QT_ENDL; } if ((!(userDataPage->getProvince()).isNull()) && ( (userDataPage->getProvince()).length() > 0 )) { stream << "ProvinceState=" << userDataPage->getProvince() <<";" << QT_ENDL; } if ((!(userDataPage->getCountry()).isNull()) && ( (userDataPage->getCountry()).length() > 0 )) { stream << "Country=" << userDataPage->getCountry() <<";" << QT_ENDL; } if ((!(userDataPage->getRig1()).isNull()) && ( (userDataPage->getRig1()).length() > 0 )) { stream << "Rig1=" << userDataPage->getRig1() <<";" << QT_ENDL; } if ((!(userDataPage->getRig2()).isNull()) && ( (userDataPage->getRig2()).length() > 0 )) { stream << "Rig2=" << userDataPage->getRig2() <<";" << QT_ENDL; } if ((!(userDataPage->getRig3()).isNull()) && ( (userDataPage->getRig3()).length() > 0 )) { stream << "Rig3=" << userDataPage->getRig3() <<";" << QT_ENDL; } if ((!(userDataPage->getAntenna1()).isNull()) && ( (userDataPage->getAntenna1()).length() > 0 )) { stream << "Antenna1=" << userDataPage->getAntenna1() <<";" << QT_ENDL; } if ((!(userDataPage->getAntenna2()).isNull()) && ( (userDataPage->getAntenna2()).length() > 0 )) { stream << "Antenna2=" << userDataPage->getAntenna2() <<";" << QT_ENDL; } if ((!(userDataPage->getAntenna3()).isNull()) && ( (userDataPage->getAntenna2()).length() > 0 )) { stream << "Antenna3=" << userDataPage->getAntenna3() <<";" << QT_ENDL; } if ((userDataPage->getPower()).toFloat()>=0) { stream << "Power=" << userDataPage->getPower() << ";" << QT_ENDL; } //qDebug() << "SetupDialog::slotOkButtonClicked - 20" << QT_ENDL; stream << "Bands=" << bandModePage->getBands() << ";" << QT_ENDL; stream << "Modes=" << bandModePage->getModes() << ";" << QT_ENDL; stream << "LogViewFields=" << logViewPage->getFields() << ";" << QT_ENDL; //stream << "InMemory=" << miscPage->getInMemory() << ";" << QT_ENDL; stream << "RealTime=" << miscPage->getRealTime() << ";" << QT_ENDL; stream << "UTCTime=" << miscPage->getUTCTime() << ";" << QT_ENDL; stream << "AlwaysADIF=" << miscPage->getAlwaysADIF() << ";" << QT_ENDL; stream << "UseDefaultName=" << miscPage->getUseDefaultName() << ";" << QT_ENDL; stream << "DefaultADIFFile=" << miscPage->getDefaultFileName() << ";" << QT_ENDL; stream << "DBPath=" << miscPage->getDefaultDBPath() << ";" << QT_ENDL; stream << "ImperialSystem=" << miscPage->getImperial() << ";" << QT_ENDL; stream << "SendQSLWhenRec=" << miscPage->getSendQSLWhenRec() << ";" << QT_ENDL; stream << "ShowCallsignInSearch=" << miscPage->getShowStationCallSignInSearch() << ";" << QT_ENDL; stream << "CompleteWithPrevious=" << miscPage->getCompleteWithPrevious() << ";" << QT_ENDL; stream << "CheckNewVersions=" << miscPage->getCheckNewVersions() << ";" << QT_ENDL; stream << "ManageDXMarathon=" << miscPage->getDXMarathon() << ";" << QT_ENDL; stream << "DebugLog=" << miscPage->getDebugLog() << ";" << QT_ENDL; stream << "SendEQSLByDefault=" << miscPage->getSendEQSLByDefault() << ";" << QT_ENDL; stream << "DeleteAlwaysAdiFile=" << miscPage->getDeleteAlwaysAdiFile() << ";" << QT_ENDL; stream << "CheckValidCalls=" << util->boolToQString (miscPage->getCheckCalls())<< ";" << QT_ENDL; if (miscPage->getDupeTime()>0) { stream << "DuplicatedQSOSlot=" << QString::number(miscPage->getDupeTime()) << ";" << QT_ENDL; } //stream << "PSTRotatorActive=" << interfacesWindowsPage->getSendToPSTRotator() << ";" << QT_ENDL; //stream << "PSTRotatorServer=" << interfacesWindowsPage->getPSTRotatorUDPServer() << ";" << QT_ENDL; //stream << "PSTRotatorPort=" << interfacesWindowsPage->getPSTRotatorUDPServerPort() << ";" << QT_ENDL; //qDebug() << "SetupDialog::slotOkButtonClicked - 30" << QT_ENDL; if ( miscPage->getReportInfo()) { stream << "ProvideInfo=True;" << QT_ENDL; } if ((!(dxClusterPage->getSelectedDxClusterServer()).isNull()) && ( (dxClusterPage->getSelectedDxClusterServer()).length() > 0 )) { stream << "DXClusterServerToUse=" << dxClusterPage->getSelectedDxClusterServer() <<";" << QT_ENDL; } QStringList stringList; stringList.clear(); stringList << dxClusterPage->getDxclusterServersComboBox(); if (stringList.size()>0) { for (int i = 0; i < stringList.size(); i++) { stream << "DXClusterServerPort="<< stringList.at(i) << ";" << QT_ENDL; } } stream << "DXClusterShowHF=" << dxClusterPage->getShowHFQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowVHF=" << dxClusterPage->getShowVHFQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowWARC=" << dxClusterPage->getShowWARCQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowWorked=" << dxClusterPage->getShowWorkedQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowConfirmed=" << dxClusterPage->getShowConfirmedQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowAnn=" << dxClusterPage->getShowANNQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowWWV=" << dxClusterPage->getShowWWVQCheckbox() << ";" << QT_ENDL; stream << "DXClusterShowWCY=" << dxClusterPage->getShowWCYQCheckbox() << ";" << QT_ENDL; stream << "DXClusterSave=" << dxClusterPage->getSaveActivityQCheckbox() << ";" << QT_ENDL; stream << "NewOneColor=" << colorsPage->getNewOneColor() << ";" << QT_ENDL; stream << "NeededColor=" << colorsPage->getNeededColor() << ";" << QT_ENDL; stream << "WorkedColor=" << colorsPage->getWorkedColor() << ";" << QT_ENDL; stream << "ConfirmedColor=" << colorsPage->getConfirmedColor() << ";" << QT_ENDL; stream << "DefaultColor=" << colorsPage->getDefaultColor() << ";" << QT_ENDL; stream << "DarkMode=" << colorsPage->getDarkMode() << ";" << QT_ENDL; stream << "SelectedLog=" << QString::number(logsPage->getSelectedLog()) << ";" << QT_ENDL; //qDebug() << "SetupDialog::slotOkButtonClicked SelectedLog: " << logsPage->getSelectedLog() << QT_ENDL; // CLUBLOG //qDebug() << "SetupDialog::slotOkButtonClicked - 40" << QT_ENDL; if (eLogPage->getClubLogActive()) { stream << "ClubLogActive=True;"<< QT_ENDL; } else { stream << "ClubLogActive=False;"<< QT_ENDL; } if (eLogPage->getClubLogRealTime()) { stream << "ClubLogRealTime=True;" << QT_ENDL; } else { stream << "ClubLogRealTime=False;" << QT_ENDL; } tmp = eLogPage->getClubLogEmail() ; if (tmp.length()>0) { stream << "ClubLogEmail=" << tmp << ";" << QT_ENDL; } tmp = eLogPage->getClubLogPassword() ; if (tmp.length()>0) { stream << "ClubLogPass=" << tmp << ";" << QT_ENDL; } //qDebug() << "SetupDialog::slotOkButtonClicked - 50" << QT_ENDL; // eQSL if (eLogPage->getEQSLActive()) { stream << "eQSLActive=True;" << QT_ENDL; } else { stream << "eQSLActive=False;" << QT_ENDL; } tmp = eLogPage->getEQSLUser(); if (tmp.length()>0) { stream << "eQSLCall=" << tmp << ";" << QT_ENDL; } tmp = eLogPage->getEQSLPassword() ; if (tmp.length()>0) { stream << "eQSLPass=" << tmp << ";" << QT_ENDL; } // eQSL - END // QRZ.com //qDebug() << "SetupDialog::slotOkButtonClicked - Storing QRZ.com data" << QT_ENDL; if (eLogPage->getQRZCOMActive()) { stream << "QRZcomActive=True;" << QT_ENDL; } else { stream << "QRZcomActive=False;" << QT_ENDL; } tmp = eLogPage->getQRZCOMUser(); if (tmp.length()>0) { stream << "QRZcomUser=" << tmp << ";" << QT_ENDL; } tmp = eLogPage->getQRZCOMPassword(); if (tmp.length()>0) { stream << "QRZcomPass=" << tmp << ";" << QT_ENDL; } if (eLogPage->getQRZCOMSubscriber()) { stream << "QRZcomSubscriber=True;" << QT_ENDL; } else { stream << "QRZcomSubscriber=False;" << QT_ENDL; } if (eLogPage->getQRZCOMAutoCheck()) { stream << "QRZcomAuto=True;" << QT_ENDL; } else { stream << "QRZcomAuto=False;" << QT_ENDL; } tmp = eLogPage->getQRZCOMLogBookKEY(); if (tmp.length()>0) { stream << "QRZcomLogBookKey=" << tmp << ";" << QT_ENDL; } // QRZ.com - END //qDebug() << "SetupDialog::slotOkButtonClicked - 60" << QT_ENDL; // LOTW stream << "LoTWActive=" << eLogPage->getLoTWActive() << ";" << QT_ENDL; tmp = eLogPage->getTQSLPath(); if (tmp.length()>0) { stream << "LoTWPath=" << tmp << ";" << QT_ENDL; } tmp = eLogPage->getLoTWUser(); if (tmp.length()>0) { stream << "LoTWUSer=" << tmp << ";" << QT_ENDL; } tmp = eLogPage->getLoTWPass(); if (tmp.length()>0) { stream << "LoTWPass=" << tmp << ";" << QT_ENDL; } // LOTW //qDebug() << "SetupDialog::slotOkButtonClicked - 70" << QT_ENDL; //WSJTX stream << "UDPServer=" << UDPPage->getUDPServer() << ";" << QT_ENDL; stream << "UDPNetworkInterface=" << UDPPage->getNetworkInterface() << ";" << QT_ENDL; stream << "UDPServerPort=" << UDPPage->getUDPServerPort() << ";" << QT_ENDL; stream << "LogFromWSJTX=" << UDPPage->getLogFromWSJTx() << ";" << QT_ENDL; stream << "LogAutoFromWSJTX=" << UDPPage->getAutoLogFromWSJTx() << ";" << QT_ENDL; stream << "RealTimeFromWSJTX=" << UDPPage->getReaDataFromWSJTx() << ";" << QT_ENDL; stream << "InfoTimeOut=" << UDPPage->getTimeout() << ";" << QT_ENDL; //qDebug() << "SetupDialog::slotOkButtonClicked: hamlib" << QT_ENDL; QString _aa = hamlibPage->getData(); stream << _aa << QT_ENDL; //qDebug() << "SetupDialog::slotOkButtonClicked: hamlib-2: " << _aa << QT_ENDL; //WSJTX //Windows Size if (windowSize.length()>0) { stream << "MainWindowSize=" << windowSize << ";" << QT_ENDL; } if (latestBackup.length()>0) { stream << "LatestBackup=" << latestBackup << ";" << QT_ENDL; } file.close (); //qDebug() << "SetupDialog::slotOkButtonClicked - just before leaving" << QT_ENDL; QDialog::accept(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); //qDebug() << "SetupDialog::slotOkButtonClicked - END" << QT_ENDL; //close(); } void SetupDialog::slotReadConfigData() { //qDebug() << "SetupDialog::slotReadConfigData" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); if (firstTime) { //qDebug() << "SetupDialog::slotReadConfigData - First time" << QT_ENDL; setDefaults(); bands.removeDuplicates(); modes.removeDuplicates(); logViewFields.removeDuplicates(); bandModePage->setActiveModes(modes); bandModePage->setActiveBands(bands); logViewPage->setActiveFields(logViewFields); } //qDebug() << "SetupDialog::slotReadConfigData - 1" << QT_ENDL; QFile file(configFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "SetupDialog::slotReadConfigData() File not found" << configFileName << QT_ENDL; //firstTime = true; emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); return; } //qDebug() << "SetupDialog::slotReadConfigData - 2" << QT_ENDL; //dxClusterServers.clear(); while (!file.atEnd()){ QByteArray line = file.readLine(); processConfigLine(line); //qDebug() << "SetupDialog::slotReadConfigData - in the while" << QT_ENDL; } //qDebug() << "SetupDialog::slotReadConfigData - 3" << QT_ENDL; dxClusterPage->setDxclusterServersComboBox(dxClusterServers); dxClusterPage->setSelectedDxClusterServer(dxClusterServerToUse); if (modes.isEmpty()) { modes << "SSB" << "CW" << "RTTY"; } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; } if (logViewFields.isEmpty()) { logViewFields << "qso_date" << "call" << "rst_sent" << "rst_rcvd" << "bandid" << "modeid" << "comment"; } modes.removeDuplicates(); bandModePage->setActiveModes(modes); bands.removeDuplicates(); bandModePage->setActiveBands(bands); logViewFields.removeDuplicates(); logViewPage->setActiveFields(logViewFields); //qDebug() << "SetupDialog::slotReadConfigData - END" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", logSeverity); } bool SetupDialog::processConfigLine(const QString &_line) { //qDebug() << "SetupDialog::processConfigLine: " << _line << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); QString line = _line.simplified(); //line.simplified(); int i = 0; //aux variable QStringList values = line.split("=", QT_SKIP); QString tab = QString(); if (line.startsWith('#')){ //qDebug() << "SetupDialog::processConfigLine: Comment Line!" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "SetupDialog::processConfigLine: Wrong Line!" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END-2", logSeverity); return false; } QString value = values.at(1); tab = (values.at(0)).toUpper(); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } value = checkAndFixASCIIinADIF(value); // Check whether the value is valid. //qDebug() << "SetupDialog::processConfigLine: TAB: " << tab << QT_ENDL; //qDebug() << "SetupDialog::processConfigLine: VALUE: " << value << QT_ENDL; if (tab == "CALLSIGN"){ //qDebug() << "SetupDialog::processConfigLine: CALLSIGN: " << value << QT_ENDL; userDataPage->setMainCallsign(value); }else if (tab == "OPERATORS"){ userDataPage->setOperators(value); }else if (tab=="CQZ"){ userDataPage->setCQz((value).toInt()); }else if (tab=="ITUZ"){ userDataPage->setITUz((value).toInt()); }else if (tab=="CONTEST"){ //userDataPage->setContest(value); }else if (tab=="MODES"){ readActiveModes(value); modes.removeDuplicates(); bandModePage->setActiveModes(modes); }else if (tab=="BANDS"){ readActiveBands(value); bands.removeDuplicates(); bandModePage->setActiveBands(bands); //}else if (tab=="INMEMORY"){ // miscPage->setInMemory(value); }else if (tab=="LOGVIEWFIELDS"){ logViewFields.clear(); //qDebug() << Q_FUNC_INFO << ": " << value; //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; logViewFields << dataProxy->filterValidFields(value.split(",", QT_SKIP)); logViewFields.removeDuplicates(); logViewPage->setActiveFields(logViewFields); }else if (tab=="REALTIME"){ miscPage->setRealTime(value); }else if (tab=="UTCTIME"){ miscPage->setUTCTime(value); }else if (tab=="ALWAYSADIF"){ miscPage->setAlwaysADIF(value); }else if (tab=="USEDEFAULTNAME"){ miscPage->setDefaultFileName(value); }else if (tab=="DBPATH"){ miscPage->setUseDefaultDBPath(value); }else if (tab=="DEFAULTADIFFILE"){ miscPage->setDefaultFileName(value); //qDebug() << "SetupDialog::processConfigLine: FILE: " << value << QT_ENDL; }else if (tab=="IMPERIALSYSTEM"){ miscPage->setImperial(value.toUpper()); }else if (tab=="COMPLETEWITHPREVIOUS"){ miscPage->setCompleteWithPrevious(value.toUpper()); }else if (tab=="SENDQSLWHENREC"){ miscPage->setSendQSLWhenRec(value.toUpper()); }else if (tab=="MANAGEDXMARATHON"){ miscPage->setDXMarathon(value.toUpper()); }else if (tab=="DEBUGLOG"){ miscPage->setDebugLog(value); } else if (tab=="SHOWCALLSIGNINSEARCH"){ miscPage->setShowStationCallSignInSearch(value.toUpper()); } else if (tab=="CHECKNEWVERSIONS"){ miscPage->setCheckNewVersions(value); } else if (tab=="PROVIDEINFO"){ miscPage->setReportInfo(value); } /* else if (tab=="LOGSORT"){ miscPage->setLogSort(value); } */ else if (tab=="SENDEQSLBYDEFAULT"){ miscPage->setSetEQSLByDefault(value); } else if (tab=="DUPLICATEDQSOSLOT"){ if (value.toInt()>=0) { miscPage->setDupeTime(value.toInt()); } } else if (tab == "CHECKVALIDCALLS") { miscPage->setCheckCalls (util->trueOrFalse (value)); } /* else if (tab=="PSTROTATORACTIVE"){ interfacesWindowsPage->setSendToPSTRotator(value); } else if (tab=="PSTROTATORPORT"){ interfacesWindowsPage->setPSTRotatorUDPServerPort(value); } else if (tab=="PSTROTATORSERVER") { interfacesWindowsPage->setPSTRotatorUDPServer(value); } */ else if (tab=="UDPSERVER"){ UDPPage->setUDPServer(value); } else if (tab=="UDPNETWORKINTERFACE"){ UDPPage->setNetworkInterface(value); } else if (tab=="UDPSERVERPORT"){ UDPPage->setUDPServerPort(value); } else if (tab=="LOGFROMWSJTX") { UDPPage->setLogFromWSJTx(value); } else if (tab=="LOGAUTOFROMWSJTX") { UDPPage->setAutoLogFromWSJTx(value); } else if (tab=="REALTIMEFROMWSJTX") { UDPPage->setReaDataFromWSJTx(value); } else if (tab=="INFOTIMEOUT") { UDPPage->setTimeout(value); } else if (tab =="NAME") { userDataPage->setName(value); } else if (tab =="ADDRESS1") { userDataPage->setAddress1(value); } else if (tab =="ADDRESS2") { userDataPage->setAddress2(value); } else if (tab =="ADDRESS3") { userDataPage->setAddress3(value); } else if (tab =="ADDRESS4") { userDataPage->setAddress4(value); } else if (tab =="CITY") { userDataPage->setCity(value); } else if (tab =="ZIPCODE") { userDataPage->setZipCode(value); } else if (tab =="PROVINCESTATE") { userDataPage->setProvince(value); } else if (tab =="COUNTRY") { userDataPage->setCountry(value); } else if (tab =="POWER") { userDataPage->setPower(value); } else if (tab =="RIG1") { userDataPage->setRig1(value); } else if (tab =="RIG2") { userDataPage->setRig2(value); } else if (tab =="RIG3") { userDataPage->setRig3(value); } else if (tab =="ANTENNA1") { userDataPage->setAntenna1(value); } else if (tab =="ANTENNA2") { userDataPage->setAntenna2(value); } else if (tab =="ANTENNA3") { userDataPage->setAntenna3(value); } else if (tab =="STATIONLOCATOR"){ if ( locator->isValidLocator(value) ) { userDataPage->setStationLocator(value); } }else if (tab =="DXCLUSTERSHOWHF"){ dxClusterPage->setShowHFQCheckbox(value); }else if (tab =="DXCLUSTERSHOWVHF"){ dxClusterPage->setShowVHFQCheckbox(value); }else if (tab =="DXCLUSTERSHOWWARC"){ dxClusterPage->setShowWARCQCheckbox(value); }else if (tab =="DXCLUSTERSHOWWORKED"){ dxClusterPage->setShowWorkedQCheckbox(value); }else if (tab =="DXCLUSTERSHOWCONFIRMED"){ dxClusterPage->setShowConfirmedQCheckbox(value); }else if (tab =="DXCLUSTERSHOWANN"){ dxClusterPage->setShowANNQCheckbox(value); }else if (tab =="DXCLUSTERSHOWWWV"){ dxClusterPage->setShowWWVQCheckbox(value); }else if (tab =="DXCLUSTERSHOWWCY"){ dxClusterPage->setShowWCYQCheckbox(value); }else if(tab =="DXCLUSTERSERVERPORT"){ dxClusterServers << value; //qDebug() << "SetupDialog::processConfigLine: dxClusterServers: " << dxClusterServers.last() << QT_ENDL; }else if (tab =="DXCLUSTERSERVERTOUSE"){ dxClusterServerToUse=value; } else if (tab =="DXCLUSTERSAVE"){ dxClusterPage->setSaveActivityQCheckbox(value); } else if(tab =="NEWONECOLOR"){ colorsPage->setNewOneColor(value); }else if(tab =="NEEDEDCOLOR"){ colorsPage->setNeededColor(value); }else if(tab =="WORKEDCOLOR"){ colorsPage->setWorkedColor(value); }else if(tab =="CONFIRMEDCOLOR"){ colorsPage->setConfirmedColor(value); }else if(tab =="DEFAULTCOLOR"){ colorsPage->setDefaultColor(value); //qDebug() << "SetupDialog::processConfigLine: DEFAULTCOLOR: " << value << QT_ENDL; }else if(tab =="DARKMODE"){ colorsPage->setDarkMode(value); }else if(tab =="HAMLIBRIGTYPE"){ //qDebug() << "SetupDialog::processConfigLine: Before HAMLIBRIGTYPE: " << value << QT_ENDL; hamlibPage->setRigType(value); //qDebug() << "SetupDialog::processConfigLine: After HAMLIBRIGTYPE: " << value << QT_ENDL; }else if(tab =="HAMLIBSERIALPORT"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPORT: " << value << QT_ENDL; hamlibPage->setSerialPort(value); }else if(tab =="HAMLIBSERIALBAUDS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALBAUDS: " << value << QT_ENDL; hamlibPage->setSerialSpeed(value.toInt()); }else if(tab =="HAMLIB"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIB: " << value << QT_ENDL; hamlibPage->setActive(value); }else if(tab=="HAMLIBREADONLY"){ hamlibPage->setReadOnly(value); }else if(tab =="HAMLIBSERIALDATABITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << QT_ENDL; hamlibPage->setDataBits(value.toInt ()); }else if(tab =="HAMLIBSERIALSTOPBITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << QT_ENDL; hamlibPage->setStopBits(value); }else if(tab =="HAMLIBSERIALFLOWCONTROL"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << QT_ENDL; hamlibPage->setFlowControl(value); }else if(tab =="HAMLIBSERIALPARITY"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << QT_ENDL; hamlibPage->setParity(value); }else if(tab =="HAMLIBSERIALRTS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << QT_ENDL; //hamlibPage->setRTS(value); }else if(tab =="HAMLIBSERIALDTR"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << QT_ENDL; //hamlibPage->setDTR(value); }else if (tab == "HAMLIBRIGPOLLRATE"){ hamlibPage->setPollingInterval(value.toInt()); }else if (tab == "HAMLIBNETADDRESS"){ hamlibPage->setRadioNetworkAddress (value); }else if (tab == "HAMLIBNETPORT"){ hamlibPage->setRadioNetworkPort (value.toInt ()); }else if(tab =="SELECTEDLOG"){ //qDebug() << "SetupDialog::processConfigLine: SELECTEDLOG: " << value << QT_ENDL; i = value.toInt(); if (dataProxy->doesThisLogExist(i)) { //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist TRUE" << QT_ENDL; } else { //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist FALSE" << QT_ENDL; i = 0; while(!dataProxy->doesThisLogExist(i)) { i++; } } logsPage->setSelectedLog(i); //qDebug() << "SetupDialog::processConfigLine: dataProxy->doesThisLogExist END" << QT_ENDL; }else if(tab =="CLUBLOGACTIVE"){ eLogPage->setClubLogActive(util->trueOrFalse(value)); } else if(tab =="CLUBLOGREALTIME"){ //clubLogPage->setClubLogRealTime(value); eLogPage->setClubLogRealTime(util->trueOrFalse(value)); } else if(tab =="CLUBLOGPASS"){ //clubLogPage->setPassword(value); eLogPage->setClubLogPassword(value); } else if(tab =="CLUBLOGEMAIL"){ //clubLogPage->setEmail(value); eLogPage->setClubLogEmail(value); } else if(tab =="EQSLACTIVE"){ //eQSLPage->setActive(value); eLogPage->setEQSLActive(util->trueOrFalse(value)); } else if(tab =="EQSLCALL"){ //eQSLPage->setCallsign(value); eLogPage->setEQSLUser(value); } else if(tab =="EQSLPASS"){ //eQSLPage->setPassword(value); eLogPage->setEQSLPassword(value); } else if(tab =="QRZCOMACTIVE"){ //eQSLPage->setActive(value); eLogPage->setQRZCOMActive(value); } else if(tab =="QRZCOMSUBSCRIBER"){ eLogPage->setQRZCOMSubscriber(util->trueOrFalse (value)); } else if(tab =="QRZCOMUSER"){ eLogPage->setQRZCOMUser(value); } else if(tab =="QRZCOMAUTO"){ eLogPage->setQRZCOMAutoCheck(value); } else if(tab =="QRZCOMPASS"){ eLogPage->setQRZCOMPassword(value); } else if(tab =="QRZCOMLOGBOOKKEY"){ eLogPage->setQRZCOMLogBookKEY(value); } else if(tab =="LOTWACTIVE"){ eLogPage->setLoTWActive(util->trueOrFalse(value)); } else if(tab =="LOTWPATH"){ eLogPage->setTQSLPath(value); } else if(tab =="LOTWUSER"){ eLogPage->setLoTWUser(value); } else if(tab =="LOTWPASS"){ eLogPage->setLoTWPass(value); } else if(tab =="MAINWINDOWSIZE"){ QStringList values; values.clear(); values << value.split("x"); if ((values.at(0).toInt()>0) && (values.at(1).toInt()>0)) { windowSize = value; } } else if(tab =="DELETEALWAYSADIFILE"){ miscPage->setDeleteAlwaysAdiFile(util->trueOrFalse(value)); } else if (tab == "LATESTBACKUP"){ if (value.length()>0) { latestBackup = value; } else { latestBackup = QString(); } //s.append("LatestBackup=" + (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss") + ";\n" ); } else { //qDebug() << "SetupDialog::processConfigLine: NONE: " << QT_ENDL; } // Lines are: Option = value; //qDebug() << "SetupDialog::processConfigLine: END " << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", logSeverity); return true; } void SetupDialog::readActiveBands (const QString &actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the // bands used in the program //qDebug() << "SetupDialog::readActiveBands: " << actives << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); bool atLeastOne = false; QStringList values = actives.split(", ", QT_SKIP); QStringList _abands; for (int i = 0; i < values.size() ; i++) { if (isValidBand(values.at(i))) { if (!atLeastOne) { //qDebug() << "SetupDialog::readActiveBands (at least One!): " << values.at(i) << QT_ENDL; atLeastOne = true; _abands.clear(); } _abands << values.at(i); //qDebug() << "SetupDialog::readActiveBands: " << values.at(i) << QT_ENDL; } } bands.clear(); //_abands.removeDuplicates(); bands << dataProxy->getBandsInLog(-1); bands << _abands; bands.removeDuplicates(); //qDebug() << Q_FUNC_INFO << " - END"; emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::readActiveModes (const QString &actives) { //qDebug() << "SetupDialog::readActiveModes: " << actives << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); bool atLeastOne = false; QStringList _amodes;//, _backModes; // _backModes.clear(); // _backModes << modes; QStringList values = actives.split(", ", QT_SKIP); values.removeDuplicates(); for (int i = 0; i < values.size() ; i++) { if (isValidMode(values.at(i))) { if (!atLeastOne) { atLeastOne = true; _amodes.clear(); } _amodes << values.at(i); } } modes.clear(); modes = dataProxy->getModesInLog(-1); modes << _amodes; modes.removeDuplicates(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); //qDebug() << "SetupDialog::readActiveModes: " << modes.join(" / ") << QT_ENDL; } bool SetupDialog::isValidBand (const QString &b) { //qDebug() << "SetupDialog::isValidBand: "<< b << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); return query.isValid(); } bool SetupDialog::isValidMode (const QString &b) { //qDebug() << "SetupDialog::isValidMode: " << b << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); QString stringQuery = QString("SELECT id FROM mode WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); emit debugLog (Q_FUNC_INFO, "END", logSeverity); return query.isValid(); } void SetupDialog::setDefaults() { //qDebug() << "SetupDialog::setDefaults" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); miscPage->setRealTime("TRUE"); miscPage->setUTCTime("TRUE"); miscPage->setImperial("FALSE"); //Metric system is the default miscPage->setAlwaysADIF("FALSE"); miscPage->setSendQSLWhenRec("TRUE"); miscPage->setShowStationCallSignInSearch("TRUE"); miscPage->setCheckNewVersions("TRUE"); miscPage->setReportInfo("FALSE"); miscPage->setDXMarathon("FALSE"); miscPage->setDebugLog("FALSE"); //miscPage->setLogSort("FALSE"); miscPage->setSetEQSLByDefault("TRUE"); miscPage->setCheckCalls (true); UDPPage->setUDPServer("FALSE"); UDPPage->setUDPServerPort("2237"); UDPPage->setTimeout("2000"); UDPPage->setLogFromWSJTx("FALSE"); UDPPage->setReaDataFromWSJTx("FALSE"); UDPPage->setAutoLogFromWSJTx("FALSE"); //interfacesWindowsPage->setSendToPSTRotator("FALSE"); //interfacesWindowsPage->setPSTRotatorUDPServer("locahost"); //interfacesWindowsPage->setPSTRotatorUDPServerPort("12040"); dxClusterPage->setShowHFQCheckbox("TRUE"); dxClusterPage->setShowVHFQCheckbox("TRUE"); dxClusterPage->setShowWARCQCheckbox("TRUE"); dxClusterPage->setShowWorkedQCheckbox("TRUE"); dxClusterPage->setShowConfirmedQCheckbox("TRUE"); dxClusterPage->setShowANNQCheckbox("TRUE"); dxClusterPage->setShowWWVQCheckbox("TRUE"); dxClusterPage->setShowWCYQCheckbox("TRUE"); dxClusterServers.clear(); dxClusterServers.append("dxfun.com:8000"); dxClusterServerToUse = "dxfun.com:8000"; if (modes.isEmpty()) { modes << "SSB" << "CW" << "RTTY"; modes.removeDuplicates(); } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; bands.removeDuplicates(); } emit debugLog (Q_FUNC_INFO, "END", logSeverity); } QString SetupDialog::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data << QT_ENDL; //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy emit debugLog (Q_FUNC_INFO, "Start", logSeverity); ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal) << QT_ENDL; } // Show into another lineEdit emit debugLog (Q_FUNC_INFO, "END", logSeverity); return newString; } bool SetupDialog::haveAtleastOneLog() { emit debugLog (Q_FUNC_INFO, "Start", logSeverity); emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); return dataProxy->haveAtLeastOneLog(); //emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::setClubLogActive(const bool _b) { emit debugLog (Q_FUNC_INFO, "Start", logSeverity); eLogPage->setClubLogActive(_b); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::setQRZCOMAutoCheckActive(const bool _b) { eLogPage->setQRZCOMAutoCheck(util->boolToQString(_b)); } void SetupDialog::setEQSLActive(const bool _b) { eLogPage->setEQSLActive(_b); } void SetupDialog::checkIfNewBandOrMode() { //qDebug() << "SetupDialog::checkIfNewBandOrMode: logSeverity: " << QString::number(logSeverity) << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); QStringList _items; _items.clear(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -1" << QT_ENDL; _items << dataProxy->getBandsInLog(-1); //qDebug() << "SetupDialog::checkIfNewBandOrMode -2" << QT_ENDL; _items << (bandModePage->getBands()).split(", ", QT_SKIP); //qDebug() << "SetupDialog::checkIfNewBandOrMode -3" << QT_ENDL; _items.removeDuplicates(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -4" << QT_ENDL; bandModePage->setActiveBands(_items); //qDebug() << "SetupDialog::checkIfNewBandOrMode -5" << QT_ENDL; _items.clear(); _items << dataProxy->getModesInLog(-1); _items << (bandModePage->getModes()).split(", ", QT_SKIP); _items.removeDuplicates(); bandModePage->setActiveModes(_items); emit debugLog (Q_FUNC_INFO, "END", logSeverity); //qDebug() << "SetupDialog::checkIfNewBandOrMode END" << QT_ENDL; } void SetupDialog::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupDialog::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")" << QT_ENDL; //qDebug() << "SetupDialog::slotAnalyzeNewLogData" << QT_ENDL; // We receive the station callsign and operators from the logs tab emit debugLog (Q_FUNC_INFO, "Start", logSeverity); if (_qs.length()!=2) { emit debugLog (Q_FUNC_INFO, "END-1", logSeverity); return; } userDataPage->setMainCallsign(_qs.at(0)); userDataPage->setOperators(_qs.at(1)); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotSetStationCallSign(const QString &_p) { //qDebug() << "SetupDialog::slotSetStationCallSign: " << _p << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); logsPage->setDefaultStationCallsign(_p); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotSetOperators(const QString &_p) { //qDebug() << "SetupDialog::slotSetOperators: " << _p << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", logSeverity); logsPage->setDefaultOperators(_p); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::setSeverity(const DebugLogLevel _sev) { logSeverity = _sev; } void SetupDialog::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit debugLog (Q_FUNC_INFO, "Start", logSeverity); emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); emit debugLog (Q_FUNC_INFO, "END", logSeverity); } void SetupDialog::slotFocusOK() { //qDebug() << "SetupDialog::slotFocusOK" << QT_ENDL; okButton->setFocus(Qt::OtherFocusReason); } void SetupDialog::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - selectedLog: " << QString::number(logsPage->getSelectedLog()) << QT_ENDL; QWidget::showEvent(event); userDataPage->setStationFocus(); } klog-1.8.6/COPYING0000644000175000017500000010451614166020407012504 0ustar develdevel GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . klog-1.8.6/downloadcty.cpp0000644000175000017500000001646614166020407014512 0ustar develdevel/*************************************************************************** downloadcty.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "downloadcty.h" #include #include #include #include //#include DownLoadCTY::DownLoadCTY(const QString &_klogDir, const QString &_klogVersion) : QObject(0) { //qDebug() << "DownLoadCTY::DownLoadCTY(): " << _klogDir << QT_ENDL; util = new Utilities; url = new QUrl; klogDir = _klogDir; result = -1; // Error unknown manager = new QNetworkAccessManager; request = new QNetworkRequest; //request->setUrl(QUrl("https://www.country-files.com/cty/cty.csv")); request->setUrl(QUrl("https://www.country-files.com/bigcty/cty.csv")); QString ver = "KLog"+_klogVersion; QByteArray str; str.clear(); str.append(util->getAgent(_klogVersion).toUtf8()); request->setRawHeader("User-Agent", str); //request->setHeader(QNetworkRequest::UserAgentHeader, str); //qDebug() << "DownLoadCTY::DownLoadCTY() - UserAgent: " << request->rawHeader("QNetworkRequest::UserAgentHeader") << QT_ENDL; QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "DownLoadCTY::DownLoadCTY(): - END" << QT_ENDL; } DownLoadCTY::~DownLoadCTY() { //qDebug() << "DownLoadCTY::~DownLoadCTY" << QT_ENDL; } void DownLoadCTY::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "DownLoadCTY::slotDownloadFinished" << QT_ENDL; emit downloadStopped(); QUrl url = reply->url(); //qDebug() << "DownLoadCTY::slotDownloadFinished - URL: " << url.toString() << QT_ENDL; QMessageBox msgBox; QString aux; aux.clear(); if (reply->error()) { //fprintf(stderr, "Download of %s failed: %s\n", // url.toEncoded().constData(), // qPrintable(reply->errorString())); //errorCode = query.lastError().nativeErrorCode(); msgBox.setIcon(QMessageBox::Warning); aux = tr("Download of cty.csv failed with the following error code: "); msgBox.setText(aux + reply->errorString()); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { QString filename = saveFileName(url); if (saveToDisk(filename, reply)) { msgBox.setIcon(QMessageBox::Information); aux = tr("Download of cty.csv done."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); emit actionReturnDownload(QNetworkReply::NoError); } //printf("Download of %s succeeded (saved to %s)\n", // url.toEncoded().constData(), qPrintable(filename)); } reply->deleteLater(); emit done(true); } int DownLoadCTY::download() { //qDebug() << "DownLoadCTY::download..." << QT_ENDL; manager->get(*request); return 1; } void DownLoadCTY::slotDownloadProgress(qint64 received, qint64 total) { //qDebug() << "DownLoadCTY::slotDownloadProgress: " << QT_ENDL; //qDebug() << "DownLoadCTY::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; //qDebug() << received << total; emit actionShowProgres(received, total); } void DownLoadCTY::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug() << "DownLoadCTY::slotErrorManagement: " << QString::number(networkError) << QT_ENDL; result = networkError; if (result == QNetworkReply::NoError) { //qDebug() << "DownLoadCTY::downloadFinished: No error" << QT_ENDL; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "DownLoadCTY::downloadFinished: Host not found" << QT_ENDL; } else { //qDebug() << "DownLoadCTY::downloadFinished: ERROR: " << QString::number(result) << QT_ENDL; } emit actionError(result); } QString DownLoadCTY::saveFileName(const QUrl &url) { //qDebug() << "DownLoadCTY::saveFileName" << QT_ENDL; QString path = url.path(); QString basename = QFileInfo(path).fileName(); QMessageBox msgBox; QString aux; aux.clear(); if (basename.isEmpty()) basename = "download"; if (QFile::exists(basename)) { msgBox.setIcon(QMessageBox::Warning); aux = tr("There is already a cty.csv file in the folder but it will be replaced with the new one."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); // already exists, don't overwrite //int i = 0; //basename += '.'; //while (QFile::exists(basename + QString::number(i))) // ++i; //basename += QString::number(i); } return basename; } bool DownLoadCTY::saveToDisk(const QString &filename, QIODevice *data) { //qDebug() << "DownLoadCTY::saveToDisk: " << filename << QT_ENDL; QFile file(filename); QMessageBox msgBox; QString aux; aux.clear(); if (!file.open(QIODevice::WriteOnly)) { /* Flawfinder: ignore */ msgBox.setIcon(QMessageBox::Warning); aux = tr("Could not open %1 for writing").arg(filename); //aux = tr("Could not open ") + filename + tr(" for writing."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //fprintf(stderr, "Could not open %s for writing: %s\n", // qPrintable(filename), // qPrintable(file.errorString())); return false; } file.write(data->readAll()); file.close(); return true; } klog-1.8.6/lotwutilities.h0000644000175000017500000000732214166020407014540 0ustar develdevel#ifndef LOTWUTILITIES_H #define LOTWUTILITIES_H /*************************************************************************** lotwutilities.h - description ------------------- begin : apr 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" // https://lotw.arrl.org/lotw-help/developer-query-qsos-qsls/?lang=en class QSslError; class LoTWUtilities : public QObject { Q_OBJECT public: explicit LoTWUtilities(const QString &_klogDir, const QString &_klogVersion, const QString &_parentFunction, DataProxy_SQLite *dp); ~LoTWUtilities(); bool setStationCallSign(const QString &_call); int download(); int fullDownload(); void setUser(const QString &_call); void setPass(const QString &_pass); bool getIsReady(); void setFileName(const QString &_fn); QString getFileName(); private: void startRequest(QUrl url); int startThefullDownload(); bool selectQuery(const int _queryId); void parseDownloadedFile(const QString &_fn); //void showMessage(const int _messageIcon, const QString &_msg, const QString &_msgExt); Utilities *util; //void setTarget(const QString& t); QNetworkAccessManager *manager; QNetworkReply *reply; QFile *file; bool downloadAborted; qint64 fileSize; QUrl url; QProgressDialog *pDialog; QString klogDir, klogVersion; QString urld; QString fileName; QString stationCallsign; QString startDate; QString lotwQuery; QString lotwUser, lotwPassword; DataProxy_SQLite *dataProxy;//, *dataProxyPrepared; QCalendarWidget *calendar; QDate firstDate; private slots: void slotReadyRead(); void slotFinished(); void slotDownloadProgress(qint64 bytesRead); void slotCancelDownload(); void slotCalendarDateSelected(const QDate _d); signals: void actionProcessLoTWDownloadedFile(QString _fn); }; #endif // LOTWUTILITIES_H klog-1.8.6/main.cpp0000644000175000017500000004504114166020407013076 0ustar develdevel/*************************************************************************** main.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include #include #include #include #include #include #include "klogdefinitions.h" #include "startwizard.h" #include "mainwindow.h" #include "utilities.h" int main(int argc, char *argv[]) { //qDebug() << "KLog Main: Start! " << QT_ENDL; //qDebug() << "KLog Main: " << QSslSocket::supportsSsl() << QSslSocket::sslLibraryBuildVersionString() << QSslSocket::sslLibraryVersionString() << QT_ENDL; QT_REQUIRE_VERSION(argc, argv, "5.9") QDir d1 = QDir(); //QCoreApplication::setApplicationVersion(QString(APP_VERSION)); //qDebug() << "KLog Main STARTED: " << version << QT_ENDL; Utilities util = Utilities(); QStringList arguments; QTextStream cout(stdout); //QCoreApplication::setOrganizationName("EA4K"); //QCoreApplication::setOrganizationDomain("klog.xyz"); //QCoreApplication::setApplicationName("KLog"); QApplication app(argc, argv); QString iconSt; iconSt = ":/img/klog.ico"; QIcon KLogIcon(iconSt); QApplication::setWindowIcon(KLogIcon); app.setApplicationName(QString("KLog")); app.setOrganizationName("EA4K"); app.setOrganizationDomain("klog.xyz"); app.setApplicationVersion(QString(APP_VERSION)); QString version = QCoreApplication::applicationVersion(); //qDebug() << "KLog Main: -10 " << QT_ENDL; // Now we check if the user is executing from the command line arguments.clear(); arguments << app.arguments(); if (arguments.length()>1) { if (arguments.contains("-h")) { //cout << "Usage: klog [OPTION]... [FILE]..." << QT_ENDL; cout << "Usage: klog [OPTION]..." << QT_ENDL; cout << "Options:" << QT_ENDL; cout << " -? Display this help" << QT_ENDL; cout << " -h Display this help" << QT_ENDL; cout << " -v Display program version" << QT_ENDL; //cout << " -e Export Adif file " << QT_ENDL; } else if (arguments.contains("-?")) { cout << "Usage: klog [OPTION]..." << QT_ENDL; cout << "Options:" << QT_ENDL; cout << " -? Display this help" << QT_ENDL; cout << " -h Display this help" << QT_ENDL; cout << " -v Display program version" << QT_ENDL; } else if (arguments.contains("-v")) { cout << "Version: KLog-" << app.applicationVersion() << QT_ENDL; } else { cout << "Usage: klog [OPTION]..." << QT_ENDL; cout << "Options:" << QT_ENDL; cout << " -? Display this help" << QT_ENDL; cout << " -h Display this help" << QT_ENDL; cout << " -v Display program version" << QT_ENDL; } app.quit(); return 0; } //qDebug() << "KLog Main: Start of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //qDebug() << "KLog Main: Detected language: " << (QLocale::system().name()).left(2) << ".qm" << QT_ENDL; // Translations begin QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); /* Flawfinder: ignore */ app.installTranslator(&qtTranslator); QTranslator myappTranslator; bool missingTranslation = false; //QString msgOSFilePath = QString(); // The OS depending part of the message to be printed if no translation is found. #if defined(Q_OS_WIN) //qDebug() << "KLog WIN " << QT_ENDL; //qDebug() << "KLog Main: -20 - WIN" << QT_ENDL; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); /* Flawfinder: ignore */ } else if (QFile::exists(QDir::homePath()+"/klog/klog_" + (QLocale::system().name()).left(2)+ ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QDir::homePath()+"/klog/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; //msgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } //qDebug() << "KLog Main: -20 - end WIN " << QT_ENDL; #elif defined(Q_OS_OSX) //qDebug() << "KLog OSX " << QT_ENDL; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; } #else //qDebug() << "KLog OTHER OS: " << (QLocale::system()).name() << QT_ENDL; if (QFile::exists("klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load("klog_" + (QLocale::system().name()).left(2)); /* Flawfinder: ignore */ } else if (QFile::exists("/usr/share/klog/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { //qDebug() << "KLog OTHER -2: " << "/usr/share/klog/klog_" + (QLocale::system().name()).left(2) << QT_ENDL; /* Flawfinder: ignore */ myappTranslator.load("/usr/share/klog/translations/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm")) /* Flawfinder: ignore */ { //qDebug() << "KLog OTHER -3: " << QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) << QT_ENDL; myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; //sgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } #endif //qDebug() << "KLog Main: -40 " << QT_ENDL; if (missingTranslation) { //qDebug() << "KLog Main: Translation missing! " << QT_ENDL; QMessageBox msgBox; QString urlTranslate = QString(); urlTranslate = "

TRANSLATE

"; QString msg = QString(); msgBox.setWindowTitle("KLog"); msgBox.setIcon(QMessageBox::Warning); msgBox.setTextFormat(Qt::RichText); QString language = (QLocale::system().name()).left(2); /* Flawfinder: ignore */ msg = QString("No translation files for your language have been found so KLog will be shown in English.") + "

" + QString("If you have the klog_%1.qm file for your language, you can copy it into the %2/translations/ folder and restart KLog.

If you want to help to translate KLog into your language, please contact the author.").arg(language).arg(QCoreApplication::applicationDirPath()) + "

" + urlTranslate; msgBox.setText(msg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } //qDebug() << "KLog Main-1" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; app.installTranslator(&myappTranslator); //qDebug() << "KLog Main: End of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; // Traslations end /* Application Singleton * * We want to run only one instance of KLog application */ QSystemSemaphore semaphore("klogapp", 1); // create semaphore with unique ID klogapp semaphore.acquire(); // Raise the semaphore, barring other instances to work with shared memory #ifndef Q_OS_WIN // in linux / unix shared memory is not freed when the application terminates abnormally, // so you need to get rid of the garbage QSharedMemory nix_fix_shared_memory("klogshm"); if (nix_fix_shared_memory.attach()) { nix_fix_shared_memory.detach(); // if there is no running instance then it remove the orphaned shared memory } #endif QSharedMemory sharedMemory("klogshm"); // Create a copy of the shared memory - Unique ID klogshm bool is_running; /* * trying to attach a copy of the shared memory to an existing segment * * if successful, it determines that there is already a running instance * otherwise allocate 1 byte of memory and no instance is running */ if (sharedMemory.attach()) { is_running = true; } else { sharedMemory.create(1); is_running = false; } semaphore.release(); // If you already run one instance of the application, then we inform the user about it // and complete the current instance of the application if (is_running) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(QObject::tr("KLog is already running.") + "\n" + QObject::tr("It is allowed to run only one instance.")); msgBox.exec(); return 1; } // END OF Application Singleton QString configFileName, klogDir; klogDir = util.getHomeDir(); configFileName = util.getCfgFile(); //qDebug() << "KLog Main-10" << QT_ENDL; //qDebug() << "KLog Main: Setting klog dir: " << (QTime::currentTime()).toString("HH:mm:ss")<< QT_ENDL;; if (!QDir::setCurrent (klogDir) ) { //qDebug() << "MAIN: KLogDir does not exist.... creating " << QT_ENDL; if (d1.mkdir(klogDir)) { if (QDir::setCurrent (klogDir) ) { //qDebug() << "MAIN: KLogDir has just been created and pointed " << QT_ENDL; } else { //qDebug() << "MAIN: KLogDir has just been created and pointed FAILED! " << QT_ENDL; } } else { //qDebug() << "MAIN: KLogDir can not be created?? " << QT_ENDL; } } else { //qDebug() << "MAIN: KLogDir already existed!! " << QT_ENDL; } //qDebug() << "KLog Main: Setting klog dir - finished: " << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //qDebug() << "KLog Main: Setting config file: " << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; QPixmap pixmap(":img/klog_512x512.png"); //qDebug() << "KLog Main-51" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; QSplashScreen splash(pixmap); if(!QFile::exists(configFileName)) { //qDebug() << "MAIN: Starting wizard... " << QT_ENDL; StartWizard *wizard = new StartWizard(klogDir, version); wizard->setModal(true); int inMemory = wizard->exec(); //qDebug() << "MAIN: Wizard inMemory: " << QString::number(inMemory) << QT_ENDL; inMemory = 1; if (inMemory == 1) { //qDebug() << "MAIN: Wizard accepted " << QString::number(inMemory) << " ... Will run in Memory " << QT_ENDL; MainWindow mw(klogDir, version); mw.init(); splash.finish(&mw); //mw.checkIfNewVersion(); //mw.recommendBackupIfNeeded(); mw.show(); return app.exec(); } else { //qDebug() << "MAIN: Wizard cancelled " << QString::number(inMemory) << " ... should close " << QT_ENDL; QMessageBox msgBox; msgBox.setText(QObject::tr("Install wizard was canceled before completing...")); msgBox.setInformativeText(QObject::tr("Do you want to remove the KLog dir from your disk?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: if (QDir::setCurrent (QDir::homePath()) ) { if (d1.remove(klogDir)) { QMessageBox msgBox; msgBox.setText(QObject::tr("Your KLog dir has been removed") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setText(QObject::tr("I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk.") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } } else { QMessageBox msgBox; msgBox.setText(QObject::tr("Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk.") +"\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); } break; case QMessageBox::No: QMessageBox msgBox; msgBox.setText(QObject::tr("Remember that your KLog dir is on your system...") + "\n\n" + QObject::tr("Thank you for running KLog!")); msgBox.exec(); break; } return 0; } } else { //qDebug() << "Main: Start of DB Activities" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; DataBase *db = new DataBase(Q_FUNC_INFO, version, util.getKLogDBFile()); //qDebug() << "Main: After Start of DB Activities" << QT_ENDL; if (!db->createConnection(Q_FUNC_INFO)) { //qDebug() << "Main: Conection not created" << QT_ENDL; return -1; // Exits with an error; no DB has been created } else { //qDebug() << "Main: DB to be updated" << QT_ENDL; db->updateIfNeeded(); // Check if we need to update the DB //qDebug() << "Main: DB Updated" << QT_ENDL; } //qDebug() << "Main: DB Updated" << QT_ENDL; //qDebug() << "KLog Main-98" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; db->~DataBase(); //qDebug() << "KLog Main-99" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; splash.show(); //qDebug() << "KLog Main-100" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; MainWindow mw(klogDir, version); //qDebug() << "KLog Main-101" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; mw.init(); //qDebug() << "KLog Main-102" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; splash.finish(&mw); //qDebug() << "KLog Main-103" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; mw.checkIfNewVersion(); //qDebug() << "KLog Main-104" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; mw.recommendBackupIfNeeded(); //qDebug() << "KLog Main-105" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; mw.show(); //qDebug() << "KLog Main-106" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; return app.exec(); //qDebug() << "KLog Main-107" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; } //qDebug() << "KLog Main-END: " << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //return app.exec(); } klog-1.8.6/src.pro0000644000175000017500000002612614166020421012756 0ustar develdevel#*************************************************************************** # src.pro # # ------------------- # begin : jan 2021 # copyright : (C) 2021 by Jaime Robles # email : jaime@robles.es # *************************************************************************** #/***************************************************************************** # * This file is part of KLog. * # * * # * KLog is free software: you can redistribute it and/or modify * # * it under the terms of the GNU General Public License as published by * # * the Free Software Foundation, either version 3 of the License, or * # * (at your option) any later version. * # * * # * KLog is distributed in the hope that it will be useful, * # * but WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * # * GNU General Public License for more details. * # * * # * You should have received a copy of the GNU General Public License * # * along with KLog. If not, see . * # * * # *****************************************************************************/ CONFIG += app_bundle CONFIG += static #CONFIG += console CONFIG -=depend_includepath #CONFIG += release TEMPLATE = app VERSION = 1.8.6 DEFINES += APP_VERSION=\\\"$$VERSION\\\" APP_NAME = KLog DEFINES += APP_NAME="$$APP_NAME" APP_UNIX_NAME = klog DEFINES += APP_UNIX_NAME="$$APP_UNIX_NAME" message(Building $${APP_NAME} $${VERSION}) message(Qt $$[QT_VERSION] in $$[QT_INSTALL_PREFIX]) #DEFINES *= QT_NO_DEBUG_OUTPUT DEFINES *= QT_USE_QSTRINGBUILDER DEFINES *= QT_STRICT_ITERATORS TARGET = $${APP_UNIX_NAME} QT += core \ gui \ sql \ network \ serialport \ printsupport \ charts \ widgets greaterThan(QT_MAJOR_VERSION, 4):greaterThan(QT_MINOR_VERSION, 4) { macx:QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks } HEADERS += setupdialog.h \ aboutdialog.h \ awarddxmarathon.h \ awards.h \ awardswidget.h \ charts/barchartstats.h \ charts/statsfieldperbandwidget.h \ setuppages/hamlibnetworkconfigwidget.h \ setuppages/hamlibserialconfigwidget.h \ setuppages/setuppagelogview.h \ widgets/showkloglogwidget.h \ charts/statsgeneralchartwidget.h \ charts/statsdxccsonsatswidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statsgridsonsatswidget.h \ charts/statssentconfirmedpiechartwidget.h \ database.h \ dataproxy_sqlite.h \ downloadcty.h \ dxcluster.h \ dxccstatuswidget.h \ elogqrzlog.h \ eqslutilities.h \ global.h \ hamlibclass.h \ inputwidgets/mainwindowinputqso.h \ inputwidgets/mainwindowinputcomment.h \ inputwidgets/mainwindowmydatatab.h \ inputwidgets/mainwindowinputothers.h \ inputwidgets/mainwindowinputeqsl.h \ inputwidgets/mainwindowinputqsl.h \ inputwidgets/mainwindowsattab.h\ klogdefinitions.h \ lotwutilities.h \ mainqsoentrywidget.h \ mainwindow.h \ qso.h \ searchmodel.h \ searchwindow.h \ #widgets/advancedsearch/advancedsearchmodel.h \ #widgets/advancedsearch/advancedsearchwidget.h \ #widgets/advancedsearch/advancedsearchwindow.h \ logwindow.h \ filemanager.h \ fileawardmanager.h \ locator.h \ startwizard.h \ elogclublog.h \ softwareupdate.h \ softwareupdatedialog.h \ utilities.h \ logmodel.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ statisticswidget.h \ setuppages/setuppagemisc.h \ setuppages/setuppagelogview.h \ setuppages/setuppageuserdata.h \ setuppages/setuppagedxcluster.h \ setuppages/setuppagecolors.h \ setuppages/setuppagelogs.h \ setuppages/setuppageworldeditor.h \ setuppages/setuppagesats.h \ setuppages/setuppagesatsnew.h \ setuppages/setuppagehamlib.h \ setuppages/setuppagelogsnew.h \ setuppages/setuppagebandmode.h \ setuppages/setupentitydialog.h \ setuppages/setuppageudp.h \ setuppages/setuppageelog.h \ setuppages/setuppagesubdivisionnew.h \ setuppages/setuppagesubdivisions.h \ tipsdialog.h \ udpserver.h \ updatesatsdata.h \ widgets/adiflotwexportwidget.h \ widgets/showkloglogwidget.h \ widgets/onlinemessagewidget.h \ widgets/showadifimportwidget.h \ world.h \ worldmapwidget.h message(Sources) SOURCES += main.cpp \ aboutdialog.cpp \ awardswidget.cpp \ charts/statsfieldperbandwidget.cpp \ elogqrzlog.cpp \ eqslutilities.cpp \ lotwutilities.cpp \ mainqsoentrywidget.cpp \ mainwindow.cpp \ inputwidgets/mainwindowinputqso.cpp \ inputwidgets/mainwindowinputcomment.cpp \ inputwidgets/mainwindowmydatatab.cpp \ inputwidgets/mainwindowinputothers.cpp \ inputwidgets/mainwindowinputeqsl.cpp \ inputwidgets/mainwindowinputqsl.cpp \ inputwidgets/mainwindowsattab.cpp\ qso.cpp \ searchmodel.cpp \ searchwindow.cpp \ setupdialog.cpp \ setuppages/hamlibnetworkconfigwidget.cpp \ setuppages/hamlibserialconfigwidget.cpp \ setuppages/setuppageelog.cpp \ setuppages/setuppagelogview.cpp \ setuppages/setuppagesubdivisionnew.cpp \ setuppages/setuppagesubdivisions.cpp \ widgets/adiflotwexportwidget.cpp \ #widgets/advancedsearch/advancedsearchmodel.cpp \ #widgets/advancedsearch/advancedsearchwidget.cpp \ #widgets/advancedsearch/advancedsearchwindow.cpp \ widgets/onlinemessagewidget.cpp \ widgets/showadifimportwidget.cpp \ widgets/showkloglogwidget.cpp \ world.cpp \ logwindow.cpp \ filemanager.cpp \ fileawardmanager.cpp \ database.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ dxcluster.cpp \ locator.cpp \ awards.cpp \ setuppages/setuppagemisc.cpp \ setuppages/setuppageuserdata.cpp \ setuppages/setuppagedxcluster.cpp \ setuppages/setuppagecolors.cpp \ setuppages/setuppagelogs.cpp \ setuppages/setuppageworldeditor.cpp \ setuppages/setuppagelogsnew.cpp \ setuppages/setuppagebandmode.cpp \ setuppages/setuppageudp.cpp \ setuppages/setuppagesats.cpp \ setuppages/setuppagesatsnew.cpp \ setuppages/setuppagehamlib.cpp \ setuppages/setupentitydialog.cpp \ startwizard.cpp \ awarddxmarathon.cpp \ elogclublog.cpp \ softwareupdate.cpp \ softwareupdatedialog.cpp \ utilities.cpp \ dxccstatuswidget.cpp \ logmodel.cpp \ searchwidget.cpp \ infowidget.cpp \ showerrordialog.cpp \ udpserver.cpp \ statisticswidget.cpp \ charts/barchartstats.cpp \ updatesatsdata.cpp \ charts/statsgeneralchartwidget.cpp \ charts/statsdxccsonsatswidget.cpp \ charts/statsqsosperyearbarchartwidget.cpp \ charts/statsentitiesperyearbarchartwidget.cpp \ charts/statscqzperyearbarchartwidget.cpp \ charts/statsqsospermodebarchartwidget.cpp \ charts/statsqsosperdxccbarchartwidget.cpp \ charts/statsqsospercontinentbarchartwidget.cpp \ charts/statsqsosperhourbarchartwidget.cpp \ charts/statsqsospermonthbarchartwidget.cpp \ charts/statsworkedconfirmedpiechartwidget.cpp \ charts/statsworkedsentpiechartwidget.cpp \ charts/statssentconfirmedpiechartwidget.cpp \ charts/statsqsosperbandbarchartwidget.cpp \ charts/statsgridsonsatswidget.cpp \ hamlibclass.cpp \ tipsdialog.cpp \ worldmapwidget.cpp message (Other files) OTHER_FILES += \ README-DEVEL \ TODO \ tips-for-devel.txt \ INSTALL.txt \ INSTALL-linux \ INSTALL-win.txt \ Changelog \ INSTALL-osx.txt \ NEWS \ klog.1 \ COPYING \ AUTHORS \ README message (More...) RESOURCES += klog.qrc DESTDIR = build/target/ OBJECTS_DIR = build/obj/ MOC_DIR = build/moc/ RCC_DIR = build/rcc/ #D_OBJECTS = $(SRC:%.cpp=build/obj/%.o) #R_OBJECTS = $(SRC:%.cpp=build/obj/%.o) # Tell Qt Linguist that we use UTF-8 strings in our sources CODECFORTR = UTF-8 CODECFORSRC = UTF-8 #include(translations/translations.pri) message (Translations) TRANSLATIONS = translations/klog_es.ts \ translations/klog_ca.ts \ translations/klog_cs.ts \ translations/klog_da.ts \ translations/klog_de.ts \ translations/klog_fi.ts \ translations/klog_fr.ts \ translations/klog_hr.ts \ translations/klog_it.ts \ translations/klog_ja.ts \ translations/klog_pl.ts message(End of translations...) isEmpty(QMAKE_LRELEASE) { win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease unix { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } } else { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } } updateqm.input = TRANSLATIONS updateqm.output = $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm # deploy DISTFILES += Changelog COPYING unix:!mac { message(unix:!mac) DEFINES += APP_LINUX CONFIG += c++11 #QMAKE_CXXFLAGS += --coverage #LIBS += -lgcov # Translations should be copied in /usr/share/klog/translations # https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard # QT += dbus isEmpty(PREFIX):PREFIX = /usr BINDIR = $$PREFIX/bin DATADIR = $$PREFIX/share PKGDATADIR = $$DATADIR/klog INSTALLS += target target.path = $$BINDIR translations.path = $$PKGDATADIR/translations translations.files += $$DESTDIR/translations/* datafiles.path = $$PKGDATADIR datafiles.files = $$DISTFILES INSTALLS += translations INSTALLS += datafiles LIBS += -lhamlib } macx: { message(macx) ICON = klog.icns TARGET = KLog CONFIG += c++11 #INCLUDEPATH +=../../../hamlib/include/ #LIBS += -L"../../../hamlib/lib" -lhamlib INCLUDEPATH +=/usr/local/include/ LIBS += -L"/usr/local/lib" -lhamlib } win32: { message(windows) RC_ICONS = klog.ico TARGET = klog QMAKE_TARGET_COMPANY = EA4K QMAKE_TARGET_DESCRIPTION = Hamradio logging LIBS += -L"$$PWD/../../libs/hamlib/lib/gcc" -lhamlib LIBS += -L"$$PWD/../../libs/hamlib/bin" INCLUDEPATH += "$$PWD/../../libs/hamlib/include/" } klog-1.8.6/filemanager.h0000644000175000017500000001546214166020407014075 0ustar develdevel#ifndef FILEMANAGER_H #define FILEMANAGER_H /*************************************************************************** filemanager.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awards.h" #include "database.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" #include "utilities.h" #include "qso.h" /* enum { CQZones = 40, ITUZones = 90, DXCCEntities = 521 // http://www.adif.org/adif302.htm#Country%20Codes }; */ //enum ExportMode {ModeLotW, ModeADIF}; class FileManager : public QWidget { Q_OBJECT public: FileManager(DataProxy_SQLite *dp); //FileManager(DataProxy_SQLite *dp, const QString &_klogDir); FileManager(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_softVersion); //FileManager(DataProxy_SQLite *dp, const QString &_softVersion); ~FileManager(); //bool readAdif(const QString& tfileName, const int logN); bool adifReadLog(const QString& tfileName, const int logN); QList adifLoTWReadLog2(const QString& fileName, const int logN); QList adifLoTWReadLog(const QString& tfileName, const int logN); //QList adifLoTWLogExport(const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN); //QList (const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN, const bool LoTWOnly); bool adifQSOsExport(const QString& _fileName, QList _qsos); QList adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em); bool adifLogExport(const QString& _fileName, const int _logN); bool adifLogExportMarked(const QString& _fileName); bool adifReqQSLExport(const QString& _fileName); //bool cabrilloLogExport(const QString& _fileName, const QString &_contestType, const int logNconst); bool modifySetupFile(const QString& _filename, const QString &_field, const QString &_value); void setVersion(const QString &_version); QDateTime getDateTimeOfLastBackup(); void setStationCallSign(const QString& _st); void setDuplicatedQSOSlot (const int _secs); private: bool adifLogExportToFile(const QString& _fileName, const int _logN, bool justMarked, bool _qslRequested, bool _lotw); //bool cabrilloLogExportToFile(const QString& _fileName, const int logNconst); //bool cabrilloLogExportCQWWToFile(const QString& _fileName, const int logNconst); //bool adifCheckMoreThanOneLog(QFile &_f); int howManyLogsInFile(QFile & _f); bool fillHashLog(QFile & _f); QStringList getListOfLogsInFile(QFile & _f); bool writeBackupDate(); bool getStationCallsignFromUser(const QString &_qrzDX, const QDate &_dt); bool showInvalidCallMessage(const QString &_call); void showError (const QString &_txt); bool askUserToUseAlwaysSameAnswer(); bool askUserToAddThisQSOToLog(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate); //QString checkAndFixASCIIinADIF(_data); bool processQsoReadingADIF(const QStringList &_line, const int logNumber);//, const bool _keepLogsInFile); void queryPreparation(const int _logN); bool checkADIFValidFormat(const QStringList &_qs); QStringList readAdifField (const QString &_field); // void writeAdifField(const QString &_field, const QString &_data); // It should possibly receive also the QTextStream QString prepareStringLog(); void writeQuery(QSqlQuery query, QTextStream &out, const ExportMode _em, const bool _justMarked, const bool _onlyRequested, const int _logN); void writeADIFHeader(QTextStream &out, const ExportMode _em, const int _numberOfQsos); bool dbCreated; DataBase *db; //float softwareVersion; //DataProxy_SQLite *dataProxy; DataProxy_SQLite *dataProxy;//, *dataProxyPrepared; Utilities *util; //QSO *qso; bool rstTXDefault, rstRXDefault; // If true and a log is not including RST, 59 is automatically added //bool printQs(const QString &_q, const QStringList _line); bool printQs(const QStringList &_line); //int confirmed; QString klogDir; QString klogVersion; QString defaultStationCallsign; bool ignoreUnknownAlways; // When importing ADIF, ignore all unknown fields. bool usePreviousStationCallsignAnswerAlways; // When importing ADIF, ignore all unknown fields. bool noMoreQso; int duplicatedQSOSlotInSecs; World *world; Awards *awards; //QSqlDatabase db; QHash hashLogs; // to create different logs when importing a ADIF file QSqlQuery preparedQuery; int constrid; // Just an id for the constructor to check who is being executed at one specific time signals: void addQSOToList(QStringList _qso); void queryError(QString _functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // FILEMANAGER_H klog-1.8.6/mainqsoentrywidget.cpp0000644000175000017500000010464514166020421016111 0ustar develdevel/***************************************************************************tv mainqsoentrywidget.cpp - description ------------------- begin : january 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //https://github.com/ea4k/klog/commit/1ac02c7b779922a8e5907ebee088fa64654cbdf5 #include "mainqsoentrywidget.h" MainQSOEntryWidget::MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug()<< "MainQSOEntryWidget::MainQSOEntryWidget " << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); upAndRunning = false; dataProxy = dp; qrzLineEdit = new QLineEdit; bandComboBox = new QComboBox; modeComboBox = new QComboBox; dateEdit = new QDateEdit; timeEdit = new QTimeEdit; realtimeCheckBox = new QCheckBox; enabledCR = realtimeCheckBox->backgroundRole(); manualModeCheckBox = new QCheckBox; OKButton = new QPushButton(tr("&Add"), this); clearButton = new QPushButton(tr("&Clear"), this); timer = new QTimer(this); util = new Utilities; realTime = true; duplicatedQSOSlotInSecs = 0; delayInputTimer = new QTimer; //hamlib = new HamLibClass(); createUI(); setInitialData(); //installEventFilter (this); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug()<< "MainQSOEntryWidget::MainQSOEntryWidget: - END" << QT_ENDL; } /* void MainQSOEntryWidget::slotRealTimeButtonResize() { int heigh = qrzLineEdit->sizeHint ().height (); realtimeButton->setFixedSize(QSize(heigh, heigh)); //realtimeButton->setSizePolicy (QSizePolicy::Fixed); } */ void MainQSOEntryWidget::createUI() { //qDebug()<< "MainQSOEntryWidget::createUI" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); qrzLineEdit->setToolTip(tr("Callsign of the QSO.")); bandComboBox->setToolTip(tr("Band of the QSO.")); modeComboBox->setToolTip(tr("Mode of the QSO.")); dateEdit->setToolTip(tr("Date of the QSO.")); timeEdit->setToolTip(tr("Time of the QSO.")); OKButton->setToolTip(tr("Add the QSO to the log.")); clearButton->setToolTip(tr("Clears the QSO entry.")); realtimeCheckBox->setToolTip(tr("KLog will show real time if enabled.")); realtimeCheckBox->setText (tr("Real time")); //realtimeButton->setToolTip(tr("KLog will show real time if enabled.")); manualModeCheckBox->setToolTip(tr("Stop wsjt-x and hamlib from automatically updating QSO information.")); manualModeCheckBox->setText (tr("Manual Mode")); QHBoxLayout *TimeLayout = new QHBoxLayout; TimeLayout->addWidget(dateEdit); TimeLayout->addWidget(timeEdit); //TimeLayout->addWidget(realtimeButton); TimeLayout->addWidget(realtimeCheckBox); TimeLayout->addWidget(manualModeCheckBox); TimeLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed)); QHBoxLayout *BandModeLayout = new QHBoxLayout; BandModeLayout->addWidget(bandComboBox); BandModeLayout->addWidget(modeComboBox); QHBoxLayout *QrzBandModeLayout = new QHBoxLayout; QrzBandModeLayout->addWidget(qrzLineEdit); QrzBandModeLayout->addLayout(BandModeLayout); qrzgroupBox = new QGroupBox(tr("Callsign")); qrzgroupBox->setFlat(true); QVBoxLayout *qrzvbox = new QVBoxLayout; qrzvbox->addLayout(QrzBandModeLayout); qrzgroupBox->setLayout(qrzvbox); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(OKButton); buttonsLayout->addWidget(clearButton); dateEdit->setDisplayFormat("yyyy-MM-dd"); timeEdit->setDisplayFormat("HH:mm:ss"); QGridLayout *widgetLayout = new QGridLayout; widgetLayout->addWidget(qrzgroupBox, 0, 0, 1, 0); widgetLayout->addLayout(TimeLayout, 1, 0); widgetLayout->addLayout(buttonsLayout,1, 1); //widgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(widgetLayout); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); connect(qrzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotOKButtonClicked() ) ); //connect(qrzLineEdit, SIGNAL(res), this, SLOT(slotOKButtonClicked() ) ); //connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZTextChanged() ) ); connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStartDelayInputTimer() ) ); connect(delayInputTimer, SIGNAL(timeout()), this, SLOT(slotDelayInputTimedOut() ) ); connect(bandComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotBandComboBoxChanged(QString) ) ) ; connect(modeComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotModeComboBoxChanged(QString) ) ) ; connect(OKButton, SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClearButtonClicked() ) ); connect(timer, SIGNAL(timeout()), this, SLOT(slotUpdateTime()) ); //connect(realtimeButton, SIGNAL(clicked()), this, SLOT(slotRealtimeButtonClicked()) ); connect(realtimeCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxClicked())); connect(manualModeCheckBox, SIGNAL(clicked()), this, SLOT(slotManualModeCheckBoxClicked())); //qDebug()<< "MainQSOEntryWidget::createUI-END" << QT_ENDL; QWidget::setTabOrder (qrzLineEdit, dateEdit); QWidget::setTabOrder (dateEdit, timeEdit); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } /* void MainQSOEntryWidget::resizeEvent(QResizeEvent *event) { //qDebug() << Q_FUNC_INFO; slotRealTimeButtonResize(); } */ void MainQSOEntryWidget::slotCheckBoxClicked() { //qDebug() << Q_FUNC_INFO; if (realtimeCheckBox->isChecked()) { realTime = true; //realtimeButton->setIcon(QIcon(":/img/play.svg")); timeEdit->setBackgroundRole(enabledCR); } else { realTime = false; //realtimeButton->setIcon(QIcon(":/img/stop.svg")); timeEdit->setBackgroundRole(QPalette::BrightText); } } void MainQSOEntryWidget::slotManualModeCheckBoxClicked() { //qDebug() << Q_FUNC_INFO; if (manualModeCheckBox->isChecked()) { slotClearButtonClicked(); emit hamlibSetActiveSignal(false); //hamlib->stop(); //stop hamlib and wsjt-x communication; } else { //hamlib->initClass(); emit hamlibSetActiveSignal(true); //start hamlib and wsjt-x communication; } } /* void MainQSOEntryWidget::slotRealtimeButtonClicked() { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (realtimeButton->isChecked()) { realTime = true; realtimeButton->setIcon(QIcon(":/img/stop.svg")); timeEdit->setBackgroundRole(enabledCR); } else { realTime = false; realtimeButton->setIcon(QIcon(":/img/play.svg")); timeEdit->setBackgroundRole(QPalette::BrightText); } emit debugLog(Q_FUNC_INFO, "END", Debug); } */ void MainQSOEntryWidget::setCleaning (const bool _c) { emit debugLog(Q_FUNC_INFO, "Start", Debug); cleaning = _c; emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotQRZTextChanged() { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: " << qrzLineEdit->text() << " / Length: " << QString::number((qrzLineEdit->text()).size()) << "###### START ######" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { //emit clearForNextQSOSignal(); //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(); emit debugLog(Q_FUNC_INFO, "END-1", Debug); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ <1 - END" << QT_ENDL; return; } int cursorP = qrzLineEdit->cursorPosition(); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position: " << QString::number(cursorP) << QT_ENDL; qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); if (cleaning) { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Cleaning - END" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "END-2", Debug); return; } if (qrzAutoChanging) { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: qrzAutoChanging - END" << QT_ENDL; qrzAutoChanging = false; emit debugLog(Q_FUNC_INFO, "END-3", Debug); return; } qrzAutoChanging = true; //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.1: " << QString::number(cursorP) << QT_ENDL; if ( (qrzLineEdit->text()).endsWith(' ') ) {/*Remove the space and moves the focus to SRX to write the RX exchange*/ previousQRZ = (qrzLineEdit->text()).simplified(); qrzLineEdit->setText(previousQRZ); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Space detected" << QT_ENDL; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Simplifiying & Capitalizing" << QT_ENDL; qrzLineEdit->setText(((qrzLineEdit->text())).simplified()); qrzLineEdit->setText((qrzLineEdit->text()).remove(" ")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars" << QT_ENDL; //TODO: This validCharactersInCall may be removed? InValidCharsInPrevCall = validCharactersInCall(qrzLineEdit->text()); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars 00 " << QT_ENDL; if (!util->isValidCall(qrzLineEdit->text())) { qrzLineEdit->setPalette(palRed); //emit showInfoLabel(tr("Callsign not valid")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ not valid - Red" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "END-4", Debug); } else { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ is valid - Black" << QT_ENDL; if (getDarkMode()) { qrzLineEdit->setPalette(palWhite); } else { qrzLineEdit->setPalette(palBlack); } currentQrz = qrzLineEdit->text(); //emit showInfoLabel(tr("")); } /* //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for length" << QT_ENDL; if (((qrzLineEdit->text()).length() < 1)) { // If QRZ box is blank, Information labels should be cleared. slotClearButtonClicked(); emit debugLog(Q_FUNC_INFO, "END-5", Debug); return; } */ //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for modify or length<1" << QT_ENDL; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: qrzSmallModDontCalculate < 1" << QT_ENDL; qrzSmallModDontCalculate=false; emit debugLog(Q_FUNC_INFO, "END-6", Debug); return; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: running..." << QT_ENDL; qrzSmallModDontCalculate = true; // A kind of flag to prevent multiple calls to this method. currentQrz = qrzLineEdit->text(); if ((currentQrz).count('\\')) { // Replaces \ by / to ease operation. //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Replacing \\ by /" << QT_ENDL; currentQrz.replace(QChar('\\'), QChar('/')); qrzLineEdit->setText(currentQrz); } currentQrz = qrzLineEdit->text(); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.3: " << QString::number(cursorP) << QT_ENDL; if (cursorP>currentQrz.length()) {// A Space that has been removed without updating the cursor //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursorP > currentQRZ.length" << QT_ENDL; } else { if (((currentQrz.at(cursorP-1)).isSpace()) && (cursorP!=0)) { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.5: " << QString::number(cursorP) << QT_ENDL; previousQRZ = currentQrz.remove(cursorP-1, 1); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.6: " << QString::number(cursorP) << QT_ENDL; cursorP--; //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.7: " << QString::number(cursorP) << QT_ENDL; qrzLineEdit->setText(previousQRZ); } } currentQrz = qrzLineEdit->text(); //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: Emitting: " << currentQrz << QT_ENDL; emit currentQRZSignal(currentQrz); qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: cursorP at the end : " << QString::number(cursorP) << QT_ENDL; qrzLineEdit->setCursorPosition(cursorP); checkIfDupe(Q_FUNC_INFO); qrzAutoChanging = false; emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: END" << QT_ENDL; } void MainQSOEntryWidget::setCurrentQRZ(const QString &_qrz) { emit debugLog(Q_FUNC_INFO, "Start", Debug); currentQrz = _qrz; emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotBandComboBoxChanged(const QString &_b){ //qDebug() << Q_FUNC_INFO << ": " << _b; emit debugLog(Q_FUNC_INFO, "Start", Debug); bottomBandLimit = dataProxy->getLowLimitBandFromBandName (_b); upperBandLimit = dataProxy->getUpperLimitBandFromBandName (_b); emit bandChanged(_b); checkIfDupe(Q_FUNC_INFO); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::slotModeComboBoxChanged(const QString &_m) { emit debugLog(Q_FUNC_INFO, "Start", Debug); emit modeChanged(_m); checkIfDupe(Q_FUNC_INFO); emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotOKButtonClicked() { emit debugLog(Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { return; } emit OKClicked(); emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotClearButtonClicked() { //qDebug() << "MainQSOEntryWidget::slotClearButtonClicked" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); clear(); emit clearForNextQSOSignal(); setModify(false); checkIfDupe(Q_FUNC_INFO); emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::clear() { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << QT_ENDL; //cleaning = true; OKButton->setText(tr("&Add")); qrzLineEdit->clear(); qrzLineEdit->setFocus(Qt::OtherFocusReason); //cleaning = false; emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setInitialData() { //qDebug()<< "MainQSOEntryWidget::setInitialData" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); //Default band/modes modify = false; qrzAutoChanging = false; InValidCharsInPrevCall = false; qrzSmallModDontCalculate=false; previousQRZ = QString(); bands.clear(); modes.clear(); bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW" << "RTTY"; setBands(bands); setModes(modes); selectDefaultBand(true); selectDefaultMode(true); dateEdit->setDate(QDate::currentDate()); timeEdit->setTime(QTime::currentTime()); UTCTime = true; // //qDebug()ime = true; timer->start(1000); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug()<< "MainQSOEntryWidget::setInitialData-END" << QT_ENDL; } bool MainQSOEntryWidget::updateBandComboBox(const QString &_band) { //qDebug() << Q_FUNC_INFO << ": " << _band << QT_ENDL; //QString _currentBand = getBand(); if (!isBandExisting(_band)) {// The selected frequency is of a band that is not currently selected QString _currentBand = bandComboBox->currentText (); //qDebug() << Q_FUNC_INFO << ": New band found: " << _band << QT_ENDL; if (dataProxy->getIdFromBandName(_band) > 1) {// Not affected if 0 (light) is the frequency // In this case the user should select the band in the setup //qDebug() << Q_FUNC_INFO << ": Band is valid: " << _band << QT_ENDL; QStringList qsTemp; qsTemp.clear(); qsTemp << bands; qsTemp << _band; qsTemp.removeDuplicates(); bands.clear(); bands = dataProxy->sortBandNamesBottonUp(qsTemp); //qDebug() << Q_FUNC_INFO << ": Before setBands" << QT_ENDL; setBands(bands); bandComboBox->setCurrentIndex(bandComboBox->findText(_currentBand, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << ": Band has been added : " << _band << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << ": (END) Band is NOT valid: " <<_band<< endl; return false; } } //qDebug() << Q_FUNC_INFO << ": Band already existing, no need to add" << QT_ENDL; return true; } void MainQSOEntryWidget::setBands(const QStringList _bands) { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug()<< "MainQSOEntryWidget::setBands" << QT_ENDL; //foreach(QString i, _bands) //{ //qDebug()<< "MainQSOEntryWidget::setBands - received: " << i << QT_ENDL; //} bands.clear(); bands = _bands; bands.removeDuplicates(); bands = dataProxy->sortBandNamesBottonUp(bands); bandComboBox->clear(); bandComboBox->addItems(bands); emit validBands(_bands); //selectDefaultBand(true); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug()<< "MainQSOEntryWidget::setBands-END" << QT_ENDL; } void MainQSOEntryWidget::setModes(const QStringList _modes) { emit debugLog(Q_FUNC_INFO, "Start", Debug); modes.clear(); modes = _modes; modes.removeDuplicates(); modes.sort(); modeComboBox->clear(); modeComboBox->addItems(modes); selectDefaultMode(true); emit debugLog(Q_FUNC_INFO, "END", Debug); } QStringList MainQSOEntryWidget::getModes() { return modes; } bool MainQSOEntryWidget::setFreq(const double _f, bool isRX) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); if (isRX) { if (util->isSameFreq (freqRX, _f)) { return true; } freqRX = _f; } if (util->isSameFreq (freqTX, _f)) { return true; } freqTX = _f; if (newBandNeededForFreq (_f)) { if ((bottomBandLimit<=freqTX) && (freqTX<= upperBandLimit)) { return true; } //qDebug() << Q_FUNC_INFO << ": Freq is not in the current band" << QT_ENDL; QString _newBand = dataProxy->getBandNameFromFreq(_f); //qDebug() << Q_FUNC_INFO << ": before setting band: " << _newBand << QT_ENDL; if (isRX) { //qDebug() << Q_FUNC_INFO << ": RX Freq no more actions " << QT_ENDL; return true; } return setBand(_newBand); } return false; } bool MainQSOEntryWidget::newBandNeededForFreq(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); QString _newBand = dataProxy->getBandNameFromFreq(_f); if (!updateBandComboBox (_newBand)) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END false"; return false; } //qDebug() << Q_FUNC_INFO << " - END true "; emit debugLog(Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::setBand(const QString &_band) { //qDebug() << Q_FUNC_INFO << ": " << _band << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) { //qDebug() << "MainQSOEntryWidget::setBand-1: Band not found " << _band << QT_ENDL; if (!updateBandComboBox(_band)) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return false; } } //qDebug() << "MainQSOEntryWidget::setBand-1: Band found " << _band << QT_ENDL; bandComboBox->setCurrentIndex(bandComboBox->findText(_band, Qt::MatchCaseSensitive)); emit debugLog(Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; return true; } bool MainQSOEntryWidget::setMode(const QString &_mode) { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainQSOEntryWidget::setMode: " << _mode << QT_ENDL; if (modeComboBox->findText(_mode, Qt::MatchCaseSensitive) < 0) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return false; } else { modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); emit debugLog(Q_FUNC_INFO, "END", Debug); return true; } } bool MainQSOEntryWidget::setQRZ(const QString &_qrz) { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainQSOEntryWidget::setQRZ: " << _qrz << QT_ENDL; //TODO: Add validations to prevent that non valid qrz are sent from the outside of this function or at least manage this appropriately. qrzLineEdit->setText(_qrz.toUpper()); emit debugLog(Q_FUNC_INFO, "END", Debug); return false; } bool MainQSOEntryWidget::setDateTime(const QDateTime _date) { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (_date.isValid()) { dateEdit->setDate(_date.date()); timeEdit->setTime(_date.time()); emit debugLog(Q_FUNC_INFO, "END", Debug); return true; } else { //qDebug() << "MainQSOEntryWidget::setDate - NO VALID DATE" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "END", Debug); return false; } } bool MainQSOEntryWidget::setTime(const QTime _time) { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (_time.isValid()) { timeEdit->setTime(_time); emit debugLog(Q_FUNC_INFO, "END", Debug); return true; } else { emit debugLog(Q_FUNC_INFO, "END", Debug); return false; } } QString MainQSOEntryWidget::getQrz() { emit debugLog(Q_FUNC_INFO, "Start", Debug); emit debugLog(Q_FUNC_INFO, "END", Debug); return (qrzLineEdit->text()).toUpper(); } QString MainQSOEntryWidget::getBand(const int _b) { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (_b<0) { emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainQSOEntryWidget::getBand(1): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } else { if (bandComboBox->count()>=_b) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); //qDebug() << "MainQSOEntryWidget::getBand(2): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->itemText(_b); } else { emit debugLog(Q_FUNC_INFO, "END-2", Debug); //qDebug() << "MainQSOEntryWidget::getBand(3): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } } } QString MainQSOEntryWidget::getMode(const int _m) { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (_m<0) { emit debugLog(Q_FUNC_INFO, "END", Debug); return modeComboBox->currentText(); } else { if (modeComboBox->count()>=_m) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return modeComboBox->itemText(_m); } else { emit debugLog(Q_FUNC_INFO, "END-2", Debug); return modeComboBox->currentText(); } } } QDate MainQSOEntryWidget::getDate() { emit debugLog(Q_FUNC_INFO, "Start", Debug); emit debugLog(Q_FUNC_INFO, "END", Debug); return dateEdit->date(); } QDateTime MainQSOEntryWidget::getDateTime() { emit debugLog(Q_FUNC_INFO, "Start", Debug); //emit debugLog(Q_FUNC_INFO, "END", Debug); QDateTime dateTime; dateTime.setDate(dateEdit->date()); dateTime.setTime(timeEdit->time()); return dateTime; } QTime MainQSOEntryWidget::getTime() { emit debugLog(Q_FUNC_INFO, "Start", Debug); emit debugLog(Q_FUNC_INFO, "END", Debug); return timeEdit->time(); } void MainQSOEntryWidget::toggleRealTime() { //if ( realtimeButton->isChecked ()) if ( realtimeCheckBox->isChecked ()) { setRealTime (false); } else { setRealTime (true); } } bool MainQSOEntryWidget::getRealTime() { //return realtimeButton->isChecked (); return realtimeCheckBox->isChecked (); } void MainQSOEntryWidget::setRealTime(const bool _realTime) { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug << Q_FUNC_INFO << ": " << util->boolToQString (_realTime); realTime = _realTime; realtimeCheckBox->setChecked(realTime); /* * if (_realTime) { realtimeButton->setIcon(QIcon(":/img/play.svg")); } else { realtimeButton->setIcon(QIcon(":/img/stop.svg")); } */ //realTime = _realTime; emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setUTC(const bool _utc) { emit debugLog(Q_FUNC_INFO, "Start", Debug); UTCTime = _utc; setDateAndTimeInternally(); emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setModify(const bool _modify) { emit debugLog(Q_FUNC_INFO, "Start", Debug); modify = _modify; if (modify) { OKButton->setText(tr("&Modify")); realtimeCheckBox->setChecked (false); } else { OKButton->setText(tr("&Add")); } emit debugLog(Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getModifying() { return modify; } void MainQSOEntryWidget::slotUpdateTime() { //qDebug()<< "MainQSOEntryWidget::slotUpdateTime" << QT_ENDL; //emit debugLog(Q_FUNC_INFO, "Start", Debug); //if ( (!modify) && (realtimeButton->isChecked()) ) if ( (!modify) && (realtimeCheckBox->isChecked()) ) { //qDebug()<< "MainQSOEntryWidget::slotUpdateTime - Real Time & update" << QT_ENDL; setDateAndTimeInternally(); } //emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setDateAndTimeInternally() { if (UTCTime) { dateEdit->setDate(QDateTime::currentDateTime().toUTC().date()); timeEdit->setTime(QDateTime::currentDateTime().toUTC().time()); } else { dateEdit->setDate(QDateTime::currentDateTime().date()); timeEdit->setTime(QDateTime::currentDateTime().time()); } } bool MainQSOEntryWidget::validCharactersInCall(const QString &_qrz) { //qDebug()<< "MainQSOEntryWidget::validCharactersInCall: " << _qrz << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); for (int i = 0; i<_qrz.size()-1;i++) { if (!( ((_qrz.at(i)).isLetterOrNumber()) || (_qrz.at(i)=='\\') || (_qrz.at(i)=='/') )) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return false; } } emit debugLog(Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::isModeExisting(const QString &_m) { emit debugLog(Q_FUNC_INFO, "Start", Debug); if (modeComboBox->findText(_m, Qt::MatchCaseSensitive) >= 0) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return true; } else { emit debugLog(Q_FUNC_INFO, "END-2", Debug); return false; } } bool MainQSOEntryWidget::isBandExisting(const QString &_b) { emit debugLog(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _b << QT_ENDL; if (bandComboBox->findText(_b, Qt::MatchCaseSensitive) >= 0) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END true" << QT_ENDL; return true; } else { emit debugLog(Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - END false" << QT_ENDL; return false; } } void MainQSOEntryWidget::setUpAndRunning(const bool _u) { emit debugLog(Q_FUNC_INFO, "Start", Debug); upAndRunning = _u; emit debugLog(Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::selectDefaultBand(const bool _init) { //qDebug() << "MainQSOEntryWidget::selectDefaultBand" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); //qDebug() << "MainQSOEntryWidgetselectDefaultBand-END-1" << QT_ENDL; return; } QString aux; aux = QString(); int defaultBand = dataProxy->getMostUsedBand(-1); //TODO: The log could be defined here //qDebug() << "MainQSOEntryWidget::selectDefaultBand: " << QString::number(defaultBand) << dataProxy->getNameFromBandId (defaultBand)<< QT_ENDL; if (defaultBand<1) { defaultBand = dataProxy->getIdFromBandName(getBand(0)); } aux = dataProxy->getNameFromBandId(defaultBand); //qDebug() << Q_FUNC_INFO << ": before setting band: " << aux << QT_ENDL; setBand(aux); emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainQSOEntryWidgetselectDefaultBand_END" << QT_ENDL; } void MainQSOEntryWidget::selectDefaultMode(const bool _init) { //qDebug() << "MainQSOEntryWidgetselectDefaultMode" << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { emit debugLog(Q_FUNC_INFO, "END-1", Debug); return; } int defaultMode = dataProxy->getMostUsedMode(-1); //TODO: The log could be defined here //qDebug() << "MainQSOEntryWidgetselectDefaultMode: " << QString::number(defaultMode) << QT_ENDL; if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(getBand(0)); } setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << "MainQSOEntryWidgetselectDefaultMode3: " << QString::number(defaultMode) << QT_ENDL; emit debugLog(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainQSOEntryWidgetselectDefaultMode-END" << QT_ENDL; } void MainQSOEntryWidget::setDuplicatedQSOSlot (const int _secs) { if (_secs >= 0) { duplicatedQSOSlotInSecs = _secs; } } void MainQSOEntryWidget::checkIfDupe(const QString &_func) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << "(" << _func << ")" << QT_ENDL; #else #endif QDateTime _dateTime; _dateTime.setDate(dateEdit->date()); _dateTime.setTime(timeEdit->time()); if ((dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qrzLineEdit->text(), _dateTime, dataProxy->getIdFromBandName(bandComboBox->currentText()), dataProxy->getIdFromModeName(modeComboBox->currentText()), duplicatedQSOSlotInSecs).length()<2) || modify) { //qDebug() << Q_FUNC_INFO << " - NOT DUPE " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - Modify: " << util->boolToQString(modify) << QT_ENDL; qrzgroupBox->setTitle(tr("Callsign")); } else { //qDebug() << Q_FUNC_INFO << " - NOT DUPE " << QT_ENDL; qrzgroupBox->setTitle(tr("DUPE", "Translator: DUPE is a common world for hams. Do not translate of not sure")); } } void MainQSOEntryWidget::slotStartDelayInputTimer() { if (cleaning) { return; } if (qrzLineEdit->text ().length ()<1) { //qDebug() << Q_FUNC_INFO; slotClearButtonClicked (); return; } int cursor = qrzLineEdit->cursorPosition (); QString aux = util->getClearSQLi (qrzLineEdit->text ()); qrzLineEdit->setText (aux.toUpper()); qrzLineEdit->setCursorPosition (cursor); delayInputTimer->start(300); } void MainQSOEntryWidget::slotDelayInputTimedOut() { delayInputTimer->stop(); QString text = qrzLineEdit->text(); if( text != lastQrz) { text = lastQrz; slotQRZTextChanged(); } } bool MainQSOEntryWidget::getDarkMode() { return (OKButton->palette().color (QPalette::Base) == "#646464"); } /* void MainQSOEntryWidget::keyPressEvent( QKeyEvent *event) { //qDebug() << Q_FUNC_INFO; if(event->key()==Qt::Key_Enter) { //qDebug() << Q_FUNC_INFO << " TAB..."; } } */ bool MainQSOEntryWidget::eventFilter(QObject *object, QEvent *event) { if (!(event->type() == QEvent::Paint )) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(event->type ()); } if ((event->type() == QEvent::KeyPress) || (event->type() == QEvent::ShortcutOverride)) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED"; QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB"; if ((realtimeCheckBox->isChecked ()) && (qrzLineEdit->hasFocus ())) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB AND REAL TIME CHECKED"; //qDebug() << Q_FUNC_INFO << "emitting to hand over to QSO TAB-1"; emit handOverFocusSignal(); } else if((!realtimeCheckBox->isChecked ()) && timeEdit->hasFocus () && (timeEdit->currentSection() == QTimeEdit::SecondSection)) { //qDebug() << Q_FUNC_INFO << "emitting to hand over to QSO TAB-2"; emit handOverFocusSignal(); } // special tab handling here return true; } } return QWidget::event(event); } void MainQSOEntryWidget::setFocusToOK() { OKButton->setFocus (); } klog-1.8.6/database.cpp0000644000175000017500000107170514166020421013721 0ustar develdevel/*************************************************************************** database.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "database.h" //#include DataBase::DataBase(const QString &_parentClass, const QString &_DBName) { //qDebug() << "DataBase::DataBase: PLAIN: " << _parentClass << " / Name = " << _DBName << QT_ENDL; constrid = 1; created = false; util = new Utilities(); softVersion = util->getVersion(); dbName = _DBName; //connect(this, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotPrintErrors(QString, QString, int)) ); //qDebug() << "DataBase::DataBase1: dbName: " << dbName << QT_ENDL; //db = QSqlDatabase::database(); dbVersion = DBVersionf; createConnection(QString(Q_FUNC_INFO)+"1"); //qDebug() << "DataBase::DataBase: PLAIN - connection Name: " << dbConnectionName << QT_ENDL; //qDebug() << "DataBase::DataBase: PLAIN - DB Name: " << db.databaseName() << QT_ENDL; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase: PLAIN: - END" << QT_ENDL; } DataBase::DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName) { //qDebug() << "DataBase::DataBase2: " << _parentClass << "/" << _softVersion << " / Name = " << _DBName << QT_ENDL; //TODO: Sometimes the DB is created without the proper calling (without passing softVersion) constrid = 2; created = false; dbVersion = DBVersionf; softVersion = _softVersion; //inMemoryOnly = inmemoryonly; latestReaded = 0.0f; util = new Utilities(); util->setVersion(softVersion); dbName = _DBName; //connect(this, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotPrintErrors(QString, QString, int)) ); //qDebug() << "DataBase::DataBase2: dbName: " << dbName << QT_ENDL; //dbDir = dbName; //qDebug() << "DataBase::DataBase: DB(string): " << dbName << QT_ENDL; //db = QSqlDatabase::database(); //db = QSqlDatabase::removeDatabase("QSQLITE"); if (util->getVersionDouble()>0) { createConnection(QString(Q_FUNC_INFO)+"2"); } //qDebug() << "DataBase::DataBase: - connection Name: " << dbConnectionName << QT_ENDL; //qDebug() << "DataBase::DataBase: - DB Name: " << db.databaseName() << QT_ENDL; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase2: END" << QT_ENDL; } DataBase::~DataBase() { delete(util); //qDebug() << "DataBase::~DataBase" << QT_ENDL; } //void DataBase::slotPrintErrors(QString _func, QString _msg, int _level) //{ //qDebug() << "DataBase::slotPrintErrors: FUNC: " << _func << QT_ENDL; //qDebug() << "DataBase::slotPrintErrors: MSG: " << _msg << QT_ENDL; //qDebug() << "DataBase::slotPrintErrors: LEVEL: " << QString::number(_level) << QT_ENDL; //} QString DataBase::getSoftVersion() { QSqlQuery query; QString stringQuery ("SELECT MAX (softversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { return (query.value(0)).toString(); } else { query.finish(); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataBase::getDBVersion() { QSqlQuery query; QString stringQuery ("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { return QString::number((query.value(0)).toDouble(), 'f', 3); } else { query.finish(); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } /* bool DataBase::setDir(const QString &_dir) { dbDir = _dir; return true; } */ QString DataBase::getDBName() { return db.databaseName(); } QStringList DataBase::getColumnNamesFromTable(const QString &_tableName) { //qDebug() << "DataBase::getColumnNamesFromTable: " << _tableName << QT_ENDL; QSqlQuery query; QString queryString = QString("PRAGMA table_info('%1')").arg(_tableName); bool sqlOK = query.exec(queryString); QStringList list; list.clear(); QString aux; if (sqlOK) { //qDebug() << "DataBase::getColumnNamesFromTable: OK" << QT_ENDL; while(query.next()) { if (query.isValid()) { aux = (query.value(1)).toString(); if (( aux.toUpper() != "ID" ) && (aux.length()>0)) { list << aux; //qDebug() << "DataBase::getColumnNamesFromTable: " << (query.value(1)).toString() << QT_ENDL; } } } query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); //qDebug() << "DataBase::getColumnNamesFromTable: " << QString::number(list.size()) << QT_ENDL; return list; } void DataBase::compress() { //qDebug() << "DataBase::compress " << QT_ENDL; //QSqlDatabase db = QSqlDatabase::database(); if (!db.open()) { /* Flawfinder: ignore */ QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text()); } else { db.exec("VACUUM;"); } } bool DataBase::reConnect(const QString &_DBName) { //qDebug() << "DataBase::reConnect:" << QT_ENDL; db.close(); dbName = _DBName; //qDebug() << "DataBase::reConnect: DB closed" << QT_ENDL; //qDebug() << "DataBase::reConnect: DB: " << dbDir << QT_ENDL; bool sqlOK = createConnection(Q_FUNC_INFO); if (!sqlOK) { //// emit debugLog(Q_FUNC_INFO, "1", 7); } return sqlOK; //qDebug() << "DataBase::reConnect: END" << QT_ENDL; } bool DataBase::createConnection(const QString &function, bool newDB) { //qDebug() << "DataBase::createConnection: " << function << "-" << QString::number(dbVersion) << "/" << softVersion << QT_ENDL; QString stringQuery; QSqlQuery query; if (!db.isOpen()) { //qDebug() << "DataBase::createConnection: DB NOT Opened" << QT_ENDL; if (db.isValid()) { //qDebug() << "DataBase::createConnection: DB is Valid" << QT_ENDL; } else { //qDebug() << "DataBase::createConnection: DB is not valid, let's call addDataBase" << QT_ENDL; if (db.isOpen()) { //qDebug() << "DataBase::createConnection: DB is already open" << QT_ENDL; } else { //qDebug() << "DataBase::createConnection: DB is NOT open, let's open: connection name" << db.connectionName()<< QT_ENDL; QSqlDatabase::removeDatabase("qt_sql_default_connection"); db = QSqlDatabase::addDatabase("QSQLITE"); } //qDebug() << "DataBase::createConnection: Now we call setDatabaseName" << QT_ENDL; db.setDatabaseName(dbName); //qDebug() << "DataBase::createConnection: end of not valid" << QT_ENDL; } //qDebug() << "DataBase::createConnection: end of valid check, let's try if it is open" << QT_ENDL; if (!db.open()) /* Flawfinder: ignore */ { //qDebug() << "DataBase::createConnection:Not open " << QT_ENDL; QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text()); //qDebug() << "DataBase::createConnection: DB creation ERROR" << QT_ENDL; //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } else { //qDebug() << "DataBase::createConnection: created and opened after the creation" << QT_ENDL; if (isTheDBCreated()) { //qDebug() << "DataBase::createConnection: DB Exists" << QT_ENDL; } else { //qDebug() << "DataBase::createConnection: DB does not exist" << QT_ENDL; createDataBase(); //qDebug() << "DataBase::createConnection: After creation" << QT_ENDL; stringQuery ="PRAGMA main.page_size = 4096;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=10000;"; query.exec(stringQuery); stringQuery ="PRAGMA main.locking_mode=EXCLUSIVE;"; query.exec(stringQuery); stringQuery ="PRAGMA main.synchronous=NORMAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.journal_mode=WAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=5000;"; query.exec(stringQuery); stringQuery ="PRAGMA synchronous=OFF;"; query.exec(stringQuery); stringQuery ="PRAGMA main.temp_store = MEMORY;"; query.exec(stringQuery); //stringQuery="PRAGMA auto_vacuum = FULL;"; //query.exec(stringQuery); stringQuery ="PRAGMA case_sensitive_like=OFF;"; query.exec(stringQuery); } } } else { //qDebug() << "DataBase::createConnection: No Error, DB is open" << QT_ENDL; } //qDebug() << "DataBase::createConnection: Going to run - createBandModeMaps " << QT_ENDL; if (createBandModeMaps()) { //qDebug() << "DataBase::createConnection: createBandModeMaps true" << QT_ENDL; } else { //qDebug() << "DataBase::createConnection: createBandModeMaps false Stop" << QT_ENDL; } //created = true; //qDebug() << "DataBase::createConnection -------------------------------------------- END" << QT_ENDL; return unMarkAllQSO(); } bool DataBase::isTheDBCreated() { //qDebug() << "DataBase::isTheDBCreated: Called from: " << QString::number(constrid) << QT_ENDL; QSqlQuery query; int _num = 0; QString stringQuery ("SELECT count(id) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "DataBase::isTheDBCreated - SQL OK" << QT_ENDL; query.next(); if (query.isValid()) { //qDebug() << "DataBase::isTheDBCreated - valid" << QT_ENDL; _num = (query.value(0)).toInt(); if (_num > 0) { //qDebug() << "DataBase::isTheDBCreated - DB Exists" << QT_ENDL; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END TRUE" << QT_ENDL; query.finish(); return true; } else { //qDebug() << "DataBase::isTheDBCreated - DB does not Exist" << QT_ENDL; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-1" << QT_ENDL; query.finish(); //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } else { //qDebug() << "DataBase::isTheDBCreated - not valid" << QT_ENDL; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-2" << QT_ENDL; query.finish(); //// emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //ERROR in Query execution //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------ ERROR IN QUERY EXECUTION" << QT_ENDL; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //query.finish(); //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-X" << QT_ENDL; //return false; } bool DataBase::recreateTableLog() { //qDebug() << "DataBase::recreateTableLog" << QT_ENDL; if (!createTableLog(false)) // Create modetemp { //qDebug() << "DataBase::recreateTableLog: CreateTableLog returned false" << QT_ENDL; //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } QString queryString; queryString.clear(); QStringList columns; columns.clear(); columns << getColumnNamesFromTable("log"); queryString = columns.first(); for (int i=1;i TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableSubdivisions" << QT_ENDL; QString stringQuery = QString(); QString table = QString(); if (NoTmp) { table = "primary_subdivisions" ; } else { table = "primary_subdivisionstemp" ; } stringQuery = "CREATE TABLE "+ table; stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "dxcc INTEGER NOT NULL, " "name VARCHAR NOT NULL, " "shortname VARCHAR NOT NULL, " "prefix VARCHAR, " "cqz INTEGER NOT NULL, " "ituz INTEGER NOT NULL, " "regionalgroup VARCHAR, " "regionalid INTEGER, " "start_date DATETIME, " "end_date DATETIME, " "deleted VARCHAR, " "UNIQUE (id, shortname, name), " "FOREIGN KEY (cqz) REFERENCES entity, " "FOREIGN KEY (ituz) REFERENCES entity, " "FOREIGN KEY (dxcc) REFERENCES entity)"); QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); //qDebug() << "DataBase::createTableSubdivision - END" << QT_ENDL; return execQuery(Q_FUNC_INFO, stringQuery); //qDebug() << "DataBase::createTableSubdivision - END" << QT_ENDL; } int DataBase::getBandIdFromName(const QString &b) { //qDebug() << "DataBase::getBandIdFromName: " << b << QT_ENDL; QString band = b.toUpper(); QSqlQuery query; if (isValidBand(band)) { QString queryString = QString("SELECT id FROM band WHERE name='%1'").arg(band); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { //qDebug() << "DataBase::getBandIdFromName: OK" << QString::number((query.value(0)).toInt()) << QT_ENDL; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataBase::getBandIdFromName: NOK 1" << QT_ENDL; query.finish(); return -1; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromName: NOK 3" << QT_ENDL; } else { //qDebug() << "DataBase::getBandIdFromName: BAND NOT VALID: " << band << QT_ENDL; } //qDebug() << "DataBase::getBandIdFromName: Will return -3 from: " << band << QT_ENDL; query.finish(); return -3; } int DataBase::getModeIdFromName(const QString &b) { //qDebug() << "DataBase::getModeIdFromName: " << b << QT_ENDL; QSqlQuery query; if (isValidMode(b, false)) { QString queryString = QString("SELECT id FROM mode WHERE name='%1'").arg(b); //qDebug() << "DataBase::getModeIdFromName: queryString: " << queryString << QT_ENDL; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { //qDebug() << "DataBase::getModeIdFromName: OK" << QString::number((query.value(0)).toInt()) << QT_ENDL; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getModeIdFromName: NOK 1" << QT_ENDL; query.finish(); return -1; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } } //qDebug() << "DataBase::getModeIdFromName: NOK 3" << QT_ENDL; query.finish(); return -1; } int DataBase::getModeIdFromSubMode(const QString &b) { //qDebug() << "DataBase::getModeIdFromSubMode: " << b << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); /* if (_tmp) { queryString = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b); } else { queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); } */ bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::getModeIdFromName: OK - Mode: " << b << " - " << (query.value(0)).toString() << QT_ENDL; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getModeIdFromName: NOK 1" << "-------- END"<< QT_ENDL; query.finish(); return -1; } } else { //qDebug() << "DataBase::getModeIdFromName: NOK 2" << "-------- END"<< QT_ENDL; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "DataBase::getModeIdFromName: NOK 3" << "-------- END"<< QT_ENDL; //query.finish(); //return -1; } QString DataBase::getBandNameFromNumber(const int _n) { //qDebug() << "DataBase::getBandNameFromNumber: " << QString::number(_n) << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT name FROM band WHERE id='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { if ( isValidBand((query.value(0)).toString()) ) { //qDebug() << "DataBase::getBandNameFromNumber: " << (query.value(0)).toString() << "-------- END" << QT_ENDL; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-1" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-2" << QT_ENDL; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return QString(); } QString DataBase::getModeNameFromNumber(const int _n, bool _tmp) { //TODO May fail to identify the sumbode(mode/modetemp... (Review STEP-2 o 3) //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) << QT_ENDL; QSqlQuery query; QString queryString; if (_tmp) { queryString = QString("SELECT name FROM modetemp WHERE id='%1'").arg(_n); } else { queryString = QString("SELECT name FROM mode WHERE id='%1'").arg(_n); } bool sqlOK = query.exec(queryString); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) <<" - " << isValidMode((query.value(0)).toString(), _tmp) << QT_ENDL; if ( query.isValid() ) { //qDebug() << "DataBase::getModeNameFromNumber: ------ END-1" << QT_ENDL; return (query.value(0)).toString(); /* In a version when I change the mode table to include submode, this comparison may need to be checked in both versions * at once, failing the query as old version was not having the column submode * if ( isValidMode((query.value(0)).toString(), _tmp)) { //qDebug() << "DataBase::getModeNameFromNumber - Found: " << (query.value(0)).toString() << QT_ENDL; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid Mode: " << (query.value(0)).toString() << QT_ENDL; return QString(); } */ } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid record" << QT_ENDL; //qDebug() << "DataBase::getModeNameFromNumber: ------ END-2" << QT_ENDL; query.finish(); return QString(); } } QString DataBase::getSubModeNameFromNumber(const int _n, bool _tmp) { //qDebug() << "DataBase::getSubModeNameFromNumber: " << QString::number(_n) << QT_ENDL; QSqlQuery query; QString queryString; if (_tmp) { queryString = QString("SELECT submode FROM modetemp WHERE id='%1'").arg(_n); } else { queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_n); } bool sqlOk = query.exec(queryString); //qDebug() << "DataBase::getSubModeNameFromNumber - query: " << query.lastQuery() << QT_ENDL; if (sqlOk) { if (query.next()) { if ( query.isValid() ) { if ( isValidMode((query.value(0)).toString(), _tmp) ) { //qDebug() << "DataBase::getSubModeNameFromNumber: RETURN: " << (query.value(0)).toString() << QT_ENDL; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getSubModeNameFromNumber: NO valid mode - END" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not valid - END" << QT_ENDL; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not next - END" << QT_ENDL; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::getSubModeNameFromNumber: SQL FALSE - END" << QT_ENDL; query.finish(); return QString(); } //qDebug() << "DataBase::getSubModeNameFromNumber: - END-X" << QT_ENDL; //query.finish(); //return QString(); } bool DataBase::isValidBand (const QString &b) { //qDebug() << "DataBase::isValidBand: " << b << QT_ENDL; if (b.length()<1) { //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } QString _band = b.toUpper(); QSqlQuery query; QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(_band); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); //// emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } //emit debugLog(Q_FUNC_INFO, "3", 7); return false; } bool DataBase::isValidMode (const QString &b, const bool _tmp) { //qDebug() << "DataBase::isValidMode: " << b << QT_ENDL; QString stringQuery; if (b.length()<2) { //qDebug() << "DataBase::isValidMode: (length<2) FALSE" << QT_ENDL; //emit debugLog(Q_FUNC_INFO, "1", 7); return false; } if (_tmp) { stringQuery = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b); } else { stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); } //stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); return query.isValid(); } bool DataBase::isValidBandNumber (const int b) { //qDebug() << "DataBase::isValidBandNumber: " << QString::number(b)<< QT_ENDL; return isValidBand(getBandNameFromNumber(b)); } bool DataBase::isValidModeNumber (const int b) { //qDebug() << "DataBase::isValidModeNumber: " << QString::number(b)<< QT_ENDL; return isValidMode(getModeNameFromNumber(b, false), false); } int DataBase::getBandIdFromFreq(const QString &fr) { //qDebug() << "DataBase::getBandIdFromFreq: " << fr << QT_ENDL; //Freq should be in MHz QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(fr, fr); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataBase::getBandIdFromFreq: Query: " << query.lastQuery() << QT_ENDL; if (sqlOK) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK" << QT_ENDL; query.next(); if (query.isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK - END" << QT_ENDL; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getBandIdFromFreq: Valid NOK - END" << QT_ENDL; query.finish(); return -1; } } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK" << QT_ENDL; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() << QT_ENDL; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().nativeErrorCode() << QT_ENDL; if (query.lastError().isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error VALID" << QT_ENDL; } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error NOT-VALID" << QT_ENDL; } //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); queryErrorManagement(Q_FUNC_INFO, query.lastError().text(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromFreq: END-X" << QT_ENDL; //query.finish(); //return -3; } bool DataBase::isThisFreqInBand(const QString &b, const QString &fr) {//Freq should be in MHz //qDebug() << "DataBase::isThisFreqInBand: " << b << "/" << fr << QT_ENDL; if (b.length()<2) { //qDebug() << "DataBase::isThisFreqInBand returning false" << QT_ENDL; return false; } int bandNf = getBandIdFromFreq(fr); int bandN = getBandIDFromName2(b); //qDebug() << "DataBase::isThisFreqInBand: (b/f)" << QString::number(bandN) << "/" << QString::number(bandNf) << QT_ENDL; if (bandNf == bandN) { //qDebug() << "DataBase::isThisFreqInBand: OK " << b << "/" << fr << QT_ENDL; return true; } else { //qDebug() << "DataBase::isThisFreqInBand: NOK " << b << "/" << fr << QT_ENDL; //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //qDebug() << "DataBase::isThisFreqInBand: END" << QT_ENDL; //return false; } bool DataBase::unMarkAllQSO() { //qDebug() << "DataBase::unMarkAllQSO" << QT_ENDL; QString stringQuery = QString("UPDATE log SET marked = 'N' WHERE 1"); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateIfNeeded() { //qDebug() << "DataBase::updateIfNeeded - Version: " << QString::number(dbVersion) << QT_ENDL; /************************************************************************************** * This function should call to bool updateToXXX () being XXX dbVersion and * */ //float aux = 0.0; //int nameCol = -1; //int errorCode = -1; //bool toBeUpdated = false; //bool sqlOK; QSqlQuery query; QString stringQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); latestReaded = (query.value(0)).toFloat(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //QSqlQuery query("SELECT dbversion FROM softwarecontrol"); //QSqlRecord rec = query.record(); //query.next(); //latestReaded = (query.value(0)).toFloat(); query.finish(); //qDebug() << "DataBase::updateIfNeeded - LatestReaded: " << QString::number(latestReaded) << QT_ENDL; if (latestReaded >= dbVersion) { // DB is updated, no update is needed //qDebug() << "DataBase::updateIfNeeded - DB updated (no need to update anything!) " << QT_ENDL; //toBeUpdated = false; //qDebug() << "DataBase::updateIfNeeded - TRUE - END " << QT_ENDL; return true; } else { // DB is outdated. We need to update!! //qDebug() << "DataBase::updateIfNeeded - DB outdated... upgrade starts now! " << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle("KLog"); msgBox.setText( QObject::tr("KLog DB needs to be upgraded.")); msgBox.setInformativeText( QObject::tr("Do you want to upgrade it now?") + "\n"+ QObject::tr("If DB is not upgraded KLog may not work properly.")); msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard); msgBox.setDefaultButton(QMessageBox::Apply); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Apply: // Save was clicked backupB4Update(); break; case QMessageBox::Discard: // Discard was clicked break; default: // should never be reached //qDebug() << "DataBase::updateIfNeeded - FALSE - CHECK IF SEEN, shoud not be here! - END " << QT_ENDL; //// emit debugLog(Q_FUNC_INFO, "2", 7); return false; //break; } } // If the DB needs to be updated... we update it! :-) //qDebug() << "DataBase::updateIfNeeded - END!" << QT_ENDL; return true; } void DataBase::backupB4Update() { //qDebug() << "DataBase::backupB4Update - Start" << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle("KLog backup"); msgBox.setText( QObject::tr("Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea.")); msgBox.setInformativeText( QObject::tr("Do you want to backup your DB now?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Save was clicked logBackup(); break; case QMessageBox::No: // NO backup was selected updateToLatest(); break; } //qDebug() << "DataBase::backupB4Update - END" << QT_ENDL; } void DataBase::logBackup() { //qDebug() << "DataBase::logBackup - Start" << QT_ENDL; QFile DBFile(util->getKLogDBFile()); QString newFile = util->getKLogDBBackupFile(); bool copied = DBFile.copy(newFile); //qDebug() << "DataBase::logBackup copy: " << newFile << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle("KLog DB backup"); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); if (copied) { //qDebug() << "DataBase::logBackup - DB backup was OK" << QT_ENDL; msgBox.setText( QObject::tr("The backup finished successfully.")); msgBox.setInformativeText( QObject::tr("You can find the backup in this file: %1").arg(newFile) ); msgBox.setIcon(QMessageBox::Information); msgBox.raise(); msgBox.exec(); updateToLatest(); } else { //qDebug() << "DataBase::logBackup - DB backup was NOK" << QT_ENDL; msgBox.setText( QObject::tr("The backup was not properly done.")); msgBox.setInformativeText( QObject::tr("You will be sent back to the starting point.")); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); msgBox.exec(); updateIfNeeded(); } /* QMessageBox msgBox; msgBox.setWindowTitle("KLog DB backup"); msgBox.setText( QObject::tr("KLog is backing up the DB to a file...")); msgBox.setInformativeText( QObject::tr("Did the DB backup worked well?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Information); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Save was clicked updateToLatest(); break; case QMessageBox::No: // NO backup was DONE msgBox.setWindowTitle("KLog DB backup not done."); msgBox.setText( QObject::tr("KLog DB backup was not done.")); msgBox.setInformativeText( QObject::tr("You will be redirected to the first message.") ); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); msgBox.exec(); updateIfNeeded(); break; default: // should never be reached //qDebug() << "DataBase::backupB4Update - FALSE - CHECK IF SEEN, shoud not be here! - END " << QT_ENDL; //lse; //break; } */ //qDebug() << "DataBase::logBackup - END" << QT_ENDL; } bool DataBase::createTheBandQuickReference() { /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash QHash freqBandIdHash; */ //qDebug() << "DataBase::createTheBandQuickReference: " << QT_ENDL; QString st = "NULL"; int in = 0; QString stringQuery = QString("SELECT id, name, lower FROM band"); QString fr = QString(); bandIDHash.clear(); IDBandHash.clear(); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } while (query.next()) { if (query.isValid()) { st = (query.value(1)).toString(); in = (query.value(0)).toInt(); fr = (query.value(2)).toString(); bandIDHash.insert(st, in ); IDBandHash.insert(in, st); freqBandIdHash.insert(in, fr); //qDebug() << "DataBase::createTheBandQuickReference: " << st <<"/" << QString::number(in)<< QT_ENDL; } else { //qDebug() << "DataBase::createTheBandQuickReference: Query not valid -'RETURN FALSE - END" << QT_ENDL; // QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheBandQuickReference)"), // query.lastError().text()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "2", 7); return false; //TODO: Manage this error, in case the query is NOK. } //qDebug() << "DataBase::createTheBandQuickReference: Go for the next one!" << QT_ENDL; } query.finish(); //qDebug() << "DataBase::createTheBandQuickReference: END" << QT_ENDL; return true; } bool DataBase::createTheModeQuickReference() { /* KEY Value QHash modeIDHash; QHash IDModeHash */ //qDebug() << "DataBase::createTheModeQuickReference: " << QT_ENDL; if (getDBVersion().toFloat()<0.01f) { // If the version is not updated we don't create the reference return true; } QString st = QString(); QString sm = QString(); int in = 0; modeIDHash.clear(); IDModeHash.clear(); subModeIDHash.clear(); IDSubModeHash.clear(); QString stringQuery = QString("SELECT id, name, submode FROM mode"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } while (query.next()) { if (query.isValid()) { in = (query.value(0)).toInt(); st = (query.value(1)).toString(); sm = (query.value(2)).toString(); modeIDHash.insert(st, in ); IDModeHash.insert(in, st); subModeIDHash.insert(sm, in ); IDSubModeHash.insert(in, sm); //qDebug() << "DataBase::createTheModeQuickReference: " << st <<"/" << QString::number(in)<< QT_ENDL; } else { //qDebug() << "DataBase::createTheModeQuickReference: Query not valid - END" << QT_ENDL; //QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheModeQuickReference)"), // query.lastError().text()); query.finish(); //// emit debugLog(Q_FUNC_INFO, "2", 7); return false; //TODO: Manage this error, in case the query is NOK. } } query.finish(); //qDebug() << "DataBase::createTheModeQuickReference: END" << QT_ENDL; return true; } int DataBase::getBandIDFromName2(const QString &b) {//KEY, value //name, id /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash */ //qDebug() << "DataBase::getBandIDFromName2: " << b << QT_ENDL; //qDebug() << "DataBase::getBandIDFromName2: This line should be the last one... " << QT_ENDL; return getBandIdFromName(b); //qDebug() << "DataBase::getBandIDFromName2: CHECK IF THIS LINE IS SEEN" << QT_ENDL; /* if (b.length()<1) { return -3; } if (bandIDHash.contains(b)) { //qDebug() << "DataBase::getBandIDFromName2: " << b << ":" << bandIDHash.value(b) << QT_ENDL; return bandIDHash.value(b); } else { //qDebug() << "DataBase::getBandIDFromName2: Contains - False" << QT_ENDL; return -1; } //qDebug() << "DataBase::getBandIDFromName2: Safety exit" << QT_ENDL; */ } int DataBase::getModeIDFromName2(const QString &b) { //qDebug() << "DataBase::getModeIDFromName2: " << b << QT_ENDL; return getModeIdFromSubMode(b); /* if (b.length()<2) { //qDebug() << "DataBase::getModeIDFromName2: END -3" << QT_ENDL; return -3; } if (modeIDHash.contains(b)) { //qDebug() << "DataBase::getModeIDFromName2: END - " << b << ":" << modeIDHash.value(b) << QT_ENDL; return modeIDHash.value(b); } else { //qDebug() << "DataBase::getModeIDFromName2: Contains - False - END" << QT_ENDL; return -1; } //qDebug() << "DataBase::getModeIDFromName2: Safety exit - END" << QT_ENDL; */ } int DataBase::getSubModeIDFromName2(const QString &b) { //qDebug() << "DataBase::getSubModeIDFromName2: " << b << QT_ENDL; return getModeIdFromSubMode(b); } QString DataBase::getBandNameFromID2(const int _i) { //qDebug() << "DataBase::getBandNameFromid2: " << QString::number(_i) << QT_ENDL; return getBandNameFromNumber(_i); /* if (IDBandHash.contains(_i)) { //qDebug() << "DataBase::getBandNameFromid2: END OK" << QT_ENDL; return IDBandHash.value(_i); } else { //qDebug() << "DataBase::getBandNameFromid2: END-1" << QT_ENDL; return "-1"; } */ //qDebug() << "DataBase::getBandNameFromid2: END-2" << QT_ENDL; //return "-2"; } QString DataBase::getModeNameFromID2(const int _i) { //qDebug() << "DataBase::getModeNameFromId2: " << QString::number(_i) << QT_ENDL; return getSubModeNameFromNumber(_i); /* if (IDModeHash.contains(_i)) { //qDebug() << "DataBase::getModeNameFromId2: END OK - " << IDModeHash.value(_i) << QT_ENDL; return IDModeHash.value(_i); } else { //qDebug() << "DataBase::getModeNameFromId2: END-1" << QT_ENDL; return "-1"; } */ //qDebug() << "DataBase::getModeNameFromId2: END-2" << QT_ENDL; //return "-2"; } QString DataBase::getSubModeNameFromID2(const int _i) { //qDebug() << "DataBase::getSubModeNameFromId2: " << QString::number(_i) << QT_ENDL; return getSubModeNameFromNumber(_i); /* if (IDSubModeHash.contains(_i)) { //qDebug() << "DataBase::getSubModeNameFromId2: END OK - " << IDModeHash.value(_i) << QT_ENDL; return IDSubModeHash.value(_i); } else { //qDebug() << "DataBase::getSubModeNameFromId2: END-1" << QT_ENDL; return "-1"; } //qDebug() << "DataBase::getSubModeNameFromId2: END-2" << QT_ENDL; */ } bool DataBase::createBandModeMaps() { //qDebug() << "DataBase::createBandModeMaps" << QT_ENDL; bool b = false; bool m = false; //return (b && m); if (isTheDBCreated()) { b = createTheBandQuickReference(); m = createTheModeQuickReference(); //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated TRUE" << QT_ENDL; if (!b) { //emit debugLog(Q_FUNC_INFO, "1", 7); } if (!m) { //emit debugLog(Q_FUNC_INFO, "2", 7); } //qDebug() << "DataBase::createBandModeMaps END 1" << QT_ENDL; return (b && m); } else { //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated FALSE" << QT_ENDL; //emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //return false; //qDebug() << "DataBase::createBandModeMaps END" << QT_ENDL; } QString DataBase::getFreqFromBandId(const int _i) { //qDebug() << "DataBase::getFreqFromBandId" << QT_ENDL; if (freqBandIdHash.contains(_i)) { //qDebug() << "DataBase::getFreqFromBandId OK END" << QT_ENDL; return freqBandIdHash.value(_i); } else { //qDebug() << "DataBase::getFreqFromBandId END-1" << QT_ENDL; return "-1.0"; } //qDebug() << "DataBase::getFreqFromBandId END-2" << QT_ENDL; //return "-2.0"; } /* int DataBase::getLogTypeNumber(const QString &_logType) { //qDebug() << "DataBase::getLogTypeNumber: " << _logType << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT id FROM supportedcontests WHERE name='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toInt(); } else { query.finish(); return -1; } //query.finish(); //return -2; } QString DataBase::getLogTypeName(const int _logType) { //qDebug() << "DataBase::getLogTypeName: " << QString::number(_logType) << QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT name FROM supportedcontests WHERE id='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toString(); } else { query.finish(); return QString(); } //query.finish(); //return QString(); } */ bool DataBase::updateToLatest() { /* * With the DB updates, the function that is called from here should be also updated. * The updateXXX are recursive calls that calls the previous one. * */ //qDebug() << "DataBase::updateToLatest " << QT_ENDL; if (requiresManualUpgrade()) { //qDebug() << "DataBase::updateToLatest requires" << QT_ENDL; exit(1); //return false; } return updateTo023(); } bool DataBase::requiresManualUpgrade() { // If DB version <= 0.006, DB can't be upgraded automatically. // Recomendation is to export to ADIF in an olf KLog version (before KLog 1.1); // Install new KLog version // import ADIF file float ver = getDBVersion().toFloat(); //qDebug() << "DataBase::requiresManualUpgrade - ver: " << QString::number(ver) << QT_ENDL; if (ver >= 0.007f) { //qDebug() << "DataBase::requiresManualUpgrade false" << QT_ENDL; return false; } else { //qDebug() << "DataBase::requiresManualUpgrade true" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); msgBox.setWindowTitle(QObject::tr("KLog - DB can't be updated automatically")); QString aux = QObject::tr("You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version."); QString aux2 = QObject::tr("The process to upgrade is:\n- Using an old KLog version export your log to ADIF.\n- Remove your logbook.dat file from your KLog folder.\n- Install the new KLog version.\n- Import your ADIF file.\n\nKLog will finish when you click on OK."); msgBox.setText(aux); msgBox.setDetailedText(aux2); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return true; } bool DataBase::updateTo003() {// Updates the DB to 0.0.3 /* * This function should be used as a template to create the all the update functions implementing the needed changes * in the dB to update from one version to the following one. * * // dbVersion shows the DB version that is being deployed * // latestReaded shows the DB version that is currently deployed. *i.e.: * QString stringQuery = QString ("ALTER TABLE award_enumeration ADD COLUMN dxcc INTEGER;"); * */ //qDebug() << "DataBase::updateTo003: latestRead: " << QString::number(latestReaded) << QT_ENDL; bool IAmIn003 = false; bool IAmIn002 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.003f) { //IAmIn003 = true; return true; } else { IAmIn003 = false; } while (!IAmIn003 && !ErrorUpdating) { while (!IAmIn002 && !ErrorUpdating) { //IAmIn002 = updateTo002(); IAmIn002 = true; } if (ErrorUpdating) { //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //DO ALL THE TASKS TO BE IN 0.003 from 0.002 HERE and set ErrorUpdating if it is not possible. IAmIn003 = true; } return IAmIn003; } bool DataBase::updateTo004() {// Updates the DB to 0.0.41 //qDebug() << "DataBase::updateTo004: latestRead: " << getDBVersion() << QT_ENDL; //qDebug() << "DataBase::updateTo004: latestRead: " << QString::number(latestReaded) << QT_ENDL; bool IAmIn004 = false; bool IAmIn003 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.004f) { //qDebug() << "DataBase::updateTo004: - I am in 004" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo004: - I am not in 004" << QT_ENDL; IAmIn004 = false; } while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo004: - And I am not in 004 nor ErrorUpdating" << QT_ENDL; while (!IAmIn003 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo004: - And I am not in 003" << QT_ENDL; //IAmIn002 = updateTo002(); IAmIn003 = true; } if (ErrorUpdating) { //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //qDebug() << "DataBase::updateTo004: - And I am in 003" << QT_ENDL; sqlOk = updateDBVersion(softVersion, "0.004"); //qDebug() << "DataBase::updateTo004: - Update Version" << QT_ENDL; if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo004: - Update OK" << QT_ENDL; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE award_enumeration"); } else { // Version not updated //qDebug() << "DataBase::updateTo004: - Update NOK" << QT_ENDL; } //DO ALL THE TASKS TO BE IN 0.004 from 0.003 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo004: - IAmIn004 = true" << QT_ENDL; IAmIn004 = true; } if (IAmIn004) { //qDebug() << "DataBase::updateTo004: - Return... TRUE" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo004: - Return... FALSE" << QT_ENDL; } //qDebug() << "DataBase::updateTo004: UPDATED OK!" << QT_ENDL; return IAmIn004; } bool DataBase::updateTo005() {// Updates the DB to 0.0.5 //qDebug() << "DataBase::updateTo005: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn005 = false; bool IAmIn004 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); msgBox.setIcon(QMessageBox::Information); //int errorCode; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.005f) { //qDebug() << "DataBase::updateTo005 - Already in 005" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo005 - 005 update false" << QT_ENDL; IAmIn005 = false; } while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 005" << QT_ENDL; while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 004" << QT_ENDL; IAmIn004 = updateTo004(); } //qDebug() << "DataBase::updateTo005 - I am in 004" << QT_ENDL; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - 005 update false2" << QT_ENDL; //// emit debugLog(Q_FUNC_INFO, "1", 7); return false; } sqlOk = updateDBVersion(softVersion, "0.005"); if (sqlOk) { // Version updated if (recreateContestData()) { //qDebug() << "DataBase::updateTo005 - recreateContestData OK" << QT_ENDL; sqlOk = execQuery(Q_FUNC_INFO, "DROP table logs"); sqlOk = createTableLogs(true); if (!sqlOk) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTo005 - logs table do not created" << QT_ENDL; } if (howManyQSOsInLog(0)>0) { // If the user has QSOs that were added with previous versions... // We need to create a new log and rename all QSOs to that QSO. //stringQuery = QString("UPDATE log SET lognumber='1' WHERE lognumber='0'"); msgBox.setText(QObject::tr("KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you.")); msgBox.exec(); if (!execQuery(Q_FUNC_INFO, "UPDATE log SET lognumber='1' WHERE lognumber='0'")) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //showError(QObject::tr("QSOs not updated to main log")); //qDebug() << "DataBase::updateTo005 - QSOs not updated to main log" << QT_ENDL; } QString dateString = (QDate::currentDate()).toString("yyyy-MM-dd"); QString callToUse = QString(); bool ok; //QString text; //text = QInputDialog::getText(this, QObject::tr("Station Callsign"), QObject::tr("Enter the Station Callsign you want to use in the imported log:"), QLineEdit::Normal, QObject::tr("N0CALL"), &ok); QString text = (QInputDialog::getText(nullptr, QObject::tr("KLog: Enter Station callsign"), QObject::tr("Enter the station callsign used in this log"), QLineEdit::Normal, QObject::tr("Station Callsign"), &ok)).toUpper(); text = text.toUpper(); if (ok && !text.isEmpty()) { callToUse = text; } else { callToUse = "N0CALL"; } stringQuery = QString("INSERT INTO logs (logdate, stationcall, logtype, logtypen) values('%1','%2','DX', '1')").arg(dateString).arg(callToUse); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOk) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //showError(QObject::tr("New Log not created")); //qDebug() << "DataBase::updateTo005 - New Log not created" << QT_ENDL; //qDebug() << "DataBase::clearLog: Log deleted FAILED" << QT_ENDL; } } IAmIn005 = true; } else { //qDebug() << "DataBase::updateTo005 - recreateContestData FAILED" << QT_ENDL; ErrorUpdating = true; } } else { // Version not updated //qDebug() << "DataBase::updateTo005 - 005 update false6" << QT_ENDL; ErrorUpdating = true; } } //qDebug() << "DataBase::updateTo005 - 005 updated 3" << QT_ENDL; //TODO: Delete the table and recreate it if (IAmIn005) { msgBox.setText(QObject::tr("All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay.")); msgBox.exec(); } else { //// emit debugLog(Q_FUNC_INFO, "2", 7); } //qDebug() << "DataBase::updateTo005 - I am in 005 already!! " << QT_ENDL; //qDebug() << "DataBase::updateTo005: UPDATED OK!" << QT_ENDL; return IAmIn005; } bool DataBase::recreateSatelliteData() { //qDebug() << "DataBase::recreateSatelliteData" << QT_ENDL; QSqlQuery query; if (isTheTableExisting("satellites")) { if (execQuery(Q_FUNC_INFO, "DROP TABLE satellites")) { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" << QT_ENDL; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" << QT_ENDL; } } else { //qDebug() << "DataBase::recreateSatelliteData execQuery FAILED" << QT_ENDL; } } else { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" << QT_ENDL; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" << QT_ENDL; } } //qDebug() << "DataBase::recreateSatelliteData END FALSE" << QT_ENDL; return false; } bool DataBase::recreateContestData() { //qDebug() << "DataBase::recreateContestData" << QT_ENDL; if (isTheTableExisting("contest")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE contest"); if (sqlOk) { if (createTableContest()) { return populateContestData(); } } } else { if (createTableContest()) { return populateContestData(); } } return false; } bool DataBase::recreateSupportedContest() { //qDebug() << "DataBase::recreateSupportedContest" << QT_ENDL; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); if (isTheTableExisting("supportedcontests")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontests"); if (sqlOk) { //qDebug() << "DataBase::recreateSupportedContest SQLOK" << QT_ENDL; if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" << QT_ENDL; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" << QT_ENDL; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } } else { if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" << QT_ENDL; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" << QT_ENDL; return false; } } //qDebug() << "DataBase::recreateSupportedContest - FALSE end" << QT_ENDL; return false; } bool DataBase::recreatePropModes() { //qDebug() << "DataBase::recreatePropModes" << QT_ENDL; if (isTheTableExisting("prop_mode_enumeration")) { //qDebug() << "DataBase::recreatePropModes: Table Exist" << QT_ENDL; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE prop_mode_enumeration"); if (sqlOk) { //qDebug() << "DataBase::recreatePropModes SQLOK" << QT_ENDL; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" << QT_ENDL; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" << QT_ENDL; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" << QT_ENDL; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-1" << QT_ENDL; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::recreatePropModes - prop_mode_enumeration table has not been dropped" << QT_ENDL; //qDebug() << "DataBase::recreatePropModes : Table creation FAILED" << QT_ENDL; } } else { //qDebug() << "DataBase::recreatePropModes: Table does NOT Exist" << QT_ENDL; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" << QT_ENDL; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" << QT_ENDL; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" << QT_ENDL; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-2" << QT_ENDL; } } //qDebug() << "DataBase::recreatePropModes - FALSE end" << QT_ENDL; return false; } bool DataBase::createTableLogs(const bool real) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableLogs" << QT_ENDL; QString stringQuery = QString(); //QSqlQuery query; if (real) { //qDebug() << "DataBase::createTableLogs - logs" << QT_ENDL; stringQuery = "CREATE TABLE logs" ; } else { //qDebug() << "DataBase::createTableLogs - logstemp" << QT_ENDL; stringQuery = "CREATE TABLE logstemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "logdate VARCHAR(10), " "stationcall VARCHAR(15) NOT NULL, " "operators VARCHAR, " "comment VARCHAR, " "logtype VARCHAR, " "logtypen INTEGER, " "FOREIGN KEY (logtypen) REFERENCES supportedcontests(id)," "FOREIGN KEY (logtype) REFERENCES supportedcontests(name))"); //qDebug() << "DataBase::createTableLogs - END" << QT_ENDL; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::createTablePropModes() { //qDebug() << "DataBase::createTablePropModes" << QT_ENDL; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists prop_mode_enumeration"); return execQuery(Q_FUNC_INFO, "CREATE TABLE prop_mode_enumeration (id INTEGER PRIMARY KEY AUTOINCREMENT, shortname VARCHAR(8), name VARCHAR(55) )"); } bool DataBase::createTableSupportedContest() { //qDebug() << "DataBase::createTableSupportedContest" << QT_ENDL; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); QString st = QString("CREATE TABLE supportedcontests (" "id INTEGER PRIMARY KEY, " "longname VARCHAR," "name VARCHAR)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::createTableContest() { //qDebug() << "DataBase::createTableContest" << QT_ENDL; //QSqlQuery query; createTableSupportedContest(); execQuery(Q_FUNC_INFO, "DROP TABLE IF exists contest"); execQuery(Q_FUNC_INFO, "CREATE TABLE contest (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "contest INTEGER NOT NULL," "catoperator INTEGER NOT NULL," "catassisted INTEGER NOT NULL," "catpower INTEGER NOT NULL," "catband INTEGER NOT NULL," "catoverlay INTEGER NOT NULL," "catmode INTEGER NOT NULL," "FOREIGN KEY (contest) REFERENCES supportedcontests(id), " "FOREIGN KEY (catoperator) REFERENCES contestcatoperator(id), " "FOREIGN KEY (catassisted) REFERENCES contestcatassisted(id), " "FOREIGN KEY (catpower) REFERENCES contestcatpower(id), " "FOREIGN KEY (catband) REFERENCES contestcatband(id), " "FOREIGN KEY (catoverlay) REFERENCES contestcatoverlay(id), " "FOREIGN KEY (catmode) REFERENCES contestcatmode(id))"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoperator (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatassisted (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatpower (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatband (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoverlay (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatmode (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); populateTableSupportedContest(); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('1', 'Single-Operator')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('2', 'Multi-One')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('3', 'Multi-Two')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('4', 'Multi-Unlimited')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('5', 'CheckLog')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('1', 'Non-Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('2', 'Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('1', 'High-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('2', 'Low-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('3', 'QRP')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('1', 'All-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('2', 'Single-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('1', 'Classic')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('2', 'Rookie')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('1', 'SSB')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('2', 'CW')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('3', 'MIXED')"); //qDebug() << "DataBase::createTableContest END" << QT_ENDL; return true; } bool DataBase::populateTableSupportedContest() { //qDebug() << "DataBase::populateTableSupportedContest" << QT_ENDL; // ADDING ALL THE CATEGORIES OPTIONS return execQuery(Q_FUNC_INFO, "INSERT INTO supportedcontests (id, longname, name) VALUES ('0', 'Normal log', 'DX')"); } bool DataBase::createTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via_enumeration"); QString st = QString("CREATE TABLE qsl_via_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::populateTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('B', 'Bureau')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('D', 'Direct')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('E', 'Electronic')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('M', 'Manager')"); return true; } bool DataBase::createTableMode(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableMode" << QT_ENDL; QString stringQuery = QString(); QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE mode" ; } else { stringQuery = "CREATE TABLE modetemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "cabrillo VARCHAR(2) NOT NULL, " "name VARCHAR(40) NOT NULL, " "submode VARCHAR(40) NOT NULL, " "deprecated VARCHAR(1) NOT NULL)"); //qDebug() << "DataBase::createTableMode END" << QT_ENDL; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableMode(const bool NoTmp) { //qDebug() << "DataBase::populateTableMode" << QT_ENDL; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "mode"; } else { tableName = "modetemp"; } bool sqlOK = execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AM', 'AM', 'PH', '0')").arg(tableName)); //int errorCode = -1; if (!sqlOK) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::populateTableMode: Mode table population FAILED" << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); } else { //qDebug() << "DataBase::populateTableMode: Mode table population OK" << QT_ENDL; } execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ARDOP', 'ARDOP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AMTORFEC', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ASCI', 'RTTY', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ATV', 'ATV', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('C4FM', 'C4FM', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP', 'CHIP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP64', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP128', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CLO', 'CLO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CONTESTI', 'CONTESTI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CW', 'CW', 'CW', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DIGITALVOICE', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DSTAR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINO', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOEX', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOF', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FAX', 'FAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FM', 'FM', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FMHELL', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4W', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK441', 'FSK441', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSQCALL', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('GTOR', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL80', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HFSK', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-A', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-B', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JS8', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4', 'JT4', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4A', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4B', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4C', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4D', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4E', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4F', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4G', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT6M', 'JT6M', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-1', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-2', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-5', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-10', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-30', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9A', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9B', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9C', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9D', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT44', 'JT44', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65A', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B2', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C2', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK8', 'MFSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK11', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK16', 'MFSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK22', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK31', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK32', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK64', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK128', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MT63', 'MT63', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/125', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/250', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/250', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/500', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/500', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/1000', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 32/1000', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-BEACON', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-QSO', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC2', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC3', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC4', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX', 'PAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX2', 'PAX', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PCW', 'CW', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PKT', 'PKT', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK10', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63F', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK125', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK250', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK500', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK1000', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM10', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM50', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKFEC31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK2K', 'PSK2K', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q15', 'Q15', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q65', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK63', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK125', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK250', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK500', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64A', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64B', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64C', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64D', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64E', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-EME', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-HF', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-MF', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTY', 'RTTY', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTYM', 'RTTYM', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('LSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('USB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SIM31', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSTV', 'SSTV', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('T10', 'T10', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRB', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX', 'THRB', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('TOR', 'TOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('V4', 'V4', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VOI', 'VOI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WINMOR', 'WINMOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WSPR', 'WSPR', 'NO', '0')").arg(tableName)); createTheModeQuickReference(); //qDebug() << "DataBase::populateTableMode END" << QT_ENDL; return true; } bool DataBase::createTableSatellites(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableSatellites" << QT_ENDL; // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes QString stringQuery = QString(); QString table = QString(); if (NoTmp) { table = "satellites" ; } else { table = "satellitestemp" ; } stringQuery = "CREATE TABLE "+ table; stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "satarrlid VARCHAR, " "satname VARCHAR, " "uplink VARCHAR," "downlink VARCHAR," "satmode VARCHAR, " "UNIQUE (satarrlid) )"); /* * * uplink/downlink format is the following: * Single frecuency: 145.950 * Segment: 145.950-145.975 * Several freqs: 145.950,435.950 * Several segments: 145.950-145.975,435.950-435.975 * * satmode format: * Single mode: FM * Modes complex Up/Downlink: USB/LSB * Several modes (one per uplink/downlink pair): FM,SSB * Several complex modes (one per uplink/downlink pair): USB/LSB,LSB/USB,FM * */ QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableSatellites(const bool NoTmp) { // Data must come from: // https://lotw.arrl.org/lotw-help/frequently-asked-questions/#sats //qDebug() << "DataBase::populateTableSatellites" << QT_ENDL; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "satellites"; } else { tableName = "satellitestemp"; } // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-10', 'AMSAT-OSCAR 10', '435.030,146.180', '145.81', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-13', 'AMSAT-OSCAR 13', '435.423-435.573', '145.975-145.825', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-16', 'AMSAT-OSCAR 16', '145.92', '437.026', 'FM/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-21', 'OSCAR 21/RS-14', '', '145.8', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-24', 'Arsene-OSCAR 24', '', '145.975', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-27', 'AMRAD-OSCAR 27', '145.85', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-3', 'AMSAT-OSCAR 3', '145.975-146.025', '144.325-144.375', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-4', 'AMSAT-OSCAR 4', '432.145-432.155', '144.300-144.310', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-40', 'AMSAT-OSCAR 40','145.840-145.990,435.790-435.520', '2401.2225-2401.475', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-51', 'AMSAT-OSCAR 51', '145.92', '435.3', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-6', 'AMSAT-OSCAR 6', '145.900-146.000', '29.450-29.550', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-7', 'AMSAT-OSCAR 7', '145.850-145.950,432.180-432.120', '29.400-29.500,145.920-145.980', 'USB,LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-73', 'AMSAT-OSCAR 73', '435.150-435.130', '145.950-145.970', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-8', 'AMSAT-OSCAR 8', '145.850-145.900,145.900-146.000', '29.400-29.500,435.200-435.100', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-85', 'AMSAT-OSCAR 85 (Fox-1A)', '435.170', '145.980', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('ARISS', 'ARISS', '145.200,144.490', '145.800,145.800', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-BT', 'BHUTAN-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-MY', 'UiTMSat-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-PH', 'MAYA-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BY70-1', 'Bayi Kepu Weixing 1', '145.92', '436.2', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-3H', 'LilacSat 2', '144.350,144.390', '437.225,144.390', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4A', 'CAMSAT 4A', '435.210-435.230', '145.880-145.860', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4B', 'CAMSAT 4B', '435.270-435.290', '145.935-145.915', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('DO-64', 'Delfi OSCAR-64', '', '145.870', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-79', 'FUNcube-3', '435.047-435.077', '145.935-145.965', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-88', 'Emirates OSCAR 88 (Nayif-1)', '435.045-435.015', '145.960-145.990', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-12', 'Fuji-OSCAR 12', '145.900-146.000,145.85', '435.900-435.800,435.91', 'SSB,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-20', 'Fuji-OSCAR 20', '145.900-146.000', '435.900-435.800', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-29', 'Fuji-OSCAR 29', '145.900-145.999', '435.900-435.800', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('HO-68', 'Hope OSCAR 68', '145.925-145.975,145.825', '435.765-435.715,435.675', 'LSB/USB,FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('IO-86', 'Indonesia OSCAR 86 (LAPAN-ORARI)', '435.880', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-19', 'Lusat-OSCAR 19', '145.840-145.900', '437.125-437.150', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-78', 'LituanicaSAT-1', '145.95,145.85', '435.1755,437.543', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-87', 'LUSEX-OSCAR 87', '435.935-435.965', '145.935-145.965', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('MIREX', 'Mir packet digipeater', '145.985', '145.985', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-44', 'Navy-OSCAR 44', '145.827', '145.827', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-83', 'BRICsat','145.825,28.120', '145.825,435.975','PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-84', 'PSAT', '145.825,28.120', '435.350', 'PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-1', 'Radio Sputnik 1', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-10', 'Radio Sputnik 10', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-11', 'Radio Sputnik 11', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-12', 'Radio Sputnik 12', '21.210-21.250', '29.410-29.450', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-13', 'Radio Sputnik 13', '21.260-21.300', '145.860-145.900', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-15', 'Radio Sputnik 15', '', '29.3525-29.3987', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-2', 'Radio Sputnik 2', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-44', 'DOSAAF-85', '145.935-145.995', '435.610-435.670', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-5', 'Radio Sputnik 5', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-6', 'Radio Sputnik 6', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-7', 'Radio Sputnik 7', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-8', 'Radio Sputnik 8', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SAREX', 'Shuttle Amateur Radio Experiment packet digipeater', '144.80,144.49', '144.55', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-35', 'Sunsat-OSCAR 35', '436.291', '145.825', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-41', 'Saudi-OSCAR 41', '145.850', '436.775', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-50', 'Saudi-OSCAR 50', '145.850', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-67', 'Sumbandila OSCAR 67', '145.875', '435.345', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UKUBE1', 'UKube-1 (FUNcube-2)', '435.080-435.060', '145.930-145.950,2401.0', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UO-14', 'UOSAT-OSCAR 14', '145.975', '435.07', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('VO-52', 'VUsat-OSCAR 52', '435.220-435.280,435.225-435.275', '145.930-145.870,145.925-145.875', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2A', 'Hope 2A (CAS-3A)', '435.030-435.050', '145.665-145.685', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2B', 'Hope 2B (CAS-3B)', '435.090-435.110', '145.730-145.750', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2C', 'Hope 2C (CAS-3C)', '435.150-435.170', '145.795-145.815', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2D', 'Hope 2D (CAS-3D)', '435.210-435.230', '145.860-145.880', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2E', 'Hope 2E (CAS-3E)', '435.270-435.290', '145.915-145.935', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2F', 'Hope 2F (CAS-3F)', '435.330-435.350', '145.980-145.999', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-90', 'LilacSat-OSCAR 90 (LilacSat-1)', '145.985', '436.510', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-91', 'RadFxSat (Fox-1B)', '435.250', '145.960', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-92', 'Fox-1D', '435.350,1267.35', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FS-3', 'FalconSat-3', '435.103', '145.840', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('QO-100', 'Es''hail-2', '2400.050-2409.500', '10489.550-10499.000', 'SSB,CW')").arg(tableName)); //qDebug() << "DataBase::populateTableSatellites - END" << QT_ENDL; return true; } bool DataBase::createTableEntity(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableEntity" << QT_ENDL; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE entity" ; } else { stringQuery = "CREATE TABLE entitytemp" ; } stringQuery = stringQuery + QString( " (id INTEGER PRIMARY KEY AUTOINCREMENT, " "name VARCHAR(40) NOT NULL," "cqz INTEGER NOT NULL, " "ituz INTEGER NOT NULL, " "continent INTEGER NOT NULL, " "latitude REAL NOT NULL, " "longitude REAL NOT NULL, " "utc INTEGER NOT NULL, " "dxcc INTEGER NOT NULL, " "mainprefix VARCHAR(15) NOT NULL, " "deleted INTEGER, " "sincedate VARCHAR(10), " "todate VARCHAR(10), " "isoname VARCHAR(10), " "UNIQUE (dxcc, mainprefix), " "FOREIGN KEY (continent) REFERENCES continent(shortname) )"); //qDebug() << "DataBase::createTableEntity END" << QT_ENDL; return execQuery(Q_FUNC_INFO, stringQuery); //TODO: To add some columns in this the table to mark if worked/confirmed/band/Mode } bool DataBase::createTableBand(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableBand" << QT_ENDL; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE band" ; } else { stringQuery = "CREATE TABLE bandtemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "lower REAL NOT NULL, " "upper REAL NOT NULL, " "cabrillo VARCHAR(6) NOT NULL, " "name VARCHAR(40) NOT NULL, " "UNIQUE (lower, upper, cabrillo, name) )"); //qDebug() << "DataBase::createTableBand END" << QT_ENDL; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::syncLogQSOsOnBandTableChange() { //qDebug() << Q_FUNC_INFO << QT_ENDL; QString stringQuery; QSqlQuery query; stringQuery = "SELECT DISTINCT log.bandid FROM log ORDER BY bandid DESC"; if (!query.exec(stringQuery)) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } QList bandIDs; bandIDs.clear(); int bandid = -1; while(query.next()) { if (!query.isValid()) { query.finish(); return false; } bandid = (query.value(0)).toInt(); if (bandid>0) { bandIDs.append (bandid); bandid = -1; } } if (bandIDs.length ()>0) { foreach(int i, bandIDs) { stringQuery = QString("UPDATE log SET bandid = (SELECT DISTINCT bandtemp.id FROM bandtemp INNER JOIN band ON band.name = bandtemp.name WHERE band.id='%1') WHERE log.bandid='%1'").arg(i); //qDebug() << Q_FUNC_INFO << ": " << stringQuery << QT_ENDL; if (!query.exec(stringQuery)) { query.finish(); return false; } } } query.finish (); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; return true; } bool DataBase::populateTableBand(const bool NoTmp) { // Cabrillo definition: http://wwrof.org/cabrillo/cabrillo-specification-v3/ //qDebug() << "DataBase::populateTableBand" << QT_ENDL; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "band"; } else { tableName = "bandtemp"; } //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('0', '0', '0', 'Light')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1mm', '241000', '250000', '241G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2mm', '142000', '149000', '142G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2.5mm', '119980', '120020', '119G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4mm', '75500', '81000', '75G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6mm', '47000', '47200', '47G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25CM', '24000', '24250', '24G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('3CM', '10000', '10500', '10G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6CM', '5650', '5925', '5.7G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('9CM', '3300', '3500', '3.4G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('13CM', '2340', '2450', '2.3G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('23CM', '1240', '1300', '1.2G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('33CM', '902', '928', '902')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('70CM', '420', '450', '432')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25M', '222', '225', '222')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2M', '144', '148', '144')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4M', '70', '71', '70')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('5M', '54.000001', '69.9', '5M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6M', '50', '54', '50')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('8M', '40', '45', '40')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('10M', '28.0', '29.7', '28000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('12M', '24.89', '24.99', '24900')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('15M', '21.0', '21.45', '21000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('17M', '18.068', '18.168', '18100')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('20M', '14.0', '14.35', '14000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('30M', '10.0', '10.15', '10000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('40M', '7.0', '7.3', '7000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('60M', '5.102', '5.404', '60M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('80M', '3.5', '4.0', '3500')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('160M', '1.8', '2.0', '1800')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('560M', '0.501', '0.504', '560M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('630M', '0.472', '0.479', '630M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2190M', '0.1357', '0.1378', '2190M')").arg(tableName)); createTheBandQuickReference(); //qDebug() << "DataBase::populateTableBand END" << QT_ENDL; return true; } bool DataBase::populatePropagationModes() { //qDebug() << "DataBase::populatePropagationModes" << QT_ENDL; //QSqlQuery query; execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUR', 'Aurora')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUE', 'Aurora-E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('BS', 'Back scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ECH', 'EchoLink')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('EME', 'Earth-Moon-Earth')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ES', 'Sporadic E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('FAI', 'Field Aligned Irregularities')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('F2', 'F2 Reflection')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('INTERNET', 'Internet-assisted')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ION', 'Ionoscatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('IRL', 'IRLP')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('MS', 'Meteor scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RPT', 'Terrestrial or atmospheric repeater or transponder')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RS', 'Rain scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('SAT', 'Satellite')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TEP', 'Trans-equatorial')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TR', 'Tropospheric ducting')")); //qDebug() << "DataBase::populatePropagationModes END" << QT_ENDL; return true; } bool DataBase::populateContestData() { //qDebug() << "DataBase::populateContestData" << QT_ENDL; // CONTEST DEFINITIONS START HERE // DX execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (0, 0, 0, 0, 0, 0, 0)"); // DX START /* // CQ WW DX SSB START execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 4, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 5, 0, 0, 0, 0, 1)"); // CQ WW DX SSB END */ //qDebug() << "DataBase::populateContestData END" << QT_ENDL; return true; } bool DataBase::howManyQSOsInLog(const int i) { //qDebug() << "DataBase::howManyQSOsInLog" << QT_ENDL; QSqlQuery query; QString sqlQueryString = QString("SELECT COUNT(id) from log WHERE lognumber='%1'").arg(i); bool sqlOK = query.exec(sqlQueryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::howManyQSOsInLog OK END" << QT_ENDL; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::howManyQSOsInLog END-1" << QT_ENDL; query.finish(); return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::howManyQSOsInLog END-2" << QT_ENDL; return false; } //query.finish(); //return -2; } bool DataBase::updateTo006() {// Updates the DB to 0.0.6 //qDebug() << "DataBase::updateTo006: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn006 = false; bool IAmIn005 = false; bool ErrorUpdating = false; QString stringQuery = QString(); bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.006f) { return true; } else { IAmIn006 = false; } while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - Still not in 006" << QT_ENDL; while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - And still not in 005" << QT_ENDL; IAmIn005 = updateTo005(); } //qDebug() << "DataBase::updateTo006: - Already in 005" << QT_ENDL; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(0)" << QT_ENDL; return false; } sqlOk = updateDBVersion(softVersion, "0.006"); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - DB Updated" << QT_ENDL; sqlOk = recreatePropModes(); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - recreatePropModes OK" << QT_ENDL; sqlOk = updateTableLog(6); // We copy the log into logtemp } else { //qDebug() << "DataBase::updateTo006: - recreatePropModes NOK" << QT_ENDL; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(1)" << QT_ENDL; return false; } sqlOk = createTableBand(false); // We create the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableBand OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(2)" << QT_ENDL; ErrorUpdating = true; //return false; } sqlOk = populateTableBand(false); // Populate the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableBand OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(3)" << QT_ENDL; ErrorUpdating = true; } sqlOk = updateBandIdTableLogToNewOnes(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableLogToNewOnes OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(4)" << QT_ENDL; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(1); // DXCC if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 1 OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(5)" << QT_ENDL; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(2); // WAZ if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 2 OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(6)" << QT_ENDL; ErrorUpdating = true; } if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { if (execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band")) { //qDebug() << "DataBase::updateTo006 - bandtemp renamed" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not renamed" << QT_ENDL; ErrorUpdating = true; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(7)" << QT_ENDL; } } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not dropped" << QT_ENDL; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(8)" << QT_ENDL; ErrorUpdating = true; } sqlOk = updateTheModeTableAndSyncLog(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateTheModeTableAndSyncLog OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(9)" << QT_ENDL; ErrorUpdating = true; } sqlOk = createTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableClubLogStatus OK" << QT_ENDL; sqlOk = populateTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableClubLogStatus OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(10)" << QT_ENDL; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(11)" << QT_ENDL; ErrorUpdating = true; } } else {// Version not updated //qDebug() << "DataBase::updateTo006: - DB NOT Updated" << QT_ENDL; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(12)" << QT_ENDL; ErrorUpdating = true; } //qDebug() << "DataBase::updateTo006: - IAmIn006 = TRUE" << QT_ENDL; IAmIn006 = true; } //DO ALL THE TASKS TO BE IN 0.006 from 0.005 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo006 - I am in 006 " << QT_ENDL; //qDebug() << "DataBase::updateTo006 - END " << QT_ENDL; //qDebug() << "DataBase::updateTo006: UPDATED OK!" << QT_ENDL; if (!IAmIn006) { // emit debugLog(Q_FUNC_INFO, "2", 7); } return IAmIn006; } bool DataBase::updateTableLog(const int _v) { //qDebug() << "DataBase::updateTableLog " << QT_ENDL; createTableLog(false); QString queryString; switch (_v) { case 6: // If 6, we copy in logtemp the full data coming from the old log. This way, the structure of // the log table is updated without any data loss. queryString = QString ("INSERT INTO logtemp (qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, transmiterid, marked, lognumber) SELECT qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, transmiterid, marked, lognumber FROM log"); break; default: //qDebug() << "DataBase::updateTableLog FALSE END" << QT_ENDL; return false; //break; } if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Query executed" << QT_ENDL; queryString = "DROP TABLE log"; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log dropped" << QT_ENDL; queryString = "ALTER TABLE logtemp RENAME TO log" ; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - tmp renamed - END" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Renaming failed" << QT_ENDL; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log Not dropped" << QT_ENDL; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - query failed" << QT_ENDL; } //qDebug() << "DataBase::updateTableLog END" << QT_ENDL; return false; } bool DataBase::createTableClubLogStatus() { //qDebug() << "createTableClubLogStatus" << QT_ENDL; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists clublog_status"); QString queryString = QString("CREATE TABLE clublog_status (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, queryString); } bool DataBase::populateTableClubLogStatus() { //qDebug() << "populateTableClubLogStatus" << QT_ENDL; QString queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('Y', 'Uploaded')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('N', 'Do not upload')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('M', 'Modified')"; //qDebug() << "populateTableClubLogStatus END" << QT_ENDL; return execQuery(Q_FUNC_INFO, queryString); } } //qDebug() << "populateTableClubLogStatus FALSE END" << QT_ENDL; return false; } bool DataBase::updateTableEntity() { //qDebug() << "DataBase::updateTableEntity" << QT_ENDL; bool result = false; QString stringQuery; bool sqlOk; result = createTableEntity(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableEntity: Table entitytemp created!" << QT_ENDL; // Now we need to move all the data from the old to the temp entity table. stringQuery = QString("INSERT INTO entitytemp (name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate) SELECT name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate FROM entity"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableEntity: Data copied from entity to entitytemp!" << QT_ENDL; stringQuery = "DROP TABLE entity"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableEntity: Table entity DELETED" << QT_ENDL; stringQuery = "ALTER TABLE entitytemp RENAME TO entity"; return execQuery(Q_FUNC_INFO, stringQuery); } else { return false; } } else { //qDebug() << "DataBase::updateTableEntity: Data NOT copied from entity to entitytemp!" << QT_ENDL; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableEntity: Table entitytemp NOT created!" << QT_ENDL; return false; } //return false; } bool DataBase::updateTableLogs() { //qDebug() << "DataBase::updateTableLogs" << QT_ENDL; bool result = false; QString stringQuery; bool sqlOk; result = createTableLogs(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableLogs: Table logstemp created!" << QT_ENDL; // Now we need to move all the data from the old to the temp logs table. stringQuery = QString("INSERT INTO logstemp (logdate, stationcall, comment, logtype, logtypen) SELECT logdate, stationcall, comment, logtype, logtypen FROM logs"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableLogs: data copied" << QT_ENDL; stringQuery = "DROP TABLE logs"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableLogs: Table logs DELETED" << QT_ENDL; stringQuery = "ALTER TABLE logstemp RENAME TO logs"; return execQuery(Q_FUNC_INFO, stringQuery); } else { //qDebug() << "DataBase::updateTableLogs: Table logs NOT DELETED" << QT_ENDL; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTableLogs: data NOT copied" << QT_ENDL; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableLogs: Table logstemp NOT created!" << QT_ENDL; return false; } //qDebug() << "DataBase::updateTableLogs: END" << QT_ENDL; //return false; } bool DataBase::updateModeIdFromSubModeId() {// Updates the log with the new mode IDs in each QSO: // STEP-1: Get the modeid and QSOid from the log // STEP-2: uses the modeid to get the name of the mode in the mode table (the old one) // STEP-3: uses the name of the mode in the modetemp table (the new one) to get the new ID // STEP-4: Updates the new ID in the QSO in the log //TODO: Optimize this function //qDebug() << "DataBase::updateModeIdFromSubModeId: " << QT_ENDL; bool cancel = false; bool alreadyCancelled = false; QString modetxt = QString(); QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int modeFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END" << QT_ENDL; return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY modeid"); // STEP-1 if (sqlOk) { while (query.next()) { modetxt = QString(); modeFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } modeFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-1) modeFound (numb): " << QString::number(modeFound) << QT_ENDL; modetxt = getModeNameFromNumber(modeFound, false); //STEP-2 //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-2) mode found (txt): " << modetxt << QT_ENDL; //TODO The following query can be executed in: getModeIdFromSubMode() sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(modetxt); // STEP-3 sqlOk2 = query2.exec(sq); if (sqlOk2) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) sqlOK2 TRUE" << QT_ENDL; if (query2.next()) { if (query2.isValid()) { modeFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(modeFound).arg(id); // STEP-4 sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " updated to: " << QString::number(modeFound) <<"/"<< modetxt << QT_ENDL; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " NOT updated-2" << QT_ENDL; } } else { query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) query2 not valid " << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdFromSubModeId: query2 not next " << QT_ENDL; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: ID: " << QString::number(id) << " NOT updated-1" << QT_ENDL; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 2" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: END" << QT_ENDL; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 3" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: CHECK IF this is seen - END" << QT_ENDL; //query.finish(); //return false; } bool DataBase::updateBandIdTableLogToNewOnes() { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: " << QT_ENDL; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END" << QT_ENDL; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating bands information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT bandid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: band found: " << bandtxt << QT_ENDL; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET bandid='%1' WHERE id='%2'").arg(bandFound).arg(id); query.finish(); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" << QT_ENDL; //qDebug() << "DataBase::updateBandIdTableLogToNewOnes - QSOs not updated to main log" << QT_ENDL; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not valid " << QT_ENDL; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not next " << QT_ENDL; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" << QT_ENDL; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 2" << QT_ENDL; return false; } //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: END OK" << QT_ENDL; return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 3" << QT_ENDL; return false; } } bool DataBase::updateBandIdTableAward(const int _db) { //qDebug() << "DataBase::updateBandIdTableAward: " << QT_ENDL; QString table = QString(); QString field = QString(); QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; field = "band"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; field = "band"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateBandIdTableAward: FALSE END" << QT_ENDL; return false; //break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-2" << QT_ENDL; return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating bands information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableAward: band found: " << bandtxt << QT_ENDL; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-2" << QT_ENDL; //qDebug() << "DataBase::updateBandIdTableAward - QSOs not updated to main log" << QT_ENDL; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not valid " << QT_ENDL; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not next " << QT_ENDL; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-1" << QT_ENDL; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-3" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: END OK" << QT_ENDL; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-4" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: CHECK IF SEEN END" << QT_ENDL; //query.finish(); //return false; } bool DataBase::updateModeIdTableAward(const int _db) { //qDebug() << "DataBase::updateModeIdTableAward: " << QString::number(_db) << QT_ENDL; QString table = QString(); QString field = "mode"; QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateModeIdTableAward: FALSE END" << QT_ENDL; return false; //break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-2" << QT_ENDL; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating mode information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query): " << query.lastQuery() << QT_ENDL; if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdTableAward: bandfound: " << QString::number(bandFound) << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableAward: id: " << QString::number(id) << QT_ENDL; bandtxt = getSubModeNameFromNumber(bandFound, true); //qDebug() << "DataBase::updateModeIdTableAward: mode found: " << bandtxt << "/" << QString::number(bandFound) << QT_ENDL; sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query2): " << query2.lastQuery() << QT_ENDL; if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-2" << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableAward - QSOs not updated to main log" << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not valid " << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not next " << QT_ENDL; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-1" << QT_ENDL; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-3" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: END OK" << QT_ENDL; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-4" << QT_ENDL; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: Checkif seen END" << QT_ENDL; //query.finish(); //return false; } /* bool DataBase::updateModeIdTableLogToNewOnes() { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: " << QT_ENDL; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2, query3; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); } else { return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...\n QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getModeNameFromNumber(bandFound, false); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: mode found: " << bandtxt << QT_ENDL; sq = QString("SELECT id FROM modetemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(bandFound).arg(id); sqlOk3 = query3.exec(sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL; } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - QSOs not updated to main log" << QT_ENDL; errorCode = query3.lastError().nativeErrorCode(); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - query error: " << QString::number(errorCode) << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastQuery: " << query3.lastQuery() << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-data: " << query3.lastError().databaseText() << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-driver: " << query3.lastError().driverText() << QT_ENDL; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-n: " << QString::number(query3.lastError().nativeErrorCode() ) << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not valid " << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not next " << QT_ENDL; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" << QT_ENDL; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { return false; } //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: FINISHED OK" << QT_ENDL; return true; } else { return false; } } */ bool DataBase::updateTo007() {// Updates the DB to 0.0.7 //qDebug() << "DataBase::updateTo007: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn007 = false; bool IAmIn006 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion().toFloat(); bool sqlOk = false; if (latestReaded >= 0.007f) { //qDebug() << "DataBase::updateTo007: - I am in 007" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo007: - I am not in 007" << QT_ENDL; IAmIn007 = false; } while (!IAmIn007 && !ErrorUpdating) { while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo007: - And I am not in 006" << QT_ENDL; IAmIn006 = updateTo006(); } //qDebug() << "DataBase::updateTo007: - And I am in 006!!!!" << QT_ENDL; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo007: NOK-1" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } sqlOk = updateDBVersion(softVersion, "0.007"); if (sqlOk) { // Version updated IAmIn007 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo007: NOK-2" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //DO ALL THE TASKS TO BE IN 0.007 from 0.006 HERE and set ErrorUpdating if it is not possible. IAmIn007 = true; } //qDebug() << "DataBase::updateTo007: END" << QT_ENDL; if (!IAmIn007) { // emit debugLog(Q_FUNC_INFO, "3", 7); } return IAmIn007; } bool DataBase::updateTo008() {// Updates the DB to 0.0.8 //qDebug() << "DataBase::updateTo008: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn008 = false; bool IAmIn007 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.008f) { //qDebug() << "DataBase::updateTo008: - I am in 008" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo008: - I am not in 008" << QT_ENDL; IAmIn008 = false; } while (!IAmIn008 && !ErrorUpdating) { while (!IAmIn007 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo008: - And I am not in 007" << QT_ENDL; IAmIn007 = updateTo007(); } //qDebug() << "DataBase::updateTo008: - I am in 007" << QT_ENDL; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo008: - NOK-1" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //DO ALL THE TASKS TO BE IN 0.008 from 0.007 HERE and set ErrorUpdating if it is not possible. IAmIn008 = updateTheModeTableAndSyncLog(); if (IAmIn008) { bool sqlOk = updateDBVersion(softVersion, "0.008"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo008: - OK" << QT_ENDL; } else { // Version not updated //qDebug() << "DataBase::updateTo008: - NOK-3" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //qDebug() << "DataBase::updateTo008: - NOK-2" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } //qDebug() << "DataBase::updateTo008: - END" << QT_ENDL; if (!IAmIn008) {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/ } return IAmIn008; } bool DataBase::updateTo009() {// Updates the DB to 0.0.9 - We add the Satellite tables //qDebug() << "DataBase::updateTo009: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn009 = false; bool IAmIn008 = false; bool ErrorUpdating = false; //qDebug() << "DataBase::updateTo009: Checking:" << QString::number(latestReaded) << ":" << QString::number(0.009)<< QT_ENDL; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.009f) //if ((latestReaded = 0.009) || (latestReaded > 0.009)) { //qDebug() << "DataBase::updateTo009: - I am in 009" << QT_ENDL; //IAmIn009 = true; return true; } else { //qDebug() << "DataBase::updateTo009: - I am not in 009 I am in: " << QString::number(latestReaded)<< QT_ENDL; IAmIn009 = false; } //qDebug() << "DataBase::updateTo009: compared latestRead: " << QString::number(latestReaded) << QT_ENDL; while (!IAmIn009 && !ErrorUpdating) { while (!IAmIn008 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo009: - And I am not in 008" << QT_ENDL; IAmIn008 = updateTo008(); } //qDebug() << "DataBase::updateTo009: - And I am already at least in 008" << QT_ENDL; if (ErrorUpdating) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } bool sqlOk = updateDBVersion(softVersion, "0.009"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo009: - version updated" << QT_ENDL; //IAmIn009 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo009: - version not updated" << QT_ENDL; } //DO ALL THE TASKS TO BE IN 0.009 from 0.008 HERE and set ErrorUpdating if it is not possible. if (recreateSatelliteData()) //if (createTableSatellites(true)) { //qDebug() << "DataBase::updateTo009: - createTableSatellites OK" << QT_ENDL; //if (populateTableSatellites(true)) if (updateTableEntity()) { //qDebug() << "DataBase::updateTo009: - updateTableEntity OK" << QT_ENDL; if (updateTheEntityTableISONames()) { //qDebug() << "DataBase::updateTo009: - isonames updated" << QT_ENDL; // Now I need to update the logs table if (updateTableLogs()) { //qDebug() << "DataBase::updateTo009: - logs updated and Function finished successfuly!!" << QT_ENDL; IAmIn009 = true; } else { //qDebug() << "DataBase::updateTo009: - logs NOT updated" << QT_ENDL; IAmIn009 = false; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo009: - isonames NOT updated" << QT_ENDL; IAmIn009 = false; ErrorUpdating = true; } } else { ErrorUpdating = true; IAmIn009 = false; } } else { //qDebug() << "DataBase::updateTo009: - createTableSatellites FALSE" << QT_ENDL; ErrorUpdating = true; IAmIn009 = false; } } //qDebug() << "DataBase::updateTo009: - END" << QT_ENDL; if (!IAmIn009) { // emit debugLog(Q_FUNC_INFO, "1", 7); } return IAmIn009; } bool DataBase::updateTo010() {// Updates the DB to 0.010: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo010: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn010 = false; bool IAmIn009 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo010: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.010f) { //qDebug() << "DataBase::updateTo010: - I am in 010" << QT_ENDL; IAmIn010 = true; return true; } else { //qDebug() << "DataBase::updateTo010: - I am not in 010 I am in: " << QString::number(latestReaded)<< QT_ENDL; while (!IAmIn009 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - Check if I am in 009: !" << QT_ENDL; IAmIn009 = updateTo009(); if (IAmIn009) { //qDebug() << "DataBase::updateTo010: - updateTo009 returned TRUE - I am in 0.009: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateTo010: - updateTo009 returned FALSE - I am NOT in 0.009: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } bool sqlOk = execQuery(Q_FUNC_INFO, "UPDATE band SET lower = '0.1357', upper = '0.1378' WHERE name='2190M'"); if (sqlOk) { //qDebug() << "DataBase::updateTo010: - Band update OK" << QT_ENDL; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTo010: - Band update NOK" << QT_ENDL; } execQuery(Q_FUNC_INFO, QString("INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'NO', '0')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); if (updateDBVersion(softVersion, "0.010")) { //qDebug() << "DataBase::updateTo010: - We are in 010! " << QT_ENDL; IAmIn010 = true; } else { //qDebug() << "DataBase::updateTo010: - Failed to go to 010! " << QT_ENDL; IAmIn010 = false; // emit debugLog(Q_FUNC_INFO, "1", 7); } //qDebug() << "DataBase::updateTo010: - END" << QT_ENDL; return IAmIn010; } bool DataBase::updateDBVersion(QString _softV, QString _dbV) { QString dateString = util->getDateSQLiteStringFromDate(QDate::currentDate()); //qDebug() << "DataBase::updateDBVersion: (date/SoftVersion/dbVersion): " << dateString << "/" << _softV << "/" << _dbV << QT_ENDL; QString stringQuery = "INSERT INTO softwarecontrol (dateupgrade, softversion, dbversion) VALUES ('" + dateString + "', '" + _softV + "', '" + _dbV + "')"; bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) { // emit debugLog(Q_FUNC_INFO, "1", 7); } return sqlOK; } bool DataBase::updateTheModeTableAndSyncLog() { //qDebug() << "DataBase::updateTheModeTableAndSyncLog" << QT_ENDL; QSqlQuery query; createTableMode(false); // Create modetemp populateTableMode(false); // Populate modetemp updateModeIdFromSubModeId(); // Updates the log with the new mode IDs in each QSO //updateModeIdTableAward(1); //DXCC //updateModeIdTableAward(2); // WAZ //QSqlDatabase::database().commit(); bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE mode"); if (sqlOK) { //QSqlDatabase::database().commit(); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - OK - mode was dropped" << QT_ENDL; sqlOK = execQuery(Q_FUNC_INFO, "ALTER TABLE modetemp RENAME TO mode"); if (!sqlOK) { // emit debugLog(Q_FUNC_INFO, "1", 7); } return sqlOK; } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - ERROR - modetemp not dropped" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTheModeTableAndSyncLog END" << QT_ENDL; //return true; } bool DataBase::recreateTableBand() { //qDebug() << "DataBase::recreateTableBand" << QT_ENDL; QSqlQuery query; createTableBand(false); // Create modetemp populateTableBand(false); // Populate modetemp syncLogQSOsOnBandTableChange(); if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { // emit debugLog(Q_FUNC_INFO, "1", 7); return execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band"); } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::recreateTableBand - ERROR - bandtemp not dropped" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::recreateTableBand END" << QT_ENDL; } QMultiMap DataBase::fillCountryCodes() { //qDebug() << Q_FUNC_INFO; QMultiMap countryCodes; countryCodes.clear (); countryCodes.insert ("mt", 246); countryCodes.insert ("un", 247); countryCodes.insert ("mc", 260); countryCodes.insert ("mu", 4); countryCodes.insert ("mu", 165); countryCodes.insert ("mu", 207); countryCodes.insert ("gq", 49); countryCodes.insert ("gq", 195); countryCodes.insert ("fj", 176); countryCodes.insert ("fj", 489); countryCodes.insert ("fj", 460); countryCodes.insert ("sz", 468); countryCodes.insert ("tn", 474); countryCodes.insert ("vn", 293); countryCodes.insert ("gn", 107); countryCodes.insert ("bv", 24); countryCodes.insert ("no", 199); countryCodes.insert ("az", 18); countryCodes.insert ("ge", 75); countryCodes.insert ("me", 514); countryCodes.insert ("lk", 315); countryCodes.insert ("ch", 177); // ITU HQ countryCodes.insert ("us", 289); // UN HQ countryCodes.insert ("tl", 511); // Timor Leste countryCodes.insert ("il", 336); // Israel countryCodes.insert ("ly", 436); // Libya countryCodes.insert ("cy", 215); // Cyprus countryCodes.insert ("tz", 470); // Tanzania countryCodes.insert ("ng", 450); // Nigeria countryCodes.insert ("mg", 438); // Madagascar countryCodes.insert ("mr", 444); // Mauritania countryCodes.insert ("ne", 187); // Niger countryCodes.insert ("tg", 484); // Togo countryCodes.insert ("ws", 190); // Samoa countryCodes.insert ("ug", 286); // Uganda countryCodes.insert ("ke", 430); // Kenya countryCodes.insert ("sn", 456); // Senegal countryCodes.insert ("jm", 82); // Jamaica countryCodes.insert ("es", 281); // Spain countryCodes.insert ("ls", 432); // Lesotho countryCodes.insert ("mw", 440); // Malawi countryCodes.insert ("dz", 400); // Algeria countryCodes.insert ("ye", 492); // Yemen countryCodes.insert ("bb", 62); // Barbados countryCodes.insert ("mv", 159); // Maldives countryCodes.insert ("gy", 129); // Guyana countryCodes.insert ("hr", 497); // Croatia countryCodes.insert ("gh", 424); // Ghana countryCodes.insert ("mt", 257); // Malta countryCodes.insert ("zm", 482); // Zambia countryCodes.insert ("kw", 348); // Kuwait countryCodes.insert ("sl", 458); //Sierra Leone countryCodes.insert ("my", 299); // West Malaysia countryCodes.insert ("my", 46); // East Malaysia countryCodes.insert ("np", 369); // Nepal countryCodes.insert ("cd", 414); // Dem Rep Congo countryCodes.insert ("bi", 404); // Burundi countryCodes.insert ("sg", 381); // Singapore countryCodes.insert ("rw", 454); // Rwanda countryCodes.insert ("tt", 90); // Trinidad & Tobago countryCodes.insert ("bw", 402); countryCodes.insert ("to", 160); countryCodes.insert ("om", 370); countryCodes.insert ("bt", 306); // Bhutan countryCodes.insert ("ae", 391); // Un Arab Emirates countryCodes.insert ("qa", 376); // Qatar countryCodes.insert ("bh", 304); // Bahrain countryCodes.insert ("pk", 372); // Pakistan countryCodes.insert ("tw", 386); // Taiwan countryCodes.insert ("tw", 505); // Pratas Is countryCodes.insert ("cn", 318); // China countryCodes.insert ("nr", 157); // Nauru countryCodes.insert ("ad", 203); // Andorra countryCodes.insert ("gm", 422); // Gambia countryCodes.insert ("bs", 60); countryCodes.insert ("mz", 181); // Mozambique countryCodes.insert ("cl", 112); // Chile countryCodes.insert ("cl", 217); // San Felix countryCodes.insert ("cl", 47); // Easter Is countryCodes.insert ("cl", 125); // Juan Fernandez is countryCodes.insert ("cu", 70); // Cuba countryCodes.insert ("ma", 446); // Morocco countryCodes.insert ("bo", 104); // Bolivia countryCodes.insert ("pt", 272); // Portugal countryCodes.insert ("pt", 256); // Madeira countryCodes.insert ("pt", 149); // Azores countryCodes.insert ("uy", 144); // Uruguay countryCodes.insert ("ca", 211); // Sable Is countryCodes.insert ("ca", 252); // St Paul is countryCodes.insert ("ao", 401); // Angola countryCodes.insert ("cv", 409); // Cape Verde countryCodes.insert ("km", 411); // Comoros countryCodes.insert ("de", 203); // Fed Rep Germany countryCodes.insert ("ph", 375); //Philippines countryCodes.insert ("er", 51); // Eritrea countryCodes.insert ("ps", 510); // Palestine countryCodes.insert ("ck", 191); // North Cook countryCodes.insert ("ck", 234); // South Cook countryCodes.insert ("nu", 188); // Niue countryCodes.insert ("ba", 501); // Bosnia countryCodes.insert ("balear", 21); // Balearic is countryCodes.insert ("canary", 29); // Canary Is countryCodes.insert ("ceuta", 32); // Ceuta & Melilla //TODO: Fix the flag countryCodes.insert ("ie", 245); // Ireland countryCodes.insert ("am", 14); countryCodes.insert ("lr", 434); countryCodes.insert ("ir",330); // Iran countryCodes.insert ("mv", 179); // Moldova countryCodes.insert ("ee", 52); // Estonia countryCodes.insert ("et", 53); // Ethiopia countryCodes.insert ("by", 27); // Belarus countryCodes.insert ("kg", 135); // Kyrgyzstan countryCodes.insert ("tm", 280); // Turkmenistan countryCodes.insert ("tj", 262); // Tajikistan countryCodes.insert ("fr", 227); // France countryCodes.insert ("fr", 79); // Guadeloupe countryCodes.insert ("yt", 169); // Mayotte countryCodes.insert ("fr", 516); // St Barthelemy countryCodes.insert ("fr", 36); // Clipperton Is countryCodes.insert ("nc", 162); // New Caledonia countryCodes.insert ("nc", 512); // Chesterfield Is countryCodes.insert ("mq", 84); // Martinique countryCodes.insert ("pf", 175); // French Polynesia countryCodes.insert ("pf", 508); // Austral Is countryCodes.insert ("pm", 277); // St Pierre & Miquelon countryCodes.insert ("re", 453); //Reunion Is countryCodes.insert ("fr", 213); // St Marteen countryCodes.insert ("fr", 99); // Glorioso is countryCodes.insert ("fr", 124); // Juan de nova, Europa countryCodes.insert ("fr", 276); // Tromelin - TODO: Add the wikipedia flag countryCodes.insert ("fr", 41); // Crozet countryCodes.insert ("fr", 131); // Kerguelen //TODO: Add the wikipedia flag http://es.wikipedia.org/wiki/Tierras_Australes_y_Ant%C3%A1rticas_Francesas countryCodes.insert ("fr", 10); //Amsterdam & St Paul is //TODO: Add the wikipedia flag countryCodes.insert ("wf", 298); // Wallis & Futuna is countryCodes.insert ("gf", 63); // French Guiana //TODO: Add the wikipedia flag countryCodes.insert ("england", 223); // England countryCodes.insert ("gb", 114); //Isle of Man //TODO: Add the wikipedia flag countryCodes.insert ("northernireland", 265); // Northern Ireland countryCodes.insert ("gb", 122); // Jersey countryCodes.insert ("scotland", 279); // Scotland countryCodes.insert ("scotland", 1279); // Shetland is (Scotland) countryCodes.insert ("gb", 106); // Guernsey //TODO: Add the wikipedia flag countryCodes.insert ("wales", 294); // Wales countryCodes.insert ("sb", 185); // Solomon countryCodes.insert ("sb", 507); // Temotu Province countryCodes.insert ("hu", 239); // Hungary countryCodes.insert ("ch", 287); // Switzerland countryCodes.insert ("li", 251); // Liechtenstein countryCodes.insert ("ec", 120); // Ecuador countryCodes.insert ("ec", 71); // Galapagos Is countryCodes.insert ("ht", 78); // Haiti countryCodes.insert ("do", 72); // Dominican Rep countryCodes.insert ("co", 116); // Colombia countryCodes.insert ("co", 216); // San Andres & Providencia countryCodes.insert ("co", 161); // Malpelo countryCodes.insert ("kr", 137); // Rep Korea countryCodes.insert ("pa", 88); // Panama countryCodes.insert ("hn", 80); // Honduras countryCodes.insert ("th", 387); // Thailand countryCodes.insert ("va", 295); countryCodes.insert ("sa", 378); // Saudi Arabia countryCodes.insert ("it", 248); // Italy countryCodes.insert ("it", 1248); // African Italy countryCodes.insert ("it", 2248); // Sicily countryCodes.insert ("it", 225); // Sardinia countryCodes.insert ("dj", 382); // Djibouti countryCodes.insert ("gd", 77); // Grenada countryCodes.insert ("gw", 109); // Guinea-Bissau countryCodes.insert ("lc", 97); // St Lucia countryCodes.insert ("dm", 95); // Dominica countryCodes.insert ("vc", 98); // St Vicent countryCodes.insert ("jp", 339); // Japan countryCodes.insert ("jp", 177); // Minami Torishima countryCodes.insert ("jp", 192); // Ogasawara countryCodes.insert ("mn", 363); // Mongolia countryCodes.insert ("sj", 259); // Svalbard countryCodes.insert ("sj", 1259); // Svalbard countryCodes.insert ("sj", 118); // Jan Mayen countryCodes.insert ("jo", 342); countryCodes.insert ("us", 291); countryCodes.insert ("us", 105); countryCodes.insert ("mp", 166); countryCodes.insert ("us", 20); countryCodes.insert ("gu", 103); countryCodes.insert ("us", 123); countryCodes.insert ("us", 174); countryCodes.insert ("us", 197); countryCodes.insert ("us", 134); countryCodes.insert ("us", 110); // Hawaii //TODO: Add the wikipedia flag countryCodes.insert ("us", 138); // Kure is countryCodes.insert ("as", 9); // American Samoa countryCodes.insert ("as", 515); // Swains is countryCodes.insert ("us", 297); // Wake is countryCodes.insert ("us", 6); // Alaska countryCodes.insert ("us", 182); // Navassa Is countryCodes.insert ("vi", 285); // Us Virgin is countryCodes.insert ("pr", 202); // Puerto Rico countryCodes.insert ("us", 43); // Desecheo Is countryCodes.insert ("no", 266); // Norway countryCodes.insert ("ar", 100); // Argentina countryCodes.insert ("lu", 254); // Luxembourg countryCodes.insert ("lt", 146); // Lithuania countryCodes.insert ("bg", 212); // Bulgaria countryCodes.insert ("pe", 136); // Peru countryCodes.insert ("lb", 354); // Lebanon countryCodes.insert ("at", 206); // Austria & Viena Intl HQ countryCodes.insert ("fi", 224); // Findland countryCodes.insert ("fi", 5); // Aland is countryCodes.insert ("fi", 167); // Market Reef countryCodes.insert ("cz", 503); // Czech Rep countryCodes.insert ("sk", 504); // Slovak Rep countryCodes.insert ("be", 209); // Belgium countryCodes.insert ("gl", 237); // Greenland countryCodes.insert ("dk", 222); // Faroe is //TODO: Add the wikipedia flag countryCodes.insert ("dk", 221); // Denmark countryCodes.insert ("pg", 163); // Papua New Guinea countryCodes.insert ("aw", 91); // Aruba countryCodes.insert ("kp", 344); //Dpr Korea countryCodes.insert ("nl", 263); // Netherlands countryCodes.insert ("cw", 517); // Curacao //TODO: Add the wikipedia flag countryCodes.insert ("bq", 520); // Bonaire //TODO: Add the wikipedia flag countryCodes.insert ("nl", 519); // Saba & St Eustatius //TODO: Add the wikipedia flag countryCodes.insert ("shm", 518); // Sint Marteen //TODO: Add the wikipedia flag countryCodes.insert ("br", 108); // Brazil countryCodes.insert ("br", 56); // Fernando de Noronha countryCodes.insert ("br", 253); // St Peter & St Paul countryCodes.insert ("br", 273); // Trindade & Martim Vaz countryCodes.insert ("sr", 140); // Suriname countryCodes.insert ("ru", 61); // Franz Josef Land countryCodes.insert ("eh", 302); // Western Sahara //TODO: Add the wikipedia flag countryCodes.insert ("bd", 305); // Bangladesh countryCodes.insert ("si", 499); // Slovenia countryCodes.insert ("sc", 379); // Seychelles countryCodes.insert ("st", 219); // Sao Tome & Principe countryCodes.insert ("se", 284); // Sweden countryCodes.insert ("pl", 269); // Poland countryCodes.insert ("sd", 466); // Sudan countryCodes.insert ("eg", 478); // Egypt countryCodes.insert ("gr", 236); // Greece countryCodes.insert ("gr", 180); // Mount Athos countryCodes.insert ("gr", 45); // Dodecanese countryCodes.insert ("gr", 40); // Crete countryCodes.insert ("tv", 282); // Tuvalu countryCodes.insert ("ki", 301); // Western Kiribati countryCodes.insert ("ki", 31); // Central Kiribati countryCodes.insert ("ki", 48); // Eastern Kiribati countryCodes.insert ("ki", 490); // Banaba is countryCodes.insert ("so", 232); // Somalia countryCodes.insert ("sm", 278); // San Marino countryCodes.insert ("pw", 22); // Palau countryCodes.insert ("tr", 390); // Turkey countryCodes.insert ("tr", 1390); // European Turkey countryCodes.insert ("is", 242); // Iceland countryCodes.insert ("gt", 76); // Guatemala //TODO: Add the wikipedia flag countryCodes.insert ("cr", 308); // Costa Rica countryCodes.insert ("cr", 37); // Coco is countryCodes.insert ("cm", 406); // Cameroon countryCodes.insert ("fr", 214); // Corsica // TODO: Add the wikipedia flag countryCodes.insert ("cf", 408); // Central African Rep countryCodes.insert ("cg", 412); // Rep of Congo countryCodes.insert ("ga", 420); // Gabon countryCodes.insert ("td", 410); // Chad countryCodes.insert ("ci", 428); // Cote d'Ivoire countryCodes.insert ("bj", 416); // Benin countryCodes.insert ("ml", 442); // Mali countryCodes.insert ("ru", 54); // European Russia countryCodes.insert ("ru", 15); // Asiatic Russia countryCodes.insert ("ru", 126); // Kaliningrad countryCodes.insert ("uz", 292); // Uzbekistan countryCodes.insert ("kz", 130); // Kazakhstan countryCodes.insert ("ua", 288); // Ukraine countryCodes.insert ("ag", 94); // Antigua & Barbuda countryCodes.insert ("bz", 66); // Belize countryCodes.insert ("kn", 249); // St Kitts & Nevis countryCodes.insert ("na", 464); // Namibia countryCodes.insert ("fm", 173); // Micronesia countryCodes.insert ("fm", 168); // Marshall Is countryCodes.insert ("bn", 345); // Brunei Darusalam countryCodes.insert ("ca", 1); // Canada countryCodes.insert ("au", 150); // Australia countryCodes.insert ("hm", 111); // Heard Is countryCodes.insert ("au", 153); // Macquarie is countryCodes.insert ("cc", 38); // Cocos / Keeling is countryCodes.insert ("au", 147); // Lord Howe is countryCodes.insert ("au", 171); // Mellish Reed countryCodes.insert ("nf", 189); // Norkfolk is countryCodes.insert ("au", 303); // Willis Is countryCodes.insert ("cx", 35); // Christmas is countryCodes.insert ("ai", 12); // Anguilla countryCodes.insert ("ms", 96); // Montserrat countryCodes.insert ("vg", 65); // British is countryCodes.insert ("tc", 89); // Turks & Caicos is countryCodes.insert ("pn", 172); // Pitcairn countryCodes.insert ("gb", 513); // Ducie is countryCodes.insert ("fk", 141); // Falkland is countryCodes.insert ("gs", 235); // South Georgia is countryCodes.insert ("southbritish", 241); // South Shetland is countryCodes.insert ("un", 238); // South Orkney is countryCodes.insert ("gs", 240); // South Sandwich Is countryCodes.insert ("bm", 64); // Bermuda countryCodes.insert ("io", 33); // Chagos is countryCodes.insert ("hk", 321); // Hong Kong countryCodes.insert ("in", 324); // India countryCodes.insert ("in", 11); // Andaman & Nicobar countryCodes.insert ("in", 142); // Lakshadweep Is countryCodes.insert ("mx", 50); // Mexico countryCodes.insert ("mx", 204); // Revilagigedo countryCodes.insert ("bf", 480); // Burkina Faso countryCodes.insert ("kh", 312); // Cambodia countryCodes.insert ("la", 143); // Laos countryCodes.insert ("mo", 152); // Macao countryCodes.insert ("mm", 309); // Myanmar countryCodes.insert ("af", 3); // Afganistan countryCodes.insert ("id", 327); // Indonesia countryCodes.insert ("iq", 333); // Iraq countryCodes.insert ("vu", 158); // Vanuatu countryCodes.insert ("sy", 384); // Syria countryCodes.insert ("lv", 145); // Latvia countryCodes.insert ("ni", 86); // Nicaragua countryCodes.insert ("ro", 275); // Romania countryCodes.insert ("sv", 74); // El Salvador countryCodes.insert ("rs", 296); // Serbia countryCodes.insert ("ve", 148); // Venezuela countryCodes.insert ("ve", 17); // Aves Is countryCodes.insert ("zw", 452); // Zimbabwe countryCodes.insert ("mk", 502); // Macedonia countryCodes.insert ("ss", 521); //Rep South Sudan countryCodes.insert ("al", 7); // Albania countryCodes.insert ("gi", 233); // Gibraltar countryCodes.insert ("gb", 283); // UK Base Aereas Cyprus countryCodes.insert ("sh", 250); // St Helena countryCodes.insert ("sh", 205); // Ascension is countryCodes.insert ("sh", 274); // Tristan da Cunha & Gough is countryCodes.insert ("ky", 69); // Cayman Is countryCodes.insert ("tk", 270); // Tokelau Is countryCodes.insert ("marquesas", 509); // Marquesas Is countryCodes.insert ("nz", 170); // New Zeland countryCodes.insert ("nz", 34); // Chatham Is countryCodes.insert ("nz", 133); // Kermadec is countryCodes.insert ("nz", 16); // Auckland & Campbell is countryCodes.insert ("py", 132); // Paraguay countryCodes.insert ("za", 462); // South Africa countryCodes.insert ("za", 201); // Pr Edward & Marion Is countryCodes.insert ("xk", 522); // Kosovo // Countries without flag or controversial - Data is added just to keep the DB filled-up countryCodes.insert ("un", 506); // Scarboroug Reef countryCodes.insert ("un", 13); // Antartica return countryCodes; } bool DataBase::updateTheEntityTableISONames() { //qDebug() << "DataBase::updateTheEntityTableISONames" << QT_ENDL; QSqlQuery query; QString sq; //First of all we will check if the entity table does contain data. We can't update something non existent! if (!hasTheTableData("entity")) { //qDebug() << "DataBase::updateTheEntityTableISONames: Entity has NO data" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } QMultiMap countryCodes; countryCodes.clear (); countryCodes = fillCountryCodes (); foreach (const QString &str, countryCodes.uniqueKeys()) { foreach (int i, countryCodes.values(str)) { if (!updateEntity (str, i)) return false; //qDebug() << str << ':' << i; } } //qDebug() << "DataBase::updateTheEntityTableISONames-END" << QT_ENDL; return true; } bool DataBase::updateEntity (const QString &_codeString, const int _code) { //qDebug() << Q_FUNC_INFO << "ISOCode: " << _codeString << " - int: " << QString::number(_code); QString sq = QString ("UPDATE entity SET isoname='%1' WHERE dxcc='%2'").arg(_codeString).arg(_code); //TODO Capture and manage the error return execQuery(Q_FUNC_INFO, sq); } bool DataBase::isTheTableExisting(const QString &_tableName) { QSqlQuery query; QString sq = QString("SELECT name FROM sqlite_master WHERE name='%1'").arg(_tableName); bool sqlOK = query.exec(sq); if (sqlOK) { if (query.next()) { if (query.isValid()) { int _n = (query.value(0)).toInt(); query.finish(); if (_n > 0) { //qDebug() << "DataBase::isTheTableExisting - Table Exists" << QT_ENDL; return true; } else { //qDebug() << "DataBase::isTheTableExisting - Table does not Exist" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } } } else { // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } bool DataBase::hasTheTableData(const QString &_tableName) { //qDebug() << "DataBase::hasTheTableData" << _tableName << QT_ENDL; QSqlQuery query; QString stringQuery = QString("SELECT count(id) FROM %1").arg(_tableName); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::hasTheTableData - valid" << QT_ENDL; int _num = (query.value(0)).toInt(); query.finish(); if (_num > 0) { //qDebug() << "DataBase::hasTheTableData - DB Exists" << QT_ENDL; return true; } else { //qDebug() << "DataBase::hasTheTableData - DB does not Exist" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } else { //qDebug() << "DataBase::hasTheTableData - not valid" << QT_ENDL; query.finish(); // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //qDebug() << "DataBase::hasTheTableData: LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "DataBase::hasTheTableData: LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "DataBase::hasTheTableData: LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "DataBase::hasTheTableData LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; //qDebug() << "DataBase::updateTheEntityTableISONames" << QT_ENDL; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::isTheDBCreated: END FALSE" << QT_ENDL; //query.finish(); //return false; } bool DataBase::updateTo011() {// Updates the DB to 0.011: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo011: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn011 = false; bool IAmIn010 = false; QString stringQuery = QString(); //QSqlQuery query; //bool sqlOk = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo011: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.011f) { //qDebug() << "DataBase::updateTo011: - I am in 011" << QT_ENDL; IAmIn011 = true; return true; } else { //qDebug() << "DataBase::updateTo011: - I am not in 0.012 I am in: " << QString::number(latestReaded)<< QT_ENDL; bool ErrorUpdating = false; while (!IAmIn010 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - Check if I am in 010: !" << QT_ENDL; IAmIn010 = updateTo010(); if (IAmIn010) { //qDebug() << "DataBase::updateTo011: - updateTo010 returned TRUE - I am in 0.010: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateTo011: - updateTo009 returned FALSE - I am NOT in 0.010: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo011: - Sats update NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (!recreateTableDXCC()) { //qDebug() << "DataBase::updateTo011: - recreateTableDXCC NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } if (!recreateTableWAZ()) { //qDebug() << "DataBase::updateTo011: - recreateTableWAZ NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } if(!execQuery(Q_FUNC_INFO, "INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'NO', '0')")) { //qDebug() << "DataBase::updateTo011: - MSK NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo011: - Failed to recreate Table Log " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "6", 7); return false; } if (updateDBVersion(softVersion, "0.011")) { //qDebug() << "DataBase::updateTo011: - We are in 011! " << QT_ENDL; IAmIn011 = true; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 011! " << QT_ENDL; IAmIn011 = false; } if (!updateAwardDXCCTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardDXCCTable NOK " << QT_ENDL; IAmIn011 = false; // emit debugLog(Q_FUNC_INFO, "7", 7); return false; } if (!updateAwardWAZTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardWAZTable NOK " << QT_ENDL; IAmIn011 = false; } //qDebug() << "DataBase::updateTo011: - END" << QT_ENDL; if (!IAmIn011) {// emit debugLog(Q_FUNC_INFO, "8", 7); } return IAmIn011; } bool DataBase::updateTo012() { // Updates the DB to 0.012: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo012: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn011 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo012: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.012f) { //qDebug() << "DataBase::updateTo012: - I am in 012" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo012: - I am not in 0.012 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn011 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - Check if I am in 011: !" << QT_ENDL; IAmIn011 = updateTo011(); if (IAmIn011) { //qDebug() << "DataBase::updateTo012: - updateTo011 returned TRUE - I am in 0.011: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateTo012: - updateTo011 returned FALSE - I am NOT in 0.011: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. //bool sqlOK = false; if (isTheTableExisting("supportedcontest")) { bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontest"); if (sqlOK) { if (createTableSupportedContest()) { sqlOK = recreateSupportedContest(); } else { //qDebug() << "DataBase::updateTo012: UPDATED NOK-1!" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } } else { if (createTableSupportedContest()) { if (!recreateSupportedContest()) { //qDebug() << "DataBase::updateTo012: UPDATED NOK-2!" << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } } if (updateDBVersion(softVersion, "0.012")) { //qDebug() << "DataBase::updateTo012: - We are in 012! " << QT_ENDL; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 012! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } //qDebug() << "DataBase::updateTo012: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo013() { // Updates the DB to 0.013: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo013: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn012 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo013: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.013f) { //qDebug() << "DataBase::updateTo013: - I am in 013" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateTo013: - I am not in 0.013 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn012 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - Check if I am in 012: !" << QT_ENDL; IAmIn012 = updateTo012(); if (IAmIn012) { //qDebug() << "DataBase::updateTo013: - updateTo012 returned TRUE - I am in 0.012: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateTo013: - updateTo011 returned FALSE - I am NOT in 0.012: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSupportedContest()) { // emit debugLog(Q_FUNC_INFO, "2", 7); /*emit debugLog(Q_FUNC_INFO, "0", 7);*/ return false; } execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via"); if (createTableQSL_Via_enumeration()) { if (!populateTableQSL_Via_enumeration()) { // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } else { // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } if (updateDBVersion(softVersion, "0.013")) { //qDebug() << "DataBase::updateTo013: - We are in 013! " << QT_ENDL; } else { //qDebug() << "DataBase::updateTo013: - Failed to go to 013! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } //qDebug() << "DataBase::updateTo013: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo014() { // Updates the DB to 0.014: // Updates the Satellite DB //qDebug() << "DataBase::updateto014: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn013 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto014: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.014f) { //qDebug() << "DataBase::updateto014: - I am in 013" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.013 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn013 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 013: !" << QT_ENDL; IAmIn013 = updateTo013(); if (IAmIn013) { //qDebug() << "DataBase::updateto014: - updateTo012 returned TRUE - I am in 0.013: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateto014: - updateTo011 returned FALSE - I am NOT in 0.013: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto014: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo014: - Sats update NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.014")) { //qDebug() << "DataBase::updateto014: - We are in 013! " << QT_ENDL; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 013! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo014: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo015() { // Updates the DB to 0.015: // Adds the FT4 mode //qDebug() << "DataBase::updateto015: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn014 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto015: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.015f) { //qDebug() << "DataBase::updateto015: - I am in 013" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn014 && !ErrorUpdating) { //qDebug() << "DataBase::updateto015: - Check if I am in 014: !" << QT_ENDL; IAmIn014 = updateTo014(); if (IAmIn014) { //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.014: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.014: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto015: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (updateTheModeTableAndSyncLog()) { //qDebug() << "DataBase::updateTo015: - updateTheModeTableAndSyncLog OK" << QT_ENDL; } else { //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" << QT_ENDL; //ErrorUpdating = true; } if (updateDBVersion(softVersion, "0.015")) { //qDebug() << "DataBase::updateto015: - We are in 015! " << QT_ENDL; } else { //qDebug() << "DataBase::updateto015: - Failed to go to 014! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTo015: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo016() { // Updates the DB to 0.016: // Updates the Satellite DB //qDebug() << "DataBase::updateto016: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn015 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto016: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.016f) { //qDebug() << "DataBase::updateto016: - I am in 015" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateto016: - I am not in 0.015 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn015 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 015: !" << QT_ENDL; IAmIn015 = updateTo015(); if (IAmIn015) { //qDebug() << "DataBase::updateto016: - updateTo015 returned TRUE - I am in 0.015: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateto016: - updateTo015 returned FALSE - I am NOT in 0.015: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto016: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo016: - Sats update NOK " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.016")) { //qDebug() << "DataBase::updateto014: - We are in 016! " << QT_ENDL; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 016! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo016: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo017() { // Updates the DB to 0.017: // Updates the Satellite DB //qDebug() << "DataBase::updateto017: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn016 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto017: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.017f) { //qDebug() << "DataBase::updateto017: - I am in 017" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateto017: - I am not in 0.017 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn016 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 016: !" << QT_ENDL; IAmIn016 = updateTo016(); if (IAmIn016) { //qDebug() << "DataBase::updateto017: - updateTo016 returned TRUE - I am in 0.016: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateto017: - updateTo016 returned FALSE - I am NOT in 0.016: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto017: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '') // Query to remove the ":" from the Time: update log set time_on = replace(time_on, ':', '') // Query to join columns: // update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '') /* PROCEDURE: Move to SQLITE - datetime type: // 2020-01-01 10:12:01 // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '-') // Join: SELECT qso_date || ' ' || time_on from log UPDATE logtemp SET qso_date = (SELECT qso_date || ' ' || time_on FROM log) */ /* QString stringQuery; stringQuery = "update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '')"; //UPDATE log set qso_date = qso_date ||'-'||time_on bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} */ // Modify the qso_date with the time_on data with the right format QString stringQuery; stringQuery = "UPDATE log set qso_date = replace(qso_date ||' '||time_on, '/', '-')"; bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "2", 7);*/return false;} stringQuery = "UPDATE log set qso_date_off = replace(qso_date_off, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "3", 7);*/return false;} stringQuery = "UPDATE log set qslsdate = replace(qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/return false;} stringQuery = "UPDATE log set qslrdate = replace(qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "5", 7);*/return false;} stringQuery = "UPDATE log set lotw_qslsdate = replace(lotw_qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "6", 7);*/return false;} stringQuery = "UPDATE log set lotw_qslrdate = replace(lotw_qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "7", 7);*/return false;} stringQuery = "UPDATE log set eqsl_qslrdate = replace(eqsl_qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "8", 7);*/return false;} stringQuery = "UPDATE log set eqsl_qslsdate = replace(eqsl_qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "9", 7);*/return false;} stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "10", 7);*/return false;} stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "11", 7);*/return false;} stringQuery = "UPDATE log set clublog_qso_upload_date = replace(clublog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "12", 7);*/return false;} stringQuery = "UPDATE log set qrzcom_qso_upload_date = replace(qrzcom_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "13", 7);*/return false;} if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo017: - Failed to recreate Table Log " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "14", 7); return false; } //qDebug() << "DataBase::updateTo017: - Recreated Table Log " << QT_ENDL; /* else { //qDebug() << "DataBase::updateTo017: - Table log recreated OK" << QT_ENDL; } */ // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED //return false; // If everything went OK, we update the DB number. if (updateDBVersion(softVersion, "0.017")) { //qDebug() << "DataBase::updateto017: - We are in 017! " << QT_ENDL; } else { //qDebug() << "DataBase::updateto017: - Failed to go to 017! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo017: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo018() { // Updates the DB to 0.018: // Adds the Subdivisions //qDebug() << "DataBase::updateto018: latestRead: " << getDBVersion() << QT_ENDL; bool IAmIn017 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto018: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.018f) { //qDebug() << "DataBase::updateto018: - I am in 018" << QT_ENDL; return true; } else { //qDebug() << "DataBase::updateto018: - I am not in 0.018 I am in: " << getDBVersion() << QT_ENDL; while (!IAmIn017 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 017: !" << QT_ENDL; IAmIn017 = updateTo017(); if (IAmIn017) { //qDebug() << "DataBase::updateto018: - updateTo017 returned TRUE - I am in 0.017: " << QString::number(latestReaded) << QT_ENDL; } else { //qDebug() << "DataBase::updateto017: - updateTo017 returned FALSE - I am NOT in 0.017: " << QString::number(latestReaded) << QT_ENDL; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto018: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. bool ok = createTableSubdivision(true); if (!ok) { return false; } // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED //return false; // If everything went OK, we update the DB number. if (updateDBVersion(softVersion, "0.018")) { //qDebug() << "DataBase::updateto018: - We are in 018! " << QT_ENDL; } else { //qDebug() << "DataBase::updateto018: - Failed to go to 018! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo018: UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo019() {// Adds FTS4 and FST4W modes // Adds RS-44 sat //qDebug() << Q_FUNC_INFO << " " << getDBVersion() << QT_ENDL; bool IAmIn018 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= 0.019f) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" << QT_ENDL; return true; } else { while (!IAmIn018 && !ErrorUpdating) { IAmIn018 = updateTo018(); if (!IAmIn018) { ErrorUpdating = false; } } if (ErrorUpdating) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (updateTheModeTableAndSyncLog() && recreateSatelliteData()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << " : UPDATED NOK!(9)" << QT_ENDL; return false; } if (updateDBVersion(softVersion, "0.019")) { //qDebug() << Q_FUNC_INFO << " : - We are in 019! " << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << " : - Failed to go to 018! " << QT_ENDL; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo023() {// Recreates the table band //qDebug() << Q_FUNC_INFO << " " << getDBVersion() << QT_ENDL; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= dbVersion) { //qDebug() << Q_FUNC_INFO << " : - I am in 023" << QT_ENDL; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo022(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!recreateTableBand()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL; return false; } if (!updateDBVersion(softVersion, QString::number(0.023))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " << QT_ENDL; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo022() {// Adds Q65 mode //qDebug() << Q_FUNC_INFO << " " << getDBVersion() << QT_ENDL; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= dbVersion) { //qDebug() << Q_FUNC_INFO << " : - I am in 022" << QT_ENDL; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo021(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!updateTheModeTableAndSyncLog() ) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL; return false; } if (!updateDBVersion(softVersion, QString::number(0.022))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " << QT_ENDL; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateTo021() {// Adds 5M & 8M bands //qDebug() << Q_FUNC_INFO << " " << getDBVersion() << QT_ENDL; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL; if (latestReaded >= dbVersion) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" << QT_ENDL; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo019(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!recreateTableBand ()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL; return false; } if (!updateDBVersion(softVersion, QString::number(0.021))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " << QT_ENDL; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL; return true; } bool DataBase::updateAwardDXCCTable() { //qDebug() << "DataBase::updateAwardDXCCTable" << QT_ENDL; QList dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, dxcc, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY dxcc"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } else { //qDebug() << "DataBase::updateAwardDXCCTable SELECT when OK" << QT_ENDL; } QStringList dxccStatus = QStringList(); //dxcc, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //dxcc, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardDXCCTable before the while" << QT_ENDL; while (query.next()) { //qDebug() << "DataBase::updateAwardDXCCTable IN the while" << QT_ENDL; if (query.isValid()) { //qDebug() << "DataBase::updateAwardDXCCTable VALID" << QT_ENDL; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardDXCCTable in the while" << QT_ENDL; nameCol = rec.indexOf("qsl_rcvd"); bool qsl = false; if ((query.value(nameCol)).toString() == "Y") { qsl = true; } nameCol = rec.indexOf("lotw_qsl_rcvd"); bool lotw = false; if ((query.value(nameCol)).toString() == "Y") { lotw = true; } if (qsl || lotw ) { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardDXCCTable - status" << awardEntry.status << QT_ENDL; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("dxcc"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardDXCCTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID << QT_ENDL; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardDXCCTable - END OF WHILE" << QT_ENDL; query.finish(); //qDebug() << "DataBase::updateAwardDXCCTable: Log analized... let's clean the table!" << QT_ENDL; stringQuery = QString("DELETE FROM awarddxcc"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardDXCCTable: awarddxcc table DELETED" << QT_ENDL; } //qDebug() << "DataBase::updateAwardDXCCTable: Now we start writing the table!!" << QT_ENDL; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating DXCC award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardDXCCTable: INSERTING: " << QString::number(qsos) << " QSOS..." << QT_ENDL; for (int j=0;j dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, cqz, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY cqz"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } else { //qDebug() << "DataBase::updateAwardWAZTable SELECT when OK" << QT_ENDL; } QStringList dxccStatus = QStringList(); //cqz, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //cqz, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardWAZTable before the while" << QT_ENDL; while (query.next()) { //qDebug() << "DataBase::updateAwardWAZTable IN the while" << QT_ENDL; if (query.isValid()) { //qDebug() << "DataBase::updateAwardWAZTable VALID" << QT_ENDL; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardWAZTable in the while" << QT_ENDL; nameCol = rec.indexOf("qsl_rcvd"); bool qsl = false; if ((query.value(nameCol)).toString() == "Y") { qsl = true; } nameCol = rec.indexOf("lotw_qsl_rcvd"); bool lotw = false; if ((query.value(nameCol)).toString() == "Y") { lotw = true; } if (qsl || lotw ) { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardWAZTable - status" << awardEntry.status << QT_ENDL; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("cqz"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardWAZTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID << QT_ENDL; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardWAZTable - END OF WHILE" << QT_ENDL; query.finish(); //qDebug() << "DataBase::updateAwardWAZTable: Log analized... let's clean the table!" << QT_ENDL; stringQuery = QString("DELETE FROM awardwaz"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardWAZTable: awardwaz table DELETED" << QT_ENDL; } //qDebug() << "DataBase::updateAwardWAZTable: Now we start writing the table!!" << QT_ENDL; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating WAZ award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardWAZTable: INSERTING: " << QString::number(qsos) << " QSOS..." << QT_ENDL; for (int j=0;j. * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" class eLogClubLog : public QObject { Q_OBJECT public: explicit eLogClubLog(); ~eLogClubLog(); void setCredentials(const QString &_email, const QString &_pass, const QString &_defaultStationCallsign); int sendQSO(QStringList _qso); int deleteQSO(QStringList _qso); //int deleteQSOid(const int _qsoId); int modifyQSO (QStringList _oldQSO, QStringList _newQSO); void sendLogFile(const QString &_file, QList _qso, bool _overwrite); private: QString getClubLogAdif(const QStringList _q); //int sendData(const QString &_clublogCall, const QString &_q); // Sends the data (http post) to ClubLog int sendDataParams(const QString &_clublogCall, const QUrlQuery &_params, bool _adding); QString prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it QString email, pass, api, stationCallsign; QNetworkAccessManager *manager; QNetworkReply* reply; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; //bool useQSOStationCallsign; private slots: void slotQsoUploadFinished(QNetworkReply* data); void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableClubLogAction(const bool _b); void signalFileUploaded(QNetworkReply::NetworkError, QList); }; #endif // DOWNLOADCTY_H klog-1.8.6/awarddxmarathon.cpp0000644000175000017500000000605114166020407015334 0ustar develdevel#include "awarddxmarathon.h" /*************************************************************************** awarddxmarathon.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include DXMarathon::DXMarathon(DataProxy_SQLite *dp) { //qDebug() << "DXMarathon::DXMarathon" << QT_ENDL; dataProxy = dp; //qDebug() << "DXMarathon::DXMarathon - END" << QT_ENDL; } int DXMarathon::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonQSO: " << QString::number(_year) << QT_ENDL; return dataProxy->getQSOonYear(_year, _logNumber); } int DXMarathon::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonDXCC: " << QString::number(_year) << QT_ENDL; return dataProxy->getDXCConYear(_year, _logNumber); } int DXMarathon::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonCQ: " << QString::number(_year) << QT_ENDL; return dataProxy->getCQzonYear(_year, _logNumber); } int DXMarathon::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonScore: " << QString::number(_year) << QT_ENDL; return ( getDXMarathonDXCC(_year, _logNumber) + getDXMarathonCQ(_year, _logNumber)); } bool DXMarathon::neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dataProxy->newDXMarathon(_dxcc, _cq, _year, _logNumber); } klog-1.8.6/elogqrzlog.h0000644000175000017500000001167514166020421014006 0ustar develdevel#ifndef ELOGQRZLOG_H #define ELOGQRZLOG_H /*************************************************************************** elogqrzlog.h - description ------------------- begin : nov 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "widgets/onlinemessagewidget.h" // https://www.qrz.com/XML/current_spec.html // https://www.qrz.com/page/xml_data.html // https://www.qrz.com/docs/logbook/QRZLogbookAPI.html class eLogQrzLog : public QObject { Q_OBJECT public: explicit eLogQrzLog(DataProxy_SQLite *dp, const QString &_parentFunction, const QString &_klogVersion); ~eLogQrzLog(); void login(); void setCredentials(const QString &_user, const QString &_pass); void setLogBookKey(const QString &_key); bool hasLogBookKey(); int sendQSOs(QList _qsos); void checkQRZ(const QString &_qrz); void fetchData(); void setSubcription(const bool _ok); bool getSubscription(); //int deleteQSOid(const int _qsoId); //int modifyQSO (QStringList _oldQSO, QStringList _newQSO); //void sendLogFile(const QString &_file, QList _qso, bool _overwrite); private slots: void slotManagerFinished(QNetworkReply* data); void slotManagerLogFinished(QNetworkReply* data); //void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableQRZAction(const bool _b); void signalLogUploaded(QNetworkReply::NetworkError, QList); void dataFoundSignal(const QString &_type, const QString &_data); private: void showDebugLog(const QString &_func, const QString &_log); //QString getClubLogAdif(const QStringList _q); //int sendData(const QString &_clublogCall, const QString &_q); // Sends the data (http post) to ClubLog int sendDataParams(const QUrlQuery &_params); QString prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it bool canConnect(); //void parseAppAnswer (const int howManyQSOs, const QString &_m); void parseAppAnswer (const QString &_m); void parseNetworkError(QNetworkReply::NetworkError _error); void parseXMLAnswer(QXmlStreamReader &xml); int sendQSO(const int _qsoID); void sendSignal(QNetworkReply::NetworkError _error, QList _qsos); bool errorWhileSendingLog; bool sendingQSO; bool lastQSO; bool subscriptionOK; QString sessionkey, logbookkey; QString user, pass; QString klogVersion; DataProxy_SQLite *dataProxy; QNetworkAccessManager *manager; QNetworkAccessManager *managerLog; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; bool logged; QUrl serviceUrl; QXmlStreamReader *reader; OnlineMessageWidget *onlineMessage; //bool useQSOStationCallsign; }; #endif // DOWNLOADCTY_H klog-1.8.6/INSTALL-es.txt0000644000175000017500000000034014166020407013713 0ustar develdevelEste fichero es sobre el proceso de instalación de KLog: Por favor, lea:: INSTALL-linux.txt para instrucciones de linux. INSTALL-macOS.txt para instrucciones en macOS. INSTALL-win.txt para instrucciones en Windowns.. klog-1.8.6/softwareupdatedialog.cpp0000644000175000017500000001066614166020407016374 0ustar develdevel/*************************************************************************** softwareupdatedialog.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "softwareupdatedialog.h" //#include SoftwareUpdateDialog::SoftwareUpdateDialog() { //qDebug() << "SoftwareUpdateDialog::SoftwareUpdateDialog" << QT_ENDL; textBrowser = new QTextBrowser; textBrowser->setOpenLinks(true); textBrowser->setOpenExternalLinks(true); //textBrowser->setFrameShadow(QFrame::Raised); //textBrowser->setFrameStyle(QFrame::StyledPanel); QPushButton *acceptButton = new QPushButton(tr("Ok")); textBrowser->setOpenExternalLinks(true); //textBrowser->setHTML(url); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(acceptButton); /// QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(textBrowser); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); setWindowTitle(tr("KLog update")); /// connect(acceptButton, SIGNAL(clicked()), this, SLOT(slotAcceptButtonClicked())); //qDebug() << "SoftwareUpdateDialog::SoftwareUpdateDialog - END" << QT_ENDL; } void SoftwareUpdateDialog::setVersion(const QString tversion, const bool updateNeeded) { //qDebug() << "SoftwareUpdateDialog::setVersion: " << tversion << QT_ENDL; _version = tversion; if (updateNeeded) { //text = "

KLog new version ("+ tversion + ") is available!


There is a new version of KLog available.

You can get the new version from:

https://www.klog.xyz
"; text = tr("

KLog new version (%1) is available!


There is a new version of KLog available.

You can get the new version from:

https://www.klog.xyz
").arg(tversion); } else { text = "

" + tr("Congratulations!") + "



" + tr("Your KLog has been updated.") + "

" + tr("You already have the latest version.") + "
("+ tversion + ")
"; } textBrowser->setHtml(text); //qDebug() << "SoftwareUpdateDialog::setVersion: END"<< QT_ENDL; } SoftwareUpdateDialog::~SoftwareUpdateDialog() { //qDebug() << "SoftwareUpdateDialog::~SoftwareUpdateDialog" << QT_ENDL; } void SoftwareUpdateDialog::slotAcceptButtonClicked() { //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked" << QT_ENDL; accept(); //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked END" << QT_ENDL; } void SoftwareUpdateDialog::keyPressEvent(QKeyEvent *event) { //qDebug() << "SoftwareUpdateDialog::keyPressEvent" << QT_ENDL; if (event->key()>=0) { slotAcceptButtonClicked(); } //qDebug() << "SoftwareUpdateDialog::keyPressEvent END" << QT_ENDL; } klog-1.8.6/awards.h0000644000175000017500000001672314166020407013105 0ustar develdevel#ifndef AWARDS_H #define AWARDS_H /*************************************************************************** awards.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include // For the "tr" function #include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awarddxmarathon.h" #include "dataproxy_sqlite.h" #include "utilities.h" #include "klogdefinitions.h" class QProgressDialog; class Awards : public QObject { Q_OBJECT //friend class World; public: Awards(DataProxy_SQLite *dp, const QString &_parentFunction); ~Awards(); void setAwards(const int _qsoId); void setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId); /* _workedOrConfirmed = 0 Set as Worked _workedOrConfirmed = 1 Set as Confirmed */ void setManageModes(const bool _manageModes=false); // Defines if the mode is to be taken into account when calculating an award void recalculateAwards(); //void recalculateDXCC(const int _logNumber); //void setAwards(const int _qsoId, bool modify); int getDXCCWorked(const int _logNumber); int getDXCCConfirmed(const int _logNumber); int getWAZWorked(const int _logNumber); int getWAZConfirmed(const int _logNumber); bool updateDXCCBandsStatus(const int _logNumber=0); int getQSOsInLog(const int _logNumber); bool getIsDXCCConfirmed(const int _dxcc, const int _logNumber); bool isThisSpotConfirmed(const QStringList &_qs); QString checkIfValidIOTA(const QString &_tiota); //TODO: There is an equivalent function in the MainWindowInputOthers class. I should use only one! int getEntityDXStatus (const int _enti, const int _bandid, int _modeid = -1, int _log = -1); QString getQSOofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed); int getQSOIdofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed); int getDXStatus (const QStringList &_qs); QString getDXStatusString (const int &_status); // Needs to be called with the output of getDXStatus QString getDXCCStatusBand2(const int _dxcc, const int _band, const int _logNumber=0); // Returns -, W or C (Not worked, worked, Confirmed) QString getDXCCStatusBand(const int _dxcc, const int _band); // Returns -, W or C (Not worked, worked, Confirmed) void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); QColor getQRZDXStatusColor(const QStringList &_qs); // Receives Entity, band, mode & log QColor getDefaultColor(); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber); // Receives: QStringList _qs; //_qs << QRZ << BandId << lognumber; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. 6 - Default: Not applicable */ private: void setAwardDXCC(const int _qsoId); //bool setAwardDXCC(const int _dxcc, const int _band, const int _mode, const QString &_workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); int setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid); // Changes the status of a DXCC from worked to confirmed int setDXCCToQSO(const int _dxcc, const int _qsoid); // Defines the DXCC in a QSO int setCQToQSO(const int _cqz, const int _qsoid); // Defines the CQ zone in a QSO int dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatus(const int _ent, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /* _confirmed = 0 Set as Worked _cConfirmed = 1 Set as Confirmed */ /**/ int dxccStatusBand(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatusMode(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /**/ void setAwardWAZ(const int _qsoId); //bool setAwardWAZ(const int _cqz, const int _band, const int _mode, const QString &_workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); /* _confirmed = 0 Set as Worked _confirmed = 1 Set as Confirmed */ //int getProgresStepForDialog(int totalSteps); QColor newOneColor; // QColor neededColor; // QColor workedColor; // QColor confirmedColor; // QColor defaultColor; World *world; DataProxy_SQLite *dataProxy; DXMarathon *dxMarathon; Utilities *util; typedef QMultiHash DXStatus; DXStatus dxccWorked, dxccConfirmed, wazWorked, wazConfirmed; bool manageModes; QList dxccStatusList; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void awardDXCCUpdated(); }; #endif // AWARDS_H klog-1.8.6/awarddxmarathon.h0000644000175000017500000000443214166020407015002 0ustar develdevel#ifndef AWARDDXMARATHON_H #define AWARDDXMARATHON_H /*************************************************************************** awarddxmarathon.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy_sqlite.h" class DXMarathon { public: DXMarathon(DataProxy_SQLite *dp); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); private: DataProxy_SQLite *dataProxy; }; #endif // AWARDDXMARATHON_H klog-1.8.6/infowidget.cpp0000644000175000017500000005130514166020407014311 0ustar develdevel/*************************************************************************** infowidget.h - description ------------------- begin : ago 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "infowidget.h" InfoWidget::InfoWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "InfoWidget::InfoWidget: " << QT_ENDL; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); //Just to know colors locator = new Locator(); world = new World(dataProxy, Q_FUNC_INFO); bandLabel1 = new QLabel; bandLabel2 = new QLabel; bandLabel3 = new QLabel; bandLabel4 = new QLabel; bandLabel5 = new QLabel; bandLabel6 = new QLabel; bandLabel7 = new QLabel; bandLabel8 = new QLabel; bandLabel9 = new QLabel; bandLabel10 = new QLabel; bandLabel11 = new QLabel; bandLabel12 = new QLabel; continentLabel = new QLabel; prefixLabel = new QLabel; cqzLabel = new QLabel; ituzLabel = new QLabel; gradShortLabel = new QLabel; distShortLabel = new QLabel; gradLongLabel = new QLabel; distLongLabel = new QLabel; distShortLabelN = new QLabel; distLongLabelN = new QLabel; imperialSystem=false; dxLocator.clear(); createUI(); clearBandLabels(); //qDebug() << "InfoWidget::InfoWidget: - END" << QT_ENDL; } void InfoWidget::createUI() { bandLabel1->setText(tr("10M")); bandLabel2->setText(tr("15M")); bandLabel3->setText(tr("20M")); bandLabel4->setText(tr("40M")); bandLabel5->setText(tr("80M")); bandLabel6->setText(tr("160M")); bandLabel7->setText(tr("2M")); bandLabel8->setText(tr("6M")); bandLabel9->setText(tr("12M")); bandLabel10->setText(tr("17M")); bandLabel11->setText(tr("30M")); bandLabel12->setText(tr("70CM")); bandLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel3->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel4->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel5->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel6->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel7->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel8->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel9->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel10->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel11->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel12->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *continentLabelN = new QLabel(tr("Continent")); continentLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); continentLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *prefixLabelN = new QLabel(tr("Prefix")); prefixLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); prefixLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *cqzLabelN = new QLabel(tr("CQ")); cqzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); cqzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *ituzLabelN = new QLabel(tr("ITU")); ituzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); ituzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *shortLabelN = new QLabel(tr("Short Path")); shortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *longLabelN = new QLabel(tr("Long Path")); longLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradShortLabelN = new QLabel(tr("Deg")); gradShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradLongLabelN = new QLabel(tr("Deg")); gradLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); clear(); //continentLabel->setText("--"); //prefixLabel->setText("--"); //cqzLabel->setText("0"); //ituzLabel->setText("0"); //gradShortLabel->setText("0"); //gradLongLabel->setText("0"); //distLongLabel->setText("0"); //distShortLabel->setText("0"); QGridLayout *infoLayout1 = new QGridLayout; infoLayout1->addWidget(continentLabelN, 0, 0); infoLayout1->addWidget(continentLabel, 1, 0); infoLayout1->addWidget(prefixLabelN, 0, 1); infoLayout1->addWidget(prefixLabel, 1, 1); infoLayout1->addWidget(cqzLabelN, 0, 2); infoLayout1->addWidget(cqzLabel, 1, 2); infoLayout1->addWidget(ituzLabelN, 0, 3); infoLayout1->addWidget(ituzLabel, 1, 3); QGridLayout *shortPathLayout = new QGridLayout; shortPathLayout->addWidget(shortLabelN, 0, 0, 1, 0); shortPathLayout->addWidget(gradShortLabelN, 1, 0); shortPathLayout->addWidget(gradShortLabel, 1, 1); shortPathLayout->addWidget(distShortLabelN, 1, 2); shortPathLayout->addWidget(distShortLabel, 1, 3); QGridLayout *longPathLayout = new QGridLayout; longPathLayout->addWidget(longLabelN, 0, 0, 1, 0); longPathLayout->addWidget(gradLongLabelN, 1, 0); longPathLayout->addWidget(gradLongLabel, 1, 1); longPathLayout->addWidget(distLongLabelN, 1, 2); longPathLayout->addWidget(distLongLabel, 1, 3); QHBoxLayout *pathsLayout = new QHBoxLayout; pathsLayout->addLayout(shortPathLayout); pathsLayout->addLayout(longPathLayout); QGridLayout *bandsLayout = new QGridLayout; bandsLayout->addWidget(bandLabel1, 0, 0); bandsLayout->addWidget(bandLabel2, 0, 1); bandsLayout->addWidget(bandLabel3, 0, 2); bandsLayout->addWidget(bandLabel4, 0, 3); bandsLayout->addWidget(bandLabel5, 0, 4); bandsLayout->addWidget(bandLabel6, 0, 5); bandsLayout->addWidget(bandLabel7, 1, 0); bandsLayout->addWidget(bandLabel8, 1, 1); bandsLayout->addWidget(bandLabel9, 1, 2); bandsLayout->addWidget(bandLabel10, 1, 3); bandsLayout->addWidget(bandLabel11, 1, 4); bandsLayout->addWidget(bandLabel12, 1, 5); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(bandsLayout); mainLayout->addLayout(infoLayout1); mainLayout->addLayout(pathsLayout); #ifdef Q_OS_WIN continentLabel->setFrameShadow(QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel); continentLabelN->setFrameShadow(QFrame::Raised); continentLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabelN->setFrameShadow(QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabel->setFrameShadow(QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel); cqzLabelN->setFrameShadow(QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel); cqzLabel->setFrameShadow(QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabel->setFrameShadow(QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabelN->setFrameShadow(QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameShadow(QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel); longLabelN->setFrameShadow(QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabelN->setFrameShadow(QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabel->setFrameShadow(QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel); distShortLabelN->setFrameShadow(QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel); distShortLabel->setFrameShadow(QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel); gradLongLabelN->setFrameShadow(QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel); gradLongLabel->setFrameShadow(QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel); distLongLabelN->setFrameShadow(QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel); distLongLabel->setFrameShadow(QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel); bandLabel1->setFrameShadow(QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel); bandLabel2->setFrameShadow(QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel); bandLabel3->setFrameShadow(QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel); bandLabel4->setFrameShadow(QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel); bandLabel5->setFrameShadow(QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel); bandLabel6->setFrameShadow(QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel); bandLabel7->setFrameShadow(QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel); bandLabel8->setFrameShadow(QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel); bandLabel9->setFrameShadow(QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel); bandLabel10->setFrameShadow(QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel); bandLabel11->setFrameShadow(QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel); bandLabel12->setFrameShadow(QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel); #else continentLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif setLayout(mainLayout); } void InfoWidget::clearBandLabels() { QString defaultColorName = (awards->getDefaultColor()).name(); bandLabel1->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel2->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel3->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel4->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel5->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel6->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel7->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel8->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel9->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel10->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel11->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel12->setStyleSheet("* { background-color: " + defaultColorName + "; }"); } void InfoWidget::clearInfoFromLocators() { //qDebug() << "InfoWidget::clearInfoFromLocators" << QT_ENDL; gradShortLabel->setText( "0" ); gradLongLabel->setText( "0" ); distShortLabel->setText( "0" ); distLongLabel->setText( "0" ); cqzLabel->setText("0"); ituzLabel->setText("0"); } void InfoWidget::clear() { continentLabel->setText("--"); prefixLabel->setText("--"); clearBandLabels(); clearInfoFromLocators(); } void InfoWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { awards->setColors (_newOne, _needed, _worked, _confirmed, _default); } void InfoWidget::setCurrentLog(const int _log) { currentLog = _log; } void InfoWidget::setImperialSystem (const bool _imp) { imperialSystem = _imp; if (imperialSystem) { distShortLabelN->setText(tr("Miles")); distLongLabelN->setText(tr("Miles")); //distShortLabel->setText( QString::number( Km2Mile(imperialSystem, (distShortLabel->text()).toInt() )) ); //distLongLabel->setText( QString::number(Km2Mile(imperialSystem, (distLongLabel->text()).toInt()) ) ); } else { distShortLabelN->setText(tr("Km")); distLongLabelN->setText(tr("Km")); } } QString InfoWidget::getStyleColorToLabelFromBand(const QString &_b, const QString &_q) { // Receives band name, Entity number (as a String) //qDebug() << "InfoWidget::getStyleColorToLabelFromBand: " << _b << "/" << _q << QT_ENDL; QStringList _qs; _qs.clear(); _qs << _q << QString::number(dataProxy->getIdFromBandName(_b)) << QString::number(-1) << QString::number(currentLog); //TODO: Check if we can know the mode and replace the -1 //qDebug() << "InfoWidget::getStyleColorToLabelFromBand (Band/background-color): " << _b << (awards->getQRZDXStatusColor(_qs)).name() << QT_ENDL; return "* { background-color: " + (awards->getQRZDXStatusColor(_qs)).name() + "; }"; } //void InfoWidget::showInfo(const int _entity, const int _bandid, const int _modeid, const int _log) void InfoWidget::showInfo(const int _entity) { // Default values of _modeid & _log = -1 //qDebug() << "InfoWidget::showInfo: " << QString::number(_entity) << QT_ENDL; //QColor getQRZDXStatusColor(const QStringList _qs); // Receives Entity, band, mode & log if (_entity <1) { clearBandLabels(); } bandLabel1->setStyleSheet(getStyleColorToLabelFromBand(bandLabel1->text(), QString::number(_entity))); bandLabel2->setStyleSheet(getStyleColorToLabelFromBand(bandLabel2->text(), QString::number(_entity))); bandLabel3->setStyleSheet(getStyleColorToLabelFromBand(bandLabel3->text(), QString::number(_entity))); bandLabel4->setStyleSheet(getStyleColorToLabelFromBand(bandLabel4->text(), QString::number(_entity))); bandLabel5->setStyleSheet(getStyleColorToLabelFromBand(bandLabel5->text(), QString::number(_entity))); bandLabel6->setStyleSheet(getStyleColorToLabelFromBand(bandLabel6->text(), QString::number(_entity))); bandLabel7->setStyleSheet(getStyleColorToLabelFromBand(bandLabel7->text(), QString::number(_entity))); bandLabel8->setStyleSheet(getStyleColorToLabelFromBand(bandLabel8->text(), QString::number(_entity))); bandLabel9->setStyleSheet(getStyleColorToLabelFromBand(bandLabel9->text(), QString::number(_entity))); bandLabel10->setStyleSheet(getStyleColorToLabelFromBand(bandLabel10->text(), QString::number(_entity))); bandLabel11->setStyleSheet(getStyleColorToLabelFromBand(bandLabel11->text(), QString::number(_entity))); bandLabel12->setStyleSheet(getStyleColorToLabelFromBand(bandLabel12->text(), QString::number(_entity))); } void InfoWidget::showEntityInfo(const int _enti, int _cq, int _itu) { //qDebug() << "InfoWidget::showEntityInfo" << QString::number(_enti) << QT_ENDL; if (_enti<=0) { return; } /* TO paint a flag of the Worked entity QString flagSt; flagSt.clear(); QString aux; aux = dataProxy->getISOName(_enti); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(_enti) + ".png"; flagIcon->setIcon(QIcon(flagSt)); */ //infoLabel2->setText(world->getEntityName(_enti)); continentLabel->setText( world->getContinentShortName(_enti) ); prefixLabel->setText( world->getEntityMainPrefix(_enti)); int i = -1; if ((_cq>0) && (_cq<41)) { cqzLabel->setText( QString::number(_cq) ); } else { i = world->getEntityCqz(_enti); if( i > 0 ) { cqzLabel->setText( QString::number(i) ); } else { cqzLabel->setText("0"); } } if (_itu>0) { ituzLabel->setText( QString::number(_itu) ); } else { i = world->getEntityItuz(_enti); if ( i > 0 ) { ituzLabel->setText( QString::number(i) ); } else { ituzLabel->setText("0"); } } } void InfoWidget::showDistanceAndBearing(const QString &_locLocal, const QString &_locDX) {// Local / DX //qDebug() << "InfoWidget::showDistanceAndBearing: " << _locLocal << "/" << _locDX << QT_ENDL; QString lloc = _locLocal.toUpper(); QString ldx = _locDX.toUpper(); if ( locator->isValidLocator(lloc) ) { if ( locator->isValidLocator(ldx) ) { dxLocator = ldx; int beam = locator->getBeamBetweenLocators(lloc, dxLocator); gradShortLabel->setText( QString::number(beam) ); if (beam >= 180) { gradLongLabel->setText( QString::number(beam -180 ) ); } else { gradLongLabel->setText( QString::number(beam + 180 ) ); } distShortLabel->setText( QString::number( locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); distLongLabel->setText( QString::number( 40000 - locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); } else { clearInfoFromLocators(); return; } } else { clearInfoFromLocators(); return ; } } void InfoWidget::setLocalLocator(const QString &_loc) { if (locator->isValidLocator(_loc)) { localLocator = _loc; } } void InfoWidget::setDXLocator(const QString &_loc) { if (locator->isValidLocator(_loc)) { dxLocator = _loc; } } klog-1.8.6/INSTALL.txt0000644000175000017500000000031214166020407013305 0ustar develdevelThis file is about the installation process of KLog. Please read: INSTALL-linux.txt for linux installations. INSTALL-macOS.txt for macOS installations. INSTALL-win.txt for Windows installations. klog-1.8.6/softwareupdate.cpp0000644000175000017500000004036014166020407015206 0ustar develdevel/*************************************************************************** softwareupdate.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "softwareupdate.h" //#include SoftwareUpdate::SoftwareUpdate(const QString &_klogVersion) : QObject(nullptr) { //qDebug() << "SoftwareUpdate::SoftwareUpdate(): " << _klogVersion << QT_ENDL; util = new Utilities; updateDialog = new SoftwareUpdateDialog(); latestVersion = "0.0"; //updateDialog->setVersion(_klogVersion, fale); //toUpdate = false; repositoryFound = false; url = new QUrl; //klogDir = _klogDir; setVersion(_klogVersion); //klogVersion = _klogVersion; //latestVersion = "0.0"; callsign = QString(); OSString = QString(); //result = -1; // Error unknown //reply = new QNetworkReply; //manager = new QNetworkAccessManager(this); //request = new QNetworkRequest(this); //request.setUrl(QUrl("http://localhost")); //request.setUrl(QUrl("https://download.savannah.gnu.org/releases/klog/")); //request.setUrl(QUrl("http://www.klog.xyz/download")); //setTheURL("http://download.klog.xyz/win"); //request.setUrl(QUrl("http://download.klog.xyz")); messageShown = false; OSVersion = QOperatingSystemVersion::currentType(); //qDebug() << "SoftwareUpdate::SoftwareUpdate OSVersion:: " << QString::number(OSVersion) << QT_ENDL; findOS(QOperatingSystemVersion::currentType()); setHeader(); //qDebug() << "SoftwareUpdate::SoftwareUpdate(): - END" << QT_ENDL; } void SoftwareUpdate::findOS(const int _os) { //qDebug() << "SoftwareUpdate::findOS(): " << QString::number(_os) << QT_ENDL; switch (_os) { case QOperatingSystemVersion::MacOS: OSString = QString("osx"); //qDebug() << "SoftwareUpdate::findOS(): macOS" << QT_ENDL; break; case QOperatingSystemVersion::Windows: //qDebug() << "SoftwareUpdate::findOS(): Windows" << QT_ENDL; OSString = QString("win"); break; case QOperatingSystemVersion::Unknown: //qDebug() << "SoftwareUpdate::findOS(): Unknown" << QT_ENDL; OSString = QString(); break; //qDebug() << "SoftwareUpdate::findOS(): OTHER" << QT_ENDL; default: // should never be reached break; } //qDebug() << "SoftwareUpdate::findOS() - END" << QT_ENDL; } SoftwareUpdate::~SoftwareUpdate() { } /* void SoftwareUpdate::setTheURL(QString _url) { //qDebug() << "SoftwareUpdate::setTheURL: " << _url << QT_ENDL; // request.setUrl(QUrl(_url)); } */ void SoftwareUpdate::setVersion(const QString &_klogVersion) { //qDebug() << "SoftwareUpdate::setVersion: " << _klogVersion << QT_ENDL; klogVersion = _klogVersion; latestVersion = klogVersion; setHeader(); //qDebug() << "SoftwareUpdate::setVersion: END " << QT_ENDL; } void SoftwareUpdate::slotReadyRead() { //qDebug() << "SoftwareUpdate::slotReadyRead: " << QT_ENDL; } /* void SoftwareUpdate::slotError(int _p) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << QString::number(_p) << QT_ENDL; #else #endif } */ void SoftwareUpdate::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "SoftwareUpdate::slotDownloadFinished" << QT_ENDL; QUrl url = reply->url(); //qDebug() << "SoftwareUpdate::slotDownloadFinished - URL: " << url.toString() << QT_ENDL; if (url.toString().length()< QString("https://api.github.com/repos/ea4k/klog/releases/latest").length()) //if (url.toString().length()< QString("https://download.klog.xyz").length()) { //qDebug() << "SoftwareUpdate::slotDownloadFinished - URL: URL too short" << QT_ENDL; return; } //QMessageBox msgBox; //QString aux; //aux.clear(); QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (reply->error()) { //qDebug() << "SoftwareUpdate::slotDownloadFinished: reply error: " << QString::number(reply->error()) << QT_ENDL; } else if (!redirectionTarget.isNull()) { repositoryFound = false; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); //qDebug() << "SoftwareUpdate::slotDownloadFinished: Redirect: " << newUrl.toString() << QT_ENDL; url = newUrl; reply->deleteLater(); //request.setUrl(QUrl(url.toString())); //setTheURL(url.toString()); connectToURL(url.toString()); //qDebug() << "SoftwareUpdate::slotDownloadFinished - end After connect" << QT_ENDL; return; } else { //qDebug() << "SoftwareUpdate::slotDownloadFinished: no redirection" << QT_ENDL; if (checkUpdates(reply)) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates true" << QT_ENDL; if (repositoryFound) { //qDebug() << "SoftwareUpdate::slotDownloadFinished repository found" << QT_ENDL; if(latestVersion>klogVersion) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates should update!" << QT_ENDL; updateDialog->setVersion(latestVersion, true); } updateDialog->show(); latestVersion = klogVersion; repositoryFound = false; } } else { if (repositoryFound && messageShown) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates false!" << QT_ENDL; updateDialog->setVersion(latestVersion, false); updateDialog->show(); } //qDebug() << "SoftwareUpdate::slotDownloadFinished: checkupdates false" << QT_ENDL; } } reply->deleteLater(); //manager->deleteLater(); //qDebug() << "SoftwareUpdate::slotDownloadFinished end" << QT_ENDL; } bool SoftwareUpdate::checkUpdates(QIODevice *data) { // Checks if there is a new version in the repository //qDebug() << "SoftwareUpdate::checkUpdates: " << QString::number(data->size()) << QT_ENDL; QString line, release; QStringList stringList, klogStringList; QRegularExpression rx; QString filterString; QString fileExtension; //int SO = 2; // 1 = linux, 2 = windows, 3 = macOS switch (OSVersion) { case QOperatingSystemVersion::Unknown: //qDebug() << "MainWindow::checkUpdates - Unknown" << QT_ENDL; rx.setPattern("klog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.tar.gz"); filterString = QString("klog"); fileExtension = QString(".tar.gz"); break; case QOperatingSystemVersion::Windows: //qDebug() << "MainWindow::checkUpdates - Windows" << QT_ENDL; // rx.setPattern("KLog-(\\d+\\.)?(\\d+\\.)?(\\d+)?(-\\d+)?(\\.)?-windows-installer.exe"); rx.setPattern("KLog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?-windows-installer.exe"); filterString = QString("KLog"); fileExtension = QString("-windows-installer.exe"); break; case QOperatingSystemVersion::MacOS: //rx.setPattern("KLog-(\\d+\\.)?(\\d+\\.)?(\\d+)?(-\\d+)?(\\.)?dmg"); rx.setPattern("KLog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.dmg"); filterString = QString("KLog"); fileExtension = QString(".dmg"); //qDebug() << "MainWindow::checkUpdates - macOS" << QT_ENDL; break; default: rx.setPattern("klog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.tar.gz"); filterString = QString("klog"); fileExtension = QString(".tar.gz"); // should never be reached break; } //qDebug() << "SoftwareUpdate::checkUpdates: Before entering the while"<< QT_ENDL; while (!data->atEnd()) { //qDebug() << "SoftwareUpdate::checkUpdates: In the while"<< QT_ENDL; stringList.clear(); klogStringList.clear(); line.clear(); line = data->readLine(); //qDebug() << "SoftwareUpdate::checkUpdates: line: " << line << QT_ENDL; //if ((line.contains("KLog-")) || (line.contains("klog-"))) if ((line.contains("browser_download_url")) || (line.contains("tarball_url"))) { //qDebug() << "SoftwareUpdate::checkUpdates: line contains browser_download_url or tarball_url " << QT_ENDL; repositoryFound = true; stringList << line.split(",", QT_SKIP); klogStringList << stringList.filter(filterString); release = findMatch (rx, fileExtension, klogStringList); if (release.length ()>0) { updateNeeded(release); } /* foreach (QString str, klogStringList) { //qDebug() << "SoftwareUpdate::checkUpdates klog: " << str << QT_ENDL; //str = str.chopped(3); //qDebug() << "SoftwareUpdate::checkUpdates klog - chopped: " << str << QT_ENDL; if (rx.match(str).hasMatch()) { //qDebug() << "SoftwareUpdate::checkUpdates: MATCH: " << str << QT_ENDL; release = str.section("-",1); //qDebug() << "SoftwareUpdate::checkUpdates: MATCH-1: " << str << QT_ENDL; release = release.section(fileExtension, 0, 0); //qDebug() << "SoftwareUpdate::checkUpdates: MATCH-2: " << str << QT_ENDL; //release = release.section("^.*([.]tar[.]gz)", 0, 0); //release = release.section("^.*\\.(tar.gz)?", 0, 0); updateNeeded(release); } else { //qDebug() << "SoftwareUpdate::checkUpdates: DOES NOT MATCH: " << str << QT_ENDL; } } */ //qDebug() << "SoftwareUpdate::checkUpdates: " << line << QT_ENDL; } } //qDebug() << "SoftwareUpdate::checkUpdates:Latest/Actual: " << latestVersion << "/" << klogVersion << QT_ENDL; if (latestVersion > klogVersion) { emit updateNeededSignal (true); //qDebug() << "SoftwareUpdate::checkUpdates: signal true" << QT_ENDL; return true; } else { //emit updateNeededSignal (false); //qDebug() << "SoftwareUpdate::checkUpdates: signal alse 1" << QT_ENDL; return false; } //emit updateNeededSignal (false); //qDebug() << "SoftwareUpdate::checkUpdates: signal false 2" << QT_ENDL; //return false; } QString SoftwareUpdate::findMatch(QRegularExpression rx, const QString &fileExtension, const QStringList &data) { QString release = QString(); foreach (QString str, data) { //qDebug() << "SoftwareUpdate::findMatch klog: " << str << QT_ENDL; //str = str.chopped(3); //qDebug() << "SoftwareUpdate::findMatch klog - chopped: " << str << QT_ENDL; if (rx.match(str).hasMatch()) { //qDebug() << "SoftwareUpdate::findMatch: MATCH: " << str << QT_ENDL; release = str.section("-",1); //qDebug() << "SoftwareUpdate::findMatch: MATCH-1: " << str << QT_ENDL; release = release.section(fileExtension, 0, 0); //qDebug() << "SoftwareUpdate::findMatch: MATCH-2: " << str << QT_ENDL; return release; } else { //qDebug() << "SoftwareUpdate::findMatch: DOES NOT MATCH: " << str << QT_ENDL; } } return release; } void SoftwareUpdate::updateNeeded(const QString &_newVer) { //qDebug() << "SoftwareUpdate::updateNeeded: new: " << _newVer << QT_ENDL; //qDebug() << "SoftwareUpdate::updateNeeded: cur: " << latestVersion << QT_ENDL; if (latestVersion< _newVer) { latestVersion = _newVer; } /* if (klogVersion < _newVer) { //qDebug() << "SoftwareUpdate::updateNeeded TRUE: " << _newVer << QT_ENDL; if } else { //qDebug() << "SoftwareUpdate::updateNeeded - FALSE " << _newVer << QT_ENDL; } */ //qDebug() << "SoftwareUpdate::updateNeeded - KLogVersion/latestVersion/newver: "<< klogVersion <<"/"<< latestVersion << "/"<<_newVer << QT_ENDL; } void SoftwareUpdate::needToUpdate(bool _showWithoutVersion) { // This is used to connect to the main server URL. // If _showWithoutVersion is false: We are checking for new versions at KLog start: No message should be shown if no new version is found. // If _showWithoutVersion is true: The user is manually asking to check. A message should is shown if no new version is found. //qDebug() << "SoftwareUpdate::needToUpdate (current version: " << klogVersion << ")" << QT_ENDL; messageShown = _showWithoutVersion; setVersion(klogVersion); //setTheURL("http://download.klog.xyz"); connectToURL("https://api.github.com/repos/ea4k/klog/releases/latest"); //connectToURL("https://download.klog.xyz/" + OSString); //qDebug() << "SoftwareUpdate::neededToUpdate - END" << QT_ENDL; } void SoftwareUpdate::connectToURL(const QString &_url) { // This is where the connection takes place.... so first connection may be the main URL but it launches connection after redirections //qDebug() << "SoftwareUpdate::connectToURL: " << _url << QT_ENDL; QNetworkAccessManager *manager = new QNetworkAccessManager(this); //connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); //request.setUrl(QUrl(_url)); manager->get(QNetworkRequest(QUrl(_url))); QNetworkReply *reply = manager->get(request); connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "SoftwareUpdate::conectToURL - END" << QT_ENDL; } void SoftwareUpdate::setHeader() { //qDebug() << "SoftwareUpdate::setHeader" << QT_ENDL; QString ver = util->getAgent(klogVersion); //qDebug() << "SoftwareUpdate::setHeader - ver: " << ver << QT_ENDL; if (callsign.length()>2) { ver = ver + "-" + callsign; } QByteArray str; str.clear(); str.append(ver.toUtf8 ()); //qDebug() << "SoftwareUpdate::setHeader: " << str << QT_ENDL; request.setRawHeader("User-Agent", str); //qDebug() << "SoftwareUpdate::setHeader - END" << QT_ENDL; } void SoftwareUpdate::addCall(const QString &_call) { //qDebug() << "SoftwareUpdate::addCall: " << _call << QT_ENDL; if (_call.length()>2) { callsign = _call; setHeader(); } //qDebug() << "SoftwareUpdate::addCall - END" << QT_ENDL; } klog-1.8.6/mainwindow.cpp0000644000175000017500000122234114166020421014323 0ustar develdevel/*************************************************************************** mainwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "global.h" #include #include #include #include #include #include "database.h" #include "mainwindow.h" //using namespace G_callsignCheck; //#include //extern bool g_callsignCheck; MainWindow::MainWindow(const QString &_klogDir, const QString &tversion) { //qDebug() << Q_FUNC_INFO << ": " << _klogDir << " Ver: " << tversion << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; g_callsignCheck = true; showKLogLogWidget = new ShowKLogLogWidget; showErrorDialog = new ShowErrorDialog(); UDPLogServer = new UDPServer(); util = new Utilities; qso = new QSO; softwareVersion = tversion; klogDir = _klogDir; logSeverity = Info; sendQSLByDefault = true; // This must be before reading the config dupeSlotInSeconds = 0; needToEnd = false; upAndRunning = false; // To define some actions that can only be run when starting the software QRZCOMAutoCheckAct = new QAction(tr("Check always the current callsign in QRZ.com"), this); QRZCOMAutoCheckAct->setCheckable(true); QRZCOMAutoCheckAct->setChecked(false); //qDebug() << "MainWindow::MainWindow: Debug File: "<< util->getDebugLogFile() << QT_ENDL; debugFile = new QFile(util->getDebugLogFile()); //qDebug() << Q_FUNC_INFO << ": BEFORE HAMLIB " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; hamlib = new HamLibClass(); //qDebug() << Q_FUNC_INFO << ": AFTER HAMLIB " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; dataProxy = new DataProxy_SQLite(Q_FUNC_INFO, softwareVersion); lotwUtilities = new LoTWUtilities(klogDir, softwareVersion, Q_FUNC_INFO, dataProxy); eqslUtilities = new eQSLUtilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": Before DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; dxccStatusWidget = new DXCCStatusWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": After DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; elogClublog = new eLogClubLog(); //qDebug() << Q_FUNC_INFO << ": 00082: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; elogQRZcom = new eLogQrzLog(dataProxy, Q_FUNC_INFO, softwareVersion); //qDebug() << Q_FUNC_INFO << ": 00083: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; updateSatsData = new UpdateSatsData(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00084: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; statsWidget = new StatisticsWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00085: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; infoLabel1 = new QLabel(tr("Status bar ...")); infoLabel2 = new QLabel(tr("DX Entity")); //qDebug() << "MainWindow::MainWindow: 00086" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logWindow = new LogWindow(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; searchWidget = new SearchWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087.1: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //advancedSearchWidget = new AdvancedSearchWidget(dataProxy, this); //qDebug() << "MainWindow::MainWindow: 00087.2" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; infoWidget = new InfoWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00088: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logEvent(Q_FUNC_INFO, "Creating AwardsWidget", Debug); awardsWidget = new AwardsWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 0009: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; aboutDialog = new AboutDialog(softwareVersion); tipsDialog = new TipsDialog(); downloadcty = new DownLoadCTY(klogDir, softwareVersion); statusBarMessage = tr("Starting KLog"); if (!QDir::setCurrent ( klogDir )){ QDir d1(klogDir); if (d1.mkdir(klogDir)) { QDir::setCurrent ( klogDir ); } } //qDebug() << Q_FUNC_INFO << ": 40: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; world = new World(dataProxy, klogDir, softwareVersion, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": 50: " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; configFileName = util->getCfgFile(); setupDialog = new SetupDialog(dataProxy, configFileName, softwareVersion, 0, !configured, this); //qDebug() << Q_FUNC_INFO << ": satTabWidget to be created " << QT_ENDL; satTabWidget = new MainWindowSatTab(dataProxy); QSOTabWidget = new MainWindowInputQSO(dataProxy); myDataTabWidget = new MainWindowMyDataTab(); commentTabWidget = new MainWindowInputComment(); othersTabWidget = new MainWindowInputOthers(dataProxy); eQSLTabWidget = new MainWindowInputEQSL(dataProxy); QSLTabWidget = new MainWindowInputQSL(dataProxy); mainQSOEntryWidget = new MainQSOEntryWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": locator to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; locator = new Locator(); mainWidget = new QWidget(this); setCentralWidget(mainWidget); //qDebug() << Q_FUNC_INFO << ": 8 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; dateTime = new QDateTime(); dateTimeTemp = new QDateTime(); // UI DX infoLabel2 = new QLabel(tr("DX Entity")); loggWinAct = new QAction(tr("&Log Window"), this); //qDebug() << Q_FUNC_INFO << ": dxclusterwidget to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; dxClusterWidget = new DXClusterWidget(dataProxy, dxclusterServerToConnect , dxclusterServerPort, this); //qDebug() << Q_FUNC_INFO << ": Awards to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": Awards created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; // if (needToEnd) { exit(0); } //qDebug() << Q_FUNC_INFO << ": Software update to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; softUpdate = new SoftwareUpdate(softwareVersion); //qDebug() << Q_FUNC_INFO << ": FileManager to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; filemanager = new FileManager(dataProxy, klogDir, softwareVersion); //qDebug() << Q_FUNC_INFO << ": FileAwardManager to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); lotwCallTQSL = new QAction(tr("Upload the queued QSOs to LoTW"), this); //qDebug() << Q_FUNC_INFO << ": AdifLoTWExportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; adifLoTWExportWidget = new AdifLoTWExportWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": ShowAdifImportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; showAdifImportWidget = new ShowAdifImportWidget(dataProxy, Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << Q_FUNC_INFO << ": END " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } MainWindow::~MainWindow() { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (hamlibActive) { hamlib->stop(); } delete(showErrorDialog); delete(lotwUtilities); delete(eqslUtilities); delete(elogQRZcom); delete(elogClublog); delete(downloadcty); delete(world); delete(locator); delete(qso); delete(debugFile); delete(dateTime); delete(dateTimeTemp); delete(awards); delete(softUpdate); delete(filemanager); delete(fileAwardManager); logEvent(Q_FUNC_INFO, "KLog exit", Info); } void MainWindow::saveWindowsSize() { //qDebug() << "MainWindow::saveWindows" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); windowSize = this->size(); int height = windowSize.height(); int width = windowSize.width(); //qDebug() << "MainWindow::windowsSizeAndPosition: /" << QString::number(width) << "/" << QString::number(height) << ")" << QT_ENDL; //qDebug() << "MainWindow::windowsSizeAndPosition: Heigth: " << QString::number(height) << QT_ENDL; //qDebug() << "MainWindow::windowsSizeAndPosition: Width: " << QString::number(width) << QT_ENDL; //(const QString& _filename, const QString &_field, const QString &_value) filemanager->modifySetupFile(configFileName, "MainWindowSize", QString::number(width) + "x" + QString::number(height)); //return QString::number(width) + "x" + QString::number(height); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::windowsSizeAndPosition: END" << QT_ENDL; } void MainWindow::setWindowSize(const QSize &_size) { logEvent(Q_FUNC_INFO, "Start", logSeverity); //QSize size; //size.setHeight(_height); //size.setWidth(_width); if (_size.isValid ()) { this->resize(_size); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::init() { //qDebug() << "MainWindow::init: START " << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; if (!debugFile->open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ { debugFileOpen = false; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not open")); QString aux = tr("It was not possible to open the debug file for writing. No debug log will be saved!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { debugFileOpen = true; logEvent(Q_FUNC_INFO, "KLog started!", Info); } logEvents = true; hamlib->initClass(); util->setCallValidation (true); infoLabel1T = QString(); infoLabel2T = QString(); qso->clear(); //Default band/modes bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW" << "RTTY"; //qDebug() << "MainWindow::init - 00" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; hamlibActive = false; hamlibModeNotADIFSupported = false; hamlibChangingMode = false; yearChangedDuringModification = false; readingTheUI = false; itIsANewversion = false; setCleaning(false); //qDebug() << "MainWindow::init - 10" << QT_ENDL; dxclusterServerToConnect = "dxfun.com"; dxclusterServerPort = 8000; contestMode = "DX"; infoTimeout = 2000; // default timeout defaultADIFLogFile = "klog.adi"; InValidCharsInPrevCall = false; //stationCallSignShownInSearch = true; checkNewVersions = true; reportInfo = false; configured = false; noMoreErrorShown = false; noMoreModeErrorShown = false; qslingNeeded = false; // When clicking on Find QSO to QSL manageMode = false; txFreqBeingAutoChanged = false; //rxFreqBeingChanged = false; updatingBands = false; selectedYear = 0; defaultMode = 1; defaultBand = 1; //qDebug() << "MainWindow::init - 20" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; currentMode = 1; currentModeShown = currentMode; currentBand = 1; currentBandShown = currentBand; currentLog = 1; operatorQRZ = ""; stationCallsign = ""; mainQRZ = ""; //myLocator = ""; dxLocator =""; myPower = 0.0; UDPServerStart = false; // By default the UDP server is started //qDebug() << "MainWindow::init - 30" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; currentEntity = -1; // To optimize the calls to different world methods if the entity does not change. Used in slotQRZTextChanged previousEntity = -1;// To optimize the calls to different world methods if the entity does not change. //realTime=true; //UTCTime=true; completeWithPrevious=false; completedWithPreviousQTH=false; completedWithPreviousLocator=false; completedWithPreviousName=false; completedWithPreviousIOTA=false; completedWithPreviousQSLVia=false; alwaysADIF=false; useDefaultLogFileName=false; needToSave=false; qrzSmallModDontCalculate=false; imperialSystem=false; sendQSLWhenRec = true; manageDxMarathon = false; dxClusterShowHF=true; dxClusterShowVHF=true; dxClusterShowWARC=true; dxClusterShowWorked=true; dxClusterShowConfirmed=true; dxClusterShowAnn=true; dxClusterShowWWV=true; dxClusterShowWCY=true; keepSatPage = false; //qDebug() << "MainWindow::init - 40" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //clublogUser = QString(); clublogPass = QString(); clublogEmail = QString(); clublogActive = false; clublogRealTime = false; //clublogUseStationCallSign = false; eQSLActive = false; eQSLRealTime = false; eQSLUseQSOStationCallSign = false; qrzcomActive = false; lotwActive = false; qrzcomSubscriber = false; qrzcomUser = QString(); qrzcomPass = QString(); callingUpdate = false; // to control whether the update is mannually launched or at the begining //previousQrz = ""; setModifying(false); //qDebug() << "MainWindow::init - 50" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; selectedYear = (dateTime->currentDateTime()).date().year(); loggWinAct->setShortcut(Qt::CTRL + Qt::Key_L); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); // Check date & time and set them in the UI at the begining //dateTime->currentDateTime(); clublogAnswer = -1; defaultColor.setNamedColor("slategrey"); neededColor.setNamedColor("yellow"); workedColor.setNamedColor("blue"); confirmedColor.setNamedColor("red"); newOneColor.setNamedColor("green"); //qDebug() << "MainWindow::init - 60" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; bool existingData = QFile::exists(util->getKLogDBFile()); ctyDatFile = util->getCTYFile(); if (!existingData) { //qDebug() << "MainWindow::init - 61" << QT_ENDL; world->create(ctyDatFile); //qDebug() << "MainWindow::init - 62" << QT_ENDL; } else if (!world->hasSpecialEntities()) { //qDebug() << "MainWindow::init - 63" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - CTY.dat update")); msgBox.setText(tr("KLog needs to update the Entities database.")); msgBox.setDetailedText(tr("You can update the entities database in Tools->Update cty.csv")); msgBox.setInformativeText(tr("Do you want to do it now?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : slotUpdateCTYDAT(); break; default: break; } //qDebug() << "MainWindow::init - 69" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; } //qDebug() << "MainWindow::init - 70" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; readConfigData(); //qDebug() << "MainWindow::init - 71" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; logWindow->createlogPanel(currentLog); //qDebug() << "MainWindow::init - 72" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; awards->setManageModes(manageMode); //qDebug() << "MainWindow::init - 73" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; if (dataProxy->getNumberOfManagedLogs()<1) { //qDebug() << "MainWindow::init - 73.1" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; openSetup(6); //qDebug() << "MainWindow::init - 73.2" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; } //qDebug() << "MainWindow::init - 74" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //checkIfNewBandOrMode(); //qDebug() << "MainWindow::init - 75" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; awardsWidget->fillOperatingYears(); awardsWidget->showAwards(); awardsWidget->setManageDXMarathon(manageDxMarathon); dxClusterWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::init - 80" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //qDebug() << "MainWindow::Init: calling Software update ..." << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; if (checkNewVersions) {//reportInfo if (reportInfo) { softUpdate->addCall(stationCallsign); } softUpdate->needToUpdate(); } //qDebug() << "MainWindow::init - 90" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << "MainWindow::init - 91" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; currentModeShown = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); //qDebug() << "MainWindow::init - 92" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; currentBand = currentBandShown; currentMode = currentModeShown; timerInfoBars = new QTimer(this); //qDebug() << "MainWindow::init: Calling createUI" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; createUI(); //qDebug() << "MainWindow::init: Calling slotClearButtonClicked" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(); infoWidget->showInfo(-1); //lotwTQSLpath = util->getTQSLsPath() + util->getTQSLsFileName(); upAndRunning = true; mainQSOEntryWidget->setUpAndRunning(upAndRunning); startServices(); //qDebug() << "MainWindow::init: END" << (QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; } void MainWindow::createActionsCommon(){ // Functional widgets connections //TODO: Reimplement the possibility to enter a QSO with enter inthe following widgets: //connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); logEvent(Q_FUNC_INFO, "Start", logSeverity); // Return pressed = QSO ENTRY //connect(operatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); //connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(QSOTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(QSOTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotLocatorTextChanged(QString) ) ); //connect(QSOTabWidget, SIGNAL(dxLocatorChanged(QString)) this, SLOT(slotLocatorTextChanged(QString) ) ); //connect(locatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLocatorTextChanged() ) ); connect(myDataTabWidget, SIGNAL(myLocChangedSignal(QString)), this, SLOT(slotMyLocatorTextChanged(QString) ) ); connect(myDataTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(QSOTabWidget, SIGNAL(rxFreqChanged(double)), this, SLOT(slotFreqRXChanged(double) )) ; connect(QSOTabWidget, SIGNAL(txFreqChanged(double)), this, SLOT(slotFreqTXChanged(double) )) ; connect(QSOTabWidget, SIGNAL(handOverFocusSignal()), this, SLOT(slotTakeOverFocusToMainQSOInput() )); connect(loggWinAct, SIGNAL(triggered()), this, SLOT(slotLogWinShow())); //Buttons Actions connect(mainQSOEntryWidget, SIGNAL(handOverFocusSignal()), this, SLOT(slotTakeOverFocusToQSOTabWidget())); connect(mainQSOEntryWidget, SIGNAL(currentQRZSignal(QString)), this, SLOT(slotQRZTextChanged(QString))); connect(mainQSOEntryWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(mainQSOEntryWidget, SIGNAL(showInfoLabel(QString)), this, SLOT(slotShowInfoLabel(QString)) ); connect(mainQSOEntryWidget, SIGNAL(clearForNextQSOSignal()), this, SLOT(slotClearButtonClicked()) ); connect(mainQSOEntryWidget, SIGNAL(OKClicked()), this, SLOT(slotQRZReturnPressed() ) ); connect(mainQSOEntryWidget, SIGNAL(bandChanged(QString)), this, SLOT(slotBandChanged(QString) ) ); connect(mainQSOEntryWidget, SIGNAL(modeChanged(QString)), this, SLOT(slotModeChanged(QString) ) ); connect(mainQSOEntryWidget, SIGNAL(validBands(QStringList)), this, SLOT(slotValidBandsReceived(QStringList) ) ); connect(mainQSOEntryWidget, SIGNAL(hamlibSetActiveSignal(bool)), this, SLOT(slotActiveHamlib(bool) ) ); // LOGVIEW connect(logWindow, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(logWindow, SIGNAL(actionDeleteQSO ( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(logWindow, SIGNAL(deleteTheseQSOs ( QList ) ), this, SLOT(slotQSOsDelete(QList) ) ); connect(logWindow, SIGNAL(exportToADIFTheseQSOs ( QList ) ), this, SLOT(slotQSOsExportToADIF(QList) ) ); //connect(logWindow, SIGNAL(uploadToQRZcomTheseQSOs ( QList ) ), this, SLOT(slotQRZcomUpload(QList) ) ); connect(logWindow, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(logWindow, SIGNAL(updateSearchText()), this, SLOT(slotSearchBoxTextChanged() ) ); //When a QSO is deleted connect(logWindow, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); //CLUSTER //void clusterSpotToLog(const QStringList _qs); //SIGNAL dxspotclicked(const QStringList _qs) connect(dxClusterWidget, SIGNAL(dxspotclicked(QStringList)), this, SLOT(slotAnalyzeDxClusterSignal(QStringList) ) ); // CLUBLOG connect (elogClublog, SIGNAL (showMessage(QString)), this, SLOT (slotElogClubLogShowMessage(QString))); connect (elogClublog, SIGNAL (actionReturnDownload(int, int)), this, SLOT (slotElogClubLogProcessAnswer(int, int))); connect (elogClublog, SIGNAL (disableClubLogAction(bool)), this, SLOT (slotElogClubLogDisable(bool))); connect (elogClublog, SIGNAL (signalFileUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogClubLogFileUploaded(QNetworkReply::NetworkError, QList))); //connect (eqslUtilities, SIGNAL (actionReturnDownload(int, int)), this, SLOT (slotElogClubLogProcessAnswer(int, int))); //connect (eqslUtilities, SIGNAL (disableClubLogAction(bool)), this, SLOT (slotElogClubLogDisable(bool))); connect (eqslUtilities, SIGNAL (showMessage(QString)), this, SLOT (slotElogClubLogShowMessage(QString))); connect (eqslUtilities, SIGNAL (signalFileUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogEQSLFileUploaded(QNetworkReply::NetworkError, QList))); // QRZCOM connect (elogQRZcom, SIGNAL (showMessage(QString)), this, SLOT (slotElogQRZCOMShowMessage(QString))); connect (elogQRZcom, SIGNAL (dataFoundSignal(QString, QString)), this, SLOT (slotElogQRZCOMFoundData(QString, QString))); connect (elogQRZcom, SIGNAL (signalLogUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogQRZCOMLogUploaded(QNetworkReply::NetworkError, QList))); //connect (elogQRZcom, SIGNAL (disableQRZAction(bool)), this, SLOT (slotElogQRZCOMDisable(bool))); // SATELLITE TAB //connect (satTabWidget, SIGNAL (satBandTXChanged(QString)), this, SLOT (slotSatBandTXComboBoxChanged(QString))); //connect(satTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); connect(world, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); // QSL TAB connect(QSLTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); // SEARCH TAB connect(searchWidget, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(searchWidget, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(searchWidget, SIGNAL(logRefresh() ), this, SLOT(slotLogRefresh() ) ); connect(searchWidget, SIGNAL(toStatusBar(QString) ), this, SLOT(slotUpdateStatusBar(QString) ) ); connect(searchWidget, SIGNAL(requestBeingShown() ), this, SLOT(slotShowSearchWidget() ) ); connect(searchWidget, SIGNAL(actionQSODelete( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(searchWidget, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(awards, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(awards, SIGNAL(awardDXCCUpdated()), this, SLOT(slotRefreshDXCCWidget()) ); connect(awardsWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(awardsWidget, SIGNAL(requireCurrentLogSignal()), this, SLOT(slotAwardsWidgetSetLog()) ); connect(awardsWidget, SIGNAL(requireCurrentYearSignal()), this, SLOT(slotAwardsWidgetSetYear()) ); //DXCCWIDGET TAB //connect(dxccStatusWidget, SIGNAL(showQso(int)), this, SLOT(slotShowQSOFromDXCCWidget(int) ) ); connect(dxccStatusWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(dxccStatusWidget, SIGNAL(showQsos(QList)), this, SLOT(slotShowQSOsFromDXCCWidget(QList) ) ); connect(dxccStatusWidget, SIGNAL(fillInQSOSignal()), this, SLOT(fillQSOData()) ); //connect(dxccStatusWidget, SIGNAL(updateAwards()), this, SLOT(slotShowAwards() ) ); connect(filemanager, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(filemanager, SIGNAL(addQSOToList(QStringList)), this, SLOT(slotReceiveQSOListToShowFromFile(QStringList)) ); //connect(scoreeWinAct, SIGNAL(triggered()), this, SLOT(slotScoreWinShow())); // UDPLogServer - WSJT-x connect(UDPLogServer, SIGNAL(status_update(int, QString, double, QString, QString, QString, QString, QString, QString)), this, SLOT(slotWSJXstatusFromUDPServer(int, QString, double, QString, QString, QString, QString, QString, QString) ) ); connect(UDPLogServer, SIGNAL( logged_qso(QString, QString, QString, double, QString, QString, QString, QString, QString, QString, QString, QString, QDateTime, QDateTime, QString, QString, QString)), this, SLOT(slotWSJTXloggedQSO (QString, QString, QString, double, QString, QString, QString, QString, QString, QString, QString, QString, QDateTime, QDateTime, QString, QString, QString) ) ); connect(UDPLogServer, SIGNAL(clearSignal()), this, SLOT(slotClearButtonClicked() ) ); connect(this, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(setupDialog, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(setupDialog, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(setupDialog, SIGNAL(exitSignal(int)), this, SLOT(slotExitFromSlotDialog(int)) ); connect(setupDialog, SIGNAL(qrzcomAuto(bool)), this, SLOT(slotElogQRZCOMAutoCheckFromSetup(bool)) ); connect(setupDialog, SIGNAL(finished(int)), this, SLOT(slotSetupDialogFinished(int)) ); connect(tipsDialog, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(tipsDialog, SIGNAL(findQSL2QSOSignal()), this, SLOT(slotSearchToolNeededQSLToSend()) ); connect(tipsDialog, SIGNAL(fillInDXCCSignal()), this, SLOT(slotFillEmptyDXCCInTheLog()) ); connect(tipsDialog, SIGNAL(fillInQSOSignal()), this, SLOT(fillQSOData()) ); connect(tipsDialog, SIGNAL(fileExportToPrintSignal()), this, SLOT(slotRQSLExport()) ); //connect(tipsDialog, SIGNAL(fileExportForLoTWSignal()), this, SLOT(slotLoTWExport())); connect(tipsDialog, SIGNAL(fileOpenKLogFolderSignal()), this, SLOT(slotOpenKLogFolder())); connect(tipsDialog, SIGNAL(toolSendPendingQSLSignal()), this, SLOT(slotToolSearchRequestedQSLToSend())); connect(tipsDialog, SIGNAL(toolRecPendingQSLSignal()), this, SLOT(slotToolSearchNeededQSLPendingToReceive())); connect(tipsDialog, SIGNAL(toolRecRecPendingQSLSignal()), this, SLOT(slotToolSearchNeededQSLRequested())); connect(tipsDialog, SIGNAL(toolsUploadLoTWSignal()), this, SLOT(slotLoTWExport())); connect(satTabWidget, SIGNAL(newBandsToBeAdded(QStringList)), this, SLOT(slotDefineNewBands(QStringList)) ); connect(satTabWidget, SIGNAL(satTxFreqChanged(double)), this, SLOT(slotFreqTXChanged(double) ) ); connect(satTabWidget, SIGNAL(satRxFreqChanged(double)), this, SLOT(slotFreqRXChanged(double) ) ); connect(satTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotUpdateLocator(QString)) ); connect(satTabWidget, SIGNAL(setPropModeSat(QString, bool)), this, SLOT(slotSetPropModeFromSat(QString, bool)) ) ; connect(satTabWidget, SIGNAL(satTXFreqNeeded(double)), this, SLOT(slotFreqTXChanged(double))); connect(satTabWidget, SIGNAL(satRXFreqNeeded(double)), this, SLOT(slotFreqRXChanged(double))); connect(satTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); connect(othersTabWidget, SIGNAL(setPropMode(QString)), this, SLOT(slotSetPropModeFromOther(QString)) ) ; connect(downloadcty, SIGNAL(done(bool)), this, SLOT(slotWorldReload(bool)) ); connect(timerInfoBars, SIGNAL(timeout()), this, SLOT(slotTimeOutInfoBars()) ); connect(hamlib, SIGNAL(freqChanged(double)), this, SLOT(slotHamlibTXFreqChanged(double)) ); connect(hamlib, SIGNAL(modeChanged(QString)), this, SLOT(slotHamlibModeChanged(QString)) ); connect(lotwUtilities, SIGNAL(actionProcessLoTWDownloadedFile(QString)), this, SLOT(slotLoTWDownloadedFileProcess(QString)) ); connect(adifLoTWExportWidget, SIGNAL(selection(QString, QDate, QDate, ExportMode)), this, SLOT(slotADIFExportSelection(QString, QDate, QDate, ExportMode)) ); connect(dataProxy, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(dataProxy, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); //connect(this, SIGNAL(focusC), this, SLOT(slotTimeOutInfoBars()) ); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::recommendBackupIfNeeded() { //qDebug() << "MainWindow::recommendBackupIfNeeded" << QT_ENDL; if (dataProxy->getHowManyQSOInLog(-1)<1) { return; } QDateTime lastBackupDate; lastBackupDate = QDateTime(); lastBackupDate = filemanager->getDateTimeOfLastBackup(); //qDebug() << "MainWindow::recommendBackupIfNeeded lastDate: " << util->getDateTimeSQLiteStringFromDateTime(lastBackupDate) << QT_ENDL; bool backupNeeded = false; QString msg; if (lastBackupDate == QDateTime()) { backupNeeded = true; msg = tr("It seems that you have never done a backup or exported your log to ADIF."); } else if (lastBackupDate.addMonths(1) < QDateTime::currentDateTime()) { //qDebug() << "MainWindow::recommendBackupIfNeeded More than a month" << QT_ENDL; backupNeeded = true; msg = tr("It seems that the latest backup you did is older than one month."); } if (backupNeeded) { //qDebug() << "MainWindow::recommendBackupIfNeeded We need to backup" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); //msg = msg + tr("Do you want to backup your logs now?"); //msgBox.setText(msg); msgBox.setWindowTitle(tr("Log backup recommended!")); msgBox.setText(msg); msgBox.setInformativeText(tr("It is a good practice to backup your full log regularly to avoid loosing data in case of a problem.\n" "Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ...\n\n" "KLog will remind you to backup on a monthly basis.\n\n")); msgBox.addButton(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: //QString filename = (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmm") + "-klogbackup.adi"; QString filename = util->getBackupADIFile(); //qDebug() << "MainWindow::recommendBackupIfNeeded: Backup to: " << filename << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Backup")); if (filemanager->adifLogExport(filename, 0)) // 0 will save ALL the logs) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The backup was done successfully")); msgBox.setInformativeText(tr("KLog will remind you to backup your data again in aprox one month.")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The backup was not properly done.")); msgBox.setInformativeText(tr("It is recommended to backup your data periodically to prevent lose or corruption of your log.")); } msgBox.exec(); break; } } //qDebug() << "MainWindow::recommendBackupIfNeeded - END" << QT_ENDL; } void MainWindow::checkIfNewVersion() { //qDebug() << "MainWindow::checkIfNewVersion" << QT_ENDL; //itIsANewversion = true; if (itIsANewversion) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - New version detected!")); msgBox.setText(tr("It seems that you are running this version of KLog for the first time.")); msgBox.setInformativeText(tr("The setup will be open to allow you to do any new setup you may need.")); msgBox.exec(); openSetup(0); } //qDebug() << "MainWindow::checkIfNewVersion - END" << QT_ENDL; } void MainWindow::createStatusBar() { logEvent(Q_FUNC_INFO, "Start", logSeverity); statusBar()->showMessage(tr("Ready")); logEvent(Q_FUNC_INFO, "END", logSeverity); } /* void MainWindow::slotWorldMapShow() { //worldMapWidget->resize(500,300); //worldMapWidget->loadMap(); worldMapWidget->show(); } */ void MainWindow::setMainWindowTitle() { QString aux = dataProxy->getCommentsFromLog(currentLog); int numberOfQSOs = dataProxy->getHowManyQSOInLog (currentLog); //qDebug() << "MainWindow::setMainWindowTitle: (comment): " << aux << QT_ENDL; QString msg; if (mainQRZ == stationCallsign) { msg = QString(tr("KLog-%1 - Logbook of %2 - QSOs: %3" )).arg(softwareVersion).arg(stationCallsign).arg(numberOfQSOs); } else { msg = QString(tr("KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4" )).arg(softwareVersion).arg(mainQRZ).arg(stationCallsign).arg(numberOfQSOs); } if (aux.length ()>0) { setWindowTitle(QString("%1 - %2").arg(msg).arg(aux)); } else { setWindowTitle(msg); } } void MainWindow::createUI() { //qDebug() << "MainWindow::createUI" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); createStatusBar(); setWindowTitle(tr("KLog")); createUIDX(); createActionsCommon(); createMenusCommon(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::createUI-END" << QT_ENDL; } void MainWindow::slotTimeOutInfoBars() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::slotTimeOutInfoBars - Start" << QT_ENDL; slotShowInfoLabel(infoLabel1T); //slotShowInfoLabel(infoLabel2T); //infoLabel1->setText(infoLabel1T); infoLabel2->setText(infoLabel2T); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::setModeFromFreq() { //TODO: define frequency ranges for the different modes if (hamlibActive) { if (QSOTabWidget->getTXFreq () >= dataProxy->getLowLimitBandFromBandName("20M")) { hamlib->setMode("USB"); } else { hamlib->setMode("LSB"); } if (!hamlibChangingMode) { hamlib->setMode(mainQSOEntryWidget->getMode()); } } } void MainWindow::slotBandChanged (const QString &_b) { //qDebug() << "MainWindow::slotBandChanged: " << _b << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if ((!upAndRunning) || (_b.length()<2)) { //qDebug() << "MainWindow::slotBandChanged: !upAndRunning or band short" << QT_ENDL; return; } if (updatingBands) { //qDebug() << "MainWindow::slotBandChanged: updating Bands" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } bool isFRinBand = dataProxy->isThisFreqInBand(_b, QString::number(QSOTabWidget->getTXFreq ())); if ((isFRinBand) && (QSOTabWidget->getTXFreq () >0 )) { // No change in txFreq //qDebug() << "MainWindow::slotBandChanged: isFRinBand and Freq >0" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } currentBandShown = dataProxy->getIdFromBandName(_b); currentModeShown = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); currentBand = currentBandShown; currentMode = currentModeShown; if ((!isFRinBand) || (QSOTabWidget->getTXFreq()<=0)) { //qDebug() << "MainWindow::slotBandChanged: Freq is not in band or empty" << QT_ENDL; //qDebug() << "MainWindow::slotBandChanged: Band: " << mainQSOEntryWidget->getBand() << QT_ENDL; //qDebug() << "MainWindow::slotBandChanged: Freq: " << QString::number(QSOTabWidget->getTXFreq()) << QT_ENDL; double txFr = (dataProxy->getFreqFromBandId(currentBandShown)).toDouble(); //qDebug() << "MainWindow::slotBandChanged: New Freq: " << QString::number(txFr) << QT_ENDL; slotFreqTXChanged (txFr); //if (!dataProxy->isThisFreqInBand(_b, QString::number(rxFreqSpinBox->value()))) //{ // rxFreqSpinBox->setValue(QSOTabWidget->getTXFreq()); //} } //qDebug() << "MainWindow::slotBandChanged: Checking to update Freq - DONE" << QT_ENDL; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); //qDebug() << "MainWindow:: - calling showStatusOfDXCC-02 " << QT_ENDL; showStatusOfDXCC(_qs); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotBandChanged: END" << QT_ENDL; } void MainWindow::slotModeChanged (const QString &_m) { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!upAndRunning) { return; } //qDebug() << "MainWindow::slotModeChanged: " << _m << QT_ENDL; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBandShown2: " << QString::number(currentBandShown) << QT_ENDL; currentModeShown = dataProxy->getIdFromModeName(_m); currentBand = currentBandShown; currentMode = currentModeShown; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); //qDebug() << "MainWindow:: - calling showStatusOfDXCC-01 " << QT_ENDL; _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); showStatusOfDXCC(_qs); QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); QString _modeSeen = mainQSOEntryWidget->getMode(); if (_modeSeen == "SSB") { setModeFromFreq(); } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotModeComboBoxChanged2: " << mainQSOEntryWidget->getMode() << QT_ENDL; } void MainWindow::slotQRZReturnPressed() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::slotQRZReturnPressed: " << QT_ENDL; if (mainQSOEntryWidget->getQrz().length()<=0) { //qDebug() << "MainWindow::slotQRZReturnPressed: no QRZ" << QT_ENDL; return; } readingTheUI = true; //int errorCode = 0; // Just to prepare or some tasks before reading DATA from UI QSqlQuery query; QString queryString = readDataFromUI(); //qDebug() << "MainWindow::slotQRZReturnPressed: queryString: " << queryString << QT_ENDL; if (queryString != "NULL") { if (!query.exec(queryString)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "MainWindow::slotQRZReturnPressed: Query ERROR: (queryString): " << queryString << QT_ENDL; //errorCode = query.lastError().nativeErrorCode(); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Unexpected error")); msgBox.setIcon(QMessageBox::Warning); QString aux = tr("An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: "); msgBox.setText(aux + "MW-1: " + query.lastError().nativeErrorCode()); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } else { query.finish(); //TODO: To move the following lines to this part to properly manage the query result!! //ret = true; //qDebug() << "MainWindow::slotQRZReturnPressed: QSO Added! " << QT_ENDL; actionsJustAfterAddingOneQSO(); //slotClearButtonClicked(); } } else // The QUERY string is NULL { logEvent(Q_FUNC_INFO, "END-2", logSeverity); //qDebug() << "MainWindow::slotQRZReturnPressed: QUERY string is NULL " << QT_ENDL; readingTheUI = false; return; } yearChangedDuringModification = false; readingTheUI = false; //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::actionsJustAfterAddingOneQSO() { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); int lastId = -1; needToSave = true; if (modify) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Modifying! " << QT_ENDL; needToSave = true; if(modifyingQSO>0) { awards->setAwards(modifyingQSO); if (yearChangedDuringModification) { awardsWidget->fillOperatingYears(); yearChangedDuringModification = false; } if ((clublogActive) && (clublogRealTime)) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (Modifiying ClubLog) Lastid: "<< QString::number(lastId) << QT_ENDL; // Delete QSO in CLubLog elogClublog->deleteQSO(clublogPrevQSO); // Add modified QSO in ClubLog elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)); } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (No ClubLog) Lastid: "<< QString::number(lastId) << QT_ENDL; } awards->setAwards(modifyingQSO); //Update the DXCC award status } // CHECK WHAT WAS THE QSOID to add the awards, if needed } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Not Modifying " << QT_ENDL; lastId = dataProxy->getLastQSOid(); if (lastId>=0) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Lastid: "<< QString::number(lastId) << QT_ENDL; awards->setAwards(lastId); //Update the DXCC award status // Send to CLUBLOG if enabled if ((clublogActive) && (clublogRealTime)) { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (Sending ClubLog) Lastid: "<< QString::number(lastId) << QT_ENDL; elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(lastId)); } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: (No ClubLog) Lastid: "<< QString::number(lastId) << QT_ENDL; } // } else { //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO: Lastid < 0 "<< QString::number(lastId) << QT_ENDL; } //awards->setAwards(lastId); } logWindow->refresh(); dxccStatusWidget->refresh(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::actionsJustAfterAddingOneQSO - END" << QT_ENDL; } QString MainWindow::readDataFromUI() { //qDebug() << "MainWindow::readDataFromUI: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (modify) { logEvent(Q_FUNC_INFO, "END-2", logSeverity); return readDataFromUIDXModifying(); } else { logEvent(Q_FUNC_INFO, "END-3", logSeverity); return readDataFromUIDX(); } //logEvent(Q_FUNC_INFO, "END", logSeverity); } QString MainWindow::readDataFromUIDX() { /* If you make any change here, please update also readDataFromUIDXModifying to keep data integrity! */ //qDebug() << "MainWindow::readDataFromUIDX:" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString tqrz = (mainQSOEntryWidget->getQrz()).toUpper(); if (!util->isValidCall(tqrz)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - Not valid call")); QString aux = QString(tr("The callsign %1 is not a valid call. Do you really want to add this callsign to the log?") ).arg(tqrz); msgBox.setText(aux); msgBox.setInformativeText(tr("Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications.")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Ok was clicked break; case QMessageBox::No: return "NULL"; default: // should never be reached break; } } QString stringQuery = "NULL"; QString aux1, aux2, stringFields, stringData; //QString aux, aux2; //qDebug() << "MainWindow::readDataFromUIDX: Band: " << QString::number(currentBand) << QT_ENDL; //qDebug() << "MainWindow::readDataFromUIDX: Mode: " << QString::number(currentMode) << QT_ENDL; int tband = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); int tmode = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); QString tdate = util->getDateTimeSQLiteStringFromDateTime(mainQSOEntryWidget->getDateTime()); QString ttime = (mainQSOEntryWidget->getTime()).toString("hh:mm:ss"); QString trsttx = QSOTabWidget->getRSTTX (); //qDebug() << "MainWindow::readDataFromUIDX - RSTtx: " << trsttx << QT_ENDL; QString trstrx = QSOTabWidget->getRSTRX (); int dxcc = world->getQRZARRLId(tqrz); //int dxcc2 = getDXCCFromComboBox(); int dxcc2 = world->getQRZARRLId(othersTabWidget->getEntityPrefix()); //qDebug() << "MainWindow::readDataFromUIDX - DXCC: " << QString::number(dxcc) << QT_ENDL; //qDebug() << "MainWindow::readDataFromUIDX - DXCC2: " << QString::number(dxcc2) << QT_ENDL; dxcc = util->getNormalizedDXCCValue(dxcc); dxcc2 = util->getNormalizedDXCCValue(dxcc2); //qDebug() << "MainWindow::readDataFromUIDX - DXCC: " << QString::number(dxcc) << QT_ENDL; //qDebug() << "MainWindow::readDataFromUIDX - DXCC2: " << QString::number(dxcc2) << QT_ENDL; if (dxcc!=dxcc2) { QString dxccn1 = world->getEntityName(dxcc); dxccn1 = dxccn1 + " - " + world->getEntityMainPrefix(dxcc); QString dxccn2 = world->getEntityName(dxcc2); dxccn2 = dxccn2 + " - " + world->getEntityMainPrefix(dxcc2); QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(world->getEntityMainPrefix(dxcc)); button2->setText(world->getEntityMainPrefix(dxcc2)); int ret; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Select correct entity")); msgBox.setText( tr("You have selected an entity:") + "\n\n"+"- "+dxccn2+"\n\n"+tr("that is different from the KLog proposed entity:") + "\n\n"+ "- "+dxccn1+"\n\n" +tr("Click on the prefix of the correct entity or Cancel to edit the QSO again.")); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { dxcc = dxcc2; } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-2", logSeverity); return "NULL"; } } aux1 = dataProxy->getContinentShortNameFromEntity(dxcc); if (dataProxy->isValidContinentShortName(aux1)) { stringFields = stringFields + ", cont"; stringData = stringData + ", '" + aux1 + "'"; } int cqz = world->getEntityCqz(dxcc); int ituz = world->getEntityItuz(dxcc); aux1 = QSOTabWidget->getName(); if (aux1.length()>1) { stringFields = stringFields + ", name"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QSOTabWidget->getDXLocator(); if ( locator->isValidLocator(aux1) ) { stringFields = stringFields + ", gridsquare"; stringData = stringData + ", '" + aux1 + "'"; } //qDebug() << "MainWindow::readDataFromUIDX: Reading freq...: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; if ( QSOTabWidget->getTXFreq() > 0 ) { aux1 = QString::number(QSOTabWidget->getTXFreq()); //qDebug() << "MainWindow::readDataFromUIDX: Reading freq...: " << aux1 << "/" << tband << QT_ENDL; if (dataProxy->isThisFreqInBand(dataProxy->getNameFromBandId(tband), aux1) ) { stringFields = stringFields + ", freq"; stringData = stringData + ", '" + aux1 + "'"; //qDebug() << "MainWindow::readDataFromUIDX: FREQ & BAND OK" << QT_ENDL; } else { //qDebug() << "MainWindow::readDataFromUIDX: FREQ & BAND NOK" << QT_ENDL; } } if ( QSOTabWidget->getRXFreq() > 0 ) { //qDebug() << "MainWindow::readDataFromUIDX: TX FREQ & RX FREQ ARE DIFFERENT AND != 0" << QT_ENDL; aux1 = QString::number(QSOTabWidget->getRXFreq()); stringFields = stringFields + ", freq_rx, band_rx"; stringData = stringData + ", '" + aux1 + "', '" + QString::number(dataProxy->getBandIdFromFreq(QSOTabWidget->getRXFreq())) + "'"; //stringData = stringData + ", '" + aux1 + ", " + QString::number(dataProxy->getBandIdFromFreq(rxFreqSpinBox->value())) + "'"; } aux1 = QSOTabWidget->getQTH(); if (aux1.length()>2) { stringFields = stringFields + ", qth"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getOperator(); if (aux1.length()>2) { stringFields = stringFields + ", operator"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getStationCallsign(); //qDebug() << Q_FUNC_INFO << "StationCallSign: " << aux1; if (aux1.length()>2) { //lastStationQRZ = aux1.toUpper(); stringFields = stringFields + ", station_callsign"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMyLocator(); if (aux1.length()>2) { stringFields = stringFields + ", my_gridsquare"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMyRig(); if (aux1.length()>0) { stringFields = stringFields + ", my_rig"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMyAntenna(); if (aux1.length()>0) { stringFields = stringFields + ", my_antenna"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMySOTA(); if (aux1.length()>0) { stringFields = stringFields + ", my_sota_ref"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = myDataTabWidget->getMyVUCCGrids (); if (util->isValidVUCCGrids (aux1)) { stringFields = stringFields + ", my_vucc_grids"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = commentTabWidget->getComment(); if (aux1.length()>0) { stringFields = stringFields + ", comment"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QSLTabWidget->getQSLMsg(); if (aux1.length()>0) { stringFields = stringFields + ", qslmsg"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(dxcc); if (aux1.length()>0) { stringFields = stringFields + ", dxcc"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(cqz); if (aux1.length()>0) { stringFields = stringFields + ", cqz"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(ituz); if (aux1.length()>0) { stringFields = stringFields + ", ituz"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QSLTabWidget->getQSLVia(); if (aux1.length()>3) { stringFields = stringFields + ", qsl_via"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(myDataTabWidget->getMyPower()); if ((aux1.toFloat())>0.0f) { //lastPower = aux1.toDouble(); stringFields = stringFields + ", tx_pwr"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(QSOTabWidget->getRXPwr ()); if ((aux1.toFloat())>0.0f) { stringFields = stringFields + ", rx_pwr"; stringData = stringData + ", '" + aux1 + "'"; } // OTHERS TAB // User Selectable field aux1 = othersTabWidget->getSOTA(); if (aux1.length()>0) { stringFields = stringFields + ", sota_ref"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = QString::number(othersTabWidget->getAge()); if (othersTabWidget->getAge()>0) { stringFields = stringFields + ", age"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = othersTabWidget->getVUCCGrids (); if (util->isValidVUCCGrids (aux1)) { stringFields = stringFields + ", vucc_grids"; stringData = stringData + ", '" + aux1 + "'"; } aux1 = othersTabWidget->getIOTA(); //qDebug() << "MainWindow::readDataFromUIDX: IOTA: " << aux1 << QT_ENDL; if (aux1.length() == 6) // EU-001 { //qDebug() << "MainWindow::readDataFromUIDX: IOTA to be saved" << QT_ENDL; stringFields = stringFields + ", iota"; stringData = stringData + ", '" + aux1 + "'"; } // SATS aux1 = satTabWidget->getSatName(); //We are assuming that the SAT_NAME is always well provided. If it is blank, then no SAT QSO //qDebug() << "MainWindow::readDataFromUIDX: SAT1 " << aux1 << QT_ENDL; if (aux1.length()>0) { stringFields = stringFields + ", sat_name"; stringData = stringData + ", '" + aux1 + "'"; aux1 = satTabWidget->getSatMode(); // We are assuming that the SAT_MODE is always well provided. If it is blank, then no SAT QSO if (aux1.length()>0) { stringFields = stringFields + ", sat_mode"; stringData = stringData + ", '" + aux1 + "'"; } } keepSatPage = satTabWidget->getRepeatThis(); aux1 = othersTabWidget->getPropModeFromComboBox(); //qDebug() << "MainWindow::readDataFromUIDX: PropMode: " << aux1 << QT_ENDL; if ((aux1.length()>0) && (aux1 != "Not")) { stringFields = stringFields + ", prop_mode"; stringData = stringData + ", '" + aux1 + "'"; } //CLUBLOG aux1 = eQSLTabWidget->getClubLogStatus(); //Y, N, M if (aux1 == "Y") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", clublog_qso_upload_date"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getClubLogDate()) + "'"; } else if (aux1 == "N") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'N'"; } else if (aux1 == "M") { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'M'"; stringFields = stringFields + ", clublog_qso_upload_date"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getClubLogDate()) + "'"; } else //TODO: This should be equivalent to N? { stringFields = stringFields + ", clublog_qso_upload_status"; stringData = stringData + ", 'N'"; } //CLUBLOG aux1 = eQSLTabWidget->getEQSLSenStatus(); if (aux1 == "Y") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate())+ "'"; } else if (aux1 == "R") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate())+ "'"; } else if (aux1 == "I") { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", eqsl_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate())+ "'"; } else // N { stringFields = stringFields + ", eqsl_qsl_sent"; stringData = stringData + ", 'N'"; } aux1 = eQSLTabWidget->getEQSLRecStatus(); if (aux1 == "Y") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLRecDate())+ "'"; } else if (aux1 == "R") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLRecDate())+ "'"; } else if (aux1 == "I") { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", eqsl_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLRecDate())+ "'"; } else { stringFields = stringFields + ", eqsl_qsl_rcvd"; stringData = stringData + ", 'N'"; } // LOTW-SENT aux1 = eQSLTabWidget->getLOTWSenStatus(); if (aux1 == "Y") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate())+ "'"; } else if (aux1 == "R") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'R'"; } else if (aux1 == "Q") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate())+ "'"; } else if (aux1 == "I") { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", lotw_qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate())+ "'"; } else { stringFields = stringFields + ", lotw_qsl_sent"; stringData = stringData + ", 'N'"; } // LOTW-RECEPTION //LOTW_QSLRDATE: (only valid if LOTW_RCVD is Y, I, or V) aux1 = eQSLTabWidget->getLOTWRecStatus(); if (aux1 == "Y") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate())+ "'"; } else if (aux1 == "R") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'R'"; } else if (aux1 == "V") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'V'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate())+ "'"; } else if (aux1 == "I") { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", lotw_qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate())+ "'"; } else { stringFields = stringFields + ", lotw_qsl_rcvd"; stringData = stringData + ", 'N'"; } aux1 = eQSLTabWidget->getQRZCOMStatus(); if (aux1 == "Y") { stringFields = stringFields + ", qrzcom_qso_upload_status"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", qrzcom_qso_upload_date"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getQRZCOMDate())+ "'"; } else if(aux1 == "M") { stringFields = stringFields + ", qrzcom_qso_upload_status"; stringData = stringData + ", 'M'"; stringFields = stringFields + ", qrzcom_qso_upload_date"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getQRZCOMDate())+ "'"; } else { stringFields = stringFields + ", qrzcom_qso_upload_status"; stringData = stringData + ", 'N'"; } //QSLTABWidget // QSL SENT: Y/N/R/Q/I // QSL_VIA: B/D/E/M aux1 = QSLTabWidget->getQSLSenStatus(); aux2 = QSLTabWidget->getSentVia(); //qDebug() << "MainWindow::readDataFromUIDX: aux1: " << aux1 << " / aux2: " << aux2 << QT_ENDL; //TODO: the aux2 switch is repeated and could be improved if (aux1=="Y") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", qslsdate"; //stringData = stringData + ", '" + (QSLTabWidget->getQSLSenDate()).toString("yyyy/MM/dd") + "'"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate())+ "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "R") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'R'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "Q") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'Q'"; stringFields = stringFields + ", qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate())+ "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 == "I") { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", qslsdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate())+ "'"; stringFields = stringFields + ", qsl_sent_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else { stringFields = stringFields + ", qsl_sent"; stringData = stringData + ", 'N'"; stringFields = stringFields + ", qsl_sent_via"; stringData = stringData + ", 'B'"; } // QSL RECEPTION //i = qslRecComboBox->currentIndex(); //ii = qslRecViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLRecStatus(); // Y/N/R/I/V aux2 = QSLTabWidget->getRecVia(); // B/D/E/M if (aux1 == "Y") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'Y'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate())+ "'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '1'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2 == "D") { stringData = stringData + ", 'D'"; } else if (aux2 == "E") { stringData = stringData + ", 'E'"; } else if (aux2 == "M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1 =="R") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'R'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '0'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1=="I") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'I'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate())+ "'"; //stringFields = stringFields + ", confirmed"; //stringData = stringData + ", '0'"; stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else if (aux1=="V") { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'V'"; stringFields = stringFields + ", qslrdate"; stringData = stringData + ", '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate())+ "'"; //TODO: Check if the QSL has been received or not as this "V" could mask a received QSL as a Worked (0) stringFields = stringFields + ", qsl_rcvd_via"; if (aux2=="D") { stringData = stringData + ", 'D'"; } else if (aux2=="E") { stringData = stringData + ", 'E'"; } else if (aux2=="M") { stringData = stringData + ", 'M'"; } else { stringData = stringData + ", 'B'"; } } else { stringFields = stringFields + ", qsl_rcvd"; stringData = stringData + ", 'N'"; stringFields = stringFields + ", qsl_rcvd_via"; stringData = stringData + ", 'B'"; } // The data reading finish here. Now, we prepare the data to insert into the DB if (stringFields.startsWith(", ") ) { stringFields.remove(0,2); } stringFields += ", call, bandid, modeid, qso_date, lognumber, rst_sent, rst_rcvd"; if (stringFields.startsWith(", ") ) { stringFields.remove(0,2); } if (stringData.startsWith(", ") ) { stringData.remove(0,1); } stringData.remove(0,1); stringData += QString(", '%1', '%2', '%3', '%4', '%5', '%6', '%7'").arg(tqrz).arg(tband).arg(tmode).arg(tdate).arg(QString::number(currentLog)).arg(trsttx).arg(trstrx); if (stringData.startsWith(", ") ) { stringData.remove(0,2); } stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; logEvent(Q_FUNC_INFO, "END", logSeverity); return stringQuery; } QString MainWindow::readDataFromUIDXModifying() { //qDebug() << "MainWindow::readDataFromUIDXModifying:" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString tqrz = (mainQSOEntryWidget->getQrz()).toUpper(); if (!util->isValidCall(tqrz)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - Not valid callsign")); QString aux = QString(tr("The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log?") ).arg(tqrz); msgBox.setText(aux); msgBox.setInformativeText(tr("Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications.")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Ok was clicked break; case QMessageBox::No: return "NULL"; default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END-1", logSeverity); } //qDebug() << "MainWindow::readDataFromUIDXModifying: " << tqrz << QT_ENDL; QString stringQuery = "NULL"; QString aux1, aux2; int tband = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); int tmode = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); QString tdate = util->getDateTimeSQLiteStringFromDateTime(mainQSOEntryWidget->getDateTime()); //QString tdate = (mainQSOEntryWidget->getDate()).toString("yyyy/MM/dd"); QString ttime = (mainQSOEntryWidget->getTime()).toString("hh:mm:ss"); if ((mainQSOEntryWidget->getDate().year()) && (dateTimeTemp->date().year())) { yearChangedDuringModification = true; } QString trsttx = QSOTabWidget->getRSTTX(); QString trstrx = QSOTabWidget->getRSTRX(); int dxcc = world->getQRZARRLId(tqrz); int cqz = world->getEntityCqz(dxcc); int ituz = world->getEntityItuz(dxcc); int dxcc2 = world->getQRZARRLId(othersTabWidget->getEntityPrefix()); //qDebug() << "MainWindow::readDataFromUIDXModifying - DXCC: " << QString::number(dxcc) << QT_ENDL; //qDebug() << "MainWindow::readDataFromUIDXModifying- DXCC2: " << QString::number(dxcc2) << QT_ENDL; dxcc = util->getNormalizedDXCCValue(dxcc); dxcc2 = util->getNormalizedDXCCValue(dxcc2); //qDebug() << "MainWindow::readDataFromUIDXModifying - DXCC: " << QString::number(dxcc) << QT_ENDL; //qDebug() << "MainWindow::readDataFromUIDXModifying- DXCC2: " << QString::number(dxcc2) << QT_ENDL; if (dxcc!=dxcc2) { QString dxccPref1, dxccPref2; QString dxccn1 = world->getEntityName(dxcc); if (dxccn1.length()>0) { dxccPref1 = world->getEntityMainPrefix(dxcc); dxccn1 = dxccn1 + " - " + dxccPref1; } else { dxccn1 = tr("No DXCC"); dxccPref1 = tr("None"); } QString dxccn2 = world->getEntityName(dxcc2); if (dxccn2.length()>0) { dxccPref2 = world->getEntityMainPrefix(dxcc2); dxccn2 = dxccn2 + " - " + dxccPref2; } else { dxccn2 = tr("No DXCC"); dxccPref2 = tr("None"); } QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(dxccPref1); button2->setText(dxccPref2); int ret; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Select correct entity")); msgBox.setText( tr("You have selected an entity:") + "\n\n"+"- "+dxccn2+"\n\n"+tr("that is different from the KLog proposed entity:") + "\n\n- "+dxccn1+"\n\n" +tr("Click on the prefix of the right entity or Cancel to correct.")); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { dxcc = dxcc2; //qDebug() << "MainWindow::readDataFromUIDXModifying - Button 2: " << QString::number(dxcc2) << QT_ENDL; } else if (ret == QMessageBox::ActionRole) { //qDebug() << "MainWindow::readDataFromUIDXModifying - Button 1: " << QT_ENDL; } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-2", logSeverity); //qDebug() << "MainWindow::readDataFromUIDXModifying - Button 2: " << QString::number(dxcc2) << QT_ENDL; return "NULL"; } } QString updateString = "UPDATE log SET call = '" + tqrz + "', bandid = '" + QString::number(tband) + "', modeid = '" + QString::number(tmode) + "', qso_date = '" + tdate + "', rst_sent = '" + trsttx + "', rst_rcvd = '" + trstrx + "', lognumber = '" + QString::number(currentLog) + "', "; aux1 = dataProxy->getContinentShortNameFromEntity(dxcc); if (dataProxy->isValidContinentShortName(aux1)) { updateString = updateString + "cont = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "cont = '', "; } aux1 = QSOTabWidget->getName(); if (aux1.length()>1) { updateString = updateString + "name = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "name = '', "; } aux1 = QSOTabWidget->getDXLocator (); if ( locator->isValidLocator(aux1) ) { updateString = updateString + "gridsquare = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "gridsquare = '', "; } if ( QSOTabWidget->getTXFreq() > 0 ) { aux1 = QString::number(QSOTabWidget->getTXFreq()); if (dataProxy->isThisFreqInBand(dataProxy->getNameFromBandId(tband), aux1) ) //if (db->isThisFreqInBand(db->getBandNameFromID2(tband), aux1) ) { updateString = updateString + "freq = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "freq = '0', "; } } else { updateString = updateString + "freq = '0', "; } if ( (QSOTabWidget->getRXFreq()) > 0 ) { aux1 = QString::number(QSOTabWidget->getRXFreq()); updateString = updateString + "freq_rx = '"; updateString = updateString + aux1 + "', "; updateString = updateString + "band_rx = '"; updateString = updateString + QString::number(dataProxy->getBandIdFromFreq(QSOTabWidget->getRXFreq())) + "', "; } else { updateString = updateString + "freq_rx = '0', "; updateString = updateString + "band_rx = '', "; } aux1 = QSOTabWidget->getQTH(); if (aux1.length()>2) { updateString = updateString + "qth = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "qth = '', "; } aux1 = myDataTabWidget->getOperator(); if (util->isValidCall(aux1)) { updateString = updateString + "operator = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "operator = '', "; } aux1 = myDataTabWidget->getStationCallsign(); //aux1 = (stationCallSignLineEdit->text()).toUpper(); if (util->isValidCall(aux1)) { updateString = updateString + "station_callsign = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "station_callsign = '', "; } aux1 = (myDataTabWidget->getMyLocator()).toUpper(); if (locator->isValidLocator(aux1)) { updateString = updateString + "my_gridsquare = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "my_gridsquare = '', "; } aux1 = (myDataTabWidget->getMyRig()); if (aux1.length ()>0) { updateString = updateString + "my_rig = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "my_rig = '', "; } aux1 = (myDataTabWidget->getMyAntenna()); if (aux1.length ()>0) { updateString = updateString + "my_antenna = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "my_antenna = '', "; } aux1 = (myDataTabWidget->getMySOTA()); if (aux1.length ()>0) { updateString = updateString + "my_sota_ref = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "my_sota_ref = '', "; } aux1 = myDataTabWidget->getMyVUCCGrids (); if (util->isValidVUCCGrids (aux1)) { updateString = updateString + "my_vucc_grids = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "my_vucc_grids = '', "; } aux1 = commentTabWidget->getComment(); updateString = updateString + "comment = '"; updateString = updateString + aux1 + "', "; aux1 = QSLTabWidget->getQSLMsg(); if (aux1.length()>0) { updateString = updateString + "qslmsg = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "qslmsg = '', "; } aux1 = QString::number(dxcc); //qDebug() << "MainWindow::readDataFromUIDXModifying: DXCC=" << aux1 << QT_ENDL; if (dataProxy->isValidDXCC(dxcc)) { updateString = updateString + "dxcc = '"; updateString = updateString + aux1 + "', "; //qDebug() << "MainWindow::readDataFromUIDXModifying: Saving DXCC=" << aux1 << QT_ENDL; } else { updateString = updateString + "dxcc = '', "; } if ((cqz>0) && (cqz<41)) { aux1 = QString::number(cqz); updateString = updateString + "cqz = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "cqz = '', "; } if ((ituz>0) && (ituz<91)) { aux1 = QString::number(ituz); updateString = updateString + "ituz = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "ituz = '', "; } aux1 = QSLTabWidget->getQSLVia(); //aux1 = qslViaLineEdit->text(); if (aux1.length()>3) { updateString = updateString + "qsl_via = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "qsl_via = '', "; } //aux1 = QString::number(myPowerSpinBox->value()); if (myDataTabWidget->getMyPower()>0.0) { aux1 = QString::number(myDataTabWidget->getMyPower()); updateString = updateString + "tx_pwr = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "tx_pwr = '', "; } if (QSOTabWidget->getRXPwr ()>0.0) { aux1 = QString::number(QSOTabWidget->getRXPwr ()); updateString = updateString + "rx_pwr = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "rx_pwr = '', "; } // OTHERS TAB // User Selectable field aux1 = (othersTabWidget->getSOTA ()); if (aux1.length ()>0) { updateString = updateString + "sota_ref = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "sota_ref = '', "; } aux1 = QString::number(othersTabWidget->getAge()); if (othersTabWidget->getAge()>0) { updateString = updateString + "age = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "age = '', "; } aux1 = othersTabWidget->getVUCCGrids (); if (util->isValidVUCCGrids (aux1)) { updateString = updateString + "vucc_grids = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "vucc_grids = '', "; } aux1 = othersTabWidget->getIOTA(); //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA: " << aux1 << QT_ENDL; if (aux1.length() == 6) // EU-001 { //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA to be saved! " << QT_ENDL; updateString = updateString + "iota = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "iota = '', "; //qDebug() << "MainWindow::readDataFromUIDX: Modifyng IOTA NOT to be saved! Lenght="<getSatName(); //We are assuming that the SAT_NAME is always well provided. If it is blank, then no SAT QSO //qDebug() << "MainWindow::readDataFromUIDX: SAT2 modif " << aux1 << QT_ENDL; if (aux1.length()>0) { updateString = updateString + "sat_name = '"; updateString = updateString + aux1 + "', "; satQSO = true; } else { updateString = updateString + "sat_name = '', "; } aux1 = satTabWidget->getSatMode(); // We are assuming that the SAT_MODE is always well provided. If it is blank, then no SAT QSO if ((aux1.length()>0) && satQSO) { updateString = updateString + "sat_mode = '"; updateString = updateString + aux1 + "', "; } else { updateString = updateString + "sat_mode = '', "; } aux1 = othersTabWidget->getPropModeFromComboBox(); //qDebug() << "MainWindow::readDataFromUIDX: PropMode: " << aux1 << QT_ENDL; if ((aux1.length()>0) && (aux1 != "Not")) { //qDebug() << "MainWindow::readDataFromUIDX: PropMode(1): " << aux1 << QT_ENDL; updateString = updateString + "prop_mode = '"; updateString = updateString + aux1 + "', "; } else if ((aux1.length()==0) || (aux1 == "Not")) { //qDebug() << "MainWindow::readDataFromUIDX: PropMode(2): " << aux1 << QT_ENDL; updateString = updateString + "prop_mode = '',"; } else { updateString = updateString + "prop_mode = '', "; //qDebug() << "MainWindow::readDataFromUIDX: PropMode(3): " << aux1 << QT_ENDL; } //CLUBLOG aux1 = eQSLTabWidget->getClubLogStatus(); //Y, N, M if (aux1 == "Y") { updateString = updateString + "clublog_qso_upload_status = 'Y', "; //updateString = updateString + "clublog_qso_upload_date = '" + (eQSLTabWidget->getClubLogDate()).toString("yyyy/MM/dd") + "', "; updateString = updateString + "clublog_qso_upload_date = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getClubLogDate()) + "', "; } else if (aux1 == "N") { updateString = updateString + "clublog_qso_upload_status = 'N', "; } else if (aux1 == "M") { updateString = updateString + "clublog_qso_upload_status = 'M', "; updateString = updateString + "clublog_qso_upload_date = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getClubLogDate()) + "', "; } else //TODO: This should be equivalent to N? { updateString = updateString + "clublog_qso_upload_status = 'N', "; } //CLUBLOG // EQSL-SENT aux1 = eQSLTabWidget->getEQSLSenStatus(); if (aux1 == "Y") { updateString = updateString + "eqsl_qsl_sent = 'Y', "; updateString = updateString + "eqsl_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate()) + "', "; } else if (aux1 == "R") { updateString = updateString + "eqsl_qsl_sent = 'R', "; } else if (aux1 == "Q") { updateString = updateString + "eqsl_qsl_sent = 'Q', "; updateString = updateString + "eqsl_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate()) + "', "; } else if (aux1 == "I") { updateString = updateString + "eqsl_qsl_sent = 'I', "; updateString = updateString + "eqsl_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLSenDate()) + "', "; } else // N { updateString = updateString + "eqsl_qsl_sent = 'N', "; } // EQSL-RECEPTION aux1 = eQSLTabWidget->getEQSLRecStatus(); if (aux1 == "Y") { updateString = updateString + "eqsl_qsl_rcvd = 'Y', "; updateString = updateString + "eqsl_qslrdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLRecDate()) + "', "; } else if (aux1 == "R") { updateString = updateString + "eqsl_qsl_rcvd = 'R', "; } else if (aux1 == "I") { updateString = updateString + "eqsl_qsl_rcvd = 'I', "; } else if (aux1 == "V") { updateString = updateString + "eqsl_qsl_rcvd = 'V', "; updateString = updateString + "eqsl_qslrdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getEQSLRecDate()) + "', "; } else { updateString = updateString + "eqsl_qsl_rcvd = 'N', "; } // LOTW-SENT aux1 = eQSLTabWidget->getLOTWSenStatus(); if (aux1 == "Y") { updateString = updateString + "lotw_qsl_sent = 'Y', "; updateString = updateString + "lotw_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate()) + "', "; } else if (aux1 == "R") { updateString = updateString + "lotw_qsl_sent = 'R', "; } else if (aux1 == "Q") { updateString = updateString + "lotw_qsl_sent = 'Q', "; updateString = updateString + "lotw_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate()) + "', "; } else if (aux1 == "I") { updateString = updateString + "lotw_qsl_sent = 'I', "; updateString = updateString + "lotw_qslsdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWSenDate()) + "', "; } else { updateString = updateString + "lotw_qsl_sent = 'N', "; } // LOTW-RECEPTION //LOTW_QSLRDATE: (only valid if LOTW_RCVD is Y, I, or V) aux1 = eQSLTabWidget->getLOTWRecStatus(); if (aux1 == "Y") { updateString = updateString + "lotw_qsl_rcvd = 'Y', "; updateString = updateString + "lotw_qslrdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate()) + "', "; } else if (aux1 == "R") { updateString = updateString + "lotw_qsl_rcvd = 'R', "; } else if (aux1 == "V") { updateString = updateString + "lotw_qsl_rcvd = 'V', "; updateString = updateString + "lotw_qslrdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate()) + "', "; } else if (aux1 == "I") { updateString = updateString + "lotw_qsl_rcvd = 'I', "; updateString = updateString + "lotw_qslrdate = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getLOTWRecDate()) + "', "; } else { updateString = updateString + "lotw_qsl_rcvd = 'N', "; } // QRZCOM aux1 = eQSLTabWidget->getQRZCOMStatus(); //Y, N, M if (aux1 == "Y") { updateString = updateString + "qrzcom_qso_upload_status = 'Y', "; updateString = updateString + "qrzcom_qso_upload_date = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getQRZCOMDate()) + "', "; } else if (aux1 == "M") { updateString = updateString + "qrzcom_qso_upload_status = 'M', "; updateString = updateString + "qrzcom_qso_upload_date = '" + util->getDateSQLiteStringFromDate(eQSLTabWidget->getQRZCOMDate()) + "', "; } else //TODO: This is equivalent to N { updateString = updateString + "qrzcom_qso_upload_status = 'N', "; } // QRZCOM // QSL SENT //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //int i = qslSentComboBox->currentIndex(); //int ii = qslSentViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLSenStatus(); aux2 = QSLTabWidget->getSentVia(); //qDebug() << "MainWindow::readDataFromUIDXModifying: aux1: " << aux1 << " / aux2: " << aux2 << QT_ENDL; if (aux1 == "Y") { updateString = updateString + "qsl_sent = 'Y', "; updateString = updateString + "qslsdate = '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate()) + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "R") { updateString = updateString + "qsl_sent = 'R', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "Q") { updateString = updateString + "qsl_sent = 'Q', "; updateString = updateString + "qslsdate = '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate()) + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else if (aux1 == "I") { updateString = updateString + "qsl_sent = 'I', "; updateString = updateString + "qslsdate = '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLSenDate()) + "', "; if (aux2 == "D") { updateString = updateString + "qsl_sent_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_sent_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_sent_via = 'M', "; } else { updateString = updateString + "qsl_sent_via = 'B', "; } } else { updateString = updateString + "qsl_sent = 'N', "; updateString = updateString + "qsl_sent_via = 'B', "; } // QSL RECEPTION //i = qslRecComboBox->currentIndex(); //ii = qslRecViaComboBox->currentIndex(); aux1 = QSLTabWidget->getQSLRecStatus(); aux2 = QSLTabWidget->getRecVia(); if (aux1 == "Y") { updateString = updateString + "qsl_rcvd = 'Y', "; updateString = updateString + "qslrdate = '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate()) + "', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "R") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'R', "; //updateString = updateString + "confirmed = '0', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "I") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'I', "; updateString = updateString + "qslrdate = '" +util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate()) + "', "; updateString = updateString + "qslrdate = '" + + "', "; //updateString = updateString + "confirmed = '0', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else if (aux1 == "V") { //QSL received date //(only valid if QSL_RCVD is Y, I, or V) updateString = updateString + "qsl_rcvd = 'V', "; updateString = updateString + "qslrdate = '" + util->getDateSQLiteStringFromDate(QSLTabWidget->getQSLRecDate()) + "', "; if (aux2 == "D") { updateString = updateString + "qsl_rcvd_via = 'D', "; } else if (aux2 == "E") { updateString = updateString + "qsl_rcvd_via = 'E', "; } else if (aux2 == "M") { updateString = updateString + "qsl_rcvd_via = 'M', "; } else { updateString = updateString + "qsl_rcvd_via = 'B', "; } } else { updateString = updateString + "qsl_rcvd = 'N', "; updateString = updateString + "qsl_rcvd_via = 'B', "; } keepSatPage = satTabWidget->getRepeatThis(); // The data reading finish here. Now, we prepare the data to insert into the DB if ( updateString.endsWith(", ") ) { updateString.chop(2); } stringQuery = updateString + " WHERE id = " + "'" + QString::number(modifyingQSO) + "'"; //qDebug() << "MainWindow::readDataFromUIDXModifying: queryCreated: " << stringQuery << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); return stringQuery; } void MainWindow::slotOKButtonClicked(){ //qDebug() << "MainWindow::slotOKButtonClicked: " << QT_ENDL; slotQRZReturnPressed(); } void MainWindow::slotSearchBoxTextChanged() { logEvent(Q_FUNC_INFO, "Start", logSeverity); searchWidget->slotSearchBoxTextChanged(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotQSOsExportToADIF(QList _id) { //qDebug() << "MainWindow::slotQSOsExportToADIF " << QString::number(_id.length()) << QT_ENDL; if (_id.length()<1) { return; // NO QSO TO EXPORT } QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); //qDebug() << "MainWindow::slotQSOsExportToADIF: " << fileName << QT_ENDL; if ((!fileName.endsWith(".adi")) && ( !fileName.endsWith(".adif") )) { //qDebug() << "MainWindow::slotQSOsExportToADIF: Adding the .adi to the file" << fileName << QT_ENDL; fileName = fileName + ".adi"; } //qDebug() << "MainWindow::slotQSOsExportToADIF-1: " << fileName << QT_ENDL; filemanager->adifQSOsExport(fileName, _id); //qDebug() << "MainWindow::slotQSOsExportToADIF-3" << QT_ENDL; showNumberOfSavedQSO(fileName, _id.count()); //qDebug() << "MainWindow::slotQSOsExportToADIF - END" << QT_ENDL; } void MainWindow::slotQRZcomUpload(QList _id) { //qDebug() << "MainWindow::slotQRZcomUpload " << QString::number(_id.length()) << QT_ENDL; //elogQRZcom->fetchData(); elogQRZcom->sendQSOs(_id); //qDebug() << "MainWindow::slotQRZcomUpload - END" << QT_ENDL; } void MainWindow::slotQSOsDelete(QList _id) { //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(_id.length()) << QT_ENDL; //foreach(int i, _id) //{ // //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(i) << QT_ENDL; //} QString message = QString(tr("You have requested to delete several QSOs ")); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setDetailedText(tr("This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again.")); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : foreach (int i, _id) { QStringList qsoToDelete; qsoToDelete.clear(); qsoToDelete << dataProxy->getClubLogRealTimeFromId(i); if(dataProxy->deleteQSO(i)) { //qDebug() << "MainWindow::slotQSODelete: Just removed from log, now I will try to remove from ClubLog, if needed" << QT_ENDL; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" << QT_ENDL; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" << QT_ENDL; } } } dxccStatusWidget->refresh(); logWindow->refresh(); slotShowAwards(); break; case QMessageBox::No : break; } } void MainWindow::slotQSODelete(const int _id) { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::slotQSODelete " << QString::number(_id) << QT_ENDL; int QSOid = _id; //int x = -1; QString _qrz = dataProxy->getCallFromId(QSOid); if (_qrz.length()>=3) { QString message = QString(tr("You have requested to delete the QSO with: %1").arg(_qrz)); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : { QStringList qsoToDelete; qsoToDelete.clear(); qsoToDelete << dataProxy->getClubLogRealTimeFromId(QSOid); if(dataProxy->deleteQSO(QSOid)) { //qDebug() << "MainWindow::slotQSODelete: Just removed from log, now I will try to remove from ClubLog, if needed" << QT_ENDL; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" << QT_ENDL; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" << QT_ENDL; } dxccStatusWidget->refresh(); logWindow->refresh(); slotShowAwards(); //emit updateSearchText(); } else { //TODO: The QSO could not be removed... } } break; case QMessageBox::No : // No was clicked break; default: // should never be reached break; } } else { // TODO: The QSO to be removed was not found in the log } //qDebug() << "MainWindow::slotQSODelete END " << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); //awards->recalculateAwards(); } void MainWindow::slotShowSearchWidget() { //dxUpRightTab->addTab(searchWidget, tr("Search")); //qDebug() << "MainWindow::slotShowSearchWidget: " << QString::number(dxUpRightTab->indexOf(searchWidget)) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); dxUpRightTab->setCurrentIndex(dxUpRightTab->indexOf(searchWidget)); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotLogRefresh() { logEvent(Q_FUNC_INFO, "Start", logSeverity); logWindow->refresh(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotElogClubLogDisable(const bool _b) { //qDebug() << "MainWindow::slotElogClubLogDisable: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); clublogActive = !_b; setupDialog->setClubLogActive(clublogActive); //TODO: Disable clublog in the klogrc file //bool FileManager::modifySetupFile(const QString& _filename, const QString &_field, const QString &_value) filemanager->modifySetupFile(configFileName, "ClubLogActive", "False"); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotElogClubLogFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { //qDebug() << "MainWindow::slotElogClubLogFileUploaded: " << QT_ENDL; QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - ClubLog error")); msgBox.setText(tr("The ClubLog upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getClubLogFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogClubLogFileUploaded file exist" << QT_ENDL; } else { //qDebug() << "MainWindow::slotElogClubLogFileUploaded file DOES NOT exist" << QT_ENDL; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to ClubLog?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToClubLog = dataProxy->clublogSentQSOs(_qsos); // TODO: Check if QSOS where sent if (!uploadedToClubLog) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the ClubLog QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } if (!deleteAlwaysAdiFile) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogClubLogFileUploaded - FILE REMOVED: " << fileName << QT_ENDL; } else { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The file has not been removed.")); msgBox.setDetailedText(tr("It seems that there was something that prevented KLog from removing the file\nYou can remove it manually.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogClubLogFileUploaded - FILE NOT REMOVED: " << fileName << QT_ENDL; } i = msgBox.exec(); } } else { QFile::remove(fileName); } } void MainWindow::slotElogClubLogShowMessage(const QString &_s) { //qDebug() << "MainWindow::slotElogClubLogShowMessage: " << _s << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotElogClubLogProcessAnswer(const int _i, const int _qID) { //qDebug() << "MainWindow::slotElogClubLogProcessAnswer: " <setClubLogSent(_qID, "Y", eQSLTabWidget->getClubLogDate()); } else { dataProxy->setClubLogSent(_qID, "M", eQSLTabWidget->getClubLogDate()); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotElogEQSLFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { //qDebug() << "MainWindow::slotElogEQSLFileUploaded: " << QString::number(_error) << QT_ENDL; if (qrzcomSubscriber) { QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - eQSL error")); msgBox.setText(tr("The eQSL upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getEQSLFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file exist" << fileName <eQSLSentQSOs(_qsos); // TODO: Check if QSOS where sent if (!uploadedToeQSL) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the eQSL QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } if (!deleteAlwaysAdiFile) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The eQSL upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - FILE REMOVED: " << fileName << QT_ENDL; } else { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The file has not been removed.")); msgBox.setDetailedText(tr("It seems that there was something that prevented KLog from removing the file\nYou can remove it manually.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - FILE NOT REMOVED: " << fileName << QT_ENDL; } i = msgBox.exec(); } } else { QFile::remove(fileName); } //qDebug() << "MainWindow::slotElogEQSLFileUploaded - END" << QT_ENDL; } } void MainWindow::slotElogQRZCOMDisable(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", logSeverity); if ((_b) && (elogQRZcom->getSubscription ())) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com warning")); msgBox.setText(tr("QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled.")); msgBox.setDetailedText(tr("Please check your QRZ.com subcription or credentials.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); qrzcomActive = false; setupDialog->setQRZCOMAutoCheckActive (false); filemanager->modifySetupFile(configFileName, "QRZcomActive", "False"); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotElogQRZCOMLogUploaded (QNetworkReply::NetworkError _error, QList _qsos) { //qDebug() << "MainWindow::slotElogQRZCOMLogUploaded: " << QString::number(_error) << QT_ENDL; if (qrzcomSubscriber) { QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com error")); msgBox.setText(tr("The QRZ.com upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getEQSLFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogQRZCOMLogUploaded file exist" << QT_ENDL; } else { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file DOES NOT exist" << QT_ENDL; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToeQSL = dataProxy->QRZCOMSentQSOs(_qsos); // TODO: Check if QSOS where sent if (!uploadedToeQSL) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the QRZ.com QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("The QRZ.com upload process has finished successfully")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - END" << QT_ENDL; } } void MainWindow::slotElogQRZCOMShowMessage(const QString &_s) { //qDebug() << "MainWindow::slotElogQRZCOMShowMessage: " << _s << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::cleanQRZCOMreceivedDataFromUI() { //qDebug() << Q_FUNC_INFO; if (!modify) { QSOTabWidget->cleanQRZCOM(); completedWithPreviousName = false; completedWithPreviousName = false; completedWithPreviousLocator = false; } } void MainWindow::slotElogQRZCOMFoundData(const QString &_t, const QString & _d) { //qDebug() << "MainWindow::slotElogQRZCOMFoundData: " << _t << "/" << _d << QT_ENDL; if (_t == "name") { if (QSOTabWidget->getName().length()<1) { QSOTabWidget->setName(_d); } } else if (_t == "grid") { //qDebug() << Q_FUNC_INFO << " Grid found: " << _d; if ((QSOTabWidget->getDXLocator()).length()<1) { QSOTabWidget->setDXLocator(_d); } else { //qDebug() << Q_FUNC_INFO << " There was already a Grid: " << QSOTabWidget->getDXLocator(); } } else if (_t == "qth") { if (QSOTabWidget->getQTH().length()<1) { QSOTabWidget->setQTH(_d); } } else if (_t == "qslmgr") { //QSLTabWidget->setQSLVia(_d); } // else if (_t == "message") // { // QMessageBox msgBox; // msgBox.setIcon(QMessageBox::Information); // msgBox.setWindowTitle(tr("KLog - QRZ.com message")); // QString aux = QString(tr("KLog has received a message from QRZ.com.") ); // msgBox.setText(aux); // msgBox.setDetailedText(_d); // msgBox.setStandardButtons(QMessageBox::Ok); // msgBox.setDefaultButton(QMessageBox::Ok); // msgBox.exec(); // } else if (_t == "error") { //qDebug() << "MainWindow::slotElogQRZCOMFoundData: ERROR" << _t << "/" << _d << QT_ENDL; if (_d.contains("Not found: ")) { cleanQRZCOMreceivedDataFromUI(); //qDebug() << "MainWindow::slotElogQRZCOMFoundData: call Not found" << QT_ENDL; slotUpdateStatusBar(tr("Call not found in QRZ.com")); return; } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com error")); QString aux = QString(tr("KLog has received an error from QRZ.com.") ); msgBox.setText(aux); msgBox.setDetailedText(_d); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { //qDebug() << "MainWindow::slotElogQRZCOMFoundData: QRZ value not recognized" << QT_ENDL; } } void MainWindow::slotElogQRZCOMCheckThisCall() { //qDebug() << Q_FUNC_INFO << QT_ENDL; if (qrzcomActive) { elogQRZcom->checkQRZ(mainQSOEntryWidget->getQrz()); } else { showMessageToEnableTheOnlineService(QRZ) ; } //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void MainWindow::showMessageToEnableTheOnlineService(const OnLineProvider _service) { QString aux = util->getOnlineServiceName(_service); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - %1").arg(aux)); msgBox.setText(tr("You need to activate the %1 service in the eLog preferences.").arg(aux) ); msgBox.exec(); } void MainWindow::slotElogQRZCOMAutoCheck() { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString(QRZCOMAutoCheckAct->isChecked()) << QT_ENDL; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ); return; } setupDialog->setQRZCOMAutoCheckActive(QRZCOMAutoCheckAct->isChecked()); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void MainWindow::slotElogQRZCOMAutoCheckFromSetup(const bool _s) { //qDebug() << Q_FUNC_INFO << QT_ENDL; if (qrzcomActive) { QRZCOMAutoCheckAct->setEnabled(_s); } // else // { // showMessageToEnableTheOnlineService(QRZ); // } //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void MainWindow::slotExitFromSlotDialog(const int exitID) { //qDebug() << "MainWindow::slotExitFromSlotDialog: " << QString::number(exitID) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (exitID == 2) { needToEnd = true; exitQuestion(); } //qDebug() << "MainWindow::slotExitFromSlotDialog: END " << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotFileClose() { logEvent(Q_FUNC_INFO, "Start", logSeverity); exitQuestion(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::exitQuestion() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::exitQuestion" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - Exit")); QString aux = QString(tr("Do you really want to exit KLog?") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Ok was clicked logEvent(Q_FUNC_INFO, "Exiting KLog!", Info); //maybeSave(); saveWindowsSize(); close(); exit(0); default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotQRZTextChanged(QString _qrz) { //qDebug()<< Q_FUNC_INFO << ": " << _qrz << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (_qrz.length()<1) { //qDebug()<< Q_FUNC_INFO << ": Empty... " << QT_ENDL; infoLabel1->clear(); infoLabel2->clear(); //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(); logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } //qDebug()<< Q_FUNC_INFO << ": cursor position: " << QT_ENDL; if (cleaning) { //qDebug()<< Q_FUNC_INFO << ": Cleaning" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } if (modify) { return; } //qDebug()<< Q_FUNC_INFO << ": checking for modify or length<1" << QT_ENDL; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug()<< Q_FUNC_INFO << ": MODIFY or Lenght < 1" << QT_ENDL; qrzSmallModDontCalculate=false; logEvent(Q_FUNC_INFO, "END-6", logSeverity); return; } //qDebug()<< Q_FUNC_INFO << ": running ..." << QT_ENDL; qrzSmallModDontCalculate = true; // A kind of flag to prevent multiple calls to this method. //int i; int dx_CQz = -1; int dxE_CQz = -1; int dx_ITUz = -1; int dxE_ITUz = -1; cleanQRZCOMreceivedDataFromUI(); //qDebug()<< Q_FUNC_INFO << ": currentQRZ: " <<_qrz << QT_ENDL; QString pref = util->getPrefixFromCall(_qrz); //qDebug()<< Q_FUNC_INFO << ": pref: " << pref << QT_ENDL; if (pref.length ()>0) { currentEntity = world->getQRZARRLId(pref); } else { currentEntity = world->getQRZARRLId(_qrz); } //currentEntity = world->getQRZARRLId(util->getPrefixFromCall(_qrz)); //currentEntity = world->getQRZARRLId(_qrz); //selectCorrectComboBoxEntity(currentEntity); //qDebug()<< Q_FUNC_INFO << ": currentEntity: " << QString::number(currentEntity) << QT_ENDL; othersTabWidget->setEntity(currentEntity); dxE_CQz = world->getEntityCqz(currentEntity); dx_CQz = world->getQRZCqz(_qrz); dx_ITUz = world->getQRZItuz(_qrz); dxE_ITUz = world->getEntityItuz(currentEntity); //qDebug()<< Q_FUNC_INFO << ": CQ: " << QString::number(dx_CQz) << QT_ENDL; //qDebug()<< Q_FUNC_INFO << ": CQe: " << QString::number(dxE_CQz) << QT_ENDL; //qDebug()<< Q_FUNC_INFO << ": ITU: " << QString::number(dx_ITUz) << QT_ENDL; //qDebug()<< Q_FUNC_INFO << ": ITUe: " << QString::number(dxE_ITUz) << QT_ENDL; if (dx_CQz == dxE_CQz) { dx_CQz = dxE_CQz; } if (dx_ITUz == dxE_ITUz) { dx_ITUz = dxE_ITUz; } QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBand) << QString::number(currentMode) << QString::number(currentLog); //qDebug()<< Q_FUNC_INFO << ": currentEntity: " << QString::number(currentEntity) << QT_ENDL; if ( locator->isValidLocator(QSOTabWidget->getDXLocator())) { dxLocator = QSOTabWidget->getDXLocator(); } else { dxLocator = world->getLocator(currentEntity); } //qDebug()<< Q_FUNC_INFO << ": Going to check the DXCC" << QT_ENDL; //qDebug()<< Q_FUNC_INFO << ": current/previous" << QString::number(currentEntity) << "/" << QString::number(previousEntity) << QT_ENDL; if ( (currentEntity != previousEntity) || ((infoLabel2->text()).length() < 1) || (InValidCharsInPrevCall) || (dx_CQz != dxE_CQz) || (dx_ITUz != dxE_ITUz)) { //qDebug()<< Q_FUNC_INFO << ": currentEntity=" << QString::number(currentEntity) << "/previousEntity=" << QString::number(previousEntity) << QT_ENDL; previousEntity = currentEntity; InValidCharsInPrevCall = false; //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), dxLocator); //qDebug()<< Q_FUNC_INFO << ": calling showStatusOfDXCC-03 " << QT_ENDL; showStatusOfDXCC(_qs); showDXMarathonNeeded(currentEntity, dx_CQz, mainQSOEntryWidget->getDate().year(), currentLog); othersTabWidget->setIOTAContinentFromEntity(currentEntity); } else if ((dx_CQz == dxE_CQz) || (dx_ITUz = dxE_ITUz)) { //qDebug()<< Q_FUNC_INFO << ": 000" << QT_ENDL; //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); } else { //qDebug()<< Q_FUNC_INFO << ": Default: else" << QT_ENDL; } qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug()<< Q_FUNC_INFO << ": cursorP at the end : " << QT_ENDL; if (completeWithPrevious) { completeWithPreviousQSO(_qrz); } if (!modify) { searchWidget->setCallToSearch(_qrz); if (qrzcomActive && QRZCOMAutoCheckAct->isChecked() && (_qrz.length ()>2)) { //qDebug()<< Q_FUNC_INFO << ": Checking QRZ.com"; elogQRZcom->checkQRZ(_qrz); } else { //qDebug()<< Q_FUNC_INFO << ": NOT checking QRZ.com"; } } //qrzAutoChanging = false; logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug()<< Q_FUNC_INFO << ": END" << QT_ENDL; } void MainWindow::setCleaning(const bool _c) { logEvent(Q_FUNC_INFO, "Start", logSeverity); cleaning = _c; mainQSOEntryWidget->setCleaning(cleaning); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotClearButtonClicked() { //qDebug() << "MainWindow::slotClearButtonClicked - START" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); bool needToRecover = modify; setCleaning(true); yearChangedDuringModification = false; setModifying(false); dateTimeTemp = dateTime; modifyingQSO = -1; QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); if (currentBand < 0) { currentBand = defaultBand; } if (currentMode < 0) { currentMode = defaultMode; //qDebug() << "MainWindow::MainWindow: 12b - currentMode: " << QString::number(currentMode) << QT_ENDL; } clublogAnswer = -1; clublogPrevQSO.clear(); //qDebug() << "MainWindow::slotClearButtonClicked: - 11" << QT_ENDL; setCleaning(false); //qDebug() << "MainWindow::slotClearButtonClicked: Log: " << QString::number(currentLog) << QT_ENDL; setMainWindowTitle(); if (needToRecover) { //qDebug() << Q_FUNC_INFO << ": Recovening the previous status..."; restoreCurrentQSO(true); } else { //qDebug() << Q_FUNC_INFO; clearUIDX(); statusBar()->clearMessage(); //qDebug() << Q_FUNC_INFO << ": NOT recovening the previous status..."; } //qDebug() << "MainWindow::slotClearButtonClicked: " << mainQSOEntryWidget->getMode() << QT_ENDL; //qDebug() << "MainWindow::slotClearButtonClicked - currentMode = " << QString::number(currentMode) << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotClearButtonClicked - END" << QT_ENDL; } void MainWindow::clearUIDX(bool _full) { //qDebug() << Q_FUNC_INFO << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); mainQSOEntryWidget->clear(); QSOTabWidget->clear(); commentTabWidget->clear(_full); infoLabel1->clear(); infoLabel2->clear(); QSOTabWidget->clear(); eQSLTabWidget->clear(); QSLTabWidget->clear(); othersTabWidget->clear(_full); infoWidget->clear(); satTabWidget->clear(_full); myDataTabWidget->clear(_full); completedWithPreviousName = false; completedWithPreviousQTH = false; completedWithPreviousLocator = false; //qDebug() << "MainWindow::clearUIDX deciding wether to change or not the Freq: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; if (QSOTabWidget->getTXFreq()<=0) { //qDebug() << "MainWindow::clearUIDX Setting TX Freq from: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; QSOTabWidget->setTXFreq((dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()))).toDouble()); //qDebug() << "MainWindow::clearUIDX Setting TX Freq to: " << QString::number(txFreqSpinBox->value()) << QT_ENDL; QSOTabWidget->setRXFreq(QSOTabWidget->getTXFreq()); } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void MainWindow::slotRefreshDXCCWidget() { logEvent(Q_FUNC_INFO, "Start", logSeverity); dxccStatusWidget->slotRefreshButtonClicked(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::closeEvent(QCloseEvent *event) { //qDebug() << "MainWindow::closeEvent" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (maybeSave()) { //qDebug() << "MainWindow::closeEvent saving needed" << QT_ENDL; dataProxy->unMarkAllQSO(); dataProxy->compressDB(); saveWindowsSize(); event->accept(); } else { //qDebug() << "MainWindow::closeEvent not saving needed" << QT_ENDL; event->ignore(); } //qDebug() << "MainWindow::closeEvent-END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } bool MainWindow::maybeSave() { //qDebug() << "MainWindow::maybeSave" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString str = tr("The logfile has been modified.") + "\n" + tr("Do you want to save your changes?"); if (alwaysADIF) { //qDebug() << "MainWindow::maybeSave - Saving" << QT_ENDL; if (needToSave) { QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, "KLog", str, QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { if (useDefaultLogFileName) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); //qDebug() << "MainWindow::maybeSave - Use default file name" << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ADIF export")); msgBox.setInformativeText(tr("It is important to export to ADIF and save a copy as a backup.")); if (filemanager->adifLogExport(defaultADIFLogFile, currentLog)) // 0 will save ALL the logs) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Saving the log was done successfully.")); msgBox.exec(); //qDebug() << "MainWindow::maybeSave - Log exported" << QT_ENDL; return true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The ADIF export was not properly done.")); msgBox.exec(); //qDebug() << "MainWindow::maybeSave - ERROR Log not exported" << QT_ENDL; return false; } } else { logEvent(Q_FUNC_INFO, "END-2", logSeverity); //qDebug() << "MainWindow::maybeSave - Going to import??" << QT_ENDL; slotADIFImport(); return true; //return saveFileAs(); } } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-3", logSeverity); //qDebug() << "MainWindow::maybeSave - Cancel" << QT_ENDL; return false; } } else { //qDebug() << "MainWindow::maybeSave - Not needing to save" << QT_ENDL; } } else { //qDebug() << "MainWindow::maybeSave - Not Checking if needed to save" << QT_ENDL; } logEvent(Q_FUNC_INFO, "END", logSeverity); return true; } void MainWindow::slotAWAImport() { //qDebug() << "MainWindow::slotAWAImport" << QT_ENDL; fileAwardManager->importNewAwardFile(); //qDebug() << "MainWindow::slotAWAImport - END" << QT_ENDL; } void MainWindow::createMenusCommon() { //qDebug() << "MainWindow::createMenusCommon" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); fileMenu = menuBar()->addMenu(tr("&File")); //awardAddAct = new QAction(tr("Import Award definition file ..."), this); //fileMenu->addAction(awardAddAct); //connect(awardAddAct , SIGNAL(triggered()), this, SLOT(slotAWAImport())); //awardAddAct ->setToolTip(tr("Import an Award file.")); //TestAct = new QAction(tr("TEST: Advanced search ..."), this); //fileMenu->addAction(TestAct); //connect(TestAct, SIGNAL(triggered()), this, SLOT(slotTest())); ADIFImport = new QAction(tr("&Import from ADIF ..."), this); fileMenu->addAction(ADIFImport); connect(ADIFImport, SIGNAL(triggered()), this, SLOT(slotADIFImport())); ADIFImport->setToolTip(tr("Import an ADIF file into the current log.")); //LoTWImport = new QAction(tr("&Import from LoTW ..."), this); //fileMenu->addAction(LoTWImport); //connect(LoTWImport, SIGNAL(triggered()), this, SLOT(slotLoTWImport())); //LoTWImport->setToolTip(tr("Import an LoTW file into the current log")); fileMenu->addSeparator(); fileMenu->addSeparator(); ADIFExport = new QAction(tr("Export to ADIF ..."), this); fileMenu->addAction(ADIFExport); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExport, SIGNAL(triggered()), this, SLOT(slotADIFExport())); ADIFExport->setToolTip(tr("Export the current log to an ADIF logfile.")); ADIFExportAll = new QAction(tr("Export all logs to ADIF ..."), this); fileMenu->addAction(ADIFExportAll); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExportAll, SIGNAL(triggered()), this, SLOT(slotADIFExportAll())); ADIFExportAll->setToolTip(tr("Export ALL the QSOs into one ADIF file, merging QSOs from all the logs.")); fileMenu->addSeparator(); printLogAct = new QAction(tr("&Print Log ..."), this); fileMenu->addAction(printLogAct); printLogAct->setShortcut(Qt::CTRL + Qt::Key_P); printLogAct->setToolTip(tr("Print your log.")); connect(printLogAct, SIGNAL(triggered()), this, SLOT(slotFilePrint())); fileMenu->addSeparator(); klogFolderAct = new QAction(tr("KLog folder"), this); fileMenu->addAction(klogFolderAct); printLogAct->setToolTip(tr("Opens the data folder of KLog.")); connect(klogFolderAct, SIGNAL(triggered()), this, SLOT(slotOpenKLogFolder())); fileMenu->addSeparator(); setupAct = new QAction(tr("Settings ..."), this); fileMenu->addAction(setupAct); //setupAct->setMenuRole(QAction::PreferencesRole); connect(setupAct, SIGNAL(triggered()), this, SLOT(slotSetup())); fileMenu->addSeparator(); exitAct = new QAction(tr("E&xit"), this); fileMenu->addAction(exitAct); //exitAct->setMenuRole(QAction::QuitRole); exitAct->setShortcut(Qt::CTRL + Qt::Key_X); //connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); connect(exitAct, SIGNAL(triggered()), this, SLOT(slotFileClose())); toolMenu = menuBar()->addMenu(tr("&Tools")); fillQsoAct = new QAction(tr("Fill in QSO data"), this); toolMenu->addAction(fillQsoAct); //fillQsoAct->setMenuRole(QAction::ApplicationSpecificRole); connect(fillQsoAct, SIGNAL(triggered()), this, SLOT(fillQSOData())); fillQsoAct->setToolTip(tr("Go through the log reusing previous QSOs to fill missing information in other QSOs.")); toolMenu->addSeparator(); qslToolMenu = toolMenu->addMenu(tr("QSL tools ...")); findQSO2QSLAct = new QAction(tr("Find QSO to QSL"), this); qslToolMenu->addAction(findQSO2QSLAct); connect(findQSO2QSLAct, SIGNAL(triggered()), this, SLOT(slotSearchToolNeededQSLToSend())); findQSO2QSLAct->setToolTip(tr("Shows QSOs for which you should send your QSL and request the DX QSL.")); findRequestedQSLAct = new QAction(tr("Find My-QSLs pending to send"), this); qslToolMenu->addAction(findRequestedQSLAct); //findQSO2QSLAct->setMenuRole(QAction::ApplicationSpecificRole); connect(findRequestedQSLAct, SIGNAL(triggered()), this, SLOT(slotToolSearchRequestedQSLToSend())); findRequestedQSLAct->setToolTip(tr("Shows the QSOs with pending requests to send QSLs. You should keep this queue empty!")); findQSLPendingToReceiveAct = new QAction(tr("Find DX-QSLs pending to receive"), this); qslToolMenu->addAction(findQSLPendingToReceiveAct); connect(findQSLPendingToReceiveAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLPendingToReceive())); findQSLPendingToReceiveAct->setToolTip(tr("Shows DX-QSLs for which requests or QSLs have been sent with no answer.")); findQSLDXRequestedAct = new QAction(tr("Find requested pending to receive"), this); qslToolMenu->addAction(findQSLDXRequestedAct); connect(findQSLDXRequestedAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLRequested())); findQSLDXRequestedAct->setToolTip(tr("Shows the DX-QSLs that have been requested.")); toolMenu->addSeparator(); lotwToolMenu = toolMenu->addMenu(tr("LoTW tools ...")); lotwMarkSentQueuedThisLogAct = new QAction(tr("Queue all QSLs from this log to be sent"), this); lotwToolMenu->addAction(lotwMarkSentQueuedThisLogAct); connect(lotwMarkSentQueuedThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueuedThisLog())); lotwMarkSentQueuedThisLogAct->setToolTip(tr("Mark all non-sent QSOs in this log as queued to be uploaded.")); lotwMarkSentQueuedAct = new QAction(tr("Queue all QSLs to be sent"), this); lotwToolMenu ->addAction(lotwMarkSentQueuedAct); connect(lotwMarkSentQueuedAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueued())); lotwMarkSentQueuedAct->setToolTip(tr("Put all the non-sent QSOs in the queue to be uploaded.")); lotwToolMenu->addSeparator(); lotwMarkSentYesThisLogAct = new QAction(tr("Mark all queued QSOs from this log as sent"), this); lotwToolMenu->addAction(lotwMarkSentYesThisLogAct); connect(lotwMarkSentYesThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYesThisLog())); lotwMarkSentYesThisLogAct->setToolTip(tr("Mark all queued QSOs in this log as sent to LoTW.")); lotwMarkSentYesAct = new QAction(tr("Mark all queued QSOs as sent"), this); lotwToolMenu ->addAction(lotwMarkSentYesAct); connect(lotwMarkSentYesAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYes())); lotwMarkSentYesAct->setToolTip(tr("Mark all queued QSOs as sent to LoTW.")); lotwToolMenu->addSeparator(); lotwToolMenu ->addAction(lotwCallTQSL); connect(lotwCallTQSL, SIGNAL(triggered()), this, SLOT(slotLoTWExport())); lotwCallTQSL->setToolTip("Sends the log to LoTW calling TQSL. You will be able to select the Station Callsign and start and end dates."); lotwToolMenu->addSeparator(); lotwUpdateFromLoTWAct = new QAction(tr("Download from LoTW ..."), this); lotwToolMenu ->addAction(lotwUpdateFromLoTWAct); connect(lotwUpdateFromLoTWAct, SIGNAL(triggered()), this, SLOT(slotLoTWDownload())); lotwUpdateFromLoTWAct->setToolTip("Updates your LoTW status from LoTW."); lotwFullDownloadFromLoTWAct = new QAction(tr("Download the full log from LoTW ..."), this); lotwToolMenu ->addAction(lotwFullDownloadFromLoTWAct); connect(lotwFullDownloadFromLoTWAct, SIGNAL(triggered()), this, SLOT(slotLoTWFullDownload())); toolMenu->addSeparator(); clublogToolMenu = toolMenu->addMenu(tr("ClubLog tools ...")); clublogLogModifyCurrentLogAct = new QAction(tr("Queue all the QSOs to be uploaded"), this); clublogToolMenu->addAction(clublogLogModifyCurrentLogAct); connect(clublogLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogClubLogModifyCurrentLog())); clublogLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to CLubLog."); clublogLogUploadAct = new QAction(tr("Upload the queued QSOs to ClubLog ..."), this); clublogToolMenu->addAction(clublogLogUploadAct); connect(clublogLogUploadAct, SIGNAL(triggered()), this, SLOT(slotClubLogLogUpload())); clublogLogUploadAct->setToolTip("Uploads your log to ClubLog. Please ensure that you have created log for that callsign before uploading."); toolMenu->addSeparator(); eQSLToolMenu = toolMenu->addMenu(tr("eQSL tools ...")); eqslLogModifyCurrentLogAct = new QAction(tr("Queue all the QSOs to be uploaded"), this); eQSLToolMenu->addAction(eqslLogModifyCurrentLogAct); connect(eqslLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogEQSLModifyCurrentLog())); eqslLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to eQSL."); eqslUploadAct = new QAction(tr("Upload the queued QSOs to eQSL.cc ..."), this); eQSLToolMenu->addAction(eqslUploadAct); connect(eqslUploadAct, SIGNAL(triggered()), this, SLOT(sloteQSLLogUpload())); eqslUploadAct->setToolTip("Uploads your log to eQSL.cc."); toolMenu->addSeparator(); QRZCOMToolMenu = toolMenu->addMenu(tr("QRZ.com tools ...")); QRZCOMCheckThisCallAct = new QAction(tr("Check the current callsign in QRZ.com"), this); QRZCOMLogModifyCurrentLogAct = new QAction(tr("Queue all the QSO to be uploaded"), this); QRZCOMLogUploadAct = new QAction(tr("Upload the queued QSOs to QRZ.com ..."), this); QRZCOMToolMenu->addAction(QRZCOMCheckThisCallAct); connect(QRZCOMCheckThisCallAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMCheckThisCall())); QRZCOMCheckThisCallAct->setToolTip("Checks the current callsign in QRZ.com."); QRZCOMAutoCheckAct->setText(tr("Check always the current callsign in QRZ.com")); QRZCOMToolMenu->addAction(QRZCOMAutoCheckAct); connect(QRZCOMAutoCheckAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMAutoCheck())); QRZCOMAutoCheckAct->setToolTip("Checks always the current callsign in QRZ.com"); QRZCOMToolMenu->addSeparator(); QRZCOMToolMenu->addAction(QRZCOMLogModifyCurrentLogAct); connect(QRZCOMLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMModifyCurrentLog())); QRZCOMLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to QRZ.com."); QRZCOMToolMenu->addAction(QRZCOMLogUploadAct); connect(QRZCOMLogUploadAct, SIGNAL(triggered()), this, SLOT(slotQRZCOMLogUpload())); QRZCOMLogUploadAct->setToolTip("Uploads your log to QRZ.com. Please ensure that you have created log and the API-KEY configured in the setup for that callsign before uploading."); toolMenu->addSeparator(); downloadCTYAct = new QAction (tr("Update cty.csv"), this); toolMenu->addAction(downloadCTYAct); //downloadCTYAct->setMenuRole(QAction::ApplicationSpecificRole); connect(downloadCTYAct, SIGNAL(triggered()), this, SLOT(slotUpdateCTYDAT())); downloadCTYAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); downloadSATSAct = new QAction (tr("Update Satellite Data"), this); toolMenu->addAction(downloadSATSAct); connect(downloadSATSAct, SIGNAL(triggered()), this, SLOT(slotUpdateSATSDAT())); downloadSATSAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); toolMenu->addSeparator(); showStatsAct = new QAction (tr("Stats"), this); toolMenu->addAction(showStatsAct); connect(showStatsAct, SIGNAL(triggered()), this, SLOT(slotShowStats())); showStatsAct->setToolTip(tr("Show the statistics of your radio activity.")); //qDebug() << "MainWindow::createMenusCommon before" << QT_ENDL; //toolMenu->addSeparator(); //showRotatorAct = new QAction (tr("Rotator"), this); //toolMenu->addAction(showRotatorAct); //connect(showRotatorAct, SIGNAL(triggered()), this, SLOT(slotRotatorShow())); //showRotatorAct->setToolTip(tr("Show the rotator controller.")); //qDebug() << "MainWindow::createMenusCommon after" << QT_ENDL; //showWorldMapAct = new QAction(tr("CQ zones world map"), this); //toolMenu->addAction(showWorldMapAct); //connect(showWorldMapAct, SIGNAL(triggered()), this, SLOT(slotWorldMapShow())); //showWorldMapAct->setToolTip(tr("Show a world map with your radio activity.")); //toolMenu->addSeparator(); //setupMenu = menuBar()->addMenu(tr("Setup")); //TODO: To be added once the help dialog has been implemented helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addSeparator(); helpAct= new QAction(tr("Online manual (F1) ..."), this); helpMenu->addAction(helpAct); //helpAct->setMenuRole(QAction::ApplicationSpecificRole); connect(helpAct, SIGNAL(triggered()), this, SLOT(slotOpenWiki())); tipsAct = new QAction(tr("&Tips ..."), this); helpMenu->addAction(tipsAct); //tipsAct->setMenuRole(QAction::ApplicationSpecificRole); connect(tipsAct, SIGNAL(triggered()), this, SLOT(slotTipsAction())); helpMenu->addSeparator(); debugAct = new QAction(tr("&Debug ..."), this); helpMenu->addAction(debugAct); //debugAct->setMenuRole(QAction::ApplicationSpecificRole); connect(debugAct, SIGNAL(triggered()), this, SLOT(slotDebugAction())); aboutAct = new QAction(tr("&About ..."), this); helpMenu->addAction(aboutAct); //aboutAct->setMenuRole(QAction::AboutRole); connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotHelpAboutAction())); //connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotLoTWTest()) ); #if defined(Q_OS_MACOS) // It seems that on MAC if I try to show both, only the last one (or Qt) is shown #else // I can define the setMenuRole but then no standard locations are used on macOS aboutQtAct = new QAction(tr("About Qt ..."), this); helpMenu->addAction(aboutQtAct); //aboutQtAct->setMenuRole(QAction::AboutQtRole); connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(slotAboutQt())); logEvent(Q_FUNC_INFO, "END", logSeverity); #endif helpMenu->addSeparator(); updateAct = new QAction(tr("Check updates ..."), this); helpMenu->addAction(updateAct); //updateAct->setMenuRole(QAction::ApplicationSpecificRole); connect(updateAct, SIGNAL(triggered()), this, SLOT(slotHelpCheckUpdatesAction())); } void MainWindow::slotDebugAction() { logEvent(Q_FUNC_INFO, "Start", logSeverity); showKLogLogWidget->show(); logEvent(Q_FUNC_INFO, "END", logSeverity); } /* void MainWindow::slotTest() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << Q_FUNC_INFO << QT_ENDL; //showKLogLogWidget->setWindowModality(false); showKLogLogWidget->show(); //advancedSearchWidget->show(); //qDebug() << Q_FUNC_INFO << " - END "<< QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } */ void MainWindow::slotSearchToolNeededQSLToSend() { logEvent(Q_FUNC_INFO, "Start", logSeverity); slotShowSearchWidget(); searchWidget->searchToolNeededQSLToSend(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolSearchRequestedQSLToSend() { logEvent(Q_FUNC_INFO, "Start", logSeverity); searchWidget->slotToolSearchRequestedQSLToSend(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolSearchNeededQSLPendingToReceive() { logEvent(Q_FUNC_INFO, "Start", logSeverity); searchWidget->slotToolSearchNeededQSLPendingToReceive(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolSearchNeededQSLRequested() { logEvent(Q_FUNC_INFO, "Start", logSeverity); searchWidget->slotToolSearchNeededQSLRequested(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolLoTWMarkAllQueuedThisLog() { //qDebug() << "MainWindow::slotToolLoTWMarkAllQueuedThisLog" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - LoTW")); msgConfirm.setText(tr("Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW.")); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if(dataProxy->lotwSentQueue(mainQSOEntryWidget->getDate(), currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All pending QSOs of this log has been marked as queued for LoTW!") + "\n\n" + tr("Now you can upload them to LoTW.")); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all pending QSOs of this log as queued for LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); } } /* void MainWindow::slotLoTWTest() { //qDebug() << "MainWindow::slotLoTWTest: " << QT_ENDL; slotLoTWDownloadedFileProcess("lotwimport.adi"); //qDebug() << "MainWindow::slotLoTWTest - END" << QT_ENDL; } */ void MainWindow::slotLoTWDownloadedFileProcess(const QString &_fn) { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::slotLoTWDownloadedFileProcess: " << _fn << QT_ENDL; QList a; a.clear(); a.append(filemanager->adifLoTWReadLog2(_fn, currentLog)); QString aux; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (a.length()>0) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Your log has been updated with the LoTW downloaded QSOs.")); aux = QString(tr("KLog has updated %1 QSOs from LoTW.")).arg(a.length()); msgBox.setInformativeText(aux); msgBox.exec(); logWindow->refresh(); dxccStatusWidget->refresh(); //TODO: Add the QSOs to the widget and show showAdifImportWidget->show(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Your log has not been updated.")); aux = QString(tr("No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated.")); msgBox.setInformativeText(aux); msgBox.exec(); } //filemanager->adifLoTWReadLog(_fn); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolLoTWMarkAllQueued() { //qDebug() << "MainWindow::slotToolLoTWMarkAllQueued" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - LoTW")); msgConfirm.setText(tr("Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW.")); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (dataProxy->lotwSentQueue(mainQSOEntryWidget->getDate(), -1)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All pending QSOs has been marked as queued for LoTW!") + "\n\n" + tr("Now you can upload them to LoTW.")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all pending QSOs as queued for LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); } } bool MainWindow::callTQSL(const QString &_filename, const QString &_call) { //https://lotw.arrl.org/lotw-help/cmdline/ logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::callTQSL: " << lotwTQSLpath << QT_ENDL; QStringList arguments; arguments.clear(); //arguments << "--action=compliant" << QString("-c %1").arg(_call) << "-d" << "-u" << "-x" << _filename; arguments << QString("-c %1").arg(_call) << "-u" << _filename; int ok = -1; QString msg; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - TQSL")); if (!QFile::exists(lotwTQSLpath)) { msg = tr("TQSL is not installed or KLog can't find it. Please check the configuration."); ok = 6; // A positive value here will return false, an error below. } else { ok = QProcess::execute(lotwTQSLpath, arguments); //qDebug() << "MainWindow::callTQSL-ok: " << QString::number(ok) << QT_ENDL; switch (ok) { case 0: // success: all qsos submitted were signed and saved or signed and uploaded //qDebug() << "MainWindow::callTQSL: 0" << QT_ENDL; //msg = tr("All the QSOs were signed and uploaded with no error."); //msg = tr("TQSL finished with no error."); //msgBox.setIcon(QMessageBox::Information); break; case 1: // cancelled by user //qDebug() << "MainWindow::callTQSL: 1" << QT_ENDL; msg = tr("Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded."); break; case 2: // rejected by LoTW //qDebug() << "MainWindow::callTQSL: 2" << QT_ENDL; msg = tr("Error #2: Upload was rejected by LoTW, please check your data."); break; case 3: // unexpected response from TQSL server //qDebug() << "MainWindow::callTQSL: 3" << QT_ENDL; msg = tr("Error #3: The TQSL server returned an unexpected response."); break; case 4: // TQSL error //qDebug() << "MainWindow::callTQSL: 4" << QT_ENDL; msg = tr("Error #4: There was a TQSL error."); break; case 5: // TQSLlib error //qDebug() << "MainWindow::callTQSL: 5" << QT_ENDL; msg = tr("Error #5: There was a TQSLLib error."); break; case 6: // unable to open input file //qDebug() << "MainWindow::callTQSL: 6" << QT_ENDL; msg = tr("Error #6: It was not possible to open the input file."); break; case 7: // unable to open output file //qDebug() << "MainWindow::callTQSL: 7" << QT_ENDL; msg = tr("Error #7: It was not possible to open the ouput file."); break; case 8: // No QSOs were processed since some QSOs were duplicates or out of date range //qDebug() << "MainWindow::callTQSL: 8" << QT_ENDL; msg = tr("Error #8: No QSOs were processed since some QSOs were duplicates or out of date range."); break; case 9: // Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range //qDebug() << "MainWindow::callTQSL: 9" << QT_ENDL; msg = tr("Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range."); break; case 10: // command syntax error //qDebug() << "MainWindow::callTQSL: 10" << QT_ENDL; msg = tr("Error #10: Command syntax error. KLog sent a bad syntax command."); break; case 11: // LoTW Connection error (no network or LoTW is unreachable) //qDebug() << "MainWindow::callTQSL: 11" << QT_ENDL; msg = tr("Error #11: LoTW Connection error (no network or LoTW is unreachable)."); break; default: msg = tr("Error #00: Unexpected error. Please contact the development team."); return false; // should never be reached } } if (ok>0) { msgBox.setText(msg); msgBox.exec(); return false; } else { return true; } //logEvent(Q_FUNC_INFO, "END", logSeverity); } QString MainWindow::selectStationCallsign() { logEvent(Q_FUNC_INFO, "Start", logSeverity); QString stationCallToUse = QString(); QStringList stationCallSigns; stationCallSigns.clear(); stationCallSigns << "NONE"; stationCallSigns << dataProxy->getStationCallSignsFromLog(-1); //bool callsignTyped = false; if (stationCallSigns.length()>1) { QString msg = QString(tr("The log that you have selected contains more than just one station callsign.") + "\n\n" + tr("Please select the station callsign you want to mark as sent to LoTW:")); bool ok; stationCallToUse = QInputDialog::getItem(this, tr("Station Callsign:"), msg, stationCallSigns, 0, false, &ok); if (ok && util->isValidCall(stationCallToUse)) //if (ok && !stationCallToUse.isEmpty()) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return stationCallToUse; } else { stationCallToUse = (QInputDialog::getText(this, tr("Define Station Callsign"), tr("You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here.") + "\n\n" + tr("Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined:"), QLineEdit::Normal, "", &ok)).toUpper(); if (ok) { //callsignTyped = true; if (util->isValidCall(stationCallToUse)) { logEvent(Q_FUNC_INFO, "END-2", logSeverity); return stationCallToUse; } } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - No station selected")); QString aux = QString(tr("No station callsign has been selected and therefore no log will be marked") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Ok was clicked //return ; break; default: // should never be reached break; } } } } logEvent(Q_FUNC_INFO, "END", logSeverity); return QString(); } void MainWindow::slotToolLoTWMarkAllYesThisLog() { //qDebug() << "MainWindow::slotToolLoTWMarkAllYesThisLog" << QT_ENDL; //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); logEvent(Q_FUNC_INFO, "Start", logSeverity); if(dataProxy->lotwSentYes(mainQSOEntryWidget->getDate(), currentLog, "ALL")) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All queued QSOs of this log has been marked as sent to LoTW!") ); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all queued QSOs of this log as sent to LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotToolLoTWMarkAllYes() { //qDebug() << "MainWindow::slotToolLoTWMarkAllYes" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString stationCallToUse = selectStationCallsign(); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (dataProxy->lotwSentYes(mainQSOEntryWidget->getDate(), -1, stationCallToUse)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All queued QSOs has been marked as sent to LoTW!") ); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all queued QSOs as sent to LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotReceiveQSOListToShowFromFile(QStringList _qs) { //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile: " << QString::number(_qs.length()) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); // Receiving: modifiedQSOList << _call << _date + "-" +_time << _band << _mode << _qslrdate; // Must send QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qs.length()!=4) { //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile - NO valid qso list received - length: " << QString::number(_qs.length()) << QT_ENDL; return; } if (!util->isValidCall(_qs.at(0))) { //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile - NO valid QRZ received - " << _qs.at(0) << QT_ENDL; return; } if (dataProxy->getIdFromBandName(_qs.at(2))<0) { //qDebug() << "SMainWindow::slotReceiveQSOListToShowFromFile - NO valid BAND received"<< _qs.at(2) << QT_ENDL; return; } if (dataProxy->getIdFromModeName(_qs.at(3))<0) { //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile - NO valid Mode received" << _qs.at(3)<< QT_ENDL; return; } if (!util->isValidDateTimeFromString(_qs.at(1))) { //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile No valid date" << QT_ENDL; return; } //qDebug() << "MainWindow::slotReceiveQSOListToShowFromFile ALL OK" << QT_ENDL; //QStringList qsoToSend; //qsoToSend.clear(); //qsoToSend << _qs.at(0) << _qs.at(1) << _qs.at(2) << _qs.at(3); showAdifImportWidget->addQSOToTheList(_qs); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotAboutQt() { //qDebug() << "MainWindow::slotAboutQt" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QMessageBox::aboutQt(this,tr("About ...")); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotHelpAboutAction() { //qDebug() << "MainWindow::slotHelpAboutAction " << QT_ENDL; // QMessageBox::about(this, tr("About KLog"), // tr("KLog " // "Find the last release at https://jaime.robles.es/klog.")); logEvent(Q_FUNC_INFO, "Start", logSeverity); aboutDialog->exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); //helpAboutDialog->exec(); } void MainWindow::slotTipsAction() { //qDebug() << "MainWindow::slotTipsAction " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); tipsDialog->exec(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotHelpCheckUpdatesAction() { //qDebug() << "MainWindow::slotHelpCheckUpdatesAction" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); callingUpdate = true; softUpdate->addCall(stationCallsign); softUpdate->needToUpdate(true); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotShowSoftUpdateResults(const bool _b) { //qDebug() << "MainWindow::slotShowSoftUpdateResults: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (_b == true) { //qDebug() << "MainWindow::slotShowSoftUpdateResults _b = TRUE " << QT_ENDL; } else { //qDebug() << "MainWindow::slotShowSoftUpdateResults _b = FALSE " << QT_ENDL; } if (callingUpdate == true) { if (_b == false) { //qDebug() << "MainWindow::slotShowSoftUpdateResults: UPDATE NOT NEEDED" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - Update checking result")); msgBox.setText(tr("Congratulations!") + "\n\n" + tr("You already have the latest version.")); msgBox.exec(); } else { //qDebug() << "MainWindow::slotShowSoftUpdateResults: UPDATE NEEDED" << QT_ENDL; } } callingUpdate = false; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotLogWinShow() { //qDebug() << "MainWindow::slotLogWinShow: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!(logWindow->isVisible()) ) { logWinAct->setChecked ( true ); logWindow->show(); }else { logWinAct->setChecked ( false ); logWindow->hide(); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotSetup(const int _page) { //qDebug() << "MainWindow::slotSetup: " << QString::number(_page) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); configured = false; backupCurrentQSO (); openSetup(_page); //qDebug() << "MainWindow::slotSetup - END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::openSetup(const int _page) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_page) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //int result = -1; hamlib->stop(); if (!needToEnd) { logEvent(Q_FUNC_INFO, "Just before setData", logSeverity); //qDebug() << "MainWindow::openSetup - Just before setupDialog->exec-1" << QT_ENDL; if (upAndRunning) { setupDialog->setData(configFileName, softwareVersion, _page, !configured); } else { setupDialog->setData(configFileName, softwareVersion, 0, !configured); } if ( (!configured) || (itIsANewversion) ) { logEvent(Q_FUNC_INFO, "Just before SetupDialog->exec", logSeverity); itIsANewversion = false; //setupDialog->exec(); setupDialog->setModal(true); setupDialog->show(); // move part of this code to slotSetupDialogFinished logEvent(Q_FUNC_INFO, "Just after setupDialog->show", logSeverity); //qDebug() << "MainWindow::openSetup - Just after setupDialog->show" << QT_ENDL; } else { logEvent(Q_FUNC_INFO, "No setupDialog->exec needed", logSeverity); //qDebug() << "MainWindow::openSetup - No setupDialog->show needed" << QT_ENDL; } } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotSetupDialogFinished (const int _s) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_s); if (needToEnd) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if (_s == QDialog::Accepted) { //qDebug() << Q_FUNC_INFO << " - QDialog::Accepted"; logEvent(Q_FUNC_INFO, "Just before readConfigData", logSeverity); readConfigData(); reconfigureDXMarathonUI(manageDxMarathon); logEvent(Q_FUNC_INFO, "Just after readConfigData", logSeverity); //qDebug() << "MainWindow::slotSetupDialogFinished: logmodel to be created-2" << QT_ENDL; logEvent(Q_FUNC_INFO, "logmodel to be created-2", logSeverity); logWindow->createlogPanel(currentLog); logEvent(Q_FUNC_INFO, "logmodel has been created-2", logSeverity); defineStationCallsign(stationCallsign); logEvent(Q_FUNC_INFO, "before db->reConnect", logSeverity); //qDebug() << "MainWindow::openSetup: before db->reConnect" << QT_ENDL; dataProxy->reconnectDB(); logEvent(Q_FUNC_INFO, "after db->reConnect", logSeverity); //qDebug() << "MainWindow::openSetup: after db->reConnect" << QT_ENDL; if (hamlibActive) { //qDebug() << "MainWindow::slotSetupDialogFinished: Hamlib is active, let's read the VFO Freq/Mode" << QT_ENDL; } } else { //qDebug() << Q_FUNC_INFO << " - !QDialog::Accepted"; } if (qso->getBackup ()) { //qDebug() << Q_FUNC_INFO << ": Restoring..." << QT_ENDL; restoreCurrentQSO (QDialog::Accepted); } else { //qDebug() << "MainWindow::slotSetupDialogFinished: NO Restoring..." << QT_ENDL; } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", logSeverity); } bool MainWindow::slotOpenKLogFolder() { //qDebug() << "MainWindow::slotOpenKLogFolder: " << configFileName << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //configFileName = klogDir+"/klogrc.cfg"; QString _aux = "" ; QString _text = tr("You can find the KLog data folder here: ") + _aux; QMessageBox::information(this, tr("KLog"), _text, QMessageBox::Ok, QMessageBox::Ok); //qDebug() << "MainWindow::slotOpenKLogFolder: END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); return true; } void MainWindow::slotUpdateStatusBar(const QString &statusm) { //qDebug() << "MainWindow::slotUpdateStatusBar: " << statusm << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); statusBar()->showMessage(statusm, 2000); logEvent(Q_FUNC_INFO, "END", logSeverity); } bool MainWindow::readCtyFile() { logEvent(Q_FUNC_INFO, "Start", logSeverity); logEvent(Q_FUNC_INFO, "END", logSeverity); return false; } void MainWindow::slotDoubleClickLog(const int _qsoID) { //qDebug() << "MainWindow::slotDoubleClickLog: QSOid: " << QString::number(_qsoID) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //int row = _qsoID.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); qsoToEdit(_qsoID); logEvent(Q_FUNC_INFO, "END", logSeverity); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited } bool MainWindow::setUDPServer(const bool _b) { //qDebug() << Q_FUNC_INFO << ": upAndRunning: " << util->boolToQString (upAndRunning) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_b) << QT_ENDL; QString errorMSG, aux; if (_b) { if (!UDPLogServer->isStarted()) { if (!UDPLogServer->start()) { errorMSG = tr("start"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); return false; } else { //qDebug() << Q_FUNC_INFO << ": UDP Log server started!" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } return true; } else { return true; //qDebug() << Q_FUNC_INFO << ": UDP Log server already started no need to restart!" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } } else { //qDebug() << "qDebug() << Q_FUNC_INFO << ": UDPServerStart FALSE" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if (UDPLogServer->isStarted()) { if (!UDPLogServer->stop()) { errorMSG = tr("stop"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); return UDPLogServer->isStarted (); } else { return false; //qDebug() << Q_FUNC_INFO << ": UDP Log server stopped!" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } } else { return false; //qDebug() << Q_FUNC_INFO << ": UDP Log server already stopped no need to restop!" << QT_ENDL; } } } bool MainWindow::setHamlib(const bool _b) { //qDebug() << Q_FUNC_INFO << ": upAndRunning: " << util->boolToQString (upAndRunning) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_b) << QT_ENDL; if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << ": Hamlib upAndRunning FALSE"; return false; } if (_b) { //qDebug() << Q_FUNC_INFO << ": Hamlib active"; hamlib->init(true); //qDebug() << Q_FUNC_INFO << ": After Hamlib active"; return hamlib->readRadio(true); // Forcing the radio update } else { //qDebug() << Q_FUNC_INFO << ": Hamlib NOT active"; hamlib->stop(); return false; } } void MainWindow::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO << QT_ENDL; setWindowSize(windowSize); setHamlib (hamlibActive); } void MainWindow::keyPressEvent(QKeyEvent *event){ //qDebug() << "MainWindow::keyPressEvent: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); switch (event->key()) { case Qt::Key_Return: // ENTER PRESSED slotQRZReturnPressed(); //qDebug() << "MainWindow::keyPressEvent: RETURN" << QT_ENDL; break; case Qt::Key_Enter: // ENTER PRESSED //qDebug() << "MainWindow::keyPressEvent: ENTER" << QT_ENDL; slotQRZReturnPressed(); break; case Qt::Key_F1: slotOpenWiki(); break; case Qt::Key_F4: //qDebug << "MainWindow::keyPressEvent: F4" << QT_ENDL; mainQSOEntryWidget->toggleRealTime (); break; default: //QFrame::keyPressEvent(event); break; } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotOpenWiki() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << Q_FUNC_INFO << QT_ENDL; QDesktopServices::openUrl(QUrl("https://wiki.klog.xyz/")); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::readConfigData() { //qDebug() << Q_FUNC_INFO << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (needToEnd) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); //qDebug() << "MainWindow::readConfigData - END - 1" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; return; } QFile file(configFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << ": File not found" << configFileName << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if (configured) { //qDebug() << Q_FUNC_INFO << ": configured = true" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } else { //qDebug() << Q_FUNC_INFO << ": configured = false" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } //qDebug() << Q_FUNC_INFO << ": Calling openSetup" << QT_ENDL; openSetup(0); //qDebug() << Q_FUNC_INFO << ": After calling openSetup" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-2", logSeverity); //qDebug() << Q_FUNC_INFO << ": - END - 2" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; return; } hamlibActive = false; eQSLActive = false; clublogActive = false; lotwActive = false; deleteAlwaysAdiFile = false; //qDebug() << Q_FUNC_INFO << ": Before processConfigLine " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; QTextStream in(&file); while (!in.atEnd()) { QString line; line.clear (); line = in.readLine(); processConfigLine(line); } file.close (); //qDebug() << Q_FUNC_INFO << ": After processConfigLines " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //defineStationCallsign(mainQRZ); //qDebug() << Q_FUNC_INFO << ": " << defaultADIFLogFile << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if ((useDefaultLogFileName) && (defaultADIFLogFile.length()>0)) { useDefaultLogFileName = true; } else { useDefaultLogFileName = false; } //qDebug() << Q_FUNC_INFO << ": 01" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; infoWidget->setImperialSystem(imperialSystem); infoLabel2->setText(world->getEntityName(currentEntity)); //qDebug() << "MainWindow::readConfigData-89" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; infoWidget->showEntityInfo(currentEntity); //qDebug() << Q_FUNC_INFO << ": 90" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; configured = true; searchWidget->setColors(newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); awards->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); dxClusterWidget->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); dxClusterWidget->setDXClusterSpotConfig(dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY ); setMainWindowTitle(); dxClusterWidget->setMyQRZ(stationCallsign); //qDebug() << Q_FUNC_INFO << ": 97" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; checkIfNewBandOrMode(); //qDebug() << Q_FUNC_INFO << ": 98" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //initialContestModeConfiguration(); //qDebug() << "MainWindow::readConfigData: 99" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; /* if (upAndRunning) { // Next actions will not be executed in the first run slotClearButtonClicked(); } */ // I need to init the CLUBLOG if (clublogActive) { elogClublog->setCredentials(clublogEmail, clublogPass, stationCallsign); } else { //qDebug() << "MainWindow::readConfigData: NOT Setting ClublogCredentials" << QT_ENDL; } //qDebug() << Q_FUNC_INFO << ": QRZcom active????" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if (qrzcomActive) { //qDebug() << "MainWindow::readConfigData: QRZcom active"<< QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; elogQRZcom->setCredentials(qrzcomUser, qrzcomPass); //qDebug() << "MainWindow::readConfigData: QRZcom credentials"<< QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; elogQRZcom->login(); //qDebug() << "MainWindow::readConfigData: login" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //elogQRZcom->login(); //qDebug() << "MainWindow::readConfigData: after login" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } //qDebug() << "MainWindow::readConfigData: calling checkIfNewBandOrMode" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //qDebug() << "MainWindow::readConfigData: 100" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; util->setVersion(softwareVersion); //qDebug() << "MainWindow::readConfigData: 101" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; searchWidget->setVersion(softwareVersion); //qDebug() << "MainWindow::readConfigData: 102" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; searchWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::readConfigData: 103" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; infoWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::readConfigData: 104" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; //searchWidget->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); infoWidget->setColors(newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); satTabWidget->refreshData(); adifLoTWExportWidget->setLogNumber (currentLog); QString aux; QString errorMSG; if (upAndRunning) { startServices(); } //qDebug() << Q_FUNC_INFO << " - END" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::startServices() { setWindowSize (windowSize); setHamlib(hamlibActive); setUDPServer(UDPServerStart); } bool MainWindow::processConfigLine(const QString &_line){ //qDebug() << Q_FUNC_INFO << ": " << _line << QT_ENDL; logEvent(Q_FUNC_INFO, QString("Start: %1").arg(_line), logSeverity); int _logWithMoreQSOs = 0; // At the end, if the this variable is >0 the Selectedlog will have to be changed in the file. QString line = _line.simplified(); //qDebug() << Q_FUNC_INFO << " - 2" << QT_ENDL; if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "MainWindow::processConfigLine: Wrong Line!" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-2", logSeverity); return false; } //qDebug() << Q_FUNC_INFO << " - 5" << QT_ENDL; if (line.startsWith('#')) { //qDebug() << "MainWindow::processConfigLine: notes Line!" << QT_ENDL; logEvent(Q_FUNC_INFO, "END-1", logSeverity); return true; } //qDebug() << Q_FUNC_INFO << " - 10 " << QT_ENDL; QStringList values; values.clear(); //values << line.split("=", QT_SKIP); values << line.split("=", QT_SKIP); //qDebug() << Q_FUNC_INFO << ": value length: " << QString::number(values.length ()) << QT_ENDL; if (values.length ()!=2) { //qDebug() << Q_FUNC_INFO << ": Returning false, wrong lenght!" << QT_ENDL; return false; } //qDebug() << Q_FUNC_INFO << ": value.at(0): " << values.at(0) << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": value.at(1): " << values.at(1) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - 11 " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - 20 " << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - 25" << QT_ENDL; QString field = (values.at(0)).toUpper(); //qDebug() << Q_FUNC_INFO << " - 26" << QT_ENDL; QString value = values.at(1); //qDebug() << Q_FUNC_INFO << " - 28" << QT_ENDL; int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } //qDebug() << Q_FUNC_INFO << " - 30 " << QT_ENDL; QString aux; if (field == "CALLSIGN"){ //qDebug() << Q_FUNC_INFO << " - 30.1 - Callsign: " << value << QT_ENDL; if (util->isValidCall(value)) { mainQRZ = value; } }else if (field=="CQZ"){ my_CQz = value.toInt(); }else if (field=="ITUZ"){ my_ITUz = value.toInt(); }else if (field=="CONTEST"){ //qDebug() << "MainWindow::processConfigLine: CONTEST: " << QT_ENDL; contestMode = value; }else if (field=="MODES"){ readActiveModes(value.split(", ", QT_SKIP)); }else if (field=="BANDS"){ //qDebug() << "MainWindow::processConfigLine: BANDS: " << value << QT_ENDL; readActiveBands(value.split(", ", QT_SKIP)); }else if (field=="REALTIME"){ //qDebug << "MainWindow::processConfigLine: REALTIME: " << value.toUpper() << QT_ENDL; mainQSOEntryWidget->setRealTime(util->trueOrFalse(value)); //realTime = util->trueOrFalse(value); }else if (field=="LOGVIEWFIELDS"){ //qDebug() << "MainWindow::processConfigLine: LOGVIEWFIELDS: " << value.toUpper() << QT_ENDL; logWindow->setColumns(value.split(",", QT_SKIP)); }else if (field =="DXCLUSTERSERVERTOUSE"){ aux = value; //dxfun.com:8000 if (aux.contains(':')) { dxclusterServerToConnect = (aux.split(':', QT_SKIP)).at(0); dxclusterServerPort = ((aux.split(':', QT_SKIP)).at(1)).toInt(); } if ((dxclusterServerToConnect.length()< 3) || (dxclusterServerPort <= 0)) { dxclusterServerToConnect = "dxfun.com"; dxclusterServerPort = 8000; } dxClusterWidget->setDXClusterServer(dxclusterServerToConnect, dxclusterServerPort); } else if(field=="POWER") { if (value.toFloat()>0.0f) { myPower = value.toDouble(); myDataTabWidget->setSetupMyPower(myPower); } } else if (field=="USEDEFAULTNAME") { useDefaultLogFileName = util->trueOrFalse(value); } else if (field=="IMPERIALSYSTEM") { imperialSystem = util->trueOrFalse(value); } else if (field=="SENDQSLWHENREC") { sendQSLWhenRec = util->trueOrFalse(value); } else if (field=="MANAGEDXMARATHON") { //qDebug() << "MainWindow::processConfigLine: Marathon-1 - Value: " << value << QT_ENDL; manageDxMarathon = util->trueOrFalse(value); //qDebug() << "MainWindow::processConfigLine: Marathon-2" << QT_ENDL; awardsWidget->setManageDXMarathon(manageDxMarathon); } else if (field=="SHOWCALLSIGNINSEARCH") { searchWidget->setShowCallInSearch(util->trueOrFalse(value)); //stationCallSignShownInSearch = util->trueOrFalse(value); } else if (field=="CHECKNEWVERSIONS"){ checkNewVersions = util->trueOrFalse(value); } else if (field=="PROVIDEINFO"){ reportInfo = util->trueOrFalse(value); } else if (field=="ALWAYSADIF") { alwaysADIF = util->trueOrFalse(value); } else if (field=="DEBUGLOG") { if (util->trueOrFalse(value)) { logSeverity = Info; logEvent(Q_FUNC_INFO, "Log enabled"); } else { logEvent(Q_FUNC_INFO, "Log disabled"); logSeverity = Info; } } else if (field=="UTCTIME") { //qDebug() << "MainWindow::processConfigLine: UTCTIME: " << value.toUpper() <trueOrFalse(value); mainQSOEntryWidget->setUTC(util->trueOrFalse(value)); } else if (field=="SENDEQSLBYDEFAULT") { sendQSLByDefault=util->trueOrFalse(value); eQSLTabWidget->setQueueSentByDefault(sendQSLByDefault); } else if (field=="DUPLICATEDQSOSLOT"){ if (value.toInt()>=0) { dupeSlotInSeconds = value.toInt(); filemanager->setDuplicatedQSOSlot(dupeSlotInSeconds); mainQSOEntryWidget->setDuplicatedQSOSlot(dupeSlotInSeconds); } } else if (field=="COMPLETEWITHPREVIOUS") { completeWithPrevious = util->trueOrFalse(value); } else if (field=="DXCLUSTERSAVE") { dxClusterWidget->setSaveSpots(util->trueOrFalse(value)); } else if (field=="DXCLUSTERSHOWHF") { dxClusterShowHF = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWVHF") { dxClusterShowVHF = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWARC") { dxClusterShowWARC = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWORKED") { dxClusterShowWorked = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWCONFIRMED") { dxClusterShowConfirmed = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWANN") { dxClusterShowAnn = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWWV") { dxClusterShowWWV = util->trueOrFalse(value); } else if (field=="DXCLUSTERSHOWWCY") { dxClusterShowWCY = util->trueOrFalse(value); } else if (field=="DEFAULTADIFFILE") { defaultADIFLogFile = value.toLower(); //qDebug() << "MainWindow::processConfigLine: " << defaultADIFLogFile << QT_ENDL; } else if (field=="STATIONLOCATOR") { if ( locator->isValidLocator(value) ) { //myLocator = ; myDataTabWidget->setMyLocator(value.toUpper()); } } else if(field=="NEWONECOLOR") { newOneColor.setNamedColor(value); } else if(field=="NEEDEDCOLOR") { neededColor.setNamedColor(value); } else if(field=="WORKEDCOLOR") { workedColor.setNamedColor(value); } else if(field=="CONFIRMEDCOLOR") { confirmedColor.setNamedColor(value); } else if(field=="DEFAULTCOLOR") { defaultColor.setNamedColor(value); } //else if (field=="PSTROTATORACTIVE") //{ //usePSTRotator = true; //} //else if (field=="PSTROTATORPORT") //{ // pstRotator->setPort(value.toInt()); //} //else if (field=="PSTROTATORSERVER") //{ // pstRotator->setServer(value); //} else if (field=="UDPSERVER") { //qDebug() << "MainWindow::processConfigLine: UDPSERVER: " << value.toUpper() << QT_ENDL; UDPServerStart = util->trueOrFalse(value); } else if (field=="UDPNETWORKINTERFACE") { UDPLogServer->setNetworkInterface(value); } else if (field=="UDPSERVERPORT") { UDPLogServer->setPort(value.toInt()); } else if (field=="INFOTIMEOUT") { int a = value.toInt(); if ((a>0) && (a<=65535)) { infoTimeout = a; } } else if (field=="LOGFROMWSJTX") { UDPLogServer->setLogging(util->trueOrFalse(value)); } else if (field=="LOGAUTOFROMWSJTX") { wsjtxAutoLog = util->trueOrFalse(value); } else if (field == "HAMLIBRIGTYPE" ) { //qDebug() << "MainWindow::processConfigLine: HAMLIBRIGTYPE: " << value << QT_ENDL; hamlib->setModelId(value.toInt()); //qDebug() << "MainWindow::processConfigLine: HAMLIBRIGTYPE: " << value << QT_ENDL; } else if(field == "HAMLIBSERIALPORT") { //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALPORT: " << value << QT_ENDL; hamlib->setPort(value); //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALPORT: " << value << QT_ENDL; } else if (field == "HAMLIBSERIALBAUDS") { //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALBAUDS: " << value << QT_ENDL; hamlib->setSpeed(value.toInt()); //qDebug() << "MainWindow::processConfigLine: HAMLIBSERIALBAUDS: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALDATABITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << QT_ENDL; hamlib->setDataBits(value.toInt()); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDATABITS: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALSTOPBITS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << QT_ENDL; hamlib->setStop(value.toInt ()); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALSTOPBITS: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALFLOWCONTROL"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << QT_ENDL; hamlib->setFlow(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALFLOWCONTROL: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALPARITY"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << QT_ENDL; hamlib->setParity(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALPARITY: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALRTS"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << QT_ENDL; //hamlib->setRTS(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALRTS: " << value << QT_ENDL; }else if(field =="HAMLIBSERIALDTR"){ //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << QT_ENDL; //hamlib->setDTR(value); //qDebug() << "SetupDialog::processConfigLine: HAMLIBSERIALDTR: " << value << QT_ENDL; }else if (field == "HAMLIBRIGPOLLRATE"){ hamlib->setPoll(value.toInt()); }else if (field == "HAMLIB") { //qDebug() << "MainWindow::processConfigLine: HAMLIB: " << value << QT_ENDL; hamlibActive = util->trueOrFalse(value); //qDebug() << "MainWindow::processConfigLine: HAMLIB: " << value << QT_ENDL; } else if (field == "HAMLIBREADONLY") { //qDebug() << "MainWindow::processConfigLine: HAMLIBREADONLY: " << value << QT_ENDL; hamlib->setReadOnly(util->trueOrFalse(value)); } else if (field == "HAMLIBNETADDRESS"){ //hamlibPage->setRadioNetworkAddress (value); hamlib->setNetworkAddress (value); } else if (field == "HAMLIBNETPORT"){ hamlib->setNetworkPort (value.toInt ()); //hamlibPage->setRadioNetworkPort (value.toInt ()); } else if (field=="REALTIMEFROMWSJTX") { //qDebug() << "MainWindow::processConfigLine: REALTIMEFROMWSJTX: " << value << QT_ENDL; UDPLogServer->setRealTimeUpdate(util->trueOrFalse(value)); } else if(field=="SELECTEDLOG") { currentLog = value.toInt(); //qDebug() << "MainWindow::processConfigLine: currentLog - SelectedLog: " << QString::number(currentLog) << QT_ENDL; //if ( ((dataProxy->doesThisLogExist(currentLog)) && (dataProxy->getHowManyQSOInLog(currentLog) > 0)) ) if ( ((dataProxy->doesThisLogExist(currentLog)) ) ) { //qDebug() << "MainWindow::processConfigLine: currentLog - Log with QSO - SelectedLog: " << QString::number(currentLog) << QT_ENDL; } else { int _howManyQSOMax = -1; // NUmber of QSO of the log with more QSO int _howManyQSOMaxT = 0; // Number of QSO in ine specific log QStringList logs = QStringList(); logs << dataProxy->getListOfManagedLogs(); //qDebug() << "MainWindow::processConfigLine: logs: " << QString::number(logs.size()) << QT_ENDL; for (int i = 0;igetHowManyQSOInLog(i); //qDebug() << "MainWindow::processConfigLine: SelectedLog-x: " << QString::number(i) << " - QSOs: " << QString::number(_howManyQSOMaxT) << QT_ENDL; if (_howManyQSOMax < _howManyQSOMaxT) { //qDebug() << "MainWindow::processConfigLine: Found log with more QSO: " << logs.at(i) << QT_ENDL; _howManyQSOMax = _howManyQSOMaxT; _logWithMoreQSOs = (logs.at(i)).toInt(); } } if (_logWithMoreQSOs>0) { currentLog = _logWithMoreQSOs; filemanager->modifySetupFile(configFileName, "SelectedLog", QString::number(currentLog)); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); QString aux = tr("It seems that there are no QSOs in the database.") + "\n\n" + tr("If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } stationCallsign = dataProxy->getStationCallSignFromLog (currentLog); defineStationCallsign (stationCallsign); dxClusterWidget->setCurrentLog(currentLog); dxccStatusWidget->setCurrentLog(currentLog); //qDebug() << "MainWindow::processConfigLine: currentLog: " << value << QT_ENDL; } else if(field=="CLUBLOGACTIVE") { //qDebug() << "MainWindow::processConfigLine: clublogActive: " << value << QT_ENDL; clublogActive = util->trueOrFalse(value); setupDialog->setClubLogActive(clublogActive); } else if(field=="CLUBLOGREALTIME") { //qDebug() << "MainWindow::processConfigLine: clublogRealTime: " << value << QT_ENDL; clublogRealTime = util->trueOrFalse(value); } else if(field=="CLUBLOGPASS") { //qDebug() << "MainWindow::processConfigLine: clublogPass: " << value << QT_ENDL; clublogPass = value; } else if(field=="CLUBLOGEMAIL") { //qDebug() << "MainWindow::processConfigLine: clublogEmail: " << value << QT_ENDL; clublogEmail = value; } else if(field=="QRZCOMACTIVE") { qrzcomActive = util->trueOrFalse(value); setupDialog->setQRZCOMAutoCheckActive(QRZCOMAutoCheckAct->isChecked()); //slotElogQRZCOMAutoCheck(); } else if(field=="QRZCOMSUBSCRIBER") { qrzcomSubscriber = util->trueOrFalse(value); elogQRZcom->setSubcription (util->trueOrFalse(value)); } else if(field =="QRZCOMAUTO") { //qDebug() << "MainWindow::processConfigLine: QRZCOMAuto: " << value << QT_ENDL; //qDebug() << "MainWindow::processConfigLine: QRZCOMAuto was: " << util->boolToQString(QRZCOMAutoCheckAct->isChecked()) << QT_ENDL; QRZCOMAutoCheckAct->setChecked(util->trueOrFalse(value)); setupDialog->setQRZCOMAutoCheckActive(util->trueOrFalse(value)); //qDebug() << "MainWindow::processConfigLine: QRZCOMAuto is: " << util->boolToQString(QRZCOMAutoCheckAct->isChecked()) << QT_ENDL; } else if(field=="QRZCOMPASS") { qrzcomPass = value; } else if(field=="QRZCOMUSER") { qrzcomUser = value; } else if (field =="QRZCOMLOGBOOKKEY"){ elogQRZcom->setLogBookKey(value); } else if(field =="EQSLACTIVE"){ eQSLActive = util->trueOrFalse(value); setupDialog->setEQSLActive(eQSLActive); //qDebug() << "MainWindow::processConfigLine - EQSLACTIVE" << QT_ENDL; } else if(field =="EQSLREALTIME"){ eQSLRealTime = util->trueOrFalse(value); //qDebug() << "MainWindow::processConfigLine - EQSLREALTIME" << QT_ENDL; } else if(field =="EQSLCALL"){ //qDebug() << "MainWindow::processConfigLine - EQSLPASS" << QT_ENDL; eqslUtilities->setUser(value); } else if(field =="EQSLPASS"){ //qDebug() << "MainWindow::processConfigLine - EQSLPASS" << QT_ENDL; eqslUtilities->setPass(value); } else if(field =="EQSLUSESTATIONCALLSIGN"){ //qDebug() << "MainWindow::processConfigLine - EQSLUSESTATIONCALLSIGN" << QT_ENDL; eQSLUseQSOStationCallSign = util->trueOrFalse(value); } else if(field =="LOTWACTIVE"){ //qDebug() << "MainWindow::processConfigLine - LOTWACTIVE" << QT_ENDL; if (util->trueOrFalse(value)) { lotwActive = true; lotwCallTQSL->setEnabled(true); lotwCallTQSL->setWhatsThis(tr("Sends the log to LoTW calling TQSL.")); } else { lotwActive = false; lotwCallTQSL->setEnabled(false); lotwCallTQSL->setWhatsThis(tr("This function is disabled. Go to the Setup->LoTW tab to enable it.")); } //qDebug() << "MainWindow::processConfigLine - LOTWACTIVE-END" << QT_ENDL; } else if(field =="LOTWPATH"){ //qDebug() << "MainWindow::processConfigLine - LOTWPATH" << QT_ENDL; lotwTQSLpath = value; } else if(field =="LOTWUSER"){ //qDebug() << "MainWindow::processConfigLine - LOTWUSER: -" << value <<"-" << QT_ENDL; lotwUtilities->setUser(value); //qDebug() << "MainWindow::processConfigLine - AFTER LOTWUSER" << QT_ENDL; } else if(field =="LOTWPASS"){ lotwUtilities->setPass(value); } else if(field=="VERSION") { if (softwareVersion!=value) { itIsANewversion = true; } } else if(field=="MAINWINDOWSIZE") { QStringList values; values.clear(); values << value.split("x"); if ((values.at(0).toInt()>0) && (values.at(1).toInt()>0)) { windowSize.setWidth(values.at(0).toInt()); windowSize.setHeight(values.at(1).toInt()); //setWindowSize(values.at(0).toInt(), values.at(1).toInt()); } } else if(field=="DELETEALWAYSADIFILE") { deleteAlwaysAdiFile = util->trueOrFalse(value); //qDebug() << "Delete Aways Adif File = " << deleteAlwaysAdiFile <trueOrFalse (value); //util->setCallValidation (util->trueOrFalse (value)); } //else if(field=="LATESTBACKUP") //{ //} //else //{ //qDebug() << "MainWindow::processConfigLine: NONE: " << QT_ENDL; //} // Lines are: Option = value; //qDebug() << Q_FUNC_INFO << "(" << field << "/" << value << ")" << " - END"; logEvent(Q_FUNC_INFO, "END", logSeverity); return true; } void MainWindow::checkIfNewBandOrMode() {//Checks the log to see if there is a QSO with a band/mode //that is not currently selected as active //qDebug() << "MainWindow::checkIfNewBandOrMode - START " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString currentBand = mainQSOEntryWidget->getBand(); QString currentMode = mainQSOEntryWidget->getMode(); setupDialog->checkIfNewBandOrMode(); // Update the Setup dialog with new bands or modes //qDebug() << "MainWindow::checkIfNewBandOrMode - 1 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; QStringList bandsInLog = dataProxy->getBandsInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 2 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; QStringList modesInLog = dataProxy->getModesInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; QStringList qsTemp; qsTemp.clear(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.1 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; bands << bandsInLog; bands.removeDuplicates(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.2 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; qsTemp << dataProxy->sortBandNamesBottonUp(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.3 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; bands.clear(); bands = qsTemp; modes << modesInLog; modes.removeDuplicates(); modes.sort(); //qDebug() << "MainWindow::checkIfNewBandOrMode - bands -" << QString::number(bands.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; mainQSOEntryWidget->setBands(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - modes -" << QString::number(modes.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; mainQSOEntryWidget->setModes(modes); //qDebug() << "MainWindow::checkIfNewBandOrMode - setting bands" << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; logEvent(Q_FUNC_INFO, "Setting bands", Debug); dxccStatusWidget->setBands(Q_FUNC_INFO, bands, true); //qDebug() << "MainWindow::checkIfNewBandOrMode - currentBand: " << currentBand << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if (bands.contains(currentBand)) { mainQSOEntryWidget->setBand(currentBand); } else { selectDefaultBand(); } //qDebug() << "MainWindow::checkIfNewBandOrMode-99 " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; if (modes.contains(currentMode)) { mainQSOEntryWidget->setMode(currentMode); } else { selectDefaultMode(); } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::checkIfNewBandOrMode END " << QTime::currentTime().toString("hh:mm:ss") << QT_ENDL; } void MainWindow::selectDefaultBand() { //qDebug() << "MainWindow::selectDefaultBand" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!upAndRunning) { return; } QString aux; aux = QString(); defaultBand = dataProxy->getMostUsedBand(currentLog); if (defaultBand<1) { defaultBand = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand(0)); //defaultBand = dataProxy->getIdFromBandName(bandComboBox->itemText(1)); } aux = dataProxy->getNameFromBandId(defaultBand); mainQSOEntryWidget->setBand(aux); //bandComboBox->setCurrentIndex(bandComboBox->findText(aux)); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::selectDefaultBand_END" << QT_ENDL; } void MainWindow::selectDefaultMode() { //qDebug() << "MainWindow::selectDefaultMode" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!upAndRunning) { return; } //int aux = 1; defaultMode = dataProxy->getMostUsedMode(currentLog); //qDebug() << "MainWindow::selectDefaultMode: " << QString::number(defaultMode) << QT_ENDL; if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(mainQSOEntryWidget->getBand(0)); //defaultMode = dataProxy->getSubModeIdFromSubMode((modeComboBox->itemText(0))); //qDebug() << "MainWindow::selectDefaultMode2: " << QString::number(defaultMode) << QT_ENDL; //qDebug() << "MainWindow::selectDefaultMode2S: " << QT_ENDL; } //aux = dataProxy->getNameFromSubModeId(defaultMode); mainQSOEntryWidget->setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << "MainWindow::selectDefaultMode3: " << QString::number(defaultMode) << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::selectDefaultMode-END" << QT_ENDL; } void MainWindow::readActiveBands (const QStringList actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the //qDebug() << "MainWindow::readActiveBands: " << actives << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); for (int i=0;igetBandsInLog(currentLog); __bands.removeDuplicates(); bands = __bands; for (int i = 0; i < __bands.size() ; i++) { if (dataProxy->getIdFromBandName(__bands.at(i)) > 0) //if (db->isValidMode(actives.at(i), false)) { if (!atLeastOne) { atLeastOne = true; //bands.clear(); } aux = __bands.at(i); if (aux.length()>0) { bands << aux; } // bands << actives.at(i); } } bands.removeDuplicates(); for (int i=0;igetModesInLog(currentLog); __modes.removeDuplicates(); modes.clear(); //QStringList values = actives.split(", ", QT_SKIP); for (int i = 0; i < __modes.size() ; i++) { //qDebug() << "MainWindow::readActiveModes: checking: " << __modes.at(i) << QT_ENDL; if (dataProxy->getIdFromModeName(__modes.at(i)) > 0) { //qDebug() << "MainWindow::readActiveModes: checking-exist: " << __modes.at(i) << QT_ENDL; //if (!atLeastOne) //{ // atLeastOne = true; //} aux = __modes.at(i); if (aux.length()>0) { //qDebug() << "MainWindow::readActiveModes: adding: " << aux << QT_ENDL; modes << aux; } // modes << actives.at(i); } } modes.removeDuplicates(); modes.sort(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::readActiveModes - END" << QT_ENDL; } void MainWindow::createData() { //qDebug() << "MainWindow::createData " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::createUIDX() { // //qDebug() << "MainWindow::createUIDX << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //operatorLineEdit->setToolTip(tr("Logging operator's callsign.")); //stationCallSignLineEdit->setToolTip(tr("Callsign used over the air.")); infoLabel1->setToolTip(tr("Status of the DX entity.")); //qDebug() << "MainWindow::createUIDX-13" << QT_ENDL; infoLabel2->setToolTip(tr("Name of the DX entity.")); //qDebug() << "MainWindow::createUIDX-14" << QT_ENDL; dxUpLeftInputFrame = new QFrame; dxUpLeftTab = new QTabWidget; dxUpRightTab = new QTabWidget; dxBottonTab = new QTabWidget; dxUpLeftTab->setTabPosition(QTabWidget::North); dxUpRightTab->setTabPosition(QTabWidget::South); //qDebug() << "MainWindow::createUIDX-30" << QT_ENDL; QHBoxLayout *dxUpLeftInputFrameLayout = new QHBoxLayout; dxUpLeftInputFrameLayout->addWidget (mainQSOEntryWidget); //dxUpLeftInputFrameLayout->setSizeConstraint(QLayout::SetFixedSize); dxUpLeftInputFrame->setLayout (dxUpLeftInputFrameLayout); dxUpLeftTab->addTab (QSOTabWidget, tr("QSO")); dxUpLeftTab->addTab(QSLTabWidget, tr("QSL")); dxUpLeftTab->addTab(eQSLTabWidget, tr("eQSL")); dxUpLeftTab->addTab(commentTabWidget, tr("Comment")); othersTabWidget->setEntitiesList(world->getEntitiesNames()); dxUpLeftTab->addTab(othersTabWidget, tr("Others")); dxUpLeftTab->addTab(myDataTabWidget, tr("My Data")); dxUpLeftTab->addTab(satTabWidget, tr("Satellite")); //qDebug() << "MainWindow::createUIDX-90" << QT_ENDL; QSplitter *upLeftSplitter = new QSplitter (this); upLeftSplitter->addWidget(dxUpLeftInputFrame); //upLeftSplitter->addWidget(mainQSOEntryWidget); upLeftSplitter->addWidget(dxUpLeftTab); upLeftSplitter->setOrientation(Qt::Vertical); QVBoxLayout *dxUpRightFixLayout = new QVBoxLayout; dxUpRightFixLayout->addWidget(infoLabel1); dxUpRightFixLayout->addWidget(infoLabel2); infoLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); infoLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); dxUpRightTab->addTab(infoWidget, tr("Info")); //qDebug() << "MainWindow::createUIDX-100" << QT_ENDL; reconfigureDXMarathonUI(manageDxMarathon); //qDebug() << "MainWindow::createUIDX-122" << QT_ENDL; dxUpRightTab->addTab(awardsWidget, tr("Awards")); dxUpRightTab->addTab(searchWidget, tr("Search")); dxBottonTab->addTab(logWindow, tr("Log")); dxBottonTab->addTab(dxClusterWidget, tr("DX-Cluster")); dxBottonTab->addTab(dxccStatusWidget, tr("DXCC")); QVBoxLayout *dxUpRightLayout = new QVBoxLayout; dxUpRightLayout->addLayout(dxUpRightFixLayout); dxUpRightLayout->addWidget(dxUpRightTab); QWidget *upRightWidget = new QWidget; upRightWidget->setLayout(dxUpRightLayout); QSplitter *upSplitter = new QSplitter (this); upSplitter->addWidget(upLeftSplitter); upSplitter->addWidget(upRightWidget); QSplitter *splitter = new QSplitter(this); splitter->addWidget(upSplitter); splitter->addWidget(dxBottonTab); splitter->setOrientation(Qt::Vertical); QHBoxLayout *mLayout = new QHBoxLayout; mLayout->addWidget(splitter); //mLayout->setSizeConstraint(QLayout::SetFixedSize); mainWidget->setLayout(mLayout); //qDebug() << "MainWindow::createUIDX - OS DETECTION" << QT_ENDL; #ifdef Q_OS_WIN //qDebug() << "MainWindow::createUIDX - WINDOWS DETECTED!" << QT_ENDL; dxUpLeftInputFrame->setFrameShadow(QFrame::Raised); dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "MainWindow::createUIDX - NO WINDOWS DETECTED!" << QT_ENDL; dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::createUIDX-END" << QT_ENDL; } void MainWindow::slotADIFExport() { //qDebug() << "MainWindow::slotADIFExport - Start" << QT_ENDL; // QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); adifLoTWExportWidget->setExportMode(ModeADIF); adifLoTWExportWidget->show(); //filemanager->adifLogExport(fileName, currentLog); //qDebug() << "MainWindow::slotADIFExport -END " << QT_ENDL; } void MainWindow::showNumberOfSavedQSO(const QString &_fn, const int _n) { //qDebug() << "MainWindow::showNumberOfSavedQSO: " << _fn << "/" << QString::number(_n) << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ADIF export")); if (_n <= 0) { // TODO: Check if errors should be managed. msgBox.setText(tr("No QSOs have been exported to ADIF.") ); } else { QString msg = QString(tr("KLog has exported %1 QSOs to the ADIF file: %2")).arg(QString::number(_n)).arg(_fn); msgBox.setText(msg); } msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "MainWindow::showNumberOfSavedQSO - END" << QT_ENDL; } void MainWindow::fileExportADIF(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << "MainWindow::fileExportADIF " << _st << QT_ENDL; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _startDate, _endDate, currentLog, ModeADIF); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << "MainWindow::fileExportADIF - END" << QT_ENDL; } void MainWindow::slotADIFExportAll() { //qDebug() << "MainWindow::slotADIFExportAll " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString _callToUse = "ALL"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); //qDebug() << "MainWindow::slotADIFExportAll: " << fileName << QT_ENDL; if (fileName.length()<1) { return; } if ((!fileName.endsWith(".adi")) && ( !fileName.endsWith(".adif") )) { //qDebug() << "MainWindow::slotADIFExportAll: Adding the .adi to the file" << fileName << QT_ENDL; fileName = fileName + ".adi"; } //qDebug() << "MainWindow::slotADIFExportAll-1: " << fileName << QT_ENDL; QList qsos = filemanager->adifLogExportReturnList(fileName, _callToUse, dataProxy->getFirstQSODateFromCall(_callToUse), dataProxy->getLastQSODateFromCall(_callToUse), -1, ModeADIF); //qDebug() << "MainWindow::slotADIFExportAll-3" << QT_ENDL; showNumberOfSavedQSO(fileName, qsos.count()); //filemanager->adifLogExport(fileName, 0); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::fileExportLoTW(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << "MainWindow::fileExportLoTW - Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << "MainWindow::fileExportLoTW - no valid call" << QT_ENDL; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to LoTW.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << "MainWindow::fileExportLoTW - no valid date" << QT_ENDL; return; } //QString fileName = "klog-lotw-upload.adi"; QString fileName = util->getLoTWAdifFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _startDate, _endDate, currentLog, ModeLotW); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << "MainWindow::fileExportLoTW NO QSOs" << QT_ENDL; return; } //qDebug() << "MainWindow::fileExportLoTW - 50" << QT_ENDL; bool uploadedToLoTW = callTQSL(fileName, _st); //bool uploadedToLoTW = true; //qDebug() << "MainWindow::fileExportLoTW - 51" << QT_ENDL; int i ; if (uploadedToLoTW) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("TQSL finished with no error.\n\nDo you want to mark as Sent all the QSOs uploaded to LoTW?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { uploadedToLoTW = dataProxy->lotwSentQSOs(qsos); if (!uploadedToLoTW) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the LoTW QSL sent information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } } if (!deleteAlwaysAdiFile){ msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The LoTW upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); } } //qDebug() << "MainWindow::fileExportLoTW -END " << QT_ENDL; }else{ QFile::remove(fileName); } } void MainWindow::fileExportClubLog(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << "MainWindow::fileExportClubLog - Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << "MainWindow::fileExportClubLog - no valid call" << QT_ENDL; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to ClubLog.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << "MainWindow::fileExportClubLog - no valid date" << QT_ENDL; return; } //QString fileName = "klog-clublog-upload.adi"; QString fileName = util->getClubLogFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _startDate, _endDate, currentLog, ModeClubLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << "MainWindow::fileExportClubLog NO QSOs" << QT_ENDL; return; } msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Do you want to add this QSOs to your ClubLog existing log?")); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::No); msgBox.setDetailedText(tr("If you don't agree, this upload will overwrite your current ClubLog existing log.")); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); bool overwrite = false; switch (ret) { case QMessageBox::Ok: // General ADIF overwrite = false; break; case QMessageBox::No: // ClubLog overwrite = true; break; } //qDebug() << "MainWindow::fileExportClubLog - 50" << QT_ENDL; elogClublog->sendLogFile(fileName, qsos, overwrite); //qDebug() << "MainWindow::fileExportClubLog -END " << QT_ENDL; } void MainWindow::fileExportEQSL(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << "MainWindow::fileExportEQSL - Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") << QT_ENDL; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << "MainWindow::fileExportEQSL - no valid call" << QT_ENDL; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to eQSL.cc.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << "MainWindow::fileExportEQSL - no valid date" << QT_ENDL; return; } //QString fileName = "klog-eqsl-upload.adi"; QString fileName = util->getEQSLFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _startDate, _endDate, currentLog, ModeEQSL); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << "MainWindow::fileExportEQSL NO QSOs" << QT_ENDL; return; } eqslUtilities->sendLogFile(fileName, qsos); //qDebug() << "MainWindow::fileExportEQSL -END " << QT_ENDL; } void MainWindow::slotADIFExportSelection(const QString &_st, const QDate &_startDate, const QDate &_endDate, const ExportMode _eM) { //qDebug() << "MainWindow::slotADIFExportSelection - Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") << QT_ENDL; switch (_eM) { case ModeADIF: // General ADIF //qDebug() << "MainWindow::slotADIFExportSelection - ADIF" << QT_ENDL; fileExportADIF(_st, _startDate, _endDate); break; case ModeLotW: // LoTW //qDebug() << "MainWindow::slotADIFExportSelection - LoTW" << QT_ENDL; fileExportLoTW(_st, _startDate, _endDate); break; case ModeClubLog: // General ADIF //qDebug() << "MainWindow::slotADIFExportSelection - ClubLog" << QT_ENDL; fileExportClubLog(_st, _startDate, _endDate); break; case ModeEQSL: // General eQSL //qDebug() << "MainWindow::slotADIFExportSelection - eQSL" << QT_ENDL; fileExportEQSL(_st, _startDate, _endDate); break; case ModeQRZ: // General eQSL //qDebug() << "MainWindow::slotADIFExportSelection - QRZ.com" << QT_ENDL; elogQRZcom->sendQSOs(dataProxy->getQSOsListQRZCOMToSent(_st, _startDate, _endDate, true)); break; } //qDebug() << "MainWindow::slotADIFExportSelection -END " << QT_ENDL; } void MainWindow::slotLoTWExport() { // 1.- Selec call // 2.- Select file and export (fixed filename?) // 3.- Call tqsl with the filename // 4.- Ask for the user to remove or not the file //qDebug() << "MainWindow::slotLoTWExport - Start" << QT_ENDL; // bool emptyCall = false; if (!lotwActive) { showMessageToEnableTheOnlineService(LoTW); return; } adifLoTWExportWidget->setExportMode(ModeLotW); adifLoTWExportWidget->show(); //qDebug() << "MainWindow::slotLoTWExport- END" << QT_ENDL; } void MainWindow::slotLoTWDownload() { //qDebug() << "MainWindow::slotDownUpload - Start" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QStringList calls; calls << dataProxy->getStationCallSignsFromLog(-1); bool ok; QString callToUse = QInputDialog::getItem(this, tr("KLog - Select the Station Callsign."), tr("Select the Station Callsign to use when quering LoTW:"), calls, 0, false, &ok); //qDebug() << "MainWindow::slotDownUpload: " << callToUse << QT_ENDL; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if (!lotwUtilities->getIsReady()) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Please check the LoTW setup")); msgBox.setInformativeText(tr("You have not defined a LoTW user or a proper Station Callsign.\nOpen the LoTW tab in the Setup and configure your LoTW connection.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } lotwUtilities->download(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotDownUpload - END" << QT_ENDL; } void MainWindow::slotLoTWFullDownload() { //qDebug() << "MainWindow::slotLoTWFullDownload - Start" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QStringList calls; calls << dataProxy->getStationCallSignsFromLog(-1); bool ok; QString callToUse = QInputDialog::getItem(this, tr("KLog - Select the Station Callsign."), tr("Select the Station Callsign to use when quering LoTW:"), calls, 0, false, &ok); //qDebug() << "MainWindow::slotLoTWFullDownload: " << callToUse << QT_ENDL; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if (!lotwUtilities->getIsReady()) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Please check the LoTW setup")); msgBox.setInformativeText(tr("You have not defined a LoTW user or a proper Station Callsign.\nOpen the LoTW tab in the Setup and configure your LoTW connection.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } lotwUtilities->fullDownload(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotLoTWFullDownload - END" << QT_ENDL; } void MainWindow::slotElogClubLogModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - ClubLog")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("ClubLog"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->clublogModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to ClubLog.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the ClubLog status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to ClubLog")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotElogEQSLModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - eQSL")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("eQSL"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->eQSLModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to eQSL.cc.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the eQSL.cc status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to eQSL")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotElogQRZCOMModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - QRZ.COM")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("QRZ.COM"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->QRZCOMModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to QRZ.com.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the QRZ.com status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to QRZ.com")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotClubLogLogUpload() { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!clublogActive) { showMessageToEnableTheOnlineService(ClubLog); return; } adifLoTWExportWidget->setExportMode(ModeClubLog); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::sloteQSLLogUpload() { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!eQSLActive) { showMessageToEnableTheOnlineService(eQSL) ; return; } adifLoTWExportWidget->setExportMode(ModeEQSL); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotQRZCOMLogUpload() { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << Q_FUNC_INFO << QT_ENDL; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ) ; //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; return; } if (!elogQRZcom->hasLogBookKey()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("You need to define a proper API Key for your QRZ.com logbook in the eLog preferences.") ); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; return; } adifLoTWExportWidget->setExportMode(ModeQRZ); adifLoTWExportWidget->show(); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotRQSLExport() { logEvent(Q_FUNC_INFO, "Start", logSeverity); QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifReqQSLExport(fileName); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotADIFImport(){ //qDebug() << "MainWindow::slotADIFImport " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); if (!fileName.isNull()) { //qDebug() << "MainWindow::slotADIFImport -1" << QT_ENDL; filemanager->adifReadLog(fileName, currentLog); updateQSLRecAndSent(); //qDebug() << "MainWindow::slotADIFImport -2" << QT_ENDL; //dxccStatusWidget->refresh(); logWindow->refresh(); //qDebug() << "MainWindow::slotADIFImport -3" << QT_ENDL; checkIfNewBandOrMode(); //qDebug() << "MainWindow::slotADIFImport -4" << QT_ENDL; if (contestMode == "DX") { //qDebug() << "MainWindow::slotADIFImport-DX" << QT_ENDL; //operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); awardsWidget->fillOperatingYears(); //qDebug() << "MainWindow::slotADIFImport-DX-1" << QT_ENDL; slotShowAwards(); awardsWidget->showAwards(); //qDebug() << "MainWindow::slotADIFImport-DX-1-end" << QT_ENDL; } //else if (contestMode == "CQ-WW-SSB") //{} else { awardsWidget->fillOperatingYears(); //operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); slotShowAwards(); awardsWidget->showAwards(); } //qDebug() << "MainWindow::slotADIFImport-7" << QT_ENDL; } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotADIFImport-END" << QT_ENDL; } void MainWindow::qsoToEdit (const int _qso) { //qDebug() << "MainWindow::qsoToEdit: " << QString::number(_qso) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!modify) { backupCurrentQSO (); } //qDebug() << Q_FUNC_INFO; clearUIDX(true); readingTheUI = true; int nameCol; QString aux1; double testValueDouble; // Variable just to test if the value is in the appropriate range setModifying(true); modifyingQSO = _qso; //TODO: Optimize the following query. Maybe the * is not needed. QString stringQuery = QString("SELECT * FROM log WHERE id ='%1' AND lognumber='%2'").arg(_qso).arg(currentLog); //qDebug() << "MainWindow::qsoToEdit: " << stringQuery << QT_ENDL; QSqlQuery query(stringQuery); bool sqlOK = query.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.next(); if (query.isValid()) { if ((clublogActive) && (clublogRealTime)) { clublogPrevQSO = dataProxy->getClubLogRealTimeFromId(_qso); } QSqlRecord rec = query.record(); // ADD THE DATA THAT IS PRESENT IN ALL THE MODES // ** Start of SAT data // ** BAND / MODE / Locator shoule be executed after SAT or may be removed nameCol = rec.indexOf("sat_name"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>0) { satTabWidget->setSatName(aux1); } else { satTabWidget->clear(); } nameCol = rec.indexOf("sat_mode"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>1) { satTabWidget->setSatMode(aux1); } else { satTabWidget->setSatMode("-CLEAR-"); } // END of SAT data //QString currentQrz = dataProxy->getCallFromId(modifyingQSO); nameCol = rec.indexOf("call"); aux1 = (query.value(nameCol)).toString(); mainQSOEntryWidget->setQRZ(aux1); QString currentQrz = aux1; currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << "MainWindow::qsoToEdit - currentEntity " << QString::number(currentEntity) << QT_ENDL; nameCol = rec.indexOf("qso_date"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit - date: " << aux1 << QT_ENDL; mainQSOEntryWidget->setDateTime(util->getDateTimeFromSQLiteString(aux1)); //mainQSOEntryWidget->setDate(QDate::fromString(aux1, "yyyy/MM/dd")); dateTimeTemp->setDate(util->getDateFromSQliteString(aux1)); nameCol = rec.indexOf("bandid"); aux1 = (query.value(nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id ='%1'").arg(aux1); QSqlQuery queryAux(stringQuery); sqlOK = queryAux.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, queryAux.lastError().databaseText(), queryAux.lastError().nativeErrorCode(), queryAux.lastQuery()); } queryAux.next(); if (queryAux.isValid()) { aux1 = (queryAux.value(0)).toString(); //qDebug() << "MainWindow::qsoToEdit - bandid-1 " << aux1 << QT_ENDL; //qDebug() << "MainWindow::qsoToEdit: - Changing from: " << mainQSOEntryWidget->getBand() << QT_ENDL; mainQSOEntryWidget->setBand(aux1); //bandComboBox->setCurrentIndex(bandComboBox->findText(aux1, Qt::MatchCaseSensitive)); //qDebug() << "MainWindow::qsoToEdit: - Changing to: " << mainQSOEntryWidget->getBand() << QT_ENDL; } else { //qDebug() << "MainWindow::qsoToEdit - bandid-NO " << QT_ENDL; mainQSOEntryWidget->setBand(dataProxy->getNameFromBandId(defaultBand)); //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } //qDebug() << "MainWindow::qsoToEdit: Check mode " << QT_ENDL; nameCol = rec.indexOf("modeid"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: (aux1)-1: " << aux1 << QT_ENDL; aux1 = dataProxy->getNameFromSubModeId(aux1.toInt()); QSOTabWidget->setRSTToMode(aux1, readingTheUI); if (mainQSOEntryWidget->isModeExisting(aux1)) { mainQSOEntryWidget->setMode(aux1); } else { mainQSOEntryWidget->setMode(dataProxy->getNameFromSubModeId(defaultMode)); } stringQuery = QString("SELECT submode FROM mode WHERE id ='%1'").arg(aux1); sqlOK = queryAux.exec(stringQuery); //qDebug() << "MainWindow::qsoToEdit: After ALL Mode actions" << QT_ENDL; nameCol = rec.indexOf("rst_sent"); aux1 = (query.value(nameCol)).toString(); QSOTabWidget->setRSTTX (aux1); //qDebug() << "MainWindow::qsoToEdit: - RST_SENT: " << aux1 << QT_ENDL; nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value(nameCol)).toString(); QSOTabWidget->setRSTRX (aux1); //qDebug() << "MainWindow::qsoToEdit: - before switch" << QT_ENDL; if (contestMode == "DX") { //qDebug() << "MainWindow::qsoToEdit: - in default" << QT_ENDL; nameCol = rec.indexOf("qsl_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLVia(aux1); nameCol = rec.indexOf("qslmsg"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLMsg(aux1); //qslmsgTextEdit->setText(aux1); nameCol = rec.indexOf("comment"); aux1 = (query.value(nameCol)).toString(); if (aux1.length()>0) { commentTabWidget->setData(aux1); //commentLineEdit->setText(aux1); } else { commentTabWidget->clear(); //commentLineEdit->clear(); } nameCol = rec.indexOf("name"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: - NAME: " << aux1 << QT_ENDL; if (aux1.length()>0) { QSOTabWidget->setName (aux1); } else { QSOTabWidget->clearName (); } nameCol = rec.indexOf("qth"); aux1 = (query.value(nameCol)).toString(); QSOTabWidget->setQTH (aux1); nameCol = rec.indexOf("gridsquare"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: - GRIDSQUARE: " << aux1 << QT_ENDL; QSOTabWidget->setDXLocator(aux1); satTabWidget->setLocator(aux1); nameCol = rec.indexOf("operator"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: - OPERATOR: " << aux1 << QT_ENDL; myDataTabWidget->setOperator(aux1); nameCol = rec.indexOf("station_callsign"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: - STATIONQRZ: " << aux1 << QT_ENDL; myDataTabWidget->setStationCallsign(aux1); nameCol = rec.indexOf("my_gridsquare"); aux1 = (query.value(nameCol)).toString(); myDataTabWidget->setMyLocator(aux1); nameCol = rec.indexOf("my_vucc_grids"); aux1 = (query.value(nameCol)).toString(); myDataTabWidget->setMyVUCCGrids(aux1); nameCol = rec.indexOf("my_rig"); aux1 = (query.value(nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMyRig (aux1); } nameCol = rec.indexOf("my_antenna"); aux1 = (query.value(nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMyAntenna (aux1); } nameCol = rec.indexOf("my_sota_ref"); aux1 = (query.value(nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMySOTA (aux1); } nameCol = rec.indexOf("tx_pwr"); myDataTabWidget->setMyPower((query.value(nameCol)).toDouble()); nameCol = rec.indexOf("rx_pwr"); aux1 = (query.value(nameCol)).toString(); testValueDouble = aux1.toDouble(); if (testValueDouble >=0) { QSOTabWidget->setRXPwr(testValueDouble); } else { QSOTabWidget->setRXPwr(0.0); } nameCol = rec.indexOf("freq"); aux1 = (query.value(nameCol)).toString(); QSOTabWidget->setTXFreq (aux1.toDouble ()); nameCol = rec.indexOf("freq_rx"); aux1 = (query.value(nameCol)).toString(); QSOTabWidget->setRXFreq (aux1.toDouble ()); //QSL SENT nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLSenStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslsdate"); aux1 = (query.value(nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) //if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { QSLTabWidget->setQSLSenDate(util->getDateFromSQliteString(aux1)); } nameCol = rec.indexOf("qsl_sent_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLSenVia(aux1); //QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // tr("B-Bureau") << tr("D-Direct") << tr("E-Electronic") << tr("M-Manager"); //QSLRDATE: (only valid if QSL_RCVD is Y, I, or V) nameCol = rec.indexOf("qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLRecStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslrdate"); aux1 = (query.value(nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { QSLTabWidget->setQSLRecDate(util->getDateFromSQliteString(aux1)); } nameCol = rec.indexOf("qsl_rcvd_via"); aux1 = (query.value(nameCol)).toString(); QSLTabWidget->setQSLRecVia(aux1); //TODO: BUG: When something is selected while modifying the QSL is deleted??? //CLUBLOG nameCol = rec.indexOf("clublog_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setClubLogStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("clublog_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setClubLogDate(util->getDateFromSQliteString(aux1)); } //CLUBLOG //EQSL_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //EQSL_QSLSDATE (only valid if EQSL_SENT is Y, Q, or I) nameCol = rec.indexOf("eqsl_qsl_sent"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setEQSLSenStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslsdate"); aux1 = (query.value(nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setEQSLSenDate(util->getDateFromSQliteString(aux1)); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // EQSL_QSL_RCVD: {Y, N, R, I, V} // EQSL_QSLRDATE: (only valid if EQSL_RCVD is Y, I, or V) nameCol = rec.indexOf("eqsl_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setEQSLRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslrdate"); aux1 = (query.value(nameCol)).toString(); if (util->isValidDateFromString(aux1)) { eQSLTabWidget->setEQSLRecDate(util->getDateFromSQliteString(aux1)); } //LOTW_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //LOTW_QSLSDATE (only valid if LOTW_SENT is Y, Q, or I) nameCol = rec.indexOf("lotw_qsl_sent"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setLOTWSenStatus(aux1.toUpper()); //qDebug() << "MainWindow::qsoToEdit: - LoTW Sent Status: " << aux1 << QT_ENDL; //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslsdate"); aux1 = (query.value(nameCol)).toString(); if ( util->isValidDateFromString(aux1) ) { eQSLTabWidget->setLOTWSenDate(util->getDateFromSQliteString(aux1)); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // lotw_QSL_RCVD: {Y, N, R, I, V} // lotw_QSLRDATE: (only valid if lotw_RCVD is Y, I, or V) nameCol = rec.indexOf("lotw_qsl_rcvd"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setLOTWRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslrdate"); aux1 = (query.value(nameCol)).toString(); if ( util->isValidDateFromString(aux1) ) { eQSLTabWidget->setLOTWRecDate(util->getDateFromSQliteString(aux1)); } //QRZCOM nameCol = rec.indexOf("qrzcom_qso_upload_status"); aux1 = (query.value(nameCol)).toString(); eQSLTabWidget->setQRZCOMStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qrzcom_qso_upload_date"); aux1 = (query.value(nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setQRZCOMDate(util->getDateFromSQliteString(aux1)); } //QRZCOM // OTHERS TAB nameCol = rec.indexOf("sota_ref"); aux1 = (query.value(nameCol)).toString(); if (!aux1.isEmpty ()) { othersTabWidget->setSOTA (aux1); } nameCol = rec.indexOf("age"); aux1 = (query.value(nameCol)).toString(); if (aux1.toDouble ()>0) { othersTabWidget->setAge (aux1.toDouble ()); } nameCol = rec.indexOf("vucc_grids"); aux1 = (query.value(nameCol)).toString(); //qDebug() << Q_FUNC_INFO << ": VUCC_GRIDS: " << aux1; if (util->isValidVUCCGrids (aux1)) { othersTabWidget->setVUCCGrids (aux1); } //qDebug() << "MainWindow::qsoToEdit: - just before IOTA" << QT_ENDL; nameCol = rec.indexOf("iota"); aux1 = (query.value(nameCol)).toString(); aux1 = awards->checkIfValidIOTA(aux1); othersTabWidget->setIOTA(aux1); //qDebug() << "MainWindow::qsoToEdit: - in default - 100: " << QString::number(currentEntity) << QT_ENDL; nameCol = rec.indexOf("dxcc"); aux1 = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::qsoToEdit: Checking DXCC: " << aux1 << " - " << world->getEntityName(aux1.toInt()) << QT_ENDL; if (aux1.toInt()>=1) { if (aux1.toInt() != util->getNormalizedDXCCValue(currentEntity)) { currentEntity = aux1.toInt(); } //qDebug() << "MainWindow::qsoToEdit: - in default - 101: " << QString::number(currentEntity) << QT_ENDL; } else { currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << "MainWindow::qsoToEdit: - in default - 103: " << QString::number(currentEntity) << QT_ENDL; } //qDebug() << "MainWindow::qsoToEdit: - in default - 104: " << QString::number(currentEntity) << QT_ENDL; nameCol = rec.indexOf("prop_mode"); aux1 = (query.value(nameCol)).toString(); othersTabWidget->setPropMode(aux1, false); //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); //selectCorrectComboBoxEntity(currentEntity); //qDebug() << "MainWindow::qsoToEdit: " << QString::number(currentEntity) << QT_ENDL; othersTabWidget->setEntity(currentEntity); //qDebug() << "MainWindow::qsoToEdit: - in default - 101" << QT_ENDL; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); //TODO: The band sometimes fails here. Check _qs << QString::number(currentEntity) << QString::number(dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand())) << QString::number(dataProxy->getIdFromBandName(mainQSOEntryWidget->getMode())) << QString::number(currentLog); //qDebug() << "MainWindow::qsoToEdit: - in default - 104" << QT_ENDL; //qDebug() << "MainWindow:: - calling showStatusOfDXCC-05 " << QT_ENDL; showStatusOfDXCC(_qs); //qDebug() << "MainWindow::qsoToEdit: - in default - 105" << QT_ENDL; //qDebug() << "MainWindow::qsoToEdit: - just after de IOTA" << QT_ENDL; } else if (contestMode == "CQ-WW-SSB") { } else { //TODO: Manage the else... is it a DX or show a message? } //qDebug() << "MainWindow::qsoToEdit: - in default - 106" << QT_ENDL; } //Closes the next.isValid //qDebug() << "MainWindow::qsoToEdit: - in default - END" << QT_ENDL; readingTheUI = false; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::setModifying(const bool _m) { logEvent(Q_FUNC_INFO, "Start", logSeverity); modify = _m; QSOTabWidget->setModifying (_m); mainQSOEntryWidget->setModify(_m); satTabWidget->setModifying(_m); myDataTabWidget->setModify (_m); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotLocatorTextChanged(const QString &_loc) {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << "MainWindow::slotLocatorTextChanged: " << locatorLineEdit->text() << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if ( locator->isValidLocator(_loc) ) { infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), _loc); satTabWidget->setLocator(_loc); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotMyLocatorTextChanged(const QString &_loc) { //qDebug() << "MainWindowMy::slotMyLocatorTextChanged: " <<_loc << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if ( locator->isValidLocator(_loc)) { dxccStatusWidget->setMyLocator(_loc); slotLocatorTextChanged(QSOTabWidget->getDXLocator ()); } else { logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::showStatusOfDXCC(const QStringList _qs) { //qDebug() << "MainWindow::showStatusOfDXC: Entity: " << _qs.at(0) << "/ Bandid :" << _qs.at(1) << "/Modeid: " << _qs.at(2) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); // Receives: QStringList _qs; //_qs << Entity << BandId << ModeId << lognumber; // Check if new one, needed, worked, confirmed // Print the infoLabel1 // Print/Color the band boxes/labels /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ if ((_qs.length() != 4) || (_qs.at(1) == "-1")) // is the qs valid? { infoWidget->clear(); slotShowInfoLabel("--"); //infoLabel1->setText("--"); logEvent(Q_FUNC_INFO, "END-1", logSeverity); //qDebug() << "MainWindow::showStatusOfDXCC -- END" << QT_ENDL; return; } // Set the status bar with the appropriate message int status = awards->getDXStatus (_qs); QString message = QString(); //qDebug() << "MainWindow::showStatusOfDXC: " << QString::number(status) << QT_ENDL; message = awards->getDXStatusString(status); slotShowInfoLabel(message); //infoLabel1->setText(message); //infoWidget->showInfo((_qs.at(0)).toInt(), (_qs.at(1)).toInt(), (_qs.at(2)).toInt(), (_qs.at(3)).toInt() ); infoWidget->showInfo((_qs.at(0)).toInt()); //qDebug() << "MainWindow::showStatusOfDXC: -END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log) { //qDebug() << "MainWindow::showDXMarathonNeeded" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if ((_dxcc<=0) || (_cqz<=0) || (!manageDxMarathon)) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if ( awards->isDXMarathonNeed(_dxcc, _cqz, _year, _log)) { slotShowInfoLabel(infoLabel1->text()+ tr(" - Needed for DXMarathon")); //infoLabel1->setText(infoLabel1->text()+ tr(" - Needed for DXMarathon")); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotShowAwards() { //To be called from the logWindow & searchWidget //qDebug() << "MainWindow::slotShowAwards" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); awards->recalculateAwards(); //qDebug() << "MainWindow::slotShowAwards-1" << QT_ENDL; logWindow->refresh(); //qDebug() << "MainWindow::slotShowAwards-2" << QT_ENDL; awardsWidget->showAwards(); //qDebug() << "MainWindow::slotShowAwards-3" << QT_ENDL; //dxccStatusWidget->refresh(); setMainWindowTitle(); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotShowAwards-END" << QT_ENDL; } void MainWindow::fillQSOData() { // Updates all QSO with the dxcc, CQZ, ... if empty. //qDebug() << "MainWindow::fillQSOData" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, lognumber, id, cqz, ituz, dxcc, cont FROM log WHERE ((dxcc<1) OR (cqz<1) OR (ituz<1) OR (dxcc IS NULL) OR (cqz IS NULL) OR (ituz IS NULL)) AND lognumber='%1'").arg(currentLog); QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, lognumber, id, cqz, ituz, dxcc, cont FROM log WHERE ((dxcc<1) OR (cqz<1) OR (ituz<1) OR (dxcc IS NULL) OR (cqz IS NULL) OR (ituz IS NULL))"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return; } QSqlQuery query1; QSqlRecord rec = query.record(); int nameCol; QString aux, queryString; QString _call, _bandid, _modeid, _tdate, _ttime, _lognumber, _id, aux1, updateString;//, _confirmed; bool toModify = false; bool noMoreQso = false; int numberOfQsos = 0; int i = 0; int _dxcc = 0; numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); //int progressBarPosition = 0; QProgressDialog progress(tr("Filling QSOs ..."), tr("Abort filling"), 0, numberOfQsos, this); progress.setWindowModality(Qt::WindowModal); while ( (query.next()) && (!noMoreQso) ) { if (query.isValid()) { i++; toModify = false; nameCol = rec.indexOf("call"); if ( (query.value(nameCol)).isValid() ) { _call = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("bandid"); if ( (query.value(nameCol)).isValid() ) { _bandid = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("modeid"); if ( (query.value(nameCol)).isValid() ) { _modeid = (query.value(nameCol)).toString(); } nameCol = rec.indexOf("qso_date"); if ( (query.value(nameCol)).isValid() ) { _tdate = (query.value(nameCol)).toString(); } //nameCol = rec.indexOf("lognumber"); //if ( (query.value(nameCol)).isValid() ) //{ // _lognumber = (query.value(nameCol)).toString(); //} //nameCol = rec.indexOf("confirmed"); //if ( (query.value(nameCol)).isValid() ) //{ // _confirmed = (query.value(nameCol)).toString(); //} nameCol = rec.indexOf("id"); if ( (query.value(nameCol)).isValid() ) { _id = (query.value(nameCol)).toString(); } //qDebug() << "MainWindow::fillQSOData: ID: " << _id << QT_ENDL; //TODO: Prepare this query updateString = "UPDATE log SET call = '" + _call + "', bandid = '" + _bandid + "', modeid = '" + _modeid + "', qso_date = '" + _tdate + "'" ;// + "', confirmed = '" + _confirmed + "'"; nameCol = rec.indexOf("cqz"); if (( (query.value(nameCol)).toString()).length() < 1 ) { aux1 = QString::number(world->getQRZCqz(_call)); updateString = updateString + ", cqz='" + aux1 + "'"; toModify = true; } nameCol = rec.indexOf("ituz"); if (( (query.value(nameCol)).toString()).length() < 1 ) { aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } //qDebug() << "MainWindow::fillQSOData: DXCC" << QT_ENDL; nameCol = rec.indexOf("dxcc"); _dxcc = (query.value(nameCol)).toInt(); //qDebug() << "MainWindow::fillQSOData: DXCC: " << QString::number(_dxcc) << QT_ENDL; if (_dxcc < 1) { aux1 = QString::number(world->getQRZARRLId(_call) ); //qDebug() << "MainWindow::fillQSOData: DXCC proposed: " << aux1 << QT_ENDL; updateString = updateString + ", dxcc='" + aux1 + "'"; toModify = true; _dxcc = aux1.toInt(); } else { //qDebug() << "MainWindow::fillQSOData: DXCC already existed" << QT_ENDL; } nameCol = rec.indexOf("cont"); if (( (query.value(nameCol)).toString()).length() < 2 ) { aux1 = world->getContinentShortName(_dxcc); //aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } _dxcc = -1; //qDebug() << "MainWindow::fillQSOData1: " << updateString << QT_ENDL; if (toModify) { updateString = updateString + " WHERE id = " + "'" + _id + "'"; //qDebug() << "MainWindow::fillQSOData2: " << updateString << QT_ENDL; sqlOK = query1.exec(updateString); if (sqlOK) { //qDebug() << "MainWindow::fillQSOData: sqlOK=True" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); //qDebug() << "MainWindow::fillQSOData: sqlOK=False" << QT_ENDL; } } else { updateString.clear(); } aux = tr("Filling DXCC, CQz, ITUz, Continent in QSOs...\n QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { //qDebug() << "MainWindow::fillQSOData3: " << QT_ENDL; noMoreQso = true; } } // Closes the next.isValid } // Closes the While logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotFillEmptyDXCCInTheLog() { logEvent(Q_FUNC_INFO, "Start", logSeverity); dataProxy->fillEmptyDXCCInTheLog(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotUpdateCTYDAT() { //qDebug() << "MainWindow::slotUpdateCTYDAT" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); downloadcty->download(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotUpdateSATSDAT() { //qDebug() << "MainWindow::slotUpdateSATSDAT" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); updateSatsData->readSatDataFile(); satTabWidget->refreshData(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotShowStats() { logEvent(Q_FUNC_INFO, "Start", logSeverity); statsWidget->show(); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotWorldReload(const bool _b) { //qDebug() << "MainWindow::slotWorldReload" << QT_ENDL; //TODO: world.recreate returns a boolean, so it is possible to manage the errors logEvent(Q_FUNC_INFO, "Start", logSeverity); if (_b) { world->recreate(ctyDatFile); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotFilePrint() { //qDebug() << "MainWindow::slotFilePrint" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QPrinter printer; QString aux; QSqlQuery query, query1; int row = 0; int _numberOfQsos = 0; bool cancelPrinting = false; bool sqlOK; _numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); int step = util->getProgresStepForDialog(_numberOfQsos); QTextDocument *doc = new QTextDocument; QTextCursor cursor(doc); QTextTable *textTable = cursor.insertTable(1, 9); QTextBlockFormat centerAlignment; centerAlignment.setAlignment(Qt::AlignCenter); QTextTableFormat tableFormat; tableFormat.setHeaderRowCount(1); tableFormat.setCellPadding(5); tableFormat.setAlignment(Qt::AlignCenter); textTable->setFormat(tableFormat); //The first row is the header cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.setBlockFormat(centerAlignment); cursor.insertText(tr("Number")); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText(tr("Date/Time")); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText(tr("Callsign")); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText(tr("RSTtx")); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText(tr("RSTrx")); cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText(tr("Band")); cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(tr("Mode")); cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(tr("Comment")); int nameCol = 0; //int qsoPerPage = 25; //int maxPages = (int)(Klog::number / qsoPerPage)+1; // To print just 10 QSO per page //int printedSoFar = 0; //int page = 1; printer.setPageOrientation(QPageLayout::Landscape); // For testing, the log will be printed landscape. printer.setDocName(stationCallsign+"-log"); QPrintDialog printDialog(&printer, this); printDialog.setWindowTitle(tr("Print Log")); if (printDialog.exec() == QDialog::Accepted) { int _qsos = 0; QProgressDialog progress(tr("Printing the log ..."), tr("Abort printing"), 0, _numberOfQsos, this); progress.setMaximum(_numberOfQsos); progress.setWindowModality(Qt::WindowModal); QString stringQuery = QString("SELECT id, qso_date, call, rst_sent, rst_rcvd, bandid, modeid, comment FROM log WHERE lognumber='%1'").arg(currentLog); sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; //TODO: Print a message showing an error and exit. } QSqlRecord rec = query.record(); aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue(_qsos); while ((query.next()) && (!cancelPrinting)) { if (query.isValid()) { textTable->appendRows(1); row++; _qsos++; //qDebug() << "MainWindow::slotFilePrint: QSO: " << QString::number(_qsos) << " - Step: " << QString::number(step) << " - Div: " << QString::number(_qsos % step)<< QT_ENDL; if (( (_qsos % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue(_qsos); } nameCol = rec.indexOf("id"); cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("call"); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("rst_sent"); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("rst_rcvd"); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText((query.value(nameCol)).toString()); nameCol = rec.indexOf("bandid"); aux = (query.value(nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id='%1'").arg(aux); sqlOK = query1.exec(stringQuery); if (sqlOK) { query1.next(); if (query1.isValid()) { cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText((query1.value(0)).toString()); } } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); } //qDebug() << "MainWindow::slotFilePrint: Band: " << aux << QT_ENDL; nameCol = rec.indexOf("modeid"); //qDebug() << "MainWindow::slotFilePrint: nameCol: " << QString::number(nameCol) << QT_ENDL; aux = (query.value(nameCol)).toString(); //qDebug() << "MainWindow::slotFilePrint: Mode1: " << aux << QT_ENDL; aux = dataProxy->getNameFromSubModeId(aux.toInt()); //qDebug() << "MainWindow::slotFilePrint: Mode2: " << aux << QT_ENDL; if (aux.length()>1) { cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(aux); } else { //qDebug() << "MainWindow::slotFilePrint: ERROR: " << aux << QT_ENDL; } nameCol = rec.indexOf("comment"); aux = (query.value(nameCol)).toString(); if ((aux.length())>0) { cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(aux); } } if ( progress.wasCanceled() ) { cancelPrinting = true; } } progress.setValue(_numberOfQsos); if (!cancelPrinting) { doc->print(&printer); } } logEvent(Q_FUNC_INFO, "END", logSeverity); } //DX-CLUSTER - DXCLUSTER void MainWindow::slotAnalyzeDxClusterSignal(QStringList ql) { //qDebug() << "MainWindow::slotAnalyzeDxClusterSignal: 1: " << ql.at(0) <<"/1: " << ql.at(1) << "/2: " << ql.at(2) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QStringList qls; int _entity = world->getQRZARRLId(ql.at(0)); qls.clear(); QString _mode = "-1"; if (!manageMode) { _mode = "-1"; } if (ql.length()==3) { if ((ql.at(2)) == "double") { clusterSpotToLog(ql.at(0), ql.at(1)); } else if ((ql.at(2)) == "selected") { //slotShowInfoLabel(world->getEntityName(_entity), 2); infoLabel2->setText(world->getEntityName(_entity)); infoWidget->showEntityInfo( _entity ); // Becareful, he Frecuency arrives in KHz instead of bandid!! // db.getBandFromFreq expects a MHz! //(ql.at(1)).toDouble() qls << QString::number(_entity) << QString::number(dataProxy->getBandIdFromFreq((ql.at(1).toDouble()/1000))) << _mode << QString::number(currentLog); // We use a mode = -1 because we don't know the mode info from the DXCluster spot // TODO: Check if we can know the mode and replace the "-1" in previous sentence //qls << QRZ << BandId << ModeId << lognumber; showStatusOfDXCC(qls); } } //else //{ // Signal was not properly emited //} logEvent(Q_FUNC_INFO, "END", logSeverity); } //void MainWindow::clusterSpotToLog(const QStringList _qs) void MainWindow::clusterSpotToLog(const QString &_call, const QString &_freq) { logEvent(Q_FUNC_INFO, "Start", logSeverity); QString _aux; double _freqN = (_freq.toDouble()) / 1000; mainQSOEntryWidget->setQRZ(_call); QSOTabWidget->setTXFreq (_freqN); //freqQLCDNumber->display(_freqN); _aux = QString::number(_freqN); //qDebug() << "MainWindow::clusterSpotToLog - Freq: " << _aux << QT_ENDL; int _bandi = dataProxy->getBandIdFromFreq(_aux.toDouble()); //qDebug() << "MainWindow::clusterSpotToLog - Bandi: " << QString::number(_bandi) << QT_ENDL; _aux = QString::number(_bandi); _aux = QString("SELECT name FROM band WHERE id ='%1'").arg(_aux); //qDebug() << "MainWindow::clusterSpotToLog - Band: " << _aux << QT_ENDL; QSqlQuery query(_aux); query.next(); if (query.isValid()) { _aux = (query.value(0)).toString(); mainQSOEntryWidget->setBand(_aux); //bandComboBox->setCurrentIndex(bandComboBox->findText(_aux, Qt::MatchCaseSensitive)); } else { mainQSOEntryWidget->setBand(dataProxy->getNameFromBandId(defaultBand)); //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } //qDebug() << "MainWindow::clusterSpotToLog - END " << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } //DX-CLUSTER - DXCLUSTER void MainWindow::updateQSLRecAndSent() { //qDebug() << "MainWindow::updateQSLRecAndSent " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); // Checks the log to fill all the qsl_rcvd and qsl_sent QSqlQuery query, query1; QString queryString, aux, idT; //int nameCol=0; //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd !='Y' AND qsl_rcvd !='N' AND qsl_rcvd !='R' AND qsl_rcvd !='I' AND qsl_rcvd !='V' AND lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd ='' OR qsl_rcvd IS NULL OR qsl_sent ='' AND lognumber='%1'").arg(currentLog); queryString = QString("UPDATE log SET qsl_rcvd='N' WHERE qsl_rcvd ='' AND lognumber='%1'").arg(currentLog); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } queryString = QString("UPDATE log SET qsl_sent='N' WHERE qsl_sent ='' AND lognumber='%1'").arg(currentLog); sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::updateQSLRecAndSent - END" << QT_ENDL; } void MainWindow::defineStationCallsign(const QString &_call) { //qDebug() << "MainWindow::defineStationCallsign (currentLog): " << QString::number(currentLog) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (util->isValidCall (_call)) { stationCallsign = _call; } else { // If no call is detected, qwe try to find it from the log QString logQRZ; logQRZ = dataProxy->getStationCallSignFromLog(currentLog); //qDebug() << "MainWindow::defineStationCallsign (logQrz): " << logQRZ << QT_ENDL; if ((world->checkQRZValidFormat(logQRZ)) && (util->isValidCall(logQRZ))) { //qDebug() << "MainWindow::defineStationCallsign TRUE " << QT_ENDL; stationCallsign = logQRZ; } } //qDebug() << "MainWindow::defineStationCallsign: " << stationCallsign << QT_ENDL; filemanager->setStationCallSign(stationCallsign); //qDebug() << "MainWindow::defineStationCallsign: AFTER" << QT_ENDL; myDataTabWidget->setData(myPower, stationCallsign, operatorQRZ, myDataTabWidget->getMyLocator()); dxccStatusWidget->setMyLocator(myDataTabWidget->getMyLocator()); searchWidget->setStationCallsign(stationCallsign); lotwUtilities->setStationCallSign(stationCallsign); adifLoTWExportWidget->setDefaultStationCallsign(stationCallsign); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::defineStationCallsign: " << stationCallsign << " - END" << QT_ENDL; } void MainWindow::slotSetPropModeFromSat(const QString &_p, bool _keep) { //qDebug() << "MainWindow::slotSetPropModeFromSat: " << _p << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << Q_FUNC_INFO << ": _keep" << util->boolToQString(_keep) << QT_ENDL; othersTabWidget->setPropMode(_p, _keep); QSOTabWidget->setPropModeFromSat(_p); logEvent(Q_FUNC_INFO, "END", logSeverity); //int indexC = propModeComboBox->findText(" - " + _p + " - ", Qt::MatchContains); //propModeComboBox->setCurrentIndex(indexC); } void MainWindow::slotSetPropModeFromOther(const QString &_p) { //Debug() << Q_FUNC_INFO << ": " << _p; if (_p!="SAT") { //qDebug() << Q_FUNC_INFO << ": Is NOT SAT propagation mode"; satTabWidget->setNoSat(); } } void MainWindow::completeWithPreviousQSO(const QString &_call) { //qDebug() << "MainWindow::completeWithPreviousQSO" << QT_ENDL; //This function completes: Name, QTH, Locator, Entity, Iota logEvent(Q_FUNC_INFO, "Start", logSeverity); if ((!completeWithPrevious) || (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) //if ( (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) { //qDebug() << "MainWindow::completeWithPreviousQSO NOT completing..." << QT_ENDL; if (completedWithPreviousName) { QSOTabWidget->clearName(); completedWithPreviousName = false; } if (completedWithPreviousQTH) { QSOTabWidget->clearQTH(); completedWithPreviousQTH = false; } if (completedWithPreviousLocator) { QSOTabWidget->clearDXLocator(); completedWithPreviousLocator = false; } if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } if (completedWithPreviousQSLVia) { QSLTabWidget->setQSLVia(""); completedWithPreviousQSLVia = false; } logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } //qDebug() << "MainWindow::completeWithPreviousQSO completing..." << QT_ENDL; QString aux = QString(); aux = dataProxy->getNameFromQRZ(_call); //qDebug() << "MainWindow::completeWithPreviousQSO aux: " << aux << QT_ENDL; //qDebug() << "MainWindow::completeWithPreviousQSO nameLineEdit: " << nameLineEdit->text() << QT_ENDL; //qDebug() << "MainWindow::completeWithPreviousQSO aux length: " << QString::number(aux.length()) << QT_ENDL; //qDebug() << "MainWindow::completeWithPreviousQSO nameL length: " << QString::number((nameLineEdit->text()).length()) << QT_ENDL; if ((aux.length()>=0) && (QSOTabWidget->getName().length()<=0) ) { //qDebug() << "MainWindow::completeWithPreviousQSO name: 1" << QT_ENDL; QSOTabWidget->setName(aux); QSOTabWidget->setPaletteRightName (true); completedWithPreviousName = true; } else if (completedWithPreviousName && (aux != QSOTabWidget->getName())) { //qDebug() << "MainWindow::completeWithPreviousQSO name: 2" << QT_ENDL; completedWithPreviousName = false; QSOTabWidget->setPaletteRightName (false); } else { //qDebug() << "MainWindow::completeWithPreviousQSO name: 3" << QT_ENDL; } aux = dataProxy->getQTHFromQRZ(_call); if ((aux.length()>=0) && (QSOTabWidget->getQTH().length()<=0) ) { QSOTabWidget->setPaletteRightQTH (true); completedWithPreviousQTH = true; QSOTabWidget->setQTH(aux); } else if (completedWithPreviousQTH && (aux != QSOTabWidget->getQTH())) { completedWithPreviousQTH = false; QSOTabWidget->setPaletteRightQTH (false); } aux = dataProxy->getLocatorFromQRZ(_call); if ((aux.length()>=0) && ((QSOTabWidget->getDXLocator()).length()<=0) ) { QSOTabWidget->setPaletteRightDXLocator (true); QSOTabWidget->setDXLocator(aux); completedWithPreviousLocator=true; } else if (completedWithPreviousLocator && (aux != QSOTabWidget->getDXLocator())) { completedWithPreviousLocator = false; QSOTabWidget->setPaletteRightDXLocator(false); } aux = dataProxy->getIOTAFromQRZ(_call); //othersTabWidget->setIOTA(aux); if ((aux.length()>=0) && (othersTabWidget->isIOTAModified()) ) { aux = awards->checkIfValidIOTA(aux); if ((aux.length())==6) { othersTabWidget->setIOTA(aux); //TODO: Decide if it is better this way or like in : void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) //QStringList values = aux.split("-", QT_SKIP); //iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); //iotaNumberLineEdit->setPalette(palRed); //iotaNumberLineEdit->setText(values.at(1)); completedWithPreviousIOTA=true; } else if (completedWithPreviousIOTA && (aux != othersTabWidget->getIOTA())) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } } else if (completedWithPreviousIOTA ) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } aux = dataProxy->getQSLViaFromQRZ(_call); if ((aux.length()>=0) && ((QSLTabWidget->getQSLVia()).length()<=0) ) { QSLTabWidget->setQSLVia(aux, Qt::red); completedWithPreviousQSLVia=true; } else if (completedWithPreviousQSLVia && (aux != QSLTabWidget->getQSLVia())) { QSLTabWidget->setQSLVia(""); } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotValidBandsReceived(const QStringList &_b) { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << Q_FUNC_INFO << QT_ENDL; dxccStatusWidget->setBands(Q_FUNC_INFO, _b, true); satTabWidget->addBands(_b); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotFreqRXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - not running" << QT_ENDL; return; } int bandId = dataProxy->getBandIdFromFreq(_fr); if (bandId < 1) { //qDebug() << Q_FUNC_INFO << " - wrong band" << QT_ENDL; return; } //mainQSOEntryWidget->setFreq (_fr, true); QSOTabWidget->setRXFreq (_fr); satTabWidget->setDownLinkFreq(_fr); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotFreqRXChanged - END" << QT_ENDL; } void MainWindow::slotFreqTXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (!upAndRunning) { //qDebug() << "MainWindow::slotFreqTXChanged !upAndRunning" << QT_ENDL; return; } QSOTabWidget->setTXFreq (_fr); mainQSOEntryWidget->setFreq (_fr); satTabWidget->setUpLinkFreq(_fr); if (hamlibActive) { hamlib->setFreq(_fr); } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::slotFreqTXChanged - END" << QT_ENDL; } void MainWindow::slotShowQSOsFromDXCCWidget(QList _qsos) { //qDebug() << "MainWindow::slotShowQSOsFromDXCCWidget" << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); slotShowSearchWidget(); searchWidget->showQSOs(_qsos); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotWSJTXloggedQSO (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_opCall, const QDateTime &_datetime, const QDateTime &_datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_mypwr) { //qDebug() << "MainWindow::slotWSJTX-loggedQSO" << QT_ENDL; //logEvent(Q_FUNC_INFO, "Start", logSeverity); bool logTheQso = false; QString opCall = stationCallsign; if (util->isValidCall(_opCall)) { opCall = _opCall.toUpper(); } double pwr = _mypwr.toDouble(); if (pwr<=0.0) { pwr = myPower; } if (!_datetime.isValid() || !_datetime_off.isValid()) { //qDebug() << Q_FUNC_INFO << " DATES NOT VALID " << QT_ENDL; return ; } //qDebug() << Q_FUNC_INFO << " dxcall: " << _dxcall << QT_ENDL; //qDebug() << Q_FUNC_INFO << " freq: " << QString::number(_freq/1000000) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " freq no div: " << QString::number(_freq) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " mode: " << _mode << QT_ENDL; //qDebug() << Q_FUNC_INFO << " band: " << _band << QT_ENDL; //qDebug() << Q_FUNC_INFO << " my_grid: " << _mygrid << QT_ENDL; //qDebug() << Q_FUNC_INFO << " dx_grid: " << _dxgrid << QT_ENDL; //qDebug() << Q_FUNC_INFO << " comment: " << _comment << QT_ENDL; //qDebug() << Q_FUNC_INFO << " StationCall: " << _stationcallsign << QT_ENDL; //qDebug() << Q_FUNC_INFO << " _opCall: " << _opCall << QT_ENDL; //qDebug() << Q_FUNC_INFO << " opCall: " << opCall << QT_ENDL; //qDebug() << Q_FUNC_INFO << " time_on: " << util->getDateTimeSQLiteStringFromDateTime(_datetime) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " time_off: " << util->getDateTimeSQLiteStringFromDateTime(_datetime_off) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " report_sent: " << _rstTX << QT_ENDL; //qDebug() << Q_FUNC_INFO << " report_rec: " << _rstRX << QT_ENDL; //qDebug() << Q_FUNC_INFO << " exchange_sent: " << _exchangeTX << QT_ENDL; //qDebug() << Q_FUNC_INFO << " exchange_rec: " << _exchangeRX << QT_ENDL; //qDebug() << Q_FUNC_INFO << " MY_PWR: " << _mypwr << QT_ENDL; if (wsjtxAutoLog) { // Log automatically, without confirmation logTheQso = true; //qDebug() << Q_FUNC_INFO << " LogTheQSO = true" << QT_ENDL; } else { // Ask for confirmation before logging //qDebug() << Q_FUNC_INFO << " LogTheQSO = false - we ask for confirmation" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - QSO received")); msgBox.setTextFormat(Qt::RichText); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); QString aux; aux = tr("The following QSO data has been received from WSJT-X to be logged:") + "\n\n" + "
    " + "
  • " + "" + tr("Callsign") + ": " + "" + _dxcall.toUpper() + "
  • " + "
  • " + "" + tr("Freq") + ": " + "" + QString::number(_freq) + "
  • " + "
  • " + "" + tr("Mode") + ": " + "" + _mode.toUpper() + "
  • " + "
  • " + //"" + tr("Time On") + ": " + "" + (QDateTime::fromString(_time_on, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "" + tr("Time On") + ": " + "" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "
  • " + "
  • " + //"" + tr("Time Off") + ": " + "" + (QDateTime::fromString(_time_off, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "" + tr("Time Off") + ": " + "" + util->getDateTimeSQLiteStringFromDateTime(_datetime_off) + "
  • " + "
  • " + "" + tr("RST TX") + ": " + "" + _rstTX + " - " + tr("RST RX") + ": " + "" + _rstRX + "
  • " + "
  • " + "" + tr("Comment") + ": " + "" + _comment + "
  • " + "
  • " + "" + tr("DX-Grid") + ": " + "" + _dxgrid.toUpper() + "
  • " + "
  • " + "" + tr("Local-Grid") + ": " + "" + _mygrid.toUpper() + "
  • " + "
  • " + "" + tr("Station Callsign") + ": " + "" + _stationcallsign.toUpper() + "
  • " + "
  • " + "" + tr("Operator Callsign") + ": " + "" + opCall.toUpper() + "
  • " + "
" ; msgBox.setText(aux); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: logTheQso = true; break; case QMessageBox::No: logTheQso = false; break; default: // should never be reached logTheQso = false; break; } } //bool saveThisQSO = true; if (logTheQso) { //qDebug() << Q_FUNC_INFO << " QSO must be logged" << QT_ENDL; bool qsoLogged = false; int dxcc = world->getQRZARRLId(_dxcall); dxcc = util->getNormalizedDXCCValue(dxcc); QString _myLoc = _mygrid; if (!(locator->isValidLocator(_myLoc))) { _myLoc = myDataTabWidget->getMyLocator(); } if ((dataProxy->isThisQSODuplicated(Q_FUNC_INFO, _dxcall, _datetime, dataProxy->getBandIdFromFreq(_freq), dataProxy->getIdFromModeName(_mode), dupeSlotInSeconds)).length()>1) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - WSJTX Dupe QSO")); msgBox.setIcon(QMessageBox::Warning); QString aux = tr("This QSO seems to be duplicated. Do you want to save or discard it?"); msgBox.setText(aux); msgBox.setDetailedText(tr("Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings.")); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard ); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Save: logEvent(Q_FUNC_INFO, "END-1", logSeverity); break; case QMessageBox::Discard: logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", logSeverity); return; // The user wants to keepseeing errors //break; } } qsoLogged = dataProxy->addQSOFromWSJTX(_dxcall, _mode, _band, _freq, _myLoc, _dxgrid, _rstTX, _rstRX, _exchangeRX, _exchangeTX, _comment, _stationcallsign, _name, opCall, _datetime, _datetime_off, pwr, dxcc, currentLog, sendQSLByDefault); if (qsoLogged) { //qDebug() << Q_FUNC_INFO << " Logged QSO OK: " << _dxcall << QT_ENDL; actionsJustAfterAddingOneQSO(); infoLabel1T = infoLabel1->text(); infoLabel2T = infoLabel2->text(); slotShowInfoLabel(tr("QSO logged from WSJT-X:")); //slotShowInfoLabel(_dxcall + " - " + dataProxy->getBandNameFromFreq(_freq) + "/" + _mode, 2); //infoLabel1->setText(tr("QSO logged from WSJT-X:")); infoLabel2->setText(_dxcall + " - " + dataProxy->getBandNameFromFreq(_freq) + "/" + _mode); //timerInfoBars->start(infoTimeout); //actionsJustAfterAddingOneQSO(); //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(); //UDPLogServer->start(); if (clublogActive && clublogRealTime) { elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(dataProxy->getLastQSOid())); } } else { //qDebug() << Q_FUNC_INFO << " Logged QSO NOK: " << _dxcall << QT_ENDL; } } else { //qDebug() << Q_FUNC_INFO << " QSO must NOT be logged ... ending" << QT_ENDL; } logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } bool MainWindow::checkIfNewMode(const QString &_mode) { //qDebug() << "MainWindow::checkIfNewMode: " << _mode << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (dataProxy->getSubModeIdFromSubMode(_mode)<0) {// The mode is not existing; it is not an accepted mode for KLog // TODO: Show an error to the user //qDebug() << "MainWindow::checkIfNewMode: Mode not valid! - " << _mode << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Non-supported mode")); msgBox.setIcon(QMessageBox::Warning); QString aux = tr("A new mode not supported by KLog has been received from an external program or radio:") + "(" + _mode + ")\n\n" + tr("If the received mode is correct, please contact KLog development team and request support for that mode") + "\n\n" + tr("Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: logEvent(Q_FUNC_INFO, "END-1", logSeverity); return false; // The user wants to keepseeing errors //break; case QMessageBox::No: logEvent(Q_FUNC_INFO, "END-1", logSeverity); return true; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", logSeverity); return false; // The user wants to keepseeing errors //break; } } else { //noMoreModeErrorShown = false; //TODO: Add the new mode to the list of active modes //qDebug() << "MainWindow::checkIfNewMode: VALID NEW MODE: Adding... - " << _mode << QT_ENDL; addNewValidMode(_mode); } logEvent(Q_FUNC_INFO, "END", logSeverity); return false; } void MainWindow::slotWSJXstatusFromUDPServer(const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString &_report, const QString &_de_call, const QString &_de_grid, const QString &_dx_grid, const QString &_sub_mode) { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (modify) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } //qDebug() << Q_FUNC_INFO << " type: " << QString::number(_type) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " dxcall: " << _dxcall << QT_ENDL; //qDebug() << Q_FUNC_INFO << " freq: " << QString::number(_freq/1000000) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " mode: " << _mode << QT_ENDL; //qDebug() << Q_FUNC_INFO << " report: " << _report << QT_ENDL; //qDebug() << Q_FUNC_INFO << " de_call: " << _de_call << QT_ENDL; //qDebug() << Q_FUNC_INFO << " _de_grid: " << _de_grid << QT_ENDL; //qDebug() << Q_FUNC_INFO << " dx_grid: " << _dx_grid << QT_ENDL; //qDebug() << Q_FUNC_INFO << " sub_mode: " << _sub_mode << QT_ENDL; if ((!mainQSOEntryWidget->isModeExisting(_mode)) && (!noMoreModeErrorShown)) { noMoreModeErrorShown = checkIfNewMode(_mode); } switch (_type) { case 0: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT/IN - Heartbeat" << QT_ENDL; break; case 1: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT - Status" << QT_ENDL; mainQSOEntryWidget->setQRZ(_dxcall); if ((!noMoreModeErrorShown) && (dataProxy->getSubModeIdFromSubMode(_mode)>0) ) { mainQSOEntryWidget->setMode(_mode); //modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); } //qDebug() << "MainWindow::slotWSJXstatusFromUDPServer updating txFreqSpinBox" << QString::number(_freq) << QT_ENDL; QSOTabWidget->setTXFreq (_freq); QSOTabWidget->setRXFreq (_freq); if (_dx_grid.length()>0) { slotUpdateLocator(_dx_grid); } QSOTabWidget->setRSTTX (_report); myDataTabWidget->setMyLocator(_de_grid); myDataTabWidget->setStationCallsign(_de_call.toUpper()); //TODO: Check what to do with _de_call -> Check if _de_call == station callsign and update if needed. //TODO: Check what to do with _de_grid -> Check if _de_grid == My Grid and update if needed. //TODO: Check what to do with _submode. //bandComboBox->setCurrentIndex(bandComboBox->findText(, Qt::MatchCaseSensitive)); break; default: //NO //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - ERROR on Type" << QT_ENDL; break; } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::addNewValidMode(const QString &_mode) { //qDebug() << "MainWindow::addNewMode: " << _mode << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QStringList _newM; _newM.clear(); _newM << _mode; _newM << mainQSOEntryWidget->getModes(); readActiveModes (_newM); mainQSOEntryWidget->setModes(modes); logEvent(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "MainWindow::addNewValidMode: END" << QT_ENDL; } void MainWindow::slotClearNoMorErrorShown() { logEvent(Q_FUNC_INFO, "Start", logSeverity); noMoreErrorShown = false; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed) { //qDebug() << "MainWindow::slotQueryErrorManagement: Function: " << functionFailed << QT_ENDL; //qDebug() << "MainWindow::slotQueryErrorManagement: Error N#: " << QString::number(errorCodeN) << QT_ENDL; //qDebug() << "MainWindow::slotQueryErrorManagement: Error: " << functionFailed << errorCodeS << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (noMoreErrorShown) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if ((functionFailed == "virtual bool DataProxy_SQLite::addSatellite(QString, QString, QString, QString, QString)") && (nativeError.toInt() == 19)) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Duplicated satellite")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("A duplicated satellite has been detected in the file and will not be imported.")); msgBox.setInformativeText(tr("Please check the satellite information file and ensure it is properly populated.") + "\n" + tr("Now you will see a more detailed error that can be used for debugging...")); msgBox.exec(); } // TODO: An error on DB has been detected. // KLog should suggest to export ALL the data to an ADIF file to prevent any log lose QString aux = "
" + tr("An unexpected error ocurred!!") + "

" + tr("If the problem persists, please contact the developers") + "(klog-devel@nongnu.org)" + tr("for analysis:") + "
"; QString errorMSG = "
    " "
  • " + tr("Error in function") + ": " + functionFailed + "
  • " + "
  • " + tr("Native Error") +": " + nativeError + "
  • " + "
  • " + tr("Error text") + ": " + errorCodeS + "
  • " + "
  • " + tr("Failed query") + ": " + queryFailed + "
  • " + "

" + "" + tr("Recommendation:") + "" + tr("Periodically export your data to ADIF to prevent a potential data loss.") + "
"; showErrorDialog->setText(aux + errorMSG); //showErrorDialog->setModal(true); showErrorDialog->exec(); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Show errors")); msgBox.setIcon(QMessageBox::Question); aux = tr("Do you want to keep showing errors?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; case QMessageBox::No: noMoreErrorShown = true; break; default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotDefineNewBands (const QStringList _bands) { //qDebug() << "MainWindow::defineNewBands: " << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); QStringList qsTemp; qsTemp.clear(); //qsTemp << _bands; //qsTemp.removeDuplicates(); qsTemp << dataProxy->sortBandNamesBottonUp(_bands); qsTemp.removeDuplicates(); bands.clear(); bands = qsTemp; mainQSOEntryWidget->setBands(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::defineNewBands - END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotHamlibTXFreqChanged(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f) << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", logSeverity); if (upAndRunning) { if (!util->isSameFreq (_f, QSOTabWidget->getTXFreq ())) { //qDebug() << Q_FUNC_INFO << ": Updating the freq... " << QT_ENDL; QSOTabWidget->setTXFreq (_f); } } //qDebug() << "MainWindow::slotHamlibTXFreqChanged - END " << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotHamlibModeChanged(const QString &_m) { logEvent(Q_FUNC_INFO, "Start", logSeverity); if (_m.length()<2) { logEvent(Q_FUNC_INFO, "END-1", logSeverity); return; } if ((mainQSOEntryWidget->getMode()).toUpper() == _m.toUpper()) { return; } hamlibChangingMode = true; if (checkIfNewMode(_m)) { hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END-2", logSeverity); return; } if (mainQSOEntryWidget->isModeExisting(_m)) { //qDebug() << "slotHamlibModeChanged: Mode in the Combobox: " << QT_ENDL; mainQSOEntryWidget->setMode(_m); //modeComboBox->setCurrentIndex(modeComboBox->findText(_m, Qt::MatchCaseSensitive)); } else { //qDebug() << "MainWindow::slotHamlibModeChanged: Mode not found in combobox" << _m << QT_ENDL; } hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END", logSeverity); } /* void MainWindow::slotRotatorShow() { rotatorWidget->show(); } */ void MainWindow::slotUpdateLocator(QString _loc) { logEvent(Q_FUNC_INFO, "Start", logSeverity); //qDebug() << "MainWindow::slotUpdateLocator: " << _loc << endl; QSOTabWidget->setDXLocator (_loc); //qDebug() << "MainWindow::slotUpdateLocator - END" << QT_ENDL; logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::reconfigureDXMarathonUI(const bool _dxM) { logEvent(Q_FUNC_INFO, "Start", logSeverity); dxClusterWidget->setDXMarathon(_dxM); awardsWidget->setManageDXMarathon(_dxM); //awardsWidget->reconfigureDXMarathonUI(_dxM); logEvent(Q_FUNC_INFO, "END", logSeverity); } void MainWindow::slotShowInfoLabel(const QString &_m) { infoLabel1->setText(_m); } void MainWindow::slotAwardsWidgetSetLog() { awardsWidget->setLog(currentLog); } void MainWindow::slotAwardsWidgetSetYear() { awardsWidget->setYear(selectedYear); } void MainWindow::slotActiveHamlib(bool _enable) { if (_enable) { hamlib->initClass(); } else { hamlib->stop(); } } void MainWindow::backupCurrentQSO() { // This function reads the full UI and stores it in a QSO //qDebug() << Q_FUNC_INFO; qso->clear (); qso->setBackup (true); qso->setModifying (mainQSOEntryWidget->getModifying()); qso->setLogId (currentLog); //qDebug() << Q_FUNC_INFO << " - 010"; // MainQSOEntryWidget qso->setCall (mainQSOEntryWidget->getQrz ()); //qDebug() << Q_FUNC_INFO << " - 011"; qso->setBand (mainQSOEntryWidget->getBand ()); //qDebug() << Q_FUNC_INFO << " - 012"; qso->setMode (mainQSOEntryWidget->getMode ()); //qDebug() << Q_FUNC_INFO << " - 013"; qso->setDateTimeOn (mainQSOEntryWidget->getDateTime ()); //qDebug() << Q_FUNC_INFO << " - 014"; qso->setRealTime (mainQSOEntryWidget->getRealTime ()); //qDebug() << Q_FUNC_INFO << " - 020"; // MainWindowInputQSO qso->setRSTTX (QSOTabWidget->getRSTTX ()); qso->setRSTRX (QSOTabWidget->getRSTRX ()); qso->setFreqTX (QSOTabWidget->getTXFreq ()); qso->setFreqRX (QSOTabWidget->getRXFreq ()); qso->setGridSquare (QSOTabWidget->getDXLocator ()); qso->setName (QSOTabWidget->getName ()); qso->setQTH (QSOTabWidget->getQTH ()); qso->setRXPwr (QSOTabWidget->getRXPwr ()); //qDebug() << Q_FUNC_INFO << " - 030"; // MainWindowInputQSL qso->setQSL_SENT (QSLTabWidget->getQSLSenStatus ()); qso->setQSL_RCVD (QSLTabWidget->getQSLRecStatus ()); qso->setQSLRDate (QSLTabWidget->getQSLRecDate ()); qso->setQSLSDate (QSLTabWidget->getQSLSenDate ()); qso->setQSLSenVia (QSLTabWidget->getSentVia ()); qso->setQSLRecVia (QSLTabWidget->getRecVia ()); qso->setQSLVia (QSLTabWidget->getQSLVia ()); qso->setQSLMsg (QSLTabWidget->getQSLMsg ()); //qDebug() << Q_FUNC_INFO << " - 040"; // MainWindowInputEQSL qso->setClubLogStatus (eQSLTabWidget->getClubLogStatus ()); qso->setClubLogDate (eQSLTabWidget->getClubLogDate ()); qso->setEQSLQSL_SENT (eQSLTabWidget->getEQSLSenStatus ()); qso->setEQSLQSLSDate (eQSLTabWidget->getEQSLSenDate ()); qso->setEQSLQSL_RCVD (eQSLTabWidget->getEQSLRecStatus ()); qso->setEQSLQSLRDate (eQSLTabWidget->getEQSLRecDate ()); qso->setLoTWQSL_SENT (eQSLTabWidget->getLOTWSenStatus ()); qso->setLoTWQSLSDate (eQSLTabWidget->getLOTWSenDate ()); qso->setLoTWQSL_RCVD (eQSLTabWidget->getLOTWRecStatus ()); qso->setLoTWQSLRDate (eQSLTabWidget->getLOTWRecDate ()); qso->setClubLogStatus (eQSLTabWidget->getClubLogStatus ()); qso->setClubLogDate (eQSLTabWidget->getClubLogDate ()); //qDebug() << Q_FUNC_INFO << " - 050"; // MainWindowInputComment qso->setComment (commentTabWidget->getComment ()); qso->setKeepComment (commentTabWidget->getKeep ()); // MainWindowInputOthers qso->setDXCC (othersTabWidget->getEntity ()); qso->setIOTA (othersTabWidget->getIOTA ()); qso->setPropMode (othersTabWidget->getPropModeFromComboBox ()); qso->setKeepOthers (othersTabWidget->getKeep ()); qso->setVUCCGrids (othersTabWidget->getVUCCGrids ()); //qDebug() << Q_FUNC_INFO << " - 060"; // MainWindowMyDataTab qso->setTXPwr (myDataTabWidget->getMyPower ()); qso->setOperatorCallsign (myDataTabWidget->getOperator ()); qso->setStationCallsign (myDataTabWidget->getStationCallsign ()); qso->setMySOTA_REF (myDataTabWidget->getMySOTA ()); qso->setMyRig (myDataTabWidget->getMyRig()); qso->setMyAntenna (myDataTabWidget->getMyAntenna ()); qso->setMyVUCCGrids (myDataTabWidget->getMyVUCCGrids ()); qso->setMyGridSquare (myDataTabWidget->getMyLocator ()); qso->setKeepMyData (myDataTabWidget->getKeep ()); //qDebug() << Q_FUNC_INFO << " - 070"; //MainWindowSatTab qso->setSatName (satTabWidget->getSatName ()); qso->setSatMode (satTabWidget->getSatMode ()); qso->setKeepSatTab (satTabWidget->getKeep ()); //qDebug() << Q_FUNC_INFO << ": Realtime: " << util->boolToQString (qso->getRealTime ()); } void MainWindow::restoreCurrentQSO(const bool restoreConfig) { // This function restores a QSO that was backed up to the UI. // MainQSOEntryWidget //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (restoreConfig); clearUIDX (); if (qso->getModifying()) { mainQSOEntryWidget->setModify(true); } mainQSOEntryWidget->setQRZ (qso->getCall ()); mainQSOEntryWidget->setBand (qso->getBand ()); mainQSOEntryWidget->setMode (qso->getMode ()); mainQSOEntryWidget->setDateTime (qso->getDateTimeOn ()); if (restoreConfig) { //qDebug << Q_FUNC_INFO << ": restoring config: " << util->boolToQString (qso->getRealTime ()); mainQSOEntryWidget->setRealTime (qso->getRealTime ()); } else { //qDebug << Q_FUNC_INFO << ": NO restoring config"; } // MainWindowInputQSO QSOTabWidget->setRSTRX (qso->getRSTRX ()); QSOTabWidget->setRSTTX (qso->getRSTTX ()); QSOTabWidget->setTXFreq (qso->getFreqTX ()); QSOTabWidget->setRXFreq (qso->getFreqRX ()); QSOTabWidget->setDXLocator (qso->getGridSquare ()); QSOTabWidget->setName (qso->getName ()); QSOTabWidget->setQTH (qso->getQTH ()); QSOTabWidget->setRXPwr (qso->getRXPwr ()); // MainWindowInputQSL QSLTabWidget->setQSLSenStatus (qso->getQSL_SENT ()); QSLTabWidget->setQSLRecStatus (qso->getQSL_RCVD ()); QSLTabWidget->setQSLRecDate (qso->getQSLRDate ()); QSLTabWidget->setQSLSenDate (qso->getQSLSDate ()); QSLTabWidget->setQSLSenVia (qso->getSentVia ()); QSLTabWidget->setQSLRecVia (qso->getRecVia ()); QSLTabWidget->setQSLVia (qso->getQSLVia ()); QSLTabWidget->setQSLMsg (qso->getQSLMsg ()); // MainWindowInputEQSL eQSLTabWidget->setClubLogStatus (qso->getClubLogStatus ()); eQSLTabWidget->setClubLogDate (qso->getClubLogDate ()); eQSLTabWidget->setEQSLSenStatus (qso->getEQSLQSL_SENT ()); eQSLTabWidget->setEQSLSenDate (qso->getEQSLQSLSDate ()); eQSLTabWidget->setEQSLRecStatus (qso->getEQSLQSL_RCVD ()); eQSLTabWidget->setEQSLRecDate (qso->getEQSLQSLRDate ()); eQSLTabWidget->setLOTWSenStatus (qso->getLoTWQSL_SENT ()); eQSLTabWidget->setLOTWSenDate (qso->getLoTWQSLSDate ()); eQSLTabWidget->setLOTWRecStatus (qso->getLoTWQSL_RCVD ()); eQSLTabWidget->setLOTWRecDate (qso->getLoTWQSLRDate ()); eQSLTabWidget->setQRZCOMStatus (qso->getQRZCOMStatus ()); eQSLTabWidget->setQRZCOMDate (qso->getQRZCOMDate ()); // MainWindowInputComment commentTabWidget->setData (qso->getComment ()); commentTabWidget->setKeep (qso->getKeepComment ()); // MainWindowInputOthers othersTabWidget->setVUCCGrids (qso->getVUCCGrids ()); othersTabWidget->setSOTA (qso->getSOTA_REF ()); othersTabWidget->setAge(qso->getAge ()); othersTabWidget->setEntity (qso->getDXCC ()); othersTabWidget->setIOTA (qso->getIOTA ()); othersTabWidget->setPropMode (qso->getPropMode ()); othersTabWidget->setKeep (qso->getKeepOthers ()); // MainWindowMyDataTab if (qso->getLogId () == currentLog) { myDataTabWidget->setStationCallsign (qso->getStationCallsign()); } else { myDataTabWidget->setStationCallsign (stationCallsign); } myDataTabWidget->setMyPower (qso->getTXPwr ()); myDataTabWidget->setOperator (qso->getOperatorCallsign()); myDataTabWidget->setMyLocator (qso->getMyGridSquare ()); myDataTabWidget->setKeep (qso->getKeepMyData ()); myDataTabWidget->setMyRig (qso->getMyRig ()); myDataTabWidget->setMyAntenna (qso->getMyAntenna ()); myDataTabWidget->setMySOTA (qso->getMySOTA_REF ()); myDataTabWidget->setMyVUCCGrids (qso->getMyVUCCGrids ()); //MainWindowSatTab satTabWidget->setSatName (qso->getSatName ()); satTabWidget->setSatMode (qso->getSatMode ()); satTabWidget->setKeep (qso->getKeepSatTab ()); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::setSeverity(const DebugLogLevel _sev) { logSeverity = _sev; setupDialog->setSeverity(logSeverity); } void MainWindow::slotTakeOverFocusToQSOTabWidget() { //qDebug() << Q_FUNC_INFO; dxUpLeftTab->setCurrentIndex (0); QSOTabWidget->raise (); QSOTabWidget->setFocus (); } void MainWindow::slotTakeOverFocusToMainQSOInput() { //qDebug() << Q_FUNC_INFO; mainQSOEntryWidget->raise(); mainQSOEntryWidget->setFocus (); mainQSOEntryWidget->setFocusToOK (); } void MainWindow::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << "MainWindow::slotCaptureDebugLogs: " << _func << "_/" << _msg << QString::number(_level) << QT_ENDL; logEvent(_func, _msg, _level); } void MainWindow::logEvent(const QString &_func, const QString &_msg, const DebugLogLevel _level) { //This function is the only one not logging the activity showKLogLogWidget->addLog(_func, _msg, _level); // if ((!logEvents) || (!debugFileOpen) || (_level<=Debug)) // Increase to 7 show the full Debug // { // //qDebug() << "MainWindow::slotCaptureDebugLogs: Not logging: " << _func << " / " << _msg << " / " << QString::number(_level) << QT_ENDL; // return; // } //Criticality if (!debugFileOpen) { return; } QTextStream out(debugFile); out << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmsszzz") << " - " << _func << " - " << _msg << QT_ENDL; } klog-1.8.6/showerrordialog.cpp0000644000175000017500000000736514166020407015373 0ustar develdevel/*************************************************************************** showerrordialog.cpp - description ------------------- begin : oct 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showerrordialog.h" ShowErrorDialog::ShowErrorDialog() { //qDebug() << "ShowErrorDialog::ShowErrorDialog" << QT_ENDL; text.clear(); setWindowTitle(tr("KLog Message")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); QVBoxLayout *layout = new QVBoxLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); txtLabel = new QLabel(text); // QLabel *txtLabel = new QLabel(text); txtLabel->setWordWrap(true); txtLabel->setOpenExternalLinks(true); txtLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); //connect(buttonBox, SIGNAL(rejected()), this, &QDialog::reject); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())) ; txtLabel->setFrameShadow(QFrame::Raised); txtLabel->setFrameStyle(QFrame::StyledPanel); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(closeButton); //QVBoxLayout *mainLayout = new QVBoxLayout; layout->addWidget(txtLabel); layout->addLayout(buttonsLayout); setLayout(layout); //qDebug() << "ShowErrorDialog::ShowErrorDialog - END" << QT_ENDL; } void ShowErrorDialog::setText(const QString txt) { //qDebug() << "ShowErrorDialog::setVersion: " << txt << QT_ENDL; text = txt; txtLabel->setText(txt); //textBrowser->setHtml(text); } ShowErrorDialog::~ShowErrorDialog() { //qDebug() << "ShowErrorDialog::~ShowErrorDialog" << QT_ENDL; } void ShowErrorDialog::slotAcceptButtonClicked() { //qDebug() << "ShowErrorDialog::slotAcceptButtonClicked" << QT_ENDL; accept(); } void ShowErrorDialog::keyPressEvent(QKeyEvent *event){ switch (event->key()) { break; default: //QFrame::keyPressEvent(event) slotAcceptButtonClicked(); } } klog-1.8.6/udpserver.cpp0000644000175000017500000006732714166020407014204 0ustar develdevel/*************************************************************************** udpserver.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "udpserver.h" #include //https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/UDPExamples/MessageServer.cpp // Read Network\NetworkMessage.hpp in the WSJT-x sources wsjtx UDPServer::UDPServer(QObject *parent) : QObject(parent) { //qDebug() << "UDPServer::UDPServer" << QT_ENDL; //address = QString("127.0.0.1"); port = 2237; haveNetworkInterface = false; socketServer = new QUdpSocket(this); groupAddress = QHostAddress::Any; networkInterface = QNetworkInterface(); /* //if (socketServer->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress)) if (socketServer->bind(port, QAbstractSocket::ShareAddress)) { //qDebug() << "UDPServer::UDPServer - Multicast group joined OK" << QT_ENDL; } else { //qDebug() << "UDPServer::UDPServer - Multicast group joined NOK" << QT_ENDL; } */ util = new Utilities; logging = false; realtime = false; connect(socketServer,SIGNAL(readyRead()),this,SLOT(slotReadPendingDatagrams())); } void UDPServer::slotReadPendingDatagrams() { //qDebug() << "UDPServer::slotReadPendingDatagrams" << QT_ENDL; while (socketServer->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socketServer->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; //qDebug() << "UDPServer::slotReadPendingDatagrams: length = " << QString::number(socketServer->pendingDatagramSize()) << QT_ENDL; socketServer->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); parse (datagram); //qDebug() << "UDPServer::slotReadPendingDatagrams: = " << datagram << QT_ENDL; } } bool UDPServer::start() { //qDebug() << "UDPServer::start " << QT_ENDL; if ( (port>0) && (port<65535) ) { //qDebug() << "UDPServer::start: calling startNow " << QT_ENDL; return startNow(port, groupAddress); } else { //qDebug() << "UDPServer::start FALSE" << QT_ENDL; return false; } } bool UDPServer::startNow(quint16 _port, QHostAddress const& _multicast_group_address) { //qDebug() << "UDPServer::startNow "<< QT_ENDL; //if ((_port != port) || (_multicast_group_address != groupAddress)) if (1) { //qDebug() << "UDPServer::startNow starting..."<< QT_ENDL; leaveMultiCastGroup(); if (socketServer->state() == QAbstractSocket::BoundState) { //qDebug() << "UDPServer::startNow: closing socket"<< QT_ENDL; socketServer->close(); } groupAddress = _multicast_group_address; auto address = _multicast_group_address.isNull () || QAbstractSocket::IPv4Protocol != groupAddress.protocol () ? QHostAddress::Any : QHostAddress::AnyIPv4; if (_port && socketServer->bind(groupAddress, _port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint)) { port = _port; joinMultiCastGroup(); } else { //qDebug() << "UDPServer::startNow port = 0"<< QT_ENDL; port = 0; } } else { //qDebug() << "UDPServer::startNow exiting... "<< QT_ENDL; } //qDebug() << "UDPServer::startNow exiting... "<< QT_ENDL; return socketServer->isValid(); } void UDPServer::joinMultiCastGroup() { //qDebug() << "UDPServer::joinMultiCastGroup: "<< QT_ENDL; if (!haveNetworkInterface) { return; } if ((socketServer->state() == QAbstractSocket::BoundState) && (!groupAddress.isNull()) && groupAddress.isMulticast() ) { auto mcast_interface = socketServer->multicastInterface(); if (( groupAddress.protocol() == QAbstractSocket::IPv4Protocol ) && (socketServer->localAddress().protocol() != QAbstractSocket::IPv4Protocol )) { socketServer->close(); socketServer->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint); if (socketServer->isValid()) { //qDebug() << "UDPServer::joinMultiCastGroup socket valid"<< QT_ENDL; } } bool joined {false}; /* QList interfaces; interfaces.clear(); interfaces.append(QNetworkInterface::allInterfaces()); for (int i = 0; i < interfaces.size(); ++i) { socketServer->setMulticastInterface(interfaces.at(i)); joined |= socketServer->joinMulticastGroup(groupAddress, interfaces.at(i)); } */ socketServer->setMulticastInterface(networkInterface); joined |= socketServer->joinMulticastGroup(groupAddress, networkInterface); if (!joined) { groupAddress.clear(); } socketServer->setMulticastInterface(mcast_interface); } //qDebug() << "UDPServer::joinMultiCastGroup - END"<< QT_ENDL; } void UDPServer::leaveMultiCastGroup() { //qDebug() << "UDPServer::leaveMultiCastGroup"<< QT_ENDL; if (groupAddress.isNull() && socketServer->state() && groupAddress.isMulticast()) { QList interfaces; interfaces.clear(); interfaces.append(QNetworkInterface::allInterfaces()); for (int i = 0; i < interfaces.size(); ++i) { socketServer->leaveMulticastGroup(groupAddress, interfaces.at(i)); } } //qDebug() << "UDPServer::leaveMultiCastGroup - END"<< QT_ENDL; } bool UDPServer::isStarted() { return socketServer->isValid(); } void UDPServer::parse(const QByteArray &msg) { //qDebug() << "UDPServer::parse: " << msg << QT_ENDL; //qDebug() << "UDPServer::parse: " << QString::fromStdString(msg.toStdString()) << QT_ENDL; //in >> time_off >> dx_call >> dx_grid >> frequency >> mode >> report_sent >> report_received >> // tx_power >> comments >> name >> time_on >> operatorCall >> de_call >> de_grid >> // exchange_sent >> exchange_received; quint32 magic; quint32 schema; quint32 type; QByteArray id; QByteArray adifReceived; QDateTime time_off, time_on; QByteArray dx_call; QByteArray operatorCall; QByteArray dx_grid; quint64 frequency = 0; // In Hz?? double frequencyDouble; QByteArray mode; QByteArray report_sent; QByteArray report_received; QByteArray exchange_sent; QByteArray exchange_received; QByteArray tx_power; QByteArray comments; QByteArray name; //QByteArray time_on; // Note: LOTW uses TIME_ON for their +/- 30-minute time QByteArray report; QByteArray tx_mode; bool tx_enabled = false; bool transmitting = false; bool decoding = false; // WSPRDecode bool newDecode = false; QTime time; qint32 snr; double deltaTime = 0.0; qint32 drift; QByteArray decodedCall, decodedGrid; qint32 power; bool offAir; // DECODE QByteArray message; bool lowConfidence = false; qint32 rx_df = -1; // Delta frequency qint32 tx_df = -1; // Delta time QByteArray de_call; QByteArray de_grid; bool watchdog_timeout = false; QByteArray sub_mode; bool fast_mode = false; quint8 specialOpMode; quint32 freqTolerance; quint32 TRPeriod; QByteArray confName; //QByteArray msgOut; QDataStream in(msg); //QDataStream out(msgOut, QIODevice::ReadWrite); in.setVersion(16); in.setByteOrder(QDataStream::BigEndian); in >> magic >> schema >> type >> id; //QByteArray ba4(QByteArray::fromRawData(cart, 6)); //in.readRawData(type, size) //qDebug() << "UDPServer::parse: - Magic = " << QString::number(magic)<< QT_ENDL; //qDebug() << "UDPServer::parse: - schema = " << QString::number(schema)<< QT_ENDL; //qDebug() << "UDPServer::parse: - type = " << QString::number(type)<< QT_ENDL; //qDebug() << "UDPServer::parse: - id = " << id << QT_ENDL; //if ((magic != 2914831322) || (id != "WSJT-X")) if (magic != 2914831322) { //qDebug() << "UDPServer::parse: - Magic BAD FORMAT = " << QString::number(magic)<< QT_ENDL; return; } //qDebug() << "UDPServer::parse: TYPE: " << QString::number(type)<< QT_ENDL; //QDateTime dateTime, dateTimeOff; //QString line; switch (type) { case Heartbeat: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT/IN - Heartbeat" << QT_ENDL; break; case Status: //qDebug() << "UDPServer::parse: - type" << QString::number(type) << " - OUT - Status" << QT_ENDL; // unpack message //in >> ch; if (realtime) { in >> frequency >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode >> fast_mode >> specialOpMode >> freqTolerance >> TRPeriod >> confName; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //if (!util->isValidCall(dx_call)) // { // //qDebug() << "UDPServer::parse: Status : Call not valid: -" << dx_call << "-" << QT_ENDL; // return; //} //qDebug() << "UDPServer::parse: Status - Freq double = " << QString::number(frequencyDouble) << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Mode = " << mode << QT_ENDL; //qDebug() << "UDPServer::parse: Status - DXCall = " << dx_call << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Report = " << report << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Rx DF = " << rx_df << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Tx DF = " << tx_df << QT_ENDL; //qDebug() << "UDPServer::parse: Status - De_Call = " << de_call << QT_ENDL; //qDebug() << "UDPServer::parse: Status - De_Grid = " << de_grid << QT_ENDL; //qDebug() << "UDPServer::parse: Status - SubMode = " << sub_mode << QT_ENDL; //qDebug() << "UDPServer::parse: Status - SpecialOp = " << QString::number(specialOpMode) << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Freq Tol = " << QString::number(freqTolerance) << QT_ENDL; //qDebug() << "UDPServer::parse: Status - T/R Period = " << QString::number(TRPeriod) << QT_ENDL; //qDebug() << "UDPServer::parse: Status - Conf Name = " << confName << QT_ENDL; emit status_update (type, dx_call, frequencyDouble, mode, report, de_call, de_grid, dx_grid, sub_mode); } else { //qDebug() << "UDPServer::parse: realtime = FALSE" << QT_ENDL; } break; case Decode: //() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Decode" << QT_ENDL; in >> newDecode >> time >> snr >> deltaTime >> drift >> mode >> message >> lowConfidence >> offAir; if (lowConfidence) { //qDebug() << "UDPServer::parse: Decode - Low Confidence" << QT_ENDL; } else { //qDebug() << "UDPServer::parse: Decode - Time = " << time.toString("hhmmss") << QT_ENDL; //qDebug() << "UDPServer::parse: Decode - SNR = " << QString::number(snr) << QT_ENDL; //qDebug() << "UDPServer::parse: Decode - Delta = " << QString::number(deltaTime) << QT_ENDL; //qDebug() << "UDPServer::parse: Decode - Drift = " << QString::number(drift) << QT_ENDL; //qDebug() << "UDPServer::parse: Decode - Mode = " << mode << QT_ENDL; //qDebug() << "UDPServer::parse: Decode - Msg = " << message << QT_ENDL; } break; case Clear: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Clear" << QT_ENDL; emit clearSignal(); break; case Reply: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay " << QT_ENDL; break; case QSOLogged: //qDebug() << "UDPServer::parse: - type = QSOLogged " << QT_ENDL; in >> time_off >> dx_call >> dx_grid >> frequency >> mode >> report_sent >> report_received >> tx_power >> comments >> name >> time_on >> operatorCall >> de_call >> de_grid >> exchange_sent >> exchange_received; //qDebug() << "UDPServer::parse: QSOLogged - Time_off = " << time_off.toString("yyyyMMdd-hhmmss") << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - DXCall = " << dx_call << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Grid = " << dx_grid << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Freq = " << QString::number(frequency) << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Mode = " << mode << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - ReportSent = " << report_sent << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - ReportReceived = " << report_received << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - TX_PWR = " << tx_power << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Comments = " << comments << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Name = " << name << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Time = " << time_on.toString("yyyyMMdd-hhmmss") << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - DeCall = " << de_call << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - DeGrid = " << de_grid << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Exch Sent = " << exchange_sent << QT_ENDL; //qDebug() << "UDPServer::parse: QSOLogged - Exch Recv = " << exchange_received << QT_ENDL; if (logging) { //qDebug() << "UDPServer::parse: logging = true " << QT_ENDL; //qDebug() << "UDPServer::parse: QSO to be logged: Time_on: " << time_on << QT_ENDL; //qDebug() << "UDPServer::parse: QSO to be logged: Time_off: " << time_off << QT_ENDL; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //qDebug() << "UDPServer::parse: Data to be logged: Comment: " << comments << QT_ENDL; //dateTime.setDate(QDate::currentDate()); //dateTime.setTime(QTime::fromString(time_on, "hhmmss")); //dateTimeOff.setDate(QDate::currentDate()); //dateTimeOff.setTime(QTime::fromString(time_off, "hhmmss")); emit logged_qso(dx_call, mode, QString(), frequencyDouble, de_grid, dx_grid, report_sent, report_received, comments, de_call, name, operatorCall, time_on, time_off, exchange_sent, exchange_received, tx_power); } else { //qDebug() << "UDPServer::parse: logging = false" << QT_ENDL; } break; case Close: //qDebug() << "UDPServer::parse: - type = Close" << QT_ENDL; socketServer->close(); //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Close " << QT_ENDL; break; case Replay: //qDebug() << "UDPServer::parse: - type = Reply" << QT_ENDL; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay" << QT_ENDL; break; case HaltTx: //qDebug() << "UDPServer::parse: - type = HaltTx" << QT_ENDL; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Halt TX" << QT_ENDL; break; case FreeText: //qDebug() << "UDPServer::parse: - type = FreeText" << QT_ENDL; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Free Text" << QT_ENDL; break; case WSPRDecode: //qDebug() << "UDPServer::parse: - type = WSPRDecode" << QT_ENDL; in >> newDecode >> time >> snr >> deltaTime >> frequency >> drift >> decodedCall >> decodedGrid >> power >> offAir; //qDebug() << "UDPServer::parse: WSPRDecode - Time = " << time.toString("yyyyMMdd-hhmmss") << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - SNR = " << QString::number(snr) << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Delta = " << QString::number(deltaTime) << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Frec = " << QString::number(frequency) << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Drift = " << QString::number(drift) << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Call = " << decodedCall << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Grid = " << decodedGrid << QT_ENDL; //qDebug() << "UDPServer::parse: WSPRDecode - Power = " << QString::number(power) << QT_ENDL; break; case Location: //qDebug() << "UDPServer::parse: - type = Location" << QT_ENDL; break; case LoggedADIF: //qDebug() << "UDPServer::parse: - type = LoggedADIF" << QT_ENDL; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - ADIF" << QT_ENDL; //in >> adifReceived; //adifParse(adifReceived); //qDebug() << "UDPServer::parse: ADIF: " << adifReceived << QT_ENDL; // Q_SIGNAL void logged_ADIF (QString const& id, QByteArray const& ADIF); break; case HighlightCallsign: //qDebug() << "UDPServer::parse: - type = HighlightCallsign" << QT_ENDL; break; case SwitchConfiguration: //qDebug() << "UDPServer::parse: - type = SwitchConfiguration" << QT_ENDL; break; case Configure: //qDebug() << "UDPServer::parse: - type = Configure" << QT_ENDL; break; default: //NO //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - ERROR on Type" << QT_ENDL; break; } //qDebug() << "UDPServer::parse: - Magic: = " << QString::number(magic)<< QT_ENDL; } bool UDPServer::stop() { //qDebug() << "UDPServer::stop"<< QT_ENDL; socketServer->close(); if (socketServer->isValid()) { return false; } else { return true; } } void UDPServer::setPort(const int _port) { //qDebug() << "UDPServer::setPort: " << QString::number(_port) << QT_ENDL; if ((_port >= 0) && (_port<=65535)) { port = _port; } } void UDPServer::setNetworkInterface(const QString &_t) { //qDebug() << "UDPServer::setNetworkInterface: " << _t << QT_ENDL; QString testInterface; testInterface.clear(); QList ifaces; ifaces.clear(); ifaces << QNetworkInterface::allInterfaces(); foreach (QNetworkInterface i, ifaces) { testInterface = i.humanReadableName() + "-" + i.hardwareAddress(); if (testInterface.contains(_t)) { //qDebug() << "UDPServer::setNetworkInterface: FOUND! " << testInterface << QT_ENDL; if ((i.flags().testFlag(QNetworkInterface::IsUp)) ) { networkInterface = i; haveNetworkInterface = true; } } } } void UDPServer::setLogging(const bool _t) { //qDebug() << "UDPServer::setLogging: " << endl; if (_t) { //qDebug() << "UDPServer::setLogging: TRUE " << endl; } else { //qDebug() << "UDPServer::setLogging: FALSE" << endl; } logging = _t; } void UDPServer::setRealTimeUpdate(const bool _t) { //qDebug() << "UDPServer::setRealTimeUpdate: " << endl; if (_t) { //qDebug() << "UDPServer::setRealTimeUpdate: TRUE " << endl; } else { //qDebug() << "UDPServer::setRealTimeUpdate: FALSE" << endl; } realtime = _t; } void UDPServer::adifParse(QByteArray &msg) { //qDebug() << "UDPServer::adifParse: " << msg << QT_ENDL; QString dx_call = QString(); QString mode = QString(); QString band = QString(); QString mygrid = QString(); QString dxgrid = QString(); QString rstTX = QString(); QString rstRX = QString(); QString _comment = QString(); QString _name = QString(); QString _exchangeTX = QString(); QString _exchangeRX = QString(); QString _myPWR = QString(); QString operatorCall = QString(); QString stationcallsign = QString(); double freq = 0.0; QDateTime datetime, datetime_off; QDate _date_on, _date_off; QTime _time_on, _time_off; QStringList adifLine; adifLine.clear(); QString line = QString(msg); adifLine << line.split('<'); //qDebug() << "UDPServer::adifParse: before the while" << QT_ENDL; for (int i = 0; i < adifLine.length() ;i++) { //qDebug() << "UDPServer::adifParse: While-1" << QT_ENDL; QString type, data; QStringList field; field.clear(); //qDebug() << "UDPServer::adifParse: While-2" << QT_ENDL; QString aux = "<" + adifLine.at(i); //qDebug() << "UDPServer::adifParse: While-3" << QT_ENDL; field.clear(); field << util->getValidADIFFieldAndData(aux); if (field.length()==2) { //qDebug() << "UDPServer::adifParse: While-4" << QT_ENDL; type = (field.at(0)).toUpper(); //qDebug() << "UDPServer::adifParse: While-5" << QT_ENDL; data = field.at(1); //qDebug() << "UDPServer::adifParse: While-6" << QT_ENDL; if (type == "CALL") { dx_call = data; } else if (type == "GRIDSQUARE") { //qDebug() << "UDPServer::adifParse: Rec Grid: " << data << QT_ENDL; if (util->isValidGrid(data)) { dxgrid = data; //qDebug() << "UDPServer::adifParse: Rec Grid to export: " << dxgrid << QT_ENDL; } else { //qDebug() << "UDPServer::adifParse: INVALID GRID: " << dxgrid << QT_ENDL; } } else if (type == "MY_GRIDSQUARE") { //qDebug() << "UDPServer::adifParse: Rec mGrid: " << data << QT_ENDL; if (util->isValidGrid(data)) { mygrid = data; //qDebug() << "UDPServer::adifParse: Rec mGrid to export: " << mygrid << QT_ENDL; } else { //qDebug() << "UDPServer::adifParse: INVALID mGRID: " << mygrid << QT_ENDL; } } else if (type == "MODE") { mode = data; } else if (type == "RST_SENT") { rstRX = data; } else if (type == "RST_RCVD") { rstTX = data; } else if (type == "QSO_DATE") { _date_on = util->getDateFromADIFDateString(data); } else if (type == "TIME_ON") { _time_on = util->getTimeFromADIFTimeString(data); } else if (type == "QSO_DATE_OFF") { _date_off = util->getDateFromADIFDateString(data); } else if (type == "TIME_OFF") { _time_off = util->getTimeFromADIFTimeString(data); } else if (type == "COMMENT") { _comment = data; } else if (type == "BAND") { band = data; } else if (type == "OPERATOR") { operatorCall = data; } else if (type == "FREQ") { freq = data.toDouble(); } else if (type == "STATION_CALLSIGN") { stationcallsign = data; } else if (type == "NAME") { stationcallsign = data; } else if (type == "EOR") { if (_date_on.isValid() && _time_on.isValid()) { datetime.setDate(_date_on); datetime.setTime(_time_on); } else { datetime = QDateTime(); } if (_date_off.isValid() && _time_off.isValid()) { datetime_off.setDate(_date_off); datetime_off.setTime(_time_off); } else { datetime_off = QDateTime(); } //qDebug() << "UDPServer::adifParse: Emitting" << QT_ENDL; if ((freq < 0.1) && (band.length ()<2)) { return; } emit logged_qso (dx_call, mode, band, freq, mygrid, dxgrid, rstTX, rstRX, _comment, stationcallsign, _name, operatorCall, datetime, datetime_off, _exchangeTX, _exchangeRX, _myPWR); return; } else { //qDebug() << "UDPServer::adifParse: NON captured ADIF type: " << type << QT_ENDL; //qDebug() << "UDPServer::adifParse: NON captured ADIF data: " << data << QT_ENDL; } } else { //qDebug() << "UDPServer::adifParse: Not a valid ADIF pair " << aux << QT_ENDL; } } //qDebug() << "UDPServer::adifParse: - END" << QT_ENDL; } klog-1.8.6/INSTALL-macOS.txt0000644000175000017500000000014614166020407014312 0ustar develdevelInstalling KLog on a macOS system is easy. Just click and drop the icon into the Applications folder klog-1.8.6/searchwidget.cpp0000644000175000017500000006524714166020407014635 0ustar develdevel/*************************************************************************** searchwidget.cpp - description ------------------- begin : jul 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchwidget.h" SearchWidget::SearchWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SearchWidget::SearchWidget" << QT_ENDL; searchBoxLineEdit = new QLineEdit; dataProxy = dp; delayInputTimer = new QTimer; searchWindow = new SearchWindow(dataProxy, this); awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities; filemanager = new FileManager(dataProxy); world = new World(dataProxy, Q_FUNC_INFO); mainStationCallsign = QString(); currentLog = -1; //qDebug() << "SearchWidget::SearchWidget: 00092" << QT_ENDL; stationCallsignComboBox = new QComboBox; searchBoxClearButton = new QPushButton(tr("&Clear"), this); searchBoxExportButton = new QPushButton(tr("&Export Highlighted"), this); searchBoxSelectAllButton = new QPushButton(tr("&Select All"), this); searchBoxReSearchButton = new QPushButton(tr("&Search"), this); searchAllQCheckbox = new QCheckBox (tr("All logs"), this); stationCallSignShownInSearch = true; clear(); createUI(); //qDebug() << "SearchWidget::SearchWidget - END" << QT_ENDL; } SearchWidget::~SearchWidget() { } void SearchWidget::clear() { searchBoxLineEdit->clear(); searchWindow->clear(); //qslingNeeded = false; setNeedingQSL(false); searchSelectAllClicked = false; lastSearch = QString(); callFilter = QString(); stationCallsignFilter = QString(); currentLogFilter = QString(); setModelFilter(); } void SearchWidget::setCallToSearch (const QString &_st) { //qDebug() << Q_FUNC_INFO << " : " << _st; searchBoxLineEdit->setText(_st); } void SearchWidget::setShowCallInSearch(const bool _sh) { stationCallSignShownInSearch = _sh; searchWindow->setStationCallsignInHeader(stationCallSignShownInSearch); } void SearchWidget::setVersion (const QString &_version) { filemanager->setVersion(_version); } void SearchWidget::showQSOs(QList qsoIdList) { //qDebug() << "SearchWidget::showQSOs received QSOs: " << QString::number(qsoIdList.length()) << QT_ENDL; if (qsoIdList.length()<0) { return; } //QString _call, _dateTime, _band, _mode, _freq, _qsltx, _qslrx, _id, _stationcallsign, _dxcc; //qDebug() << "SearchWidget::showQSOs query: : 01" << QT_ENDL; int i = 0; QString filter; filter = QString(); while ( (qsoIdList.at(i)<= 0) && (isetFilterString(filter); } void SearchWidget::setStationCallsign(const QString &_st) { if (util->isValidCall(_st)) { mainStationCallsign = _st; selectStationCallSign(); } } void SearchWidget::selectStationCallSign() { int index = stationCallsignComboBox->findText(mainStationCallsign); if (index>=0) { stationCallsignComboBox->setCurrentIndex(index); } } void SearchWidget::createUI() { searchBoxClearButton->setToolTip(tr("Clear the searches.")); searchBoxExportButton->setToolTip(tr("Export the search result to an ADIF file.")); searchBoxSelectAllButton->setToolTip(tr("Select/Unselect all the QSOs shown.")); searchBoxReSearchButton->setToolTip(tr("Search in the log.")); searchAllQCheckbox->setToolTip(tr("Search in all logs.")); searchBoxLineEdit->setToolTip(tr("Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs!")); stationCallsignComboBox->setToolTip(tr("Select the Station Callsign used to do this QSO.")); fillStationCallsignComboBox(); setShowCallInSearch(stationCallSignShownInSearch); //searchResultsTreeWidget->setHeaderLabels(labels); //(searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); //searchResultsTreeWidget->clear(); //searchResultsTreeWidget->setSortingEnabled(true); searchWindow->createlogPanel(currentLog); //searchWindow->refresh(); QHBoxLayout *dxUpRightSearchTopLayout = new QHBoxLayout; dxUpRightSearchTopLayout->addWidget(searchBoxLineEdit); dxUpRightSearchTopLayout->addWidget(stationCallsignComboBox); dxUpRightSearchTopLayout->addWidget(searchAllQCheckbox); QHBoxLayout *dxUpRightButtonsLayout = new QHBoxLayout; dxUpRightButtonsLayout->addWidget(searchBoxReSearchButton); dxUpRightButtonsLayout->addWidget(searchBoxClearButton); dxUpRightButtonsLayout->addWidget(searchBoxSelectAllButton); dxUpRightButtonsLayout->addWidget(searchBoxExportButton); QVBoxLayout *dxUpRightSearchTabLayout = new QVBoxLayout; dxUpRightSearchTabLayout->addLayout(dxUpRightSearchTopLayout); dxUpRightSearchTabLayout->addLayout(dxUpRightButtonsLayout); //dxUpRightSearchTabLayout->addWidget(searchResultsTreeWidget); dxUpRightSearchTabLayout->addWidget(searchWindow); setLayout(dxUpRightSearchTabLayout); //connect(dataProxy, SIGNAL(qsoFound(QStringList)), this, SLOT(slotQsoFound(QStringList)) ); connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStartDelayInputTimer() ) ); connect(delayInputTimer, SIGNAL(timeout()), this, SLOT(slotDelayInputTimedOut()) ); //connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSearchBoxTextChanged() ) ); connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); connect(searchBoxClearButton, SIGNAL(clicked()), this, SLOT(slotSearchClearButtonClicked() ) ); connect(searchBoxReSearchButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxReSearchButtonClicked() ) ); connect(searchBoxSelectAllButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxSelectAllButtonClicked() ) ); //connect(searchResultsTreeWidget, SIGNAL(itemSelectionChanged( ) ), this, SLOT(slotSearchBoxSelectionChanged( ) ) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); //connect(searchResultsTreeWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButtonSearch( const QPoint& ) ) ); connect(stationCallsignComboBox, SIGNAL(currentIndexChanged (int)), this, SLOT(slotStationCallsignChanged() ) ) ; connect(searchAllQCheckbox, SIGNAL(toggled(bool)), this, SLOT(slotQCheckboxToggled() ) ) ; connect(searchWindow, SIGNAL( actionQSODoubleClicked(int)), this, SLOT(slotQSOToEditFromSearch(int))); connect(searchWindow, SIGNAL( actionDeleteQSO(int)), this, SLOT( slotQsoDeleteFromSearch(int) )); connect(searchWindow, SIGNAL( updateSearchLineEdit()), this, SLOT( slotSearchBoxTextChanged() )); connect(searchWindow, SIGNAL( requestFocus()), this, SLOT( slotRequestFocus() )); } void SearchWidget::slotRequestFocus() { emit requestBeingShown(); } /* void SearchWidget::slotRightButtonSearch(const QPoint& pos) { //qDebug() << "SearchWidget::slotRightButtonSearch" << QT_ENDL; searchBoxLineEdit->setFocus(); } */ void SearchWidget::slotQsoDeleteFromSearch(const int _qsoId) { //qDebug() << "SearchWidget::slotQsoDeleteFromSearch: " << QString::number(_qsoId) << QT_ENDL; int QSOid = _qsoId; //int x = -1; QString _qrz = dataProxy->getCallFromId(QSOid); if (_qrz.length()>=3) { QString message = QString(tr("You have requested to delete the QSO with: %1").arg(_qrz)); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: if(dataProxy->deleteQSO(QSOid)) { emit actionQSODelete(QSOid); emit logRefresh(); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } //dxccStatusWidget->refresh(); //awards->recalculateAwards(); emit updateAwards(); } else { //TODO: The QSO could not be removed... } break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } } else { // TODO: The QSO to be removed was not found in the log } } void SearchWidget::slotQSLRecViaBureauFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauFromLog: " << QT_ENDL; int _qsoId = (qslRecViaBureauFromSearchAct->data()).toInt(); //logWindow->qslRecViaBureau(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLRecViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << QT_ENDL; int _qsoId = (qslRecViaDirectFromSearchAct->data()).toInt(); //logWindow->qslRecViaDirect(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::slotStartDelayInputTimer() { //qDebug() << "SearchWidget::slotStartDelayInputTimer" << QT_ENDL; int cursorP = searchBoxLineEdit->cursorPosition(); searchBoxLineEdit->setText((util->getClearSQLi(searchBoxLineEdit->text())).toUpper()); searchBoxLineEdit->setCursorPosition(cursorP); delayInputTimer->start(800); //TODO: Define the delay in the Settings } void SearchWidget::slotDelayInputTimedOut() { //qDebug() << "SearchWidget::slotDelayInputTimedOut" << QT_ENDL; delayInputTimer->stop(); QString _text = searchBoxLineEdit->text(); if( _text != lastSearch) { //DO WHATEVER lastSearch = _text; slotSearchBoxTextChanged(); } } void SearchWidget::fillStationCallsignComboBox() { stationCallsignComboBox->clear(); stationCallsignComboBox->addItem(tr("All in log")); stationCallsignComboBox->addItem(tr("Not defined")); if (searchAllQCheckbox->isChecked()) { stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(-1)); } else { stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(currentLog)); } } void SearchWidget::slotQCheckboxToggled() { //qDebug() << "SearchWidget::slotQCheckboxToggled" << QT_ENDL; fillStationCallsignComboBox(); slotSearchBoxTextChanged(); } void SearchWidget::slotStationCallsignChanged() { //qDebug() << "SearchWidget::slotStationCallsignChanged: " << stationCallsignComboBox->currentText() << QT_ENDL; slotSearchBoxTextChanged(); } /* void SearchWidget::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId) << QT_ENDL; dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWidget::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate() << QT_ENDL; dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END" << QT_ENDL; } */ void SearchWidget::slotQSOToEditFromSearch(const int _qsoId) { //qDebug() << "slotQSOToEditFromSearch: " << (qsoToEditFromSearchAct->data()).toString() << QT_ENDL; emit actionQSODoubleClicked(_qsoId); } /* void SearchWidget::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << QT_ENDL; int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt(); qslRecViaDirectMarkReq(_qsoId); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } */ void SearchWidget::slotQSLSentViaDirectMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: " << QT_ENDL; int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } /* * void SearchWidget::slotQSLSentViaBureauFromSearch() { // //qDebug() << "SearchWidget::slotQSLSentViaBureauFromSearch: " << (qslSentViaBureauFromSearchAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromSearchAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = (qslSentViaBureauFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); //logWindow->qslSentViaBureau(_qsoId); //qslSentViaBureau(_qsoId); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } */ void SearchWidget::slotQSLSentViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLSentViaDirectFromSearch: " << QT_ENDL; int _qsoId = ((qslSentViaDirectFromSearchAct->data()).toInt()); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } //qslSentViaDirect(_qsoId); } /* void SearchWidget::slotQSLSentViaBureuMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureuMarkDXReqFromSearch" << QT_ENDL; int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } */ /* void SearchWidget::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start" << QT_ENDL; int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01" << QT_ENDL; qslRecViaBureauMarkReq(_qsoId); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId) << QT_ENDL; if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03" << QT_ENDL; searchWindow->slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04" << QT_ENDL; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05" << QT_ENDL; slotSearchBoxTextChanged(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06" << QT_ENDL; } //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07" << QT_ENDL; } */ /* void SearchWidget::searchModel() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function" << QT_ENDL; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END" << QT_ENDL; } */ /* void SearchWidget::slotQSLSentMarkAsRequested() { // bool qslSentAsRequested(const int _qsoId, const QString &_updateDate); int _qsoId = (qslSentRequestedAct->data()).toInt(); dataProxy->qslSentAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } */ /* void SearchWidget::slotDoubleClickSearch(QTreeWidgetItem * item, int) { //qDebug() << "SearchWidget::slotDoubleClickSearch" << QT_ENDL; int number = -1; if (item){ if (stationCallSignShownInSearch) { number = (item->text(7)).toInt(); } else { number = (item->text(6)).toInt(); } actionQSODoubleClicked(number); } else {} } */ void SearchWidget::setNeedingQSL(bool const _q) { qslingNeeded = _q; searchWindow->setNeedingQSL(qslingNeeded); } void SearchWidget::slotSearchBoxTextChanged() { //qDebug() << "SearchWidget::slotSearchBoxTextChanged: " << searchBoxLineEdit->text() << QT_ENDL; //QString _id, _call, _dateTime, _band, _bandid, _mode, _qsltx, _qslrx, _stationcallsign, _dxcc; //QStringList q; //_stationcallsign = QString(); bool searchAll = searchAllQCheckbox->isChecked(); //int i = -1; int cursorP = searchBoxLineEdit->cursorPosition(); /* if (searchBoxLineEdit->text() == "*") { callFilter = QString("call<>'1'"); setModelFilter(); searchBoxLineEdit->setCursorPosition(cursorP); return; } */ searchBoxLineEdit->setText((searchBoxLineEdit->text()).toUpper()); if (((searchBoxLineEdit->text()).length() < 2) && (searchBoxLineEdit->text() != "*")) { //qDebug() << "SearchWidget::slotSearchBoxTextChanged: NO FILTER" << QT_ENDL; currentLogFilter = QString("lognumber='-1'"); setModelFilter(); return; } setNeedingQSL(false); //qslingNeeded = false; // If I am searching I am not longer looking for QSO to QSL QString theCall = searchBoxLineEdit->text(); //QSqlQuery query; QString queryString, aux; //QString aux; aux.clear(); if ((theCall.startsWith("1")) || (theCall.startsWith("2"))) { // Fix a bug (or my knowledge of SQLite) to search Strings begining with 1 or 2 // sqlite does not understand statements like SELECT call FROM log WHERE call LIKE '%1A%' aux = theCall + "%"; } else { aux = "%" + theCall + "%"; } if (searchBoxLineEdit->text() == "*") { callFilter = QString("call<>'1'"); } else { callFilter = QString("call LIKE '%1'").arg(aux); } QString searchAllQuery; if (searchAll) { //searchWindow->setCurrentLog("lognumber <> '-1'"); } else { currentLogFilter = QString("lognumber = '%1'").arg(currentLog); } //QString stationCallQuery; QString stationCallSign; if (stationCallsignComboBox->currentIndex() == 0) { stationCallsignFilter = QString(""); setModelFilter(); } else if (stationCallsignComboBox->currentIndex() == 1) { stationCallsignFilter = QString("station_callsign = ''"); setModelFilter(); } else if (stationCallsignComboBox->currentIndex() > 1) { stationCallSign = stationCallsignComboBox->currentText(); stationCallsignFilter= QString("station_callsign = '%1'").arg(stationCallSign); setModelFilter(); } else { // This should be an error so return searchBoxLineEdit->setCursorPosition(cursorP); return; } searchBoxLineEdit->setCursorPosition(cursorP); } void SearchWidget::setModelFilter() { //qDebug() << "SearchWidget::setModelFilter - callFilter = " << callFilter << QT_ENDL; //qDebug() << "SearchWidget::setModelFilter - stationCallFilter = " << stationCallsignFilter << QT_ENDL; //qDebug() << "SearchWidget::setModelFilter - currentLog = " << currentLogFilter << QT_ENDL; QString filter; filter = QString(); if (callFilter.length()>0) { filter = callFilter; } if (stationCallsignFilter.length() >0) { if (filter.length()>0) { filter = filter + " AND " + stationCallsignFilter; } else { filter = stationCallsignFilter; } } if (currentLogFilter.length() >0) { if (filter.length()>0) { filter = filter + " AND " + currentLogFilter; } else { filter = currentLogFilter; } } //qDebug() << "SearchWidget::setModelFilter: " << filter << QT_ENDL; searchWindow->setFilterString(filter); } void SearchWidget::setCurrentLog(const int _log) { currentLog = _log; } void SearchWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: " << QT_ENDL; searchWindow->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; setNeedingQSL(false); //qslingNeeded = false; selectStationCallSign(); } void SearchWidget::slotSearchBoxSelectAllButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: " << QT_ENDL; if (searchSelectAllClicked) { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: UN-SELECTING" << QT_ENDL; searchSelectAllClicked = false; searchWindow->clearSelection(); searchBoxSelectAllButton->setText(tr("&Select All")); } else { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: SELECTING" << QT_ENDL; searchSelectAllClicked = true; searchWindow->selectAll(); searchBoxSelectAllButton->setText(tr("&Clear selection")); } } void SearchWidget::slotSearchBoxReSearchButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxReSearchButtonClicked: " << QT_ENDL; slotSearchBoxTextChanged(); } void SearchWidget::slotSearchBoxSelectionChanged() {// Detects when a selection has been done in the search box and changes // The button to clear selection //qDebug() << "SearchWidget::slotSearchBoxSelectionChanged: " << QT_ENDL; /* if ((searchResultsTreeWidget->selectedItems()).size() > 0 ) { searchBoxSelectAllButton->setText(tr("&Clear selection")); searchSelectAllClicked = true; } else { searchBoxSelectAllButton->setText(tr("&Select All")); searchSelectAllClicked = false; } */ } void SearchWidget::slotSearchExportButtonClicked() { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: Selected: " << QString::number(searchWindow->getSelectedQSOs().count())<< QT_ENDL; // MARK QSOs // SAVE MARKED QSOs TO FILE // UNMARK QSOs QList _qsos; _qsos.clear(); _qsos << searchWindow->getSelectedQSOs(); bool itemsSelected = false; for (int i = 0; i < _qsos.size(); ++i) { QString stringQuery; QSqlQuery query; stringQuery = QString("UPDATE log SET marked = 'X' WHERE id='%1'").arg(_qsos.at(i)); bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: query executed-error: " << query.lastError(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: query executed: " << query.lastQuery(); itemsSelected = true; } if (itemsSelected) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to Ask filename" << QT_ENDL; QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExportMarked(fileName); //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to callsign save file" << QT_ENDL; dataProxy->unMarkAllQSO(); } else { //No items were selected } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: unmarking..." << QT_ENDL; } void SearchWidget::searchToolNeededQSLToSend() { searchWindow->slotToolSearchQSL(0); } void SearchWidget::slotToolSearchRequestedQSLToSend() { searchWindow->slotToolSearchQSL(1); } void SearchWidget::slotToolSearchNeededQSLPendingToReceive() { searchWindow->slotToolSearchQSL(2); } void SearchWidget::slotToolSearchNeededQSLRequested() { searchWindow->slotToolSearchQSL(3); } void SearchWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; // Just to pass the colors to the awards class searchWindow->setColors(_newOne, _needed, _worked, _confirmed, _default); } klog-1.8.6/worldmapwidget.h0000644000175000017500000000622614166020407014652 0ustar develdevel#ifndef WORLDMAPWIDGET_H #define WORLDMAPWIDGET_H /*************************************************************************** worldmapwidget.h - description ------------------- begin : oct 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include "klogdefinitions.h" class QMenu; class QScrollArea; class QScrollBar; class QAction; class QLabel; class WorldMapWidget: public QMainWindow { Q_OBJECT public: WorldMapWidget(); ~WorldMapWidget(); void loadMap(); //void setText(const QString txt); private slots: //void slotAcceptButtonClicked(); void slotZoomIn(); void slotZoomOut(); void slotNormalSize(); void slotFitToWindow(); private: //void loadMap(); void drawLocators(); void drawLocator(const int _x, const int _y, const int _width,const int _height, const bool _confirmed); void drawLocatorText (const int _x, const int _y, const QString &loc, const bool _confirmed); void drawLines(const int _x, const int _y); void setImage (const QImage &newImage); void updateActions(); void createActions(); void scaleImage(double factor); void adjustScrollBar(QScrollBar *scrollbar, double factor); QRect getScreenResolution(); void mapNormalizeSize(); //void keyPressEvent(QKeyEvent *event); //QTextBrowser *textBrowser; //QString text; QScrollArea *scrollArea; QLabel *mapLabel; QImage *mapQImage; int width, height; double scaleFactor; QAction *zoomInAct; QAction *zoomOutAct; QAction *fitToWindowAct; QAction *normalSizeAct; }; #endif // WorldMapWidget_H klog-1.8.6/awardswidget.cpp0000644000175000017500000004730214166020421014635 0ustar develdevel/*************************************************************************** awardswidget.cpp - description ------------------- begin : nov 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "awardswidget.h" AwardsWidget::AwardsWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "AwardsWidget::AwardsWidget" << QT_ENDL; manageDXMarathon = false; logSeverity = Info; //7 Debug /0=emergency or no debug emit debugLog (Q_FUNC_INFO, "Start", Debug); currentLog = -1; dxccConfirmedQLCDNumber = new QLCDNumber; dxccWorkedQLCDNumber = new QLCDNumber; wazConfirmedQLCDNumber = new QLCDNumber; wazWorkedQLCDNumber = new QLCDNumber; //localConfirmedQLCDNumber = new QLCDNumber; //localWorkedQLCDNumber = new QLCDNumber; qsoConfirmedQLCDNumber = new QLCDNumber; qsoWorkedQLCDNumber = new QLCDNumber; yearlyQSOLCDNumber = new QLCDNumber; yearlyDXCCQLCDNumber = new QLCDNumber; yearlyCQQLCDNumber = new QLCDNumber; yearlyScoreQLCDNumber = new QLCDNumber; operatingYearsComboBox = new QComboBox; yearlyLabelN = new QLabel(); yearlyScoreLabelN = new QLabel(); recalculateAwardsButton = new QPushButton; operatingYearsComboBox = new QComboBox; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); //awards = new Awards(dataProxy, Q_FUNC_INFO); //util = new Utilities; clear(); createUI(); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::AwardsWidget - END" << QT_ENDL; } AwardsWidget::~AwardsWidget() { delete(awards); } void AwardsWidget::clear() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "AwardsWidget::clear" << QT_ENDL; /* searchBoxLineEdit->clear(); searchResultsTreeWidget->clear(); qslingNeeded = false; searchSelectAllClicked = false; */ emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::clear-END" << QT_ENDL; } void AwardsWidget::createUI() { //searchBoxClearButton->setToolTip(tr("Clear the searches.")); //qDebug() << "AwardsWidget::createUI" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", Debug); recalculateAwardsButton = new QPushButton(tr("Recalculate"), this); recalculateAwardsButton->setToolTip(tr("Click to recalculate the award status.")); operatingYearsComboBox->setToolTip(tr("Select the year you want to check.")); QLabel *yearlyQSOsLabelN = new QLabel(tr("QSOs")); QLabel *yearlyDXCCLabelN = new QLabel(tr("DXCC")); QLabel *yearlyCQLabelN = new QLabel(tr("CQ")); QLabel *awardLabelN = new QLabel(tr("Award")); awardLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *confirmedLabelN = new QLabel(tr("Confirmed")); confirmedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *workedLabelN = new QLabel(tr("Worked")); workedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *dxccLabelN = new QLabel(tr("DXCC")); dxccLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *wazLabelN = new QLabel(tr("WAZ")); wazLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); //QLabel *localLabelN = new QLabel(tr("Local")); //localLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *qsoNLabelN = new QLabel(tr("QSOs")); qsoNLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyQSOsLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyDXCCLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyQSOsLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyCQLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyScoreLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); #ifdef Q_OS_WIN //qDebug() << "AwardsWidget::createUIDX - WINDOWS DETECTED!" << QT_ENDL; qsoNLabelN->setFrameShadow(QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel); wazLabelN->setFrameShadow(QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel); //localLabelN->setFrameShadow(QFrame::Raised); //localLabelN->setFrameStyle(QFrame::StyledPanel); dxccLabelN->setFrameShadow(QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel); workedLabelN->setFrameShadow(QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel); confirmedLabelN->setFrameShadow(QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel); awardLabelN->setFrameShadow(QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel); yearlyQSOsLabelN->setFrameShadow(QFrame::Raised); yearlyDXCCLabelN->setFrameShadow(QFrame::Raised); yearlyQSOsLabelN->setFrameShadow(QFrame::Raised); yearlyScoreLabelN->setFrameShadow(QFrame::Raised); yearlyLabelN->setFrameShadow(QFrame::Raised); yearlyCQLabelN->setFrameShadow(QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel); yearlyDXCCLabelN->setFrameStyle(QFrame::StyledPanel); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel); yearlyScoreLabelN->setFrameStyle(QFrame::StyledPanel); yearlyLabelN->setFrameStyle(QFrame::StyledPanel); yearlyCQLabelN->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "AwardsWidget::createUIDX - NO WINDOWS DETECTED!" << QT_ENDL; //localLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyDXCCLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyCQLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyScoreLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif //qDebug() << "AwardsWidget::createUI-125" << QT_ENDL; //reconfigureyearlyUI(manageyearly); yearlyScoreLabelN->setText(tr("Score")); yearlyLabelN->setText(tr("Annual")); //qDebug() << "AwardsWidget::createUI-135" << QT_ENDL; QGridLayout *yearlyDLayout = new QGridLayout; yearlyDLayout->addWidget(yearlyQSOsLabelN, 0, 0); yearlyDLayout->addWidget(yearlyDXCCLabelN, 0, 1); yearlyDLayout->addWidget(yearlyCQLabelN, 0, 2); yearlyDLayout->addWidget(yearlyQSOLCDNumber, 1, 0); yearlyDLayout->addWidget(yearlyDXCCQLCDNumber, 1, 1); yearlyDLayout->addWidget(yearlyCQQLCDNumber, 1, 2); //qDebug() << "AwardsWidget::createUI-145" << QT_ENDL; QVBoxLayout *yearlyTLayout = new QVBoxLayout; yearlyTLayout->addWidget(yearlyLabelN); yearlyTLayout->addWidget(operatingYearsComboBox); //qDebug() << "AwardsWidget::createUI-150" << QT_ENDL; QGridLayout *dxUpRightAwardsTabLayout = new QGridLayout; //qDebug() << "AwardsWidget::createUI-151" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(awardLabelN, 0, 0); //qDebug() << "AwardsWidget::createUI-152" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(workedLabelN, 0, 1); //qDebug() << "AwardsWidget::createUI-153" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(confirmedLabelN, 0, 2); //qDebug() << "AwardsWidget::createUI-154" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(dxccLabelN, 1, 0); //qDebug() << "AwardsWidget::createUI-155" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(dxccWorkedQLCDNumber, 1, 1); //qDebug() << "AwardsWidget::createUI-156" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(dxccConfirmedQLCDNumber, 1, 2); //qDebug() << "AwardsWidget::createUI-157" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(wazLabelN, 2, 0); //qDebug() << "AwardsWidget::createUI-158" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(wazWorkedQLCDNumber, 2, 1); //qDebug() << "AwardsWidget::createUI-159" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(wazConfirmedQLCDNumber, 2, 2); //qDebug() << "AwardsWidget::createUI-160" << QT_ENDL; //dxUpRightAwardsTabLayout->addWidget(localLabelN, 3, 0); //qDebug() << "AwardsWidget::createUI-161" << QT_ENDL; //dxUpRightAwardsTabLayout->addWidget(localWorkedQLCDNumber, 3, 1); //qDebug() << "AwardsWidget::createUI-162" << QT_ENDL; //dxUpRightAwardsTabLayout->addWidget(localConfirmedQLCDNumber, 3, 2); //qDebug() << "AwardsWidget::createUI-163" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(qsoNLabelN, 4, 0); //qDebug() << "AwardsWidget::createUI-164" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(qsoWorkedQLCDNumber, 4, 1); //qDebug() << "AwardsWidget::createUI-165" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(qsoConfirmedQLCDNumber, 4, 2); //qDebug() << "AwardsWidget::createUI-166" << QT_ENDL; dxUpRightAwardsTabLayout->addLayout(yearlyTLayout, 5, 0); //qDebug() << "AwardsWidget::createUI-167" << QT_ENDL; dxUpRightAwardsTabLayout->addLayout(yearlyDLayout, 5, 1, 1, -1); //qDebug() << "AwardsWidget::createUI-168" << QT_ENDL; dxUpRightAwardsTabLayout->addWidget(recalculateAwardsButton, 6, 1); //qDebug() << "AwardsWidget::createUI-200" << QT_ENDL; setLayout(dxUpRightAwardsTabLayout); //connect(dataProxy, SIGNAL(qsoFound(QStringList)), this, SLOT(slotQsoFound(QStringList)) ); //connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); setToolTips(); connect(operatingYearsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotOperatingYearComboBoxChanged() ) ) ; connect(recalculateAwardsButton, SIGNAL(clicked()), this, SLOT(slotRecalculateAwardsButtonClicked() ) ); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::createUI-END" << QT_ENDL; } void AwardsWidget::setManageDXMarathon(const bool _dx) { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); manageDXMarathon = _dx; reconfigureDXMarathonUI(manageDXMarathon); emit debugLog(Q_FUNC_INFO, "End", logSeverity); } /* void AwardsWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: " << QT_ENDL; searchResultsTreeWidget->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; qslingNeeded = false; } */ void AwardsWidget::setToolTips() { emit debugLog (Q_FUNC_INFO, "Start", Debug); dxccConfirmedQLCDNumber->setToolTip(tr("Number of confirmed DXCC entities.")); dxccWorkedQLCDNumber->setToolTip(tr("Number of worked DXCC entities.")); wazConfirmedQLCDNumber->setToolTip(tr("Number of confirmed WAZ zones.")); wazWorkedQLCDNumber->setToolTip(tr("Number of worked WAZ zones.")); //localConfirmedQLCDNumber->setToolTip(tr("Number of confirmed local references.")); //localWorkedQLCDNumber->setToolTip(tr("Number of worked local references.")); qsoConfirmedQLCDNumber->setToolTip(tr("Number of confirmed QSOs.")); qsoWorkedQLCDNumber->setToolTip(tr("Number of worked QSOs.")); yearlyQSOLCDNumber->setToolTip(tr("Number of QSOs worked in the selected year.")); yearlyDXCCQLCDNumber->setToolTip(tr("Number of DXCCs worked in the selected year.")); yearlyCQQLCDNumber->setToolTip(tr("Number of CQ Zones worked in the selected year.")); yearlyScoreQLCDNumber->setToolTip(tr("Score for the DXMarathon in the selected year.")); operatingYearsComboBox->setToolTip(tr("Select the year you want to check.")); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::slotRecalculateAwardsButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); awards->recalculateAwards(); //emit recalculateAwardsSignal(); showAwards(); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::slotOperatingYearComboBoxChanged() { emit debugLog (Q_FUNC_INFO, "Start", Debug); selectedYear = (operatingYearsComboBox->currentText()).toInt(); showDXMarathon(selectedYear); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::showAwards() { // Updates and show all the award status tab. //qDebug() << "AwardsWidget::showAwards" << QT_ENDL; /* WAZ Local */ emit debugLog(Q_FUNC_INFO, "Start", logSeverity); checkIfValidLog(); int _num = 0; //QSqlQuery query; //QString aux; _num = dataProxy->getHowManyQSOInLog(currentLog); if (_num>99999) { qsoWorkedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoWorkedQLCDNumber->setDigitCount(5); } qsoWorkedQLCDNumber->display(_num); _num = dataProxy->getHowManyConfirmedQSLInLog(currentLog); if (_num>99999) { qsoConfirmedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoConfirmedQLCDNumber->setDigitCount(5); } qsoConfirmedQLCDNumber->display(_num); //_num = 0; dxccWorkedQLCDNumber->display(dataProxy->getFieldInBand (DXCC, "ALL", false, "ALL", currentLog)); dxccConfirmedQLCDNumber->display(dataProxy->getFieldInBand (DXCC, "ALL", true, "ALL", currentLog)); wazWorkedQLCDNumber->display(awards->getWAZWorked(currentLog)); wazConfirmedQLCDNumber->display(awards->getWAZConfirmed(currentLog)); showDXMarathon(selectedYear); emit debugLog(Q_FUNC_INFO, "END", logSeverity); //qDebug() << "AwardsWidget::showAwards - END" << QT_ENDL; } void AwardsWidget::showDXMarathon(const int _year) { //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Year: " << QString::number(_year) << QT_ENDL; emit debugLog(Q_FUNC_INFO, "Start", logSeverity); int i = 0; i = awards->getDXMarathonQSO(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: QSO: " << QString::number(i) << QT_ENDL; yearlyQSOLCDNumber->display(i); i = awards->getDXMarathonDXCC(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: DXCC: " << QString::number(i) << QT_ENDL; yearlyDXCCQLCDNumber->display(i); i = awards->getDXMarathonCQ(_year, currentLog); yearlyCQQLCDNumber->display(i); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: CQ: " << QString::number(i) << QT_ENDL; if (manageDXMarathon) { i = awards->getDXMarathonScore(_year, currentLog); } else { i = 0; } yearlyScoreQLCDNumber->display(i); emit debugLog(Q_FUNC_INFO, "End", logSeverity); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Score: " << QString::number(i) << QT_ENDL; } void AwardsWidget::reconfigureDXMarathonUI(const bool _dxM) { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); //dxClusterWidget->setDXMarathon(_dxM); if (_dxM) { yearlyLabelN->setText(tr("DX-Marathon")); yearlyScoreLabelN->setEnabled(true); yearlyScoreQLCDNumber->setEnabled(true); yearlyScoreQLCDNumber->display(0); } else { yearlyLabelN->setText(tr("Annual")); yearlyScoreLabelN->setEnabled(false); yearlyScoreQLCDNumber->setEnabled(false); emit requireCurrentYearSignal(); int i = awards->getDXMarathonScore(selectedYear, currentLog); if (i>0) { yearlyScoreQLCDNumber->display(i); } else { yearlyScoreQLCDNumber->display(0); } } emit debugLog(Q_FUNC_INFO, "End", logSeverity); } void AwardsWidget::checkIfValidLog() { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); if (currentLog < 1) { emit requireCurrentLogSignal(); } emit debugLog(Q_FUNC_INFO, "End", logSeverity); } void AwardsWidget::setLog(const int _log) { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); if (_log >= 1) { currentLog = _log; } //TODO: Define an action when the log received is NOK emit debugLog(Q_FUNC_INFO, "End", logSeverity); } void AwardsWidget::setYear(const int _year) { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); if (_year >= 1800) { selectedYear = _year; if (operatingYearsComboBox->findText(QString::number(selectedYear), Qt::MatchCaseSensitive)>=0) { operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(QString::number(selectedYear), Qt::MatchCaseSensitive)); } else { //TODO: Define what to do when the year is NOK } } emit debugLog(Q_FUNC_INFO, "End", logSeverity); } void AwardsWidget::fillOperatingYears() { emit debugLog(Q_FUNC_INFO, "Start", logSeverity); emit requireCurrentLogSignal(); emit requireCurrentYearSignal(); operatingYearsComboBox->clear(); if (dataProxy->getLastQSOid()<=1) { //qDebug() << "AwardsWidget::AwardsWidget: 18.4" << QT_ENDL; operatingYearsComboBox->addItem(QString::number(selectedYear)); } else { //qDebug() << "AwardsWidget::AwardsWidget: 18.5 - currentLog: " << QString::number(currentLog) << QT_ENDL; operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1 - currentLog: " << QString::number(currentLog) << QT_ENDL; QStringList a; a.clear(); a << dataProxy->getOperatingYears(currentLog); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.1 - currentLog: " << QString::number(currentLog) << QT_ENDL; if (!a.isEmpty()) { //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.2 - currentLog: " << QString::number(currentLog) << QT_ENDL; operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(a.last(), Qt::MatchCaseSensitive)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.3 - currentLog: " << QString::number(currentLog) << QT_ENDL; } //qDebug() << "AwardsWidget::AwardsWidget: 18.5.2" << QT_ENDL; } emit debugLog(Q_FUNC_INFO, "End", logSeverity); } klog-1.8.6/Changelog0000644000175000017500000016557414166020421013272 0ustar develdevelJan 2022 - 1.8.6 - Bugfix: Net rig & FLRig hamlib connections were not working propertly. (Closes #339) (TNX W5PNY) - Bugfix: Some prefixes were not properly detected. (Closes #371) (Closes #367). - Bugfix: Serial Hamlib rigs were not properly working. (TNX W5PNY) - Bugfix: QRZ.com was disabled if user was not subscribed. (TNX EA5WA) - Bugfix: QRZ.com data was not updated if the boxes were already filled. (TNX EA5WA) - Bugfix: Callsigns formet were not always properly checked. - Improvement: Hamlib 4.4 in binary packages (macOS & Windows) tested also in Linux. - Improvement: RTS & DTR are defined to OFF by default in hamlib. - Improvement:KLog differenciates QRZ.com subcribed users from non subscribed. (TNX EA5WA) Oct 2021 - 1.8.5 - Bugfix: Station callsign was not shown on window title. (Closes #347) - Bugfix: Received QSOs from LoTW were shown as to be sent. (Closes #358) - Bugfix: Log was not properly ordered. (Closes #346) (TNX EA5WA) - Improvement: Message of the mainwindow has been updated. (Closes #361) - Improvement: Logs to be uploaded to LoTW are only shown from the current log. (Closes #362) - Improvement: Logs to be uploaded to ClubLog are only shown from the current log. (Closes #363) - New feature: It is now possible to enable/disable the callsign check. (Closes #186) - Removed dead & commented code. - Improved how mainCallsign & Station callsigns are used. - QRZ.com queries are disabled if QRZ.com returns a non-subscribed user answer. Aug 2021 - 1.8.4 - Bugfix: In some situations callsigns were always shown as to be worked. (Closes #345) - Bugfix: Double click on DXCC widget was not sending the DXCC QSOs to the search widget. - Bugfix: Queued LoTW were not properly selected for upload. (Closes #354) (TNX EA5WA) - Improvement: KLog start is optimized. Aug 2021 - 1.8.3 - Added some backport code so systems without Qt 5.15.2 can compile and use KLog. - Bugfix: Selecting File->Export to ADIF was not showing all the possible QSOs to be exported. Aug 2021 - 1.8.2 - Bugfix: Updated the openSSL libraries for Windows users that was causing TLS errors on some connections. (Closes #342) - Bugfix: Spanish typo (TNX EA5WA) (Closes #341) - Bugfix: Statistics were showing wrong numbers on DXCC/Grid per band (Closes #344) Aug 2021 - 1.8.1 - Bugfix: QSOs comming from WSJTX and other sources where not shown, depending on logview configuration. (Closes #338) Aug 2021 - 1.8 - Bugfix: Some recently added ADIF fields where not properly imported from ADIF. - Improvement: Code updated to Qt 5.15.2. (Closes #323) - Improvement: VUCC_GRIDS & MY_VUCC_GRIDS are also managed in the UI. (Closes #319) - Improvement: LogView fields to be shown can be selected in the prerefences. (Closes #23) - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU) & Spanish (EA4K). July 2021 - 1.7 - Bugfix: RealTime remained checked when editing. - Bugfix: Some Hamlib parameters were not properly stored. - Bugfix: Coredump when no entity (Closes #302) - Bugfix: Colors are now properly defined. (Closes #275) (Closes #40) - Bugfix: Station callsign is read from the settings. (Closes #307) - Bugfix: The right setup dialog tab is open on first start. (Closes #311) - Improvement: DarkMode added. (TNX EA5WA) (Closes #56) - Improvement: DXCC & WAZ management optimization. - Improvement: Current UI data is saved before going to edit a QSO and restore after editing. - Improvement: Order of widgets when tab is pressed has been improved. (Working on #265) - Statistics: Added the Grids & DXCC per band statistic. (Closes #312), (Closes #313), (Closes #314) - UI: The Setup menu has been moved to Settings into the File menu. - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU) & Spanish (EA4K). June 2021 - 1.6 - Optimization: Isolated the QSO tab to an independent widget. - Bugfix: When starting KLog for the first time, it crashed. - Bugfix: Hamlib was not properly started on KLog start (closes #126) (TNX G4MKT) - Bugfix: SAT_MODE was being added to non SAT QSOs. - Bugfix: DXCC status was not being properly updated. - Improvement: Added user selectable ADIF fields in the Other and My Data tabs. (Closes #4) - Improvement: Enhanced how the UDP server is started on KLog start. - Improvement: Added some basic SQL Injection protection to the UI. (Closes #95) - Improvement: UI data is saved before entering the Setup and restored after setup is done. (Closes #188) - Improvement: Only one instance of KLog is allowed to run simultaneously. (Closes #250) (TNX foldynl) - Commented some Flawfinder false positives. - Translations: Catalan (TNX Txema), Czech (TNX OK1MLG), Italian (TNX IU5HIU) & Spanish (EA4K). May 2021 - 1.5.3 - Bugfix: Fixes the DataBase update process to add the Q65 mode. - Bugfix: Unexpected Setup dialog behavior. (Closes issue #178) (TNX foldynl) - Bugfix: Time is not in UTC when "Log in real time" is uncheck. (Closes issue #179) (TNX foldynl) - Bugfix: Missing translation in SoftwareUpdateDialog. (Closes issue #180) (TNX foldynl) - Bugfix: Inconsistency text in Tip#2. (Closes issue #182) (TNX foldynl) - Bugfix: Missing Translation string in SetupPageMisc::createUI. (Closes issue #185) (TNX foldynl) - Bugfix: When LoTW service was no enabled, KLog insisted to show the QSOs to be exported. - Bugfix: Setup->Satellites did not show a correct Short name. (Closes issue #192) (TNX foldynl) - Bugfix: Removal DX Cluster unexpected disconnection. (TNX foldynl) - Bugfix: Tip #21 was not shown. (Closes issue #184) (TNX foldynl) - Bugfix: TQSL was not properly found on macOS. (Closes issue #195) (TNX K0JM) - Enhancement: Improved the readability of the DX Cluster window. (TNX foldynl) - Updated the KLog tips. - Translation: Czech (TNX OK1MLG), Spanish. May 2021 - 1.5.2 - Bugfix: Complex calls like K/EA4K/P were identified as wrong calls. (Closes issue #177) (TNX PA3FNT) April 2021 - 1.5.1 - Added the GitHub repository to find new releases due to the issue with savannah.nongnu.org - New feature: F4 toggles the real time status (on/off). - Improvements on call identification management on user input. - Bugfix: Editing removes QTH and name (Closes issue #113) - Bugfix: Some complex calls (i.e. F/EA4K) were causing a crash unders some conditions. - Bugfix: DX Entity of some complex calls where not properly identified. (Closes issue #8). March 2021 - 1.5 - Added the 8M & 5M bands. - New feature: Added "Adif file deletion" checkbox. User can choose to show or not the message boxes after uploading QSOs. - New feature: New function added to fill automatically the satMode field in satellites Tab depending on upload/download frequencies. - UI: Added EA5WA as Author. :-) - New feature: LoTW confirmation is also counted for DXCC & WAZ. - New feature: DUPES are now identified when coming from WSJTX, ADIF logs, LoTW logs or simply adding a QSO. - New feature: Added a time period to consider a QSO as DUPE if call, band & mode are also the same. (Closes issue #41) - Improvement: Hamlib now supports network communication (TNX DG1VS) - Improvement: Optimized the way DXCC & WAZ are managed. - Improvement: KLog receives the clear messages from WSJTX and is able to clear the KLog UI. - Statistics: Added the Grids on Satellites statistics. - Statistics: Added the DXCC on Satellites statistics. - UI: Removed the QComboBox of the Setup Log tab to select the log. (TNX G4MKT) - UI: Added the QSO per log in the logs setup. - UI: Added a checkbox to keep the Propagation mode, if needed. Propagation mode is also linked to the Satellite tab. (TNX EA5WA) - UI: Added a Help->Online Manual menu or push F1 to go to the Online Manual (Closes issue #52) - Bugfix: Improved the way the QSOs come from WSJT-X. (EA5WA) - Bugfix: Double clicking on a call, while searching made the search to be redefined to that call and the previous search was lost. - Bugfix: Satellite stats where not properly calculated. (TNX EA5WA) - Bugfix: Identifying some bands was not properly done due to the names being in lower case. - Bugfix: When importing an ADIF and asking for a default station callsign, it was only used for the first QSO, leaving the rest without a station callsign. - Bugfix: Stats widget where not being properly created. - Bugfix: The Log combobox on the Statistics was not working. (TNX EA5WA) - Bugfix: End date tooltip updated on the export widget.(TNX G4MKT) - Bugfix: DX Locator tooltip was not OK. (TNX G4MKT) - Translations: Catalan (TNX Txema) & Spanish (EA4K). January 2021 - 1.4.7 - Added the Q65 mode. - eQSL sent is added as Q when received from WSJT-X (github issue #45) January 2021 - 1.4.6 - Bugfix: Improved the way the QSOs come from WSJT-X. (EA5WA) January 2021 - 1.4.5 - Added the FST4 and FST4W modes. - Added the RS-44 satellite. - UI: Changed "Config Dialog" to "Settings". (TNX G4MKT) - UI: Changed QRZ to Callsign. December 2020 - 1.4.4 - Bugfix: QSOs received from WSJT-X may not be saved properly. - Bugfix: ClubLog, eQSL.cc and QRZ.com were losing one setting. (TNX EA5WA) December 2020 - 1.4.3 - Bugfix: PJ7 flag was not being shown in the DXCC widget. - Bugfix: Disabling LoTW made impossible to enable it again via the setup. (TNX G6YRK) December 2020 - 1.4.2 - Bugfix: ADIF export was failing in some circunstances. December 2020 - 1.4.1 - Bugfix: Stat 01-QSO per year was not properly shown when returning from other stat. (TNX EA5WA) - Bugfix: UpLink sat freq was not properly defined when exiting the setup. - Translation: Spanish translation fix. December 2020 - 1.4 - Improvement: Prepared the WSJTX-2.4 UDP interface. - Improvement: User data stored in the setup is know used in the QSOs (default power, station callsign). - Improved the KG4xx (Guantanamo bay) DXCC detection from KG4 calls. - Updated how KLog counts the confirmed DXCC entities to include LoTW confirmations. - New feature: QSO upload to the QRZ.com Logbook (including qso selection and qso mark that has been uploaded) - New feature: QSO upload to the eQSL.cc Logbook (including qso selection and qso mark that has been uploaded) - New feature: ClubLog full log upload (adding or overwriting). - New feature: It is possible to keep the comment field from one QSO to the following one. (TNX EA5WA) - New feature: It is possible to select multiple QSOs in the log and execute several actions with the selected QSOs.(TNX EA5WA) - New feature: It is possible to check for the data of calls in QRZ.com (you need a subscription in QRZ.com) - UI: Removed the Keep my data option from the Setup UI. - UI: The RX frequency follows the TX unless the split is checked. - UI: Consolidation of all the electronic logs configurations in one single setup page into the eLog tab. - Bugfix: Save all QSOs to ADIF process continued even if the user clicked in cancel.(TNX G4MKT) - Bugfix: Backup file was not being created in the right path.(TNX G4MKT) - Bugfix: Some paths were converted to upper case causing some issues in some case sensitive situations. (TNX G4MKT) - Bugfix: In some cases, the RST format was not properly defined.(TNX G4MKT) - Bugfix: Default ADIF file was not being saved on exit. (TNX G4MKT) - Bugfix: It was not possible to select empty logs from the preferences. (TNX G4MKT) - Bugfix: QSOs comming from WSJTx were not being uploaded to ClubLog. (TNX PD9Q) - Bugfix: Too many mesages when uploading in realtime to Clublog. It should be done silently.(TNX EA5WA) - Bugfix: Typo in the INSTALL-linux. (TNX DL4TO) - Bugfix: Hamlib polling rate was not being saved from the setup. Default value is defined to 300ms. (TNX G4MKT) - Bugfix: Complete with previous QSO (name, locator, ...) was not working properly. - Bugfix: PROGRAMID ADIF data was not properly tagged. - Bugfix: When selecting the QSOs to upload to LoTW, if the selected call was the first one on the combobox, selection didn't worked properly. - Bugfix: When importing ADIF files with fields without RST_SENT or RST_RCVD the proposed default value was not adapted to the mode of that QSO. - Bugfix: Extension .adi was always added, even if the file had it already. - Bugfix: When doing a database backup, the name of the file was not being properly defined. - Bugfix: ClubLog realtime syncronization was not working properly. October - 1.3.2 - Bugfix: Data comming from WSJT-X, when several WSJT-X instances were running was not properly parsed. (TNX 2E0WJW) October - 1.3.1 - Translations: Croatian (TNX M0NKC). October - 1.3 - Improved the search widget to make searching much quicker. - Improved the Edit of QSO related to the default QSL sent status. - Improved the QRZ.com & DXHeat.com queries from the log & search window. - Improved the UDP datagram receiver to ensure it is working multicast. - UI: KLog remembers the size of the window from last execution. (TNX EA5WA) - UI: The Station Callsign and number of QSOs in the current log is shown in the windows title.(TNX G4MKT) - New feature: KLog now search for the call as the user enters for previously QSOs with that call. (TNX EA5WA) - Adds an ".adi" file extension to the log ADIF files if not added by the user. (TNX G4MKT) - When reading a log from LoTW, if there are new QSOs not present on the current logfile, KLog offers the option to import them. - Bugfix: It was not possible to add a log if the date and Station Callsign were the same. Now operators and comments are also taken into consideration.(TNX G4MKT) - Bugfix: The export of QSOs without an station callsign defined was failing.(TNX G4MKT) - Bugfix: When reading a log from LoTW, the list of QSOs were not shown at the end. (TNX EA5WA) - Bugfix: Comment in the new log widget was converted to uppercase. (TNX G4MKT) - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Spanish (EA4K). Sept 2020 - 1.2.2 - Bugfix: LoTW export was failing due to a wrong SQL sentence. (TNX PD9Q). Aug 2020 - 1.2.1 - Bugfix: ADIF export was not exporting dates with the right format in some eQSL fields. - Bugfix: QSOs were not properly imported when received from WSJT-X. - Bugfix: Pool/Poll typo fixed. (TNX Barry!). - Bugfix: QSO editing - Locator was being cleared from sat tab. - Bugfix: QSO editing - User Inferface was not properly clearedn after editing. - Bugfix: QSOs tag in the Award tab was not properly formatted in Windows OS. - Improvement: ADIF creation has been optimized. - Improvement: All fields received from WSJTX are now added to the log. - Improvement: GRIDSQUARE & MY_GRIDSQUARE ADIF fields are now also exported to LoTW upload. Aug 2020 - 1.2 - New feature: KLog proposes to do a database backup before it is upgraded so data can be recovered if there is any problem. - Improvement: When receiving the status from WSJT-X,the RX frequency is also updated with the same TX freq - Improvement: Dates and Times are now together and it is possible to sort the log based on date & time. Date format has been overall updated. - Improvement: Search is now more confortable as the search does not start inmediately after a key is pressed but some time after so it's possible to enter more letters and reduce the search time. - Bugfix: Fixed the DB update processes. - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Spanish (EA4K). May 2020 - 1.1 - Improvement: Search widget has been improved. - Improvement: Callsigns are always checked to be a good callsign before they are saved to the log, imported and exported to ADIF. - Improvement: Removed some death code. - Improvement: If TX Freq & RX Freq are the same, only TX Freq is exported. - Improvement: New functions to check calls when importing ADIF logs. - Improvement: Improved how CTY.CSV (country files) is working. - UI: Widget to show the QSOs to be exported to ADIF & LoTW. - UI: Widget to show the QSOs updated from ADIF & LoTW. - UI: Clear the UI also clears the status of a DXCC in the Band status widget. - UI: Added a checkbox to easily enable/disable the real time in the QSO entry box. - UI: Passwords are now hidden in the UI when entered. - BugFix: Only QSOs are now updated when data is uploaded from LoTW. - BugFix: DXCC & WAZ information was updated twice when removing a QSO. - BugFix: DXCC & WAZ count. - BugFix: Fixed one SQL query on satellite. - Bugfix: Fixed the print function. (JL3OXR). - Translations: Catalan (TNX Txema), Spanish (EA4K). April 2020 - 1.0.1 - BugFix: UTC time was not properly managed, specially in the date. March 2020 - 1.0 - UI: Removed the first column inthe DXCC widget to make it more user friendly. - UI: Created a widget to manage the Main QSO entry to make KLog more modular. - UI: eQSL & LoTW are marked as queued to be sent by default if the user activates it in the setup. - UI: Added the title to some QMessage boxes that were missing. - UI: Improved the usability of creating new logs or editing existing logs in the setup. - New feature: Integrate TQSL to upload QSOs to LoTW directly from KLog. - New feature: You can check a call in QRZ.com by right-clicking in the call from the log. - New feature: You can check a call in DXHeat.com by right-clicking in the call from the log. - New feature: It is now possible to save in a file all the DX-Cluster activity. - Improvement: Added https to the cty.dat download. - Improvement: Added the https to download.klog.xyz - Improvement: Propagation modes are now sorted in the Propagation mode combobox. - Improvement: Four new tips added. - Improvement: eQSL & LoTW dates are updated always that are modified to any status. - Improvement: If a QSO does not have a freq, a default freq based on the band is assigned if edited. - Improvement: Removed some deprecated functions. - Improvement: Improved the way KLog checks for a wrong call (IARU rules applied). - Improvement: Improved the way KLog checks for a wrong IOTA reference. - Removed the functionality to sort the log based on Date & Time columns. - Removed one console message about a duplicated database connection. - Bugfix: It was not possible to include new dxcluster servers in the setup. - Bugfix: The default value of RST in some digital modes using SNR were not properly shown. - Bugfix: In translated instances of KLog, Propagation mode was sometimes not properly saved when no propagation mode eas selected. - BugFix: Locator in SAT widget was not always not correctly evaluated as correct. - Updated translations: Catalan (TNX Txema), Croatian (TNX M0NKC), Finnish (TNX Kristjan), Spanish (EA4K). February 2020 - 0.9.9.1 - BugFix: Bands & modes where sometimes duplicated in the combobox (TNX G4MKT). January 2020 - 0.9.9 - UI: Created a widget to manage the Awards to make KLog more modular. - UI: When starting a new version for the first time, the splashscreen is not hidding other messages anymore. - UI: Removed some not used File menus (New, Open, Save & Save As). - UI: Sorting by date the log is also sorting taking into account the time. - New versions are now found depending on the OS, not just for the sources. - New feature: Added some tips in the Help menu to help the users to get the most of KLog. - Hamlib has now a read-only mode that will read freq & mode from the radio but will never modify/update anything in the radio. - Added some debug log option. - Some code cleaning with cppcheck and compilation warnings removed. - UI: Added a WSJT-X like color schema. - Bugfix: KLog was crashing if the call was completely removed in the Setup. - BugFix: KLog was always logging 59 instead of the real RST. (TNX DB4BIN) - BugFix: KLog was changing the mode in the radio from CW-R to CW if hamlib was active. (TNX G4MKT) - BugFix: KLog was changing freq in the radio in the starting process if hamlib was active. (TNX G4MKT) - Improvement: KLog reads the radio freq/mode when starting. (TNX G4MKT) - BugFix: ADIF export function was not exporting the DARC_DOK properly. - Bugfix: Closes Debian bug: #948911: FTBFS on mipsel. (TNX Lisandro) - BugFix: Editing the log metadata in the setup was not possible. - KLog exit process improved. - KLog start process improved. - DataProxy_SQLite class removed to optimize the code. - Other minor improvements. - Updated translations: Catalan (TNX Txema), French (F4HWL), Spanish (EA4K). August 2019 - 0.9.8.1 - Added the Es'hail / QO-100 satellite. - UI: Satellite list, propagation modes and others are now shown sorted. (TNX Isabel) - UI: Added default values to the infoWidget (Continent, Prefix, CQ, ITU...). (TNX Isabel) - UI: RX/TX Freq in Satellite tab are also in red/black depending on the frequency being out/in of ham bands. - UI: Mode selected is now changing the RST format and default values for some modes. - Bugfix: Editing a QSO to remove a comment was not properly working. (TNX Isabel) - Bugfix: Worked & Confirmed QSO numbers are now aligned in the Awards tab. (TNX Isabel) - Bugfix: KLog.pro is now fixed to compile in Linux. (TNX KB2YSI) - Bugfix: Improved how the DXMarathon was managed when disabled. - Bugfix: Improved how DXCC Award was updated after one QSO was added. (TNX Isabel) - Fixed a bug in the SQL update database. August 2019 - 0.9.8 - New feature: Basic Hamlib support. - Fixed a bug in the SQL update database. - Fixed a bug in the DXCCWidget. - Fixed a bug in the QSO per hour stats. - Added the FT4 mode. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). March 2019 - 0.9.7.3 - TODO: Remove the band 0 / Light from the DB. - UI: KLog warns the user if the frequency used is out of the hamradio bands. - Reworked how freqs and bands are managed. March 2019 - 0.9.7.2 - Bugfix: Frequency boxes did not accepted frequencies higher than 99.999 MHz. (TNX KB2YSI) March 2019 - 0.9.7.1 - Bugfix: The frequency was not properly saved in the DB. (TNX KB2YSI) - Bugfix: The QSO_DATE was not exported into ADIF. (TNX KB2YSI) March 2019 - 0.9.7 - Bugfix: When clicking on Check updates, the dialog froze. - Bugfix: Printing log is not longer showing band in the mode column. - Updated the default date on date boxes to the current date. - Improved the Frequency syncronization between Satellite tab and the main tab. - Improved how default mode is calculated. - Added Satellites widget in Setup. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). December 2018 - 0.9.6 - Optimizing the Statistics widget. - Added some new Statistics widgets. - Fixed some messages with typos. - Bugfix: Fixed a bug preventing to modify a QSO. (TNX KB2YSI). October 2018 - 0.9.5 - Added a dot at the end of all the tooltips. - Updated the Satellite database (TNX KB2YSI). - Some queries optimized. - Bugfix: You can nor close the About KLog window from any tag (TNX F4HWL). - New feature: KLog shows some statistics of your log: Tools->Stats - New feature: It is now possible to update the satellite data reading a sats.dat file: Tools->Update Satellite Data. - Satellites file (sats.dat) updated to september 2018 (TNX KB2YSI). - New translations: French (TNX F4HWL) and German (TNX Burkhard). - Updated translations: Catalan (TNX Txema), Croatian (TNX M0NKC), Finnish (TNX Kristjan), Spanish (EA4TV). August 2018 - 0.9.4 - WSJT-X support to receive logged QSO and realtime data. - Check bool DataBase::updateTo012() / it was always returning true without any action. - Syncronize RX Freq with the satellite downlink combobox. - Focus is back to search line edit when right click on the list of found QSOs. - Update process has been improved. - Some warnings removed from compilation time. - Bugfix: Date was not properly calculated and UTC settings was not applied. That may create wrong date QSO when date changes due to UTC (TNX AC1DW). - Bugfix: When adding a QSO, if the QSL is marked as received, KLog showed a SQL error. - Bugfix: Table qsl_via needed to be renamed (TNX EA6ZS). - Bugfix: Some DXCC status were nor properly calculated. - Updated translations: Catalan (TNX Josep), Croatian (TNX M0NKC), Danish (TNX Joe), Spanish (EA4TV). April 2018 - 0.9.3 - Double clicking on DXCC Widget name of the Entity will show the QSO is providing that status on the Search widget. - Added DXCC support for Kosovo. - Bugfix: Default band & mode are now defined as the most used band and mode. - Bugfix: TX frequency was not saved. - Bugfix: In the dxcc status widget, some countries were showing the UN flag unappropriately. - Bugfix: When updating the CTY file, query errors were shown on world.readCTYCSV function. - Bugfix: When editing the QRZ, the cursor position was not properly maintained. - Bugfix: Fixed the flags of several DXCC entities that were not correctly shown. - Bugfix: DXCC Status widget was not listing all the DX entities. - Bugfix: Modes & Bands where not always properly updated from the Setup. - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Updating the WAZ status was not always possible due to a incorrect DB query. - Updated translations: Danish (TNX Joe), Spanish (EA4TV). January 2018 - 0.9.2.9 - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Modes where not properly added from the setup (TNX KB2YSI). - UI Change: Freq in the Satellite tab is now not deleted when a new QSO is added. - New translation: Catalan by Josep (Thank you!) - New translation: Finnish by Kristjan (Thank you!) January 2018 - 0.9.2.8 - Important Optimization on KLog speed on start and general use. - New satellites (AO-91 & AO-92) added. - Added ALL the ADIF 3.0.7 fields (except the _INTL ones). - New feature: New menus to export ADIF files for LoTW and manage LoTW status. - GUI: Implemented an error reporting for the users for main errors - GUI: When a satellite is selected the main bands are automatically proposed. - GUI: QSO band is now linked to the uplink & downlink bands in the satellite tab. - Bugfix: Some ADIF fields were not properly imported/exported. - Bugfix: When searching calls like 1A0XX, 2E0XX, ... no results were found but there are with 3D0XXX - Bugfix: If an empty log was selected on config file, on next KLog start KLog crashed. - Bugfix: Doubleclicking on the log to edit was sometimes causing the band/mode data to be shown as a number instead of the human readable name. - Bugfix: Windows version did not detected the DB movement correctly. - New translation: Polish by LA7RRA (Thank you!). - New translation: Danish by Joe (Thank you!). - Updated translations: Croatian (TNX M0NKC), Italian (TNX IU5HIU), Spanish (EA4TV) - Several internal updates. September 2017 - 0.9.2.7 - KLog offers the possibility to move the DB to another path (maybe a DropBox folder!) - New Operating systems recognized in runtime. - Updated the references to macOS from OSX. - Updated the list of valid modes up to ADIF 3.0.6. - Updated the list of valid propagation modes up to ADIF 3.0.6. - Update the 136KHz band limits to the new US licenses. - Optimized the speed of printing the log. - GUI: Added the QSO information done in a year on the DX-Marathon area. - GUI: Simplified the way active bands/modes are selected. - GUI: Satellite tab is redesigned. - GUI: Created a widget to manage all "eQSL" simplifying implementation of the main widget. - GUI: Created a widget to manage the Log, simplifying implementation of the main widget. - GUI: Created a widget to manage the Search, simplifying implementation of the main widget. - GUI: Added a SplashScreen on KLog start to show the user the starting process. - GUI: If the user adds a frequency in the TX Freq box that is not a currently used band, it is automatically added to the band seletion widget. - BugFix: Fixed how new logs were added to the DB. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Higher bands where not shown to be selected in the preferences. - BugFix: DB updating function (009) blocked the execution of KLog the first time it was executed. - BugFix: Language message if English is the System language is no shown anymore. - New translation: Italian by IU5HIU (Thank you!). - Translations updated: Original English (TNX JustinBRye, from Debian-10n-english), Spanish (EA4TV), Japanese (TNX JL3OXR). May 2017 - 0.9.2.6 - Check updates feature added. On start or when user desires KLog checks if there is one updated version available. - Simplified the way new logs are added, importing the general StationCallsign & Operators as default for new logs. - Improved the way first start was managed when no entity information was loaded. - GUI: Application icon is now shown in the application windows. - GUI: Updated some messages & tips. - GUI: DXCluster offers the Station Callsign as default value to connect. - GUI: Some menu minor reorganization. - Console: Added a few commands to the console command. - Changed the World class to be able to import files from any folder. - Changed how some non ARRL valid entities are managed to show the common name (Sicily / Italy) - BugFix: When manually importing a new CTY.CSV, although data was updated, it was not shown until next KLog start. - BugFix: In the others tab, the DXCC was sometime not correctly identified. - BugFix: Update on the DXCC widget caused no data to be shown if some columns were selected. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Some improvements in data quality when exporting an ADIF file. - BugFix: When importing an ADIF file, if the file was not correct it was not possible to cancel the whole importing process. - Some minor changes on source code to optimize and improve. - Translations updated: Croatian (TNX M0NKC), Japanese (TNX JL3OXR) & Spanish (EA4TV). November 2016 - 0.9.2.5 - BugFix: ADIF export function was not exporting the correct BAND & MODE data. September 2016 - 0.9.2.4 - GUI: Created a DXCC status where all the DXCC entities are listed showing the working/confirmed status. - GUI: Created a Satellite list including (up to now) only LOTW compatible satellites. - GUI: Created a widget to manage all "My Data" simplifying implementation of the main widget. - GUI: Bands in the combobox are always shown correctly ordered (botton-up). - GUI: Improved the LOTW date management (TNX JL3OXR). - BugFix: Preferences->Misc: It was not possible to edit the default filename. (TNX K6XT). - BugFix: Added the Power unit (W) to the power box. Debian bug #654332. - BugFix: When editing a QSO in some text boxes text was reused from previous QSO and data could be corrupted. - BugFix: Minor bug in WAZ management. - BugFix: When managing logs in the setup is was not possible to edit the log data as a new log was always created. - When starting KLog for the first time, the setup guidance has been improved. - When selecting an entity, different from the proposed on country file, KLog asks the user which one to use. - Operator from the selected log is used as default when entering QSO (as station callsign). - Japanese translation updated. (TNX JL3OXR). - Spanish translation updated. - Some cleaning in the code. January 2016 - 0.9.2.3 - Improved the way translations are managed (Specially in Linux). - Icon application is now shown in OSX & Windows. - New translation: Japanese by JL3OXR (Thank you!). - Bugfix: Some strings where not defined to be translated (TNX JL3OXR). - Bugfix: Some tips in the UI where not correctly placed (TNX JL3OXR). - Bugfix: QSOs in JT9 were not properly imported from ADIF (TNX EA3XQ). - Bugfix: Logfiles with the in the first line, following some test were not properly imported. November-2015 - 0.9.2.2 - Translations are now working properly in Windows & OSX. - New translation: Catalan by EA3NM (Thank you!). - Ported from Qt4 to Qt5. - BugFix: Aether ADIF files could not be properly imported. (TNX AA5VU). - BugFix: QSOs where not properly shown in the search box. - BugFix: When started for the first time, no modes were shown as default. - BugFix: CTY.CSV was not properly updated. - BugFix: When upgrading the mode information in database some modes where not properly updated. - GUI: Changed the year to show the full number to avoid problems with old QSO. - Import ADIF functionality is improved to support importing of logs with some missing data. - Removed the Spot button until its functionality is implemented. September-2015 - 0.9.2.1 -BugFix: Band & Mode information was not properly stored. August-2015 - 0.9.2 - Bugfix: An ADIF file with one blank line and one QSO used to froze KLog. - Bugfix: Minor bugfix in the definition of propagation modes. - BugFix: When editing a QSO the name was not shown. - BugFix: STX_String field was not always imported properly. - BugFix: Fixed a minor bug in log table regarding the prop_mode foreign key. - BugFix: Improved the color & status shown of a QSO on the DXCC. - BugFix: DXCluster: Fixed a bug that caused the colors to appear always as new one. - BugFix: DXCluster: The option to show only not confirmed was not working correcty. - BugFix: IOTA reference was not saved when entering a QSO. - BugFix: BIGCTY.DAT was not properly download in KLog first start. - GUI: Added some shortcuts in the preference widget. - GUI: DXCluster: Add a suggestion to hit enter if no password is expected for the cluster. (tnx AA5VI) - GUI: DXCluster: Warns you if the spot is needed for the current year DX-Marathon - GUI: Added a Propagation Mode Combobox. - GUI: Prop_Mode combobox automatically goes to SAT if sat name or sat mode are defined. - GUI: Added a Find DX-QSL requested option. - Added the 630M & 13CM bands. - Updated Mode & submode definition up to ADIF 3.0.4. - Special CQ & ITU zones in some calls are now identified. - KLog is able to import QSOs with no BAND field if FREQ field is present. - KLog offers the user a default value if RST_TX or RST_RX field is not present when importing. - Support of realtime upload, modification & removal of a single QSO to/from ClubLog.org. - Updated the DB with the PROP_MODE options. - Improved the way KLog manages & shows the bands & modes. - Removed the option to choose to run in memory or file in the start wizard. KLog will run always using a file for the DB. - Added an auto complete option to auto-complete info (QTH, Locator, Name, QSL Manager & IOTA) from previously worked QSO. - Cleared the world.cpp file. - Some minor performance improvements. April-2015 - 0.9.1.1 - Bugfix: Editing a QSO with satellite data was not properly done and caused some errors. April-2015 - 0.9.1 - Bugfix: Fixed DataBase::getBandIdFromFreq it was not ansswering properly. - Now checks if band & frequency are coherent before adding a QSO. Band wins. - All Satellite QSO include the PROP_MODE ADIF tag to make it compatible with LOTW. - Improved the DXMarathon code. - GUI: Added basic Satellite support. - GUI: It is possible to mark a QSL sent via bureau/direct & DX QSL as requested with one action from Search box. - GUI: KLog request a valid QRZ and at least one first logtype to start using it. - KLog supports the management of several logs, being possible to edit, remove and select the one to use. January-2015 - 0.9.0.3 - Bugfix: ADIF was not properly imported when Fields where using the Type of data optional field preventing logs from Logger32 being imported. (TNX EB1TR) - Bugfix: QSL Sent/Received status in the search box were switched. - Bugfix: CTY.CSV was not updated if the file was already existing. - Bugfix: Entity DB was not updated when CTY.CSV was updated. - Bugfix: Search results showed the default Station Callsign if non was in the QSO. This lead to errors if QRZ was not the default. - KLog recognizes now .ADIF files (instead of only .ADI). - KLog shows now the WAZ status. - Added a very basic support of DX Marathon (http://www.dxmarathon.com/). - DXCluster filters are now working. - The user can manually assign the DXCC entity for a DX. - Improved the function to update the DB from one release to the following. - DB file is compressed everytime KLog finishes. - It is possible to find QSL pending to receive. - It is possible to modify entities data in the World Editor in preferences. - It is possible to choose in preferences whether to keep my Data Tab from one QSO to the next or not. - GUI: A tooltip is shown in the search results showing the DXCC name / CQ zone. - GUI: Added a button to rescore awards. - GUI: Added a button to update the search Box without modifying the text. - GUI: Updates Bearing/distance/... when changing Locator. - GUI: When the QRZ lineedit is blank or the clear button is clicked, entity info is deleted (beam, distance, ...). - GUI: The IOTA continent is updated when the QRZ is modified. - GUI: DXCluster input is disabled when not connected. - GUI: Corrected the behaviour of the status bar. - GUI: Added primary & secondary subdivisions in the Others Tab. - Some other minor fixes. November-2014 - 0.9.0.2 - Bugfix: Right-click on search result sometimes caused KLog to crash. November-2014 - 0.9.0.1 - Bugfix: Selected DX-Cluster servers were not used to connect. (TNX DL6FBS) November-2014 - 0.9.0 - Ensures the ASCII requirement of ADIF. - Updated the Preferences dialog. - Added the About Qt help menu. - Bugfix: Selected DX-Cluster servers were not used to connect. - Bugfix: When selecting QSL received/sent with right click, date was not updated. - Bugfix: Fixed the FileManager::adifReadLog to be able to read logs with several lines per QSO. - Some other minor bugfixes. - New feature: It is possible to show Imperial System (Miles instead of Km) data. (TNX - KF5JNU) - New feature: It is possible to mark/look for & export requested QSL. - New feature: It is possible to automatically mark(or not) a QSL as requested by the DX when the DX's card is received. - New feature: It is possible to show (or not) the callsign used in the search box. - New feature: KLog uses bigcty.csv for normal DX & will use cty.csv for contesting. April-2014 - 0.7.1 - Backport to Qt 4.8. - Download the http://www.country-files.com/cty/cty.csv instead of cty.dat (with no ARRL id). - Capable to read cty.csv to get the info of the ARRL id. April-2014 - 0.7.0 - Full rewritten software based only in Qt. NO KDE dependency. - KLog can now run on Linux, OSX and Windows. November-2013 - 0.6.2 - Bug fixed: Under some conditions, KLog crashes when entering a new QRZ. (TNX LW1EQI). - Bug fixed: IOTA data was not properly cleared when clicking the Cancel button. - Bug fixed: QSL combobox content was not properly managed. (TNX DF4FH). - Bug (gui) fixed: IOTA continent is now "automagically" detected... again (a bug prevented this functionality). - GUI updated: You can click on RX or TX Frequency buttons to copy the frequency to the other one. - GUI updated: You can select eQSL in the QSL combobox as an option to mark the QSL information of a QSO. - GUI updated: Two new shortcuts: CTRL+W: deletes the current QSO. CTRL+Q: to (quick)edit the last QSO added. - GUI updated: Minor tab reorder. June-2013 - 0.6.1 - Bug fixed: Locator was not properly calculated due to a sign difference management from KLog and CTY.DAT. - GUI updated: The cursor position management of the QRZ box has been improved to ease the operation. January-2013 - 0.6.0 - Bug fixed: Typo "Frecuency" changed to "Frequency" in a tooltip. (Debian bug: #654328) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "Numb" changed to "Number" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "UTC" changed to "Time" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Removal of several not needed #includes. - Removed some warnings on compilation. - GUI improved: The information boxes are now independant from the top right tab widget to improve usability. - GUI updated: Disabled the Setup tab of Hamlib until hamlib is properly working. January-2012 - 0.5.9 - Bug fixed: When starting for the first time, the CTY.DAT file downloaded had a loop that was not properly managed. (Debian bug: #653697) (TNX Jonas Stein) - Fixed some typo: "Km" changed to "km". (Debian bug: #6536978) (TNX Jonas Stein) December-2011 - 0.5.8 - Bug fixed: Right button in the search result did not "sent" the QSL card. - Bug fixed: Closing the window did not ask to save data before exit. (TNX EA7HEG). - Bug fixed: Beam was not properly calculated. (TNX DL6FBS). - Bug fixed: Minor problem of APP_KLOG_NUMBER ADIF header fixed. - Bug fixed: When modifying, some fields did not accepted empty fields (deleting). (TNX VK4JAZ). - GUI updated: Remove the map tab in the main GUI as it is still not implemented. - GUI updated: Ordered the tab-switching to make it more usable. (TNX Cedric). - Added the support for QRP. Power has two decimals. (TNX VK4JAZ). November-2010 - 0.5.7 - New feature: Added the Export needed QSL that allows to create an ADIF file with all the QSO with new ones and new bands still not confirmed that has not been QSLed. The objective is to export it to a QSL or label printing software (until KLog implements that feature). - Updated translations: SV by SM4ABE. - GUI improved: Added sliders to be able to move panels. - GUI improved: Changing the band combobox changes the TX Freq box and viceversa. - Minor fix: The PROGRAMVERSION tag in log was not properly formated. July-2010 - 0.5.6 - Fixed the hamlib compilation scripts (CMakeLists.txt, FindHamlib.cmake). (TNX AB4BD). - Fixed one bug that causes some architectures not to compile. - Fixed some permisions and other warnings for Fedora packaging. (TNX N3LRX). - BUG fixed: Setting QSL from the log with right button was not working. May-2010 - 0.5.5 - New feature: If cty.dat file is not found, KLog offers to download from the web. - New feature: New tool to update the update the cty.dat file from the web. - New feature: QRZ font color changes to red if has been worked previously. (Proposed by KE7TDY) March-2010 - 0.5.4 - Small fix to initialize a variable before using it.(realTimeLog in klog.cpp) - Fixed a bug that caused KLog to crash of no cty.dat file was found (bug #016917)(TNX KA6MAL) February-2010 - 0.5.3 - Fixed a bug that caused modified QSO not being updated. - Fixed a bug in the way the band & mode combobox managed the data. February-2010 - 0.5.2 - Fixed a bug that causes a crash when connectiong to DXCluster. (bug #016653) - Added a very basic Satellite support. - Removed the Freq LCD and added two new editable widgets: Freq TX and Freq RX. (bug #016609) - Added again the entity count of /M stations. January-2010 - 0.5.1 - Fixed a bug with the display of the Date. December-2009 - 0.5.0 - Migrated to Qt4. - Updated translations: SV by SM4ABE, DE by DL5PD, ES by EA4TV. - ZL2ACG joined the KLog team. Welcome and thank you Andrew! April-2009 0.4.7 - New feature: Import cabrillo logs. - Improved the ADIF compatibility up to ADIF 2.2.2. - BUG fixed: Improved the confirmed QSO accounting. - BUG fixed: RST format were not changed when another mode was selected if the CALL was empty. (TNX Alvaro, EA4RCT). - BUG fixed: Calls like F0XXX/TU8 were not recognised if written as TU8/F0XXX. - BUG fixed: TX_PWR is only saved when bigger than 0w :-) - BUG fixed: Prefixes were not properly managed and some information, as the STATE from ADIF files were not always well imported. - BUG fixed: Related with the ADIF saving CQ & ITU zones for QSO. It was not properly saved but can be recovered from the CALL. 20-dic-2008 - 0.4.6 - BUG fixed: Printing was not properly working due to library actualization. - BUG fixed: Fields STX/SRX/STATION_CALLSIGN/CONTEST_ID were copied from one QSO to the following one. 23-nov-2008 - 0.4.5 - GUI fixed: Changed the order of the input fields tab switching. - GUI fixed: Corrected the layout to fix the screen as ITU was not properly shown. - GUI improved: Added a new one color to differ a completely new one spot in the DX-cluster from a needed in a band. This last improvement is specially usefull in the search QSO to QSL. Test it! - GUI improved: Added a tab in the botton box with the DXCC status (only main HF bands). - New feature: Added the possibility to choose to show or not DX Spots based on CW/SSB activity. (TNX EA7BJ) - New feature: Added the support of the 0.136KHz and GHz bands (not to the GUI but KLog can process them). - BUG fixed: Minor check on QSL sent date was not properly done (no data lost). - BUG fixed: Some Entities & zones where not properly recognized. - BUG fixed: The state (needed/worked/confirmed) was not always properly shown. - Improved the way is readed the cty.dat file and added support for its new format. - Improved the ADIF compatibility supported fields, band frecuencies, modes... - Improved the QSO merging with previous data. - Updated translations: English, Spanish, TNX: Swedish (SM4ABE), German (DL5PD). 1-may-2008 - 0.4.4 - BUG fixed: KLog now recognises a "/LH" LightHouse stations (TNX G3OAG) - BUG fixed: TLF import did not show the imported QSO in the log. QSO were not lost, just not shown. They were added to the logfile and saved when saving. No data was lost. This bug was introduced in release 0.4.2 after an optimization in the logfile reading. BUG: Frequency was not compliance with ADIF as was saved in KHz instead of MHz. - BUG fixed: If a logfile does not provide a MY_GRIDSQUARE, KLog does not add the predefined MY_GRIDSQUARE. - BUG fixed: Some GRIDSQUARES were not detected as wrong althought they were. - Minor fix: Corrected the URL to CTY.DAT file in the start message. - GUI improved: Added a progress dialog when saving. - GUI changes: Some widgets have been changed to prepare for the Qt4 migration. Specially the Led near the QRZ box that will reapear as usual when KLog is migrated to Qt4. - Added the 70Mhz band. - New feature: New tool added "Merge QSO data" that looks in all the log for the QSO that has been worked more than once and merges the data like Name, QSL info, QTH, Locator, ... The information comming from all the appearances of a call in the log is grouped in the first appearance of that call in the log. 18-jan-2008 - 0.4.3.1 - Package fix: Distributed with the language (po) files. 12-jan-2008 - 0.4.3 - BUG fixed: KLog copied the QSL sent date into the QSL rec date. Only QSL rec date was lost but not the QSL status. - BUG fixed: KLog now recognises a "/J" (Jamboree On The Air) Scout Station. - GUI improved: Added the cty.dat URL. 12-Sep-2007 - 0.4.2 - New feature: The user can now configure to require or not the mandatory data for each QSO (QRZ, date, time, band, mode, RST tx & RST rx. (if not all the mandatory fields are entered, KLog's behaviour may be unexpected). - New feature: Klog creates a temp file (~.klog/tempklog.adi) where it saves automatically all the QSOs entered until the log is manually saved. It prevents the log to be lost in case of unprevented KLog/computer failure. (TNX SM5OUU) - BUG fixed: If the field (maybe any other field too) COMMENT is more than one line long, the log is broken and cannot be read. (TNX SM5OUU) - BUG fixed: KLog does not ask for the file name if you have previously opened one file and the name has not changed. - BUG fixed: In the GUI, the "Preferences" is correctly shown and not as "&Preferences". - BUG fixed: When modifying a QSO, the number of QSOs was incremented when the user click over OK. - BUG fixed: If a QSO was deleted the awards/number of QSO where not decresed. - BUG fixed: When the date - GUI improved: Deleted the WAE box (the WAE calculations was not implemented). - New translation: KLog is now also in Swedish.(TNX SM4BE) - New translation: KLog is now also in Galician.(TNX Fuco Mera) - Updated German translation.(TNX DL5PD) - Updated Spanish translation. 16-Dic-2006 - 0.4.1 - Bug fixed: The distance and beam is also resetted when the call box is deleted. - Bug fixed: Calls /M and /MM do not count for DXCC.(TNX SM5CNQ) - Bug fixed: It is possible to filter only for needed entities spots. - Change: The hamlib signal meter has been removed from the GUI. - New feature: There is a new tool available to find QSO from which the QSL is needed that you have still not sent the QSL. Very useful to find which QSL you need to send first! - New feature: The MY_GRIDSQUARE is managed by default by all QSO (saves the default if none is entered) 10-Sep-2006 - 0.4.0 - New feature: It is possible to manage user-created local awards (TPEA, DOK, WAS, ...) KLog reads user defined awards in a special format. - New feature: KLog reads ".adif" files also.(TNX DL5PD) - New feature: It is possible to add/delete new DXServer clusters in the setup box.(TNX DL5PD) - GUI Improved: IOTA continent is now "automagically" detected. - Bug fixed: Not really a bug but now, the log is cleaner as it does not save the "STATE" for ALL the QSO, only does it if needed. - Bug fixed: After modifying a QSO the band and mode did not return to the last used (TNX DL5PD). - Bug fixed: If the band changed, without any call in the Call box, KLog showed "new one, work it" - Bug fixed: If the band changed, when modifying KLog fooled the entity color band boxes. - Bug fixed: KLog recognises /MM as maritime mobile station - Bug fixed: When opening a new log, the number of QSO did not start from zero. - New translation: KLog is now also in German.(TNX DL5PD) 18-Jan-2006 - 0.3.3 - New feature: It is now possible to sort the log by numbers from the main log. - New feature: The frequency box is now also used when no hamlib support is active (double clicking over a dx-cluster spot. - New feature: If file name does not end in .adi, add the .adi. - Bug fixed: Reporting a bug does not crash KLog although the widget has been temporally/drastically simplified. - Bug fixed: It is possible to select the radio from the setup. - Bug fixed: (introduced in 0.3.2) It was not possible to activate the progress dialog. - Bug fixed: When clicking over "New File", confirmed entities was not set to "zero". - Bug fixed: When reading from cty.dat file, the prefix was reading with some spaces at the begining. - GUI Improved: After pressing OK/clear button, the QRZ box is selected. (TNX P.H. Rankin Hansen) - GUI Improved: You can now reach to Name&QTH using the tab key (TNX P.H. Rankin Hansen) - GUI Improved: QTH/Locator is now on the main QSO tab (TNX P.H. Rankin Hansen) 25-Apr-2005 - 0.3.2 - New feature-(unstable): Hamlib support to control/read the rig from KLog. - New feature-(unstable): It is possible to click over a DX-Spot and set the radio to that frecuency & mode to work the spot (hamlib). - New feature-(unstable): KLog reads the frecuency, band, mode and signal from the radio in real time (hamlib). - New feature: After QSLing using the Right Button option from the search box, the search box is updated so the QSL status is shown updated. - New feature: Local operator callsign can now be also logged. - Bug fixed: A call ending in /B is now correctly recognised as a beacon. - Bug fixed: Now it recognise all the "special suffix" like /r Rotuma, /a Mount Athos,... - Bug fixed: WARC Bands were not correctly detected. - GUI improved: The QRZ box always shows the QRZ as uppercase. (TNX ea4eej) - Bug fixed: KLog can now read ADIF files where the QSO can be in several lines. - Bug fixed: Importing from tlf, the QSO count was not properly done because of the comment lines. 16-Jan-2005 - 0.3.1 - KLog has been optimized and now runs faster. - New feature: KLog saves the date/time of the last log file save. - New feature: KLog ask the user for a comment when Importing a TLF log (for example to note that those QSO are from an specific contest or whatever). - Bug fixed: When selecting a DX-Spot from the DX-Cluster it did not overwrote the name. - Bug fixed: When writting the log, there was an space missing before the . It is just a "cosmetic" fix, not a real bug. - Bug fixed: The same with the QSL card status. - Bug fixed: KLog now recognises all the prefix that appears in cty.dat file with special CQ/ITU zones. - Bug fixed: KLog recognises the special call "3XDQC/P" as "3X" although it does not follow the "prefix+number+suffix" pattern - Bug fixed: When starting it now looks the cty.dat file in: ~/.klog and in the current directory before starting without Entities' data. (TNX oh7jjt) - Bug fixed: If we are modifying a QSO, the search box is not updated. Avoids some crashes. 07-Nov-2004 - 0.3.0 - Fixed source code to allow compiling in more architectures. - New feature: It is possible to show a progress dialog when opening the log file. This is configurable. - New feature: It is now possible to hide/show WARC spots or announces from cluster. - New feature: Printing the is now possible. - New feature: Sorting the log file is now possible. - New feature: New option in right button to send&rec QSL at once. - New feature: If a CALL has been previously worked it shows data to the actual QSO. - Fixed bug: When modifying, the QTH was not modified. - Fixed bug: It did not make you save if you just modify a QSO. - Improved the gui: The "T" (from RST) does not disappears but is disabled when is not needed. (TNX Ferm�n H.). - Improved the gui: The QSL info text box is always active. - Improved the gui: When connecting to the DX-Cluster server, automatically sets the DXCluster window as active. 2-May-2004 - 0.2.9 - New feature: Selection of a DX-Spot shows the Entity data and state. - New feature: KLog checks and captures the output of a sh/dx command in cluster. - Fixed bug(caused in 0.2.8): QRZs as KA3AA, when the prefix is just one letter but the call uses two are now well recognised. - Fixed bug: Better recognision from /number calls from DX-Cluster. 21-Mar-2004 - 0.2.8 - Fixed bug: Now ignores comments in TLF's files. - Fixed bug: QRZs as VP2MCV, with complex prefixes are now well recognised. - Improved the gui: RST, Power size adjusted. (TNX ea1ddn) - Improved the gui: Name and QTH moved to QSO tab. - Improved the gui: QSL via bureau is now the default option. (TNX ea1ddn) - New feature: Calculate distance and beam if locator is entered. (TNX ea1ddn) - New feature: Auto-open logfile when starting is now possible. (TNX ke6sls & ea1ddn) - New feature: Now it is possible to double-click over a DXCluster spot to copy it to the QSO input box. (TNX ea1ddn) - New feature: In the search box, QSOs are colored indicating if worked, needed, ... 04-Jan-2004 - 0.2.7 - Fixed bug: When editing a QSO, the QSL date was not properly displayed. - Fixed bug: When entering a QSO, if the band is changed, KLog checks the state in this new band. - Fixed bug: RST (tx&rx) in ADIF was always length 3, now is calculated for every QSO (at writing). - Fixed bug: When modifying if QSL rec, the date was shown as 00/00/0000 - New feature: It is posible to select a default mode & band in the setup. - First Icon draft created. 02-Dec-2003 - 0.2.6 - Fixed bug: When Non real time logging was setting the time was "real time" when modifying. (TNX rz3dfs) - Fixed bug: When reading the log file if an entity was not recognised Klog used to crash. - Fixed bug: Now we recognise calls like 3XY1L when reading from a log file. - Fixed bug: Improved the way of checking the confirmed/worked entities. - Fixed bug: /P, /M and /QRZ are now better recognised when reading from logfile or clicked. - Fixed bug: Stats were not shown after importing a tlf log file. - Fixed bug: The zone & entity numbering fixed. - New feature: It is posible to setup a default power level. - New feature: When receiving a qsl with the mouse's right button the numbers are updated. - New feature: Also a default color is selectionable as non-info color. - Improved the gui: Band info leds removed to gain space in the info widget. 26-Aug-2003 - 0.2.5 - Fixed bug:�RST was changed so when entering SSB RST. Entering 590 -> showed 509. (TNX ke6sls) - Fixed bug: In cluster some frecs (432MHz and 2190m) were not properly recognized. - New feature: It is now possible to hide HF/VHF/ANN spots or announces from cluster. - New feature: It ask for the file name when saving first time instead of using "klog.adi" as default. (TNX ke6sls) - New feature: It is now possible to add QSO in non real time (to add previous QSOs). (TNX yu1is) - New feature: Power value is remembered from previous QSO. (TNX ke6sls) - New feature: Basic bug report system. (TNX ke6sls) - New feature: Mode selection affects to the RST configuration (TNX yu1is & ke6sls) - New feature: Colors for confirmed/worked/needed are configurable by the user. - New feature: Added tips to many widgets to explain their functions. 31-Jul-2003 - 0.2.4 - Fixed bug: Some calls were not recognized when checked (as 3da0sv). - Fixed bug: When opening a second log having a previous one KLog did not ask for saving if needed. - New feature: Basic Setup dialog and functions. - New feature: Now the band combo change checks automatically the entity state. - New feature: Smart cluster tells you if a dx spot is needed, worked and/or confirmed using colors. - New feature: Clock is now in UTC by default but can be changed in preferences. 24-Jul-2003 - 0.2.3 - Improved the gui: The "entity state" LED has been moved to a always seen zone. - Improved the gui: The way to edit QSO. - Fixed bug: When searching it showed a wrong name and a qth. - New feature: Basic DX-Cluster support. - New feature: It is possible to add a log file to the current log. - New feature: QSO deletion. - New feature: QSO selection's data is shown in the show box. - New feature: You can delete qso & manage qsl from the list with righ button quickly & easily. 30-Jun-2003 - 0.2.2 - Changed the behavior of the search box to look not only for complete calls but characters. - Fixed bug: Improved the GUI layout. - Fixed bug: When editing a previous QSO the date was not always properly saved. - New feature: Added real time clock. 20-Mar-2003 - 0.2.0 - New feature: Added search for QSO tab. - New feature: Added Name field. - New feature: Added QTH field. - New feature: Added operator (self call) field. - Fixed bug: When saving log to file comment is not saved if there is no comment. - Fixed bug: When selecting a "portable" (/P) (or /number) qso in the list it didn't recognize the entity. - Translation updated: pt_BR. 13-Mar-2003 - 0.1-beta02 - Added many modes and some more bands. - New feature: Asking for saving when finishing without save. - New feature: Asking if overwrite when saving as to an existing file. - New feature: The main led only shows info about the current band. - New feature: Band/Mode sticky between contacts. - New feature: Added the long path beam and distance. - New feature: You can track each entity state per band with leds. - New feature: Basic WAZ award support. - Fixed bug: If you had a log and started a new one, the DXCC kept the data. - Fixed bug: The IOTA number was limited to 99 (now 999). 28-Feb-2003 - 0.1-beta - New feature: Led is green (new one), yellow (worked but not confirmed), red (confirmed). - New feature: Support calls as EA4TV/EA8, EA8/EA4TV. - New feature: Import TLF logs. - New feature: Added beam and distance calculations. - New feature: Added Locator & IOTA fields. - New feature: Basic DXCC award support. - Improved the search the Entity algorithm (much quick). - Clear button shows "Cancel" when modifying. - Changed many classes from Qt classes to KDE classes. - Fixed bug: Some times the QSL was checked automaticaly. - Fixed bug: The Mode combobox showed SBB and it is SSB. - Fixed bug: some calls showed as worked before and they were not. 29-Jan-2003 - 0.1-alpha - Fixed bug: When modifying a QSO it was not shown in the log box. - Fixed bug: If you clicked over the log box but not over a qso, the program crashed - Fixed bug: When modifying a QSO the date was always set to "now". - Now you can select what log file you want to open. - Now you can select the file's name when saving the log. - Now you can create a new log always you want. - Logs are now stored in ~/.klog directory by default. - Logs are saved as klog.adi by default. - Some prefix were not found in previous version. - QSL date is activated when a QSO is selected - QSL via is working, manager field, and QSL info field 22-Jan-2003 - 0.1-pre-alpha - First "release" of the software. - You can add/edit QSOs and save/read your log to/from the disk with a fixed name in ADIF format. - Can manage QSL sent/rec. klog-1.8.6/logwindow.cpp0000644000175000017500000006515614166020421014170 0ustar develdevel/*************************************************************************** logwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "logwindow.h" LogWindow::LogWindow(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "LogWindow::LogWindow: " << QT_ENDL; dataProxy = dp; //sortingThroughProxyModel = false; logModel = new LogModel(dataProxy, this); util = new Utilities; connect(logModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); logView = new QTableView; columns.clear(); //dxccStatusWidget = new DXCCStatusWidget(dataProxy); //elogClublog = new eLogClubLog(); currentLog = -1; //proxyModel = new LogViewSortFilterProxyModel(this); awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "LogWindow::LogWindow: - END" << QT_ENDL; } LogWindow::~LogWindow() { delete(util); delete(awards); // emit clearError(); } void LogWindow::setColumns(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(_columns); logModel->setColumns(columns); } void LogWindow::sortColumn(const int _c) { //proxyModel->sort(_c); logModel->sort(_c, Qt::AscendingOrder); } void LogWindow::clear() { //qDebug() << "LogWindow::clear " << QT_ENDL; } void LogWindow::createUI() { //qDebug() << Q_FUNC_INFO; logView->setContextMenuPolicy(Qt::CustomContextMenu); logView->setSortingEnabled(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(logView); setLayout(layout); } void LogWindow::setDefaultData() { //qDebug() << Q_FUNC_INFO; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(util->getDefaultLogFields()); //qDebug() << "LogWindow::setDefaultData" << QT_ENDL; } void LogWindow::createlogPanel(const int _currentLog) { //qDebug() << "LogWindow::createlogPanel: " << QString::number(_currentLog) << QT_ENDL; currentLog = _currentLog; logModel->createlogModel(currentLog); //proxyModel->setSourceModel(logModel); logView->setModel(logModel); logView->setCurrentIndex(logModel->index(0, 0)); setColumnsOfLog(columns); sortColumn(1); //Initial sort by column 1 (date & time) logView->setSelectionMode(QAbstractItemView::ExtendedSelection); logView->setSelectionBehavior(QAbstractItemView::SelectRows); logView->resizeColumnsToContents(); logView->horizontalHeader()->setStretchLastSection(true); logView->sortByColumn(1, Qt::DescendingOrder); } void LogWindow::setColumnsOfLog(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO << ": Length: " << QString::number(_columns.length()); QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int ncolumns = rec.count(); for (int i=0; i < ncolumns; i++) { logView->setColumnHidden(i, true); } QString aux; foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ": columns-1: " << aux; } foreach(aux, _columns) { //qDebug() << Q_FUNC_INFO << ": _columns-1: " << aux; } QStringList temPColumns; temPColumns.clear(); temPColumns << _columns; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(temPColumns); foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ":-2: " << aux; } foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ": " << aux; showColumn(aux); } } void LogWindow::showColumn(const QString &_columnName) { QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.indexOf(_columnName); logView->setColumnHidden(columns, false); } void LogWindow::refresh() { //qDebug() << "LogWindow::refresh" << QT_ENDL; logModel->select(); } void LogWindow::createActions() { //qDebug() << Q_FUNC_INFO; createActionsCommon(); showMenuRightButtonFromLogCreateActions(); } void LogWindow::createActionsCommon() { //LOG VIEW connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); } void LogWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << Q_FUNC_INFO; int row = (logView->indexAt(pos)).row(); QItemSelectionModel *select = logView->selectionModel(); QModelIndexList list = select->selectedRows(); if (select->hasSelection() && (list.length()>1) ) { rightButtonMultipleFromLogMenu(); } else { rightButtonFromLogMenu(row); } //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::rightButtonMultipleFromLogMenu() { //qDebug() << Q_FUNC_INFO; QMenu menu(this); menu.addAction(multipleDelQSOsFromLogAct); //menu.addSeparator(); menu.addAction(multipleExportToADIFFromLogAct); /* menu.addSeparator(); QMenu *menuEQsl = menu.addMenu(tr("eQSL")); menuEQsl->addAction(multipleQueueForLoTWFromLogAct); menuEQsl->addAction(multipleQueueForClubLogFromLogAct); menuEQsl->addAction(multipleQueueForEQSLFromLogAct); menu.addMenu(menuEQsl); QMenu *menuQslS = menu.addMenu(tr("QSL")); QMenu *menuSentQsl = menuQslS->addMenu(tr("QSLs Send")); menuSentQsl->addAction(multipleQslSentViaBureauFromLogAct); menuSentQsl->addAction(multipleQslSentViaDirectFromLogAct); QMenu *menuRcvdQsl = menuQslS->addMenu(tr("QSLs Rcvd")); menuRcvdQsl->addAction(multipleQslRecViaBureauFromLogAct); menuRcvdQsl->addAction(multipleQslRecViaDirectFromLogAct); */ menu.addSeparator(); menu.addAction(multipleSelectAll); menu.addAction(multipleDeselectAll); menu.exec(QCursor::pos()); } void LogWindow::rightButtonFromLogMenu(const int trow) { //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: " << QString::number(trow) << QT_ENDL; //qDebug() << Q_FUNC_INFO; int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID) << QT_ENDL; bool qslReceived = isQSLReceived(_qsoID); bool qslSent = isQSLSent(_qsoID); QMenu menu(this); //menu.addAction(multipleQueueForQRZCOMFromLogAct); menu.addAction(multipleExportToADIFFromLogAct); menu.addAction(delQSOFromLogAct); delQSOFromLogAct->setData(trow); menu.addAction(qsoToEditFromLogAct); qsoToEditFromLogAct->setData(trow); menu.addAction(checkQRZCOMFromLogAct); checkQRZCOMFromLogAct->setData(trow); menu.addAction(checkDXHeatFromLogAct); checkDXHeatFromLogAct->setData(trow); menu.addSeparator(); if (qslSent) { } else { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); qslSentViaBureauFromLogAct->setData(trow); qslSentViaDirectFromLogAct->setData(trow); } if (qslReceived) { } else { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); menuRecQsl->addAction(qslRecViaDirectFromLogAct); qslRecViaBureauFromLogAct->setData(trow); qslRecViaDirectFromLogAct->setData(trow); } menu.addSeparator(); menu.addAction(multipleSelectAll); menu.addAction(multipleDeselectAll); menu.exec(QCursor::pos()); } void LogWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << "LogWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()) << QT_ENDL; int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); int qsoID = ((logModel->index(row, Qt::DisplayRole)).data(0)).toInt(); //qDebug() << "LogWindow::slotDoubleClickLog: n: " << QString::number (logModel->data(index, Qt::DisplayRole).toInt()) << QT_ENDL; //qDebug() << "LogWindow::slotDoubleClickLog: emitted: " << QString::number (((logModel->index(row, Qt::DisplayRole)).data(0)).toInt()) << QT_ENDL; emit actionQSODoubleClicked(qsoID); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited logModel->select(); } bool LogWindow::isQSLReceived(const int _qsoId) { //qDebug() << "LogWindow::isQSLReceived: " << QString::number(_qsoId) << QT_ENDL; return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL //return dataProxy->isQSLReceived(_qsoId); } bool LogWindow::isQSLSent(const int _qsoId) { //qDebug() << "LogWindow::isQSLSent: " << QString::number(_qsoId) << QT_ENDL; return dataProxy->isQSLSent(_qsoId); } void LogWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "LogWindow::showMenuRightButtonFromLogCreateActions" << QT_ENDL; delQSOFromLogAct = new QAction(tr("&Delete"), this); delQSOFromLogAct->setShortcut(Qt::CTRL + Qt::Key_D); delQSOFromLogAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog())); qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromLogAct->setShortcut(Qt::CTRL + Qt::Key_E); qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog())); qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_B); qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() )); qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_I); qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog() )); qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_R); qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau")); connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() )); qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); qslRecViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_T); qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t")); connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() )); checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this); checkQRZCOMFromLogAct->setShortcut(Qt::CTRL + Qt::Key_Q); checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com")); connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() )); checkDXHeatFromLogAct = new QAction(tr("Check in DXHeat.com"), this); checkDXHeatFromLogAct->setShortcut(Qt::CTRL + Qt::Key_Q); checkDXHeatFromLogAct->setStatusTip(tr("Check this callsign in DXHeat.com")); connect(checkDXHeatFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckDXHeatCom() )); multipleDelQSOsFromLogAct = new QAction(tr("Delete selected QSOs"), this); //multipleDelQSOsFromLogAct->setShortcut(Qt::CTRL + Qt::Key_D); multipleDelQSOsFromLogAct->setStatusTip(tr("Delete the selected QSOs")); connect(multipleDelQSOsFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsDeleteFromLog())); multipleExportToADIFFromLogAct = new QAction(tr("Export to ADIF"), this); multipleExportToADIFFromLogAct->setStatusTip(tr("Export the selected QSOs to an ADIF file.")); connect(multipleExportToADIFFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsExportFromLog())); //multipleQueueForQRZCOMFromLogAct = new QAction(tr("Upload to QRZ.com"), this); //multipleQueueForQRZCOMFromLogAct->setStatusTip(tr("Send the selected QSOs to QRZ.com.")); //connect(multipleQueueForQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsQRZUploadFromLog())); multipleQueueForLoTWFromLogAct = new QAction(tr("Upload to LoTW"), this); multipleQueueForLoTWFromLogAct->setStatusTip(tr("Upload the selected QSOs to LoTW")); connect(multipleQueueForLoTWFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToLoTWFromLog())); multipleQueueForClubLogFromLogAct = new QAction(tr("Upload to ClubLog"), this); multipleQueueForClubLogFromLogAct->setStatusTip(tr("Upload the selected QSOs to ClubLog")); connect(multipleQueueForClubLogFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToClubLogFromLog())); multipleQueueForEQSLFromLogAct = new QAction(tr("Upload to eQSL.cc"), this); multipleQueueForEQSLFromLogAct->setStatusTip(tr("Upload the selected QSOs to eQSL.cc")); connect(multipleQueueForEQSLFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToEQSLFromLog())); multipleQslSentViaBureauFromLogAct = new QAction(tr("Via bureau"), this); multipleQslSentViaBureauFromLogAct->setStatusTip(tr("Send these QSLs via bureau")); connect(multipleQslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLSentViaBureauFromLog() )); multipleQslSentViaDirectFromLogAct = new QAction(tr("Direct"), this); multipleQslSentViaDirectFromLogAct->setStatusTip(tr("Send these QSLs via direct")); connect(multipleQslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLSentViaDirectFromLog() )); multipleQslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); multipleQslRecViaBureauFromLogAct->setStatusTip(tr("QSLs received via bureau")); connect(multipleQslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLRecViaBureauFromLog() )); multipleQslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); multipleQslRecViaDirectFromLogAct->setStatusTip(tr("QSLs received via direc&t")); connect(multipleQslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLRecViaDirectFromLog() )); multipleDeselectAll = new QAction(tr("Select none"), this); multipleDeselectAll->setStatusTip(tr("Remove all selections")); connect(multipleDeselectAll, SIGNAL(triggered()), this, SLOT( slotQSOsDeselectAll() )); multipleSelectAll = new QAction(tr("Select all"), this); multipleSelectAll->setStatusTip(tr("Select all the QSOs")); connect(multipleSelectAll, SIGNAL(triggered()), this, SLOT( slotQSOsSelectAll() )); } void LogWindow::slotQSOsSelectAll() { logView->selectAll(); } void LogWindow::slotQSOsDeselectAll() { logView->selectionModel()->clearSelection(); } void LogWindow::slotQSLSentViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); } void LogWindow::slotQSLSentViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy-MM-dd")); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); } void LogWindow::slotQSLRecViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLRecViaBureauFromLog: " << QT_ENDL; int _qsoId = ((logModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSLRecViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaDirect(_qsoId); // Mark Sent, Bureau, date, update log. //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSOToEditFromLog() { //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString() << QT_ENDL; //qsoToEdit((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0).toInt()); int QSOid = ((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt(); /* int row = index.row(); int qsoID = ((logModel->index(row, Qt::DisplayRole)).data(0)).toInt(); emit actionQSODoubleClicked(qsoID); */ //int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); emit actionQSODoubleClicked(QSOid); //TODO: To be added to the logWindow and create an action that emit the QSO id } void LogWindow::deleteQSO(const int _qsoId) { //qDebug() << "LogWindow::deleteQSO " << QString::number(_qsoId) << QT_ENDL; emit actionDeleteQSO(_qsoId); } /* void LogWindow::deleteQSO(const int _qsoID) { //qDebug() << "LogWindow::deleteQSO: " << QString::number(_qsoID) << QT_ENDL; emit actionDeleteQSO(_qsoID); //elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID)); dataProxy->deleteQSO(_qsoID); //logModel->removeRow((delQSOFromLogAct->data()).toInt()); //TODO: This has been replaced by the previous line //awards->recalculateAwards(); refresh(); //dxccStatusWidget->refresh(); emit updateAwards(); emit updateSearchText(); } */ void LogWindow::slotQsoDeleteFromLog() { //qDebug() << "LogWindow::slotQsoDeleteFromLog: " << (delQSOFromLogAct->data()).toString() << QT_ENDL; //TODO: To be added to the logWindow and create an action that emist the QSO id int QSOid = ((logModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); deleteQSO(QSOid); //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): " << QString::number(QSOid) << QT_ENDL; /* switch (ret) { case QMessageBox::Yes: //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): -1" << QT_ENDL; deleteQSO(QSOid); break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } */ } void LogWindow::slotQSOsDeleteFromLog() { //qDebug() << "LogWindow::slotQSOsDeleteFromLog" << QT_ENDL; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotshowRighButtonFromLog: " << QString::number(index.row()) << QT_ENDL; //qDebug() << "LogWindow::slotshowRighButtonFromLog: " << QString::number(index.data(0).toInt()) << QT_ENDL; } } if (qsos.length()>0) { emit deleteTheseQSOs(qsos); } } void LogWindow::slotQSOsExportFromLog() { //qDebug() << "LogWindow::slotQSOsExportFromLog" << QT_ENDL; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotQSOsExportFromLog: " << QString::number(index.row()) << QT_ENDL; //qDebug() << "LogWindow::slotQSOsExportFromLog: " << QString::number(index.data(0).toInt()) << QT_ENDL; } } if (qsos.length()>0) { emit exportToADIFTheseQSOs(qsos); } //qDebug() << "LogWindow::slotQSOsExportFromLog - END - " << QString::number(qsos.length()) << QT_ENDL; } void LogWindow::slotQSOsUploadToLoTWFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToLoTWFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotQSOsUploadToClubLogFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToClubLogFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotQSOsQRZUploadFromLog() { //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog - TO BE IMPLEMENTED" << QT_ENDL; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog: " << QString::number(index.row()) << QT_ENDL; //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog: " << QString::number(index.data(0).toInt()) << QT_ENDL; } } if (qsos.length()>0) { emit uploadToQRZcomTheseQSOs(qsos); } } void LogWindow::slotQSOsUploadToEQSLFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToEQSLFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotMultipleQSLSentViaBureauFromLog() { //qDebug() << "LogWindow::slotMultipleQSLSentViaBureauFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotMultipleQSLSentViaDirectFromLog() { //qDebug() << "LogWindow::slotMultipleQSLSentViaDirectFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotMultipleQSLRecViaBureauFromLog() { //qDebug() << "LogWindow::slotMultipleQSLRecViaBureauFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::slotMultipleQSLRecViaDirectFromLog() { //qDebug() << "LogWindow::slotMultipleQSLRecViaDirectFromLog - TO BE IMPLEMENTED" << QT_ENDL; } void LogWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << "LogWindow::qslSentViaBureau: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); } void LogWindow::qslRecViaBureau(const int _qsoId) { // //qDebug() << "LogWyyyy-MM-ddRecViaBureau: " << QString::number(_qsoIyyyy-MM-dd<< (dateTime->currentDateTime()).toString("yyyy/MM/dd") << QT_ENDL; dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); //Update the Award status refresh(); emit updateAwards(); } void LogWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << "LogWindow::qslRecViaDirect: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); refresh(); emit updateAwards(); } void LogWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); } void LogWindow::slotCheckQRZCom() { QString _qrz = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); //qDebug() << "LogWindow::sloTCheckQRZCom: " << _qrz << QT_ENDL; QString url = "https://www.qrz.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void LogWindow::slotCheckDXHeatCom() { QString _qrz = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); //qDebug() << "LogWindow::slotCheckDXHeatCom(): " << _qrz << QT_ENDL; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } klog-1.8.6/mainqsoentrywidget.h0000644000175000017500000001314114166020421015544 0ustar develdevel#ifndef MAINQSOENTRYWIDGET_H #define MAINQSOENTRYWIDGET_H /*************************************************************************** mainqsoentrywidget.h - description ------------------- begin : january 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" //#include "hamlibclass.h" class MainQSOEntryWidget : public QWidget { Q_OBJECT public: explicit MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); void setBands(const QStringList _bands); void setModes(const QStringList _modes); bool setBand(const QString &_band); bool setFreq(const double _f, bool isRX = false); bool setMode(const QString &_mode); bool setQRZ(const QString &_qrz); void setCurrentQRZ(const QString &_qrz); bool setDateTime(const QDateTime _date); bool setTime(const QTime _time); void setCleaning (const bool _c); bool isModeExisting(const QString &_m); bool isBandExisting(const QString &_b); QString getQrz(); QString getBand(const int _b=-1); QString getMode(const int _m=-1); QStringList getModes(); QDate getDate(); QTime getTime(); QDateTime getDateTime(); void setRealTime(const bool _realTime); bool getRealTime(); void toggleRealTime(); void setUTC(const bool _utc); void setModify(const bool _modify); bool getModifying(); void setUpAndRunning(const bool _u); void selectDefaultBand(const bool _init = false); void selectDefaultMode(const bool _init = false); void setDuplicatedQSOSlot (const int _secs); void setFocusToOK(); void clear(); protected: //void keyPressEvent(QKeyEvent *event); //void resizeEvent(QResizeEvent *event) override; signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void showInfoLabel(QString _msg); void currentQRZSignal(QString _msg); void clearForNextQSOSignal(); void bandChanged(QString _band); void modeChanged(QString _mode); void OKClicked(); void validBands(QStringList _bands); void handOverFocusSignal(); void hamlibSetActiveSignal(bool _active); private slots: void slotUpdateTime(); void slotQRZTextChanged(); void slotBandComboBoxChanged(const QString &_b); void slotModeComboBoxChanged(const QString &_m); void slotOKButtonClicked(); void slotClearButtonClicked(); //void slotRealtimeButtonClicked(); void slotCheckBoxClicked(); //void slotRealTimeCheckBoxChanged(); void slotStartDelayInputTimer(); void slotDelayInputTimedOut(); //void slotRealTimeButtonResize(); void slotManualModeCheckBoxClicked(); private: bool eventFilter(QObject *object, QEvent *event); void createUI(); void setInitialData(); bool validCharactersInCall(const QString &_qrz); void clearForNextQSO(); void checkIfDupe(const QString &_func); void setDateAndTimeInternally(); bool updateBandComboBox(const QString &_band); // If a new band arrives, we add it if possible to KLog bool newBandNeededForFreq(const double _f); DataProxy_SQLite *dataProxy; QGroupBox *qrzgroupBox;//, *searchgroupBox; QLineEdit *qrzLineEdit; QComboBox *bandComboBox, *modeComboBox; QDateEdit *dateEdit; QTimeEdit *timeEdit; QPushButton *OKButton, *clearButton; QCheckBox *realtimeCheckBox, *manualModeCheckBox; //QPushButton *realtimeButton; //DebugLogLevel logSeverity; bool cleaning; bool qrzAutoChanging; bool InValidCharsInPrevCall; bool qrzSmallModDontCalculate; bool upAndRunning; bool getDarkMode(); QString previousQRZ; QString currentQrz; QStringList bands, modes; QTimer *timer; bool UTCTime, modify, realTime; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) Utilities *util; QPalette::ColorRole enabledCR, disabledCR; int duplicatedQSOSlotInSecs; QTimer *delayInputTimer; QString lastQrz; double freqTX, freqRX, bottomBandLimit, upperBandLimit; //HamLibClass *hamlib; }; #endif // MAINQSOENTRYWIDGET_H klog-1.8.6/eqslutilities.h0000644000175000017500000000752014166020407014517 0ustar develdevel#ifndef EQSLUTILITIES_H #define EQSLUTILITIES_H /*************************************************************************** eqslutilities.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" // https://www.eqsl.cc/qslcard/Programming.cfm class eQSLUtilities : public QObject { Q_OBJECT public: explicit eQSLUtilities(const QString &_parentFunction); ~eQSLUtilities(); void setUser(const QString &_call); void setPass(const QString &_pass); void setCredentials(const QString &_user, const QString &_pass, const QString &_defaultStationCallsign); //int sendQSO(QStringList _qso); //int deleteQSO(QStringList _qso); //int modifyQSO (QStringList _oldQSO, QStringList _newQSO); void sendLogFile(const QString &_file, QList _qso); private: //QString geteQSLAdif(const QStringList _q); //int sendData(const QString &_eQSLUser, const QString &_q); // Sends the data (http post) to eQSL //int sendDataParams(const QString &_eQSLUser, const QUrlQuery &_params); QStringList prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it QString user, pass, stationCallsign; QNetworkAccessManager *manager; QNetworkReply* reply; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; //bool useQSOStationCallsign; private slots: void slotQsoUploadFinished(QNetworkReply* data); //void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableeQSLAction(const bool _b); void signalFileUploaded(QNetworkReply::NetworkError, QList); }; #endif // EQSLUTILITIES_H klog-1.8.6/utilities.cpp0000644000175000017500000016215414166020421014166 0ustar develdevel/*************************************************************************** utilities.cpp - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "global.h" #include "utilities.h" bool g_callsignCheck; Utilities::Utilities() { //qDebug() << "Utilities::Utilities" ; init(); //palRed.setColor(QPalette::Text, Qt::red); //palBlack.setColor(QPalette::Text, Qt::black); //qDebug() << "Utilities::Utilities - END" ; } Utilities::~Utilities() { } void Utilities::init() { softwareVersion = "0.0"; darkMode = false; //callValidation = true; } void Utilities::setVersion(const QString &_v) { //qDebug() << "Utilities::setVersion: " << _v ; softwareVersion = _v; } QString Utilities::getVersion() { return softwareVersion; } double Utilities::getVersionDouble() { //qDebug() << "Utilities::getVersionDouble: " << softwareVersion ; if (softwareVersion.count('.')>1) { QString first = softwareVersion.section('.', 0, 0); int pos = softwareVersion.indexOf('.'); QString decimals = softwareVersion.section('.', pos, -1); decimals.remove('.'); first = first + "." + decimals; //qDebug() << "Utilities::getVersionDouble - returning: " << first ; return first.toDouble(); } //qDebug() << "Utilities::getVersionDouble: no points detected" ; return softwareVersion.toDouble(); } int Utilities::getProgresStepForDialog(int totalSteps) { //qDebug() << "Utilities::getProgresStepForDialog"; if (totalSteps <=100) return 1; else if (totalSteps <=1000) return 5; else if (totalSteps <=4000) return 10; else if (totalSteps <=5000) return 15; else if (totalSteps <=7000) return 20; else if (totalSteps <=9999) return 25; else if (totalSteps <=20000) return 100; else return 250; } bool Utilities::trueOrFalse(const QString &_s) {// reads a String and return true if s.upper()== TRUE :-) //qDebug() << "Utilities::trueOrFalse: " << _s ; if ( (_s.toUpper()) == "TRUE") { return true; } else { return false; } //return false; } QChar Utilities::boolToCharToSQLite(const bool _b) { if (_b) { return 'Y'; } else { return 'N'; } } QString Utilities::boolToQString(const bool _b) { if (_b) { return "True"; } else { return "False"; } } QString Utilities::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data ; // This function is not really working with ASCII but with Unicode //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal) ; } // Show into another lineEdit return newString; } void Utilities::printQString(const QStringList &_qs) { //qDebug() << "Utilities::printQString: COMMENT THIS CALL BEFORE RELEASING" ; if (_qs.length()<1) { //qDebug() << "Utilities::printQString: EMPTY QStringList received!!" ; return; } for (int i=0; i<_qs.length()-1;i++) { //qDebug() << _qs.at(i) << "/" ; } //qDebug() << _qs.at(_qs.length()-1) ; } QString Utilities::getGlobalAgent(const QString &_klogversion) { return QString("KLog-%1").arg(_klogversion); } QString Utilities::getAgent(const QString &_klogversion) { QString version; QString ops; version = _klogversion; #if defined(Q_OS_WIN32) ops = "KLog-Win32-"; #elif defined(Q_OS_WIN64) ops = "KLog-Win64-"; #elif defined(Q_OS_LINUX) ops = "KLog-Linux-"; #elif defined(Q_OS_WIN) ops = "KLog-Win-"+ version; #elif defined(Q_OS_MACOS) ops = "KLog-macOS-"; #elif defined(Q_OS_OSX) ops = "KLog-OSX-"; #elif defined(Q_OS_MAC) ops = "KLog-MAC-"; #elif defined(Q_OS_DARWIN) ops = "KLog-DARWIN-"; #elif defined(Q_OS_AIX) ops = "KLog-aix-"; #elif defined(Q_OS_ANDROID) ops = "KLog-android-"; //#elif defined(Q_OS_BSD4) // ops = "KLog-bsd4-"; #elif defined(Q_OS_BSDI) ops = "KLog-bsdi-"; #elif defined(Q_OS_CYGWIN) ops = "KLog-cygwin-"; #elif defined(Q_OS_DARWIN) ops = "KLog-darwin-"; #elif defined(Q_OS_DGUX) ops = "KLog-dgux-"; #elif defined(Q_OS_DYNIX) ops = "KLog-dynix-"; #elif defined(Q_OS_FREEBSD) ops = "KLog-freebsd-"; #elif defined(Q_OS_HPUX) ops = "KLog-hpux-"; #elif defined(Q_OS_IOS) ops = "KLog-ios-"; #elif defined(Q_OS_IRIX) ops = "KLog-irix-"; #elif defined(Q_OS_LYNX) ops = "KLog-lynx-"; #elif defined(Q_OS_NETBSD) ops = "KLog-netbsd-"; #elif defined(Q_OS_OPENBSD) ops = "KLog-openbsd-"; #elif defined(Q_OS_OSF) ops = "KLog-osf-"; #elif defined(Q_OS_QNX) ops = "KLog-qnx-"; #elif defined(Q_OS_SCO) ops = "KLog-sco-"; #elif defined(Q_OS_SOLARIS) ops = "KLog-solaris-"; #elif defined(Q_OS_TVOS) ops = "KLog-tvos-"; #elif defined(Q_OS_UNIX) ops = "KLog-unix-"; #elif defined(Q_OS_UNIXWARE) ops = "KLog-unixware-"; #elif defined(Q_OS_WHATCHOS) ops = "KLog-whatchos-"; #elif defined(Q_OS_WINRT) ops = "KLog-winrt-"; #else ops = "KLog-Other-"; #endif return ops+version; //return "KLog-Unknown-" + version; } QString Utilities::getHomeDir() { //TODO: To be removed when the defaultDir is saved in the config file #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << QDir::homePath() + "/klog" ; return QDir::homePath()+"/klog"; // We create the \klog for the logs and data #else //qDebug() << "NO WINDOWS DETECTED!" ; return QDir::homePath()+"/.klog"; // We create the ~/.klog for the logs and data #endif } QString Utilities::getDefaultRST(const QString &_m) { //qDebug() << "Utilities::getDefaultRST: " << _m ; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") ) { //qDebug() << "MainWindow::setRSTToMode: Detected SSB/LSB/USB" ; return "59"; } else if ((_m == "CW") || (_m == "RTTY")) { return "599"; } else if (_m == "PSK31") { return "599"; } else if ( (_m.contains("FT", Qt::CaseInsensitive)) || (_m.contains("JT", Qt::CaseInsensitive)) || (_m.contains("QRA64", Qt::CaseInsensitive)) || (_m.contains("JS", Qt::CaseInsensitive))) { return "0"; } else { // By default SSB RST is configured but anything could be added return "59"; } } QStringList Utilities::getDefaultLogFields() { QStringList fields; fields.clear(); fields << "qso_date" << "call" << "rst_sent" << "rst_rcvd" << "bandid" << "modeid" << "comment"; return fields; } QString Utilities::getKLogDefaultDatabaseFile() { //TODO: To be removed when the defaultDir is saved in the config file return getHomeDir() ; } QString Utilities::getKLogDBFile() { //qDebug() << "Utilities::getKLogDBFile: start " ; dbPath = getKLogDefaultDatabaseFile(); QFile file(getCfgFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //return dbPath; //return getKLogDatabaseFile(dbPath); } else { while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } } //qDebug() << "Utilities::getKLogDBFile: path to use: " << dbPath ; return dbPath + "/logbook.dat"; } QString Utilities::getKLogDBBackupFile() { //qDebug() << "Utilities::getKLogDBFile: start " ; dbPath = getKLogDefaultDatabaseFile(); QFile file(getCfgFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //return dbPath; //return getKLogDatabaseFile(dbPath); } else { while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } } //qDebug() << "Utilities::getKLogDBFile: path to use: " << dbPath ; return dbPath + "/" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + "-backup-logbook.dat" ; } bool Utilities::processConfigLine(const QString &_line) { //qDebug() << "Utilities::processConfigLine: " << _line ; QString line = _line.simplified(); //line.simplified(); //QString aux; QStringList values = line.split("=", QT_SKIP); if (line.startsWith('#')){ //qDebug() << "Utilities::processConfigLine: notes Line!" ; return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "Utilities::processConfigLine: Wrong Line!" ; return false; } QString field = (values.at(0)).toUpper(); QString value = values.at(1); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } if (field == "DBPATH") { //qDebug() << "Utilities::processConfigLine: dbPATH found: " << value ; dbPath = value; } return true; } /* QString Utilities::getKLogDatabaseFile(const QString &_file) { //qDebug() << "Utilities::getKLogDatabaseFile:" << _file ; if ( QFile::exists(_file + "/logbook.dat") ) { //qDebug() << "Utilities::getKLogDatabaseFile:returning: " << _file + "/logbook.dat" ; return _file + "/logbook.dat"; } //qDebug() << "Utilities::getKLogDatabaseFile: Does not exist so default: " << getKLogDefaultDatabaseFile() ; return getKLogDefaultDatabaseFile(); } */ QString Utilities::getCfgFile() { //TODO: To be removed when the defaultDir is saved in the config file #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogrc.cfg"; #else //qDebug() << "NO WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogrc"; #endif } QString Utilities::getDebugLogFile() { #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogdebug.log"; #else //qDebug() << "NO WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogdebug.log"; #endif } QString Utilities::getSaveSpotsLogFile() { QString filename = "/" + (QDateTime::currentDateTime()).toString("yyyyMMdd") + "-klogdxcluster.txt"; return getHomeDir() + filename; } QString Utilities::getBackupADIFile() { return getHomeDir() + "/" + (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmm") + "-klogbackup.adi"; } QString Utilities::getClubLogFile() { return getHomeDir() + "/klog-clublog-upload.adi"; } QString Utilities::getEQSLFile() { return getHomeDir() + "/klog-eqsl-upload.adi"; } QString Utilities::getLoTWAdifFile() { return getHomeDir() + "/klog-lotw-upload.adi"; } QString Utilities::getTQSLsFileName() { //qDebug() << "Utilities::getTQSLsFileName: " ; #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " ; return "tqsl.exe"; #elif defined(Q_OS_MACOS) //qDebug() << "macOS DETECTED!: " ; return "tqsl.app"; #else //qDebug() << "NO WINDOWS/macOS DETECTED!: " ; return "tqsl"; #endif } QString Utilities::getTQSLsPath() { //qDebug() << "Utilities::getDefaultProgramsPath " ; #if defined(Q_OS_WIN64) //qDebug() << "WINDOWS DETECTED!: " ; return "C:/Program Files/TrustedQSL/"; #elif defined(Q_OS_WIN32) return "C:/Program Files (x86)/TrustedQSL/"; #elif defined(Q_OS_MACOS) //qDebug() << "macOS DETECTED!: " ; return "/Applications/TrustedQSL/"; #else //qDebug() << "NO WINDOWS/macOS DETECTED!: " ; return "/usr/bin/"; #endif } QString Utilities::getCTYFile() { return getHomeDir() + "/cty.csv"; } int Utilities::getNormalizedDXCCValue(const int _dxcc) { if (_dxcc >1000) { return ((QString::number(_dxcc)).rightRef(3)).toInt(); } else { return _dxcc; } } QDate Utilities::getDefaultDate() { //return QDate::fromString("18000101", "yyyyMMdd"); return QDate::currentDate(); } bool Utilities::isValidDate(const QDate _d) { //qDebug() << "Utilities::isValidDate: " << _d.toString("yyyyMMdd") ; if (_d.isValid()) { if ( _d > QDate::fromString("18000101", "yyyyMMdd") ) { //qDebug() << "Utilities::isValidDate: OK" ; return true; } } //qDebug() << "Utilities::isValidDate: Error" ; return false; } bool Utilities::isValidDateTime(const QString &_d) { //qDebug() << "Utilities::isValidDateTime: " << _d ; QDateTime _dateTime = QDateTime::fromString(_d, "yyyyMMddhhmmss"); if ( _dateTime.isValid() ) { //qDebug() << "Utilities::isValidDateTime: 1" ; return isValidDate(_dateTime.date()); } //qDebug() << "Utilities::isValidDateTime: Error" ; return false; } bool Utilities::isValidSubCall(const QString &_c) { //qDebug() << "Utilities::isValidSubCall: " << _c ; // This functions only checks simple calls like EA4K, not composed like EA4K/F of F/EA4K/QRP //Rules: http://life.itu.int/radioclub/rr/art19.pdf if (_c.contains ('/')) { return false; } if (_c.length()<3) { //qDebug() << "Utilities::isValidSubCall: FALSE-1: " << _c ; return false; } if (!(_c.at(_c.length ()-1).isLetter ())) { //qDebug() << "Utilities::isValidSubCall: FALSE-1.1: " << _c ; return false; } for (int i = 0; i<_c.length ();i++) { if (!_c.at(i).isLetterOrNumber ()) { // Non valid chars //qDebug() << "Utilities::isValidSubCall: FALSE-1.2: " << _c ; return false; } } int prefixLength = isAPrefix (_c); if (prefixLength<1) { //qDebug() << "Utilities::isValidSubCall: FALSE-1.3: " << _c ; return false; } int i = prefixLength; //qDebug() << "Utilities::isValidSubCall: prefixLength" << QString::number(prefixLength) ; //qDebug() << "Utilities::isValidSubCall: call" << _c ; while(i<_c.length ()-1) { if (!((_c.at(i).isLetter()) )) { //qDebug() << "Utilities::isValidSubCall: FALSE-1.4: " << _c ; return false; } i++; } //qDebug() << "Utilities::isValidSubCall: true" ; return true; } bool Utilities::isCountrySuffix (const QString &_c) { //qDebug() << Q_FUNC_INFO << _c; QStringList validSuffixes = {"P", "M", "MM", "QRP", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}; return !validSuffixes.contains (_c); } int Utilities::isAPrefix (const QString &_c) { // Returns -1 if it is not a prefix or valid call. // Returns an int with the lenght of the prefix: // The length would be including the number, if possible EA4 or; // including just the country prefix: EA if the number is not included. //qDebug() << "Utilities::isAPrefix: " << _c ; // Prefixes are at least 1 chars (like in K1K) int length = _c.length (); if (length < 1) { //qDebug() << "Utilities::isAPrefix: TOO short prefix - false - END \n"; return -1; } QString call = _c; //qDebug() << "Utilities::isAPrefix: -10: " << call.at(0) ; QChar firstChar = call.at(0); QList validFirstLettersOnly = {'B', 'F', 'G', 'I', 'K', 'M', 'N', 'R', 'W'}; if (length == 1) { if (validFirstLettersOnly.contains (firstChar)) { //qDebug() << "Utilities::isAPrefix: VALID 1 letter" ; return 1; } else { //qDebug() << "Utilities::isAPrefix: NOT VALID 1 letter" ; return -1; } } QChar secondChar = call.at(1); //qDebug() << "Utilities::isAPrefix: SecondChar: " << secondChar ; int pref = -1; if (call.count(QRegularExpression("\\d")) >0) // Does it has any digit? { //qDebug() << "Utilities::isAPrefix: It has digits: " << call ; bool done = false; int i = -1; while ((i < length-1) && !done) { //qDebug() << "Utilities::isAPrefix: in the while: " << QString::number(i) ; i++; if (call.at(i).isLetter ()) { //qDebug() << "Utilities::isAPrefix: in the while: is a Letter: " << call.at(i) ; if (pref>0) { pref = i; done = true; } } else { //qDebug() << "Utilities::isAPrefix: in the while: is NOT a Letter: " << call.at(i) ; if (i > 0) { pref = i; } } } // end of while } //qDebug() << "Utilities::isAPrefix: After the while: " << QString::number(pref) ; QString prefix; if (pref>0) { //qDebug() << "Utilities::isAPrefix: pref>0 =>: " << call.left (pref) ; prefix = call.left (pref); } else { prefix = call; //qDebug() << "Utilities::isAPrefix: pref<=0 =>: " << call ; } length = prefix.length(); QChar thirdChar = QChar(); if (length>2) { thirdChar = prefix.at(2); } //qDebug() << "Utilities::isAPrefix: -50 " ; // The first two characters shall be two letters or a letter followed // by a digit or a digit followed by a letter. The first two characters or in certain cases // the first character of a call sign constitute the nationality identification if (firstChar.isDigit() && secondChar.isDigit()) { //qDebug() << "Utilities::isAPrefix: FALSE-6: " << prefix ; return -1; } //qDebug() << "Utilities::isAPrefix: -60 " ; if (firstChar.isLetter() && secondChar.isLetter() && thirdChar.isLetter()) { //qDebug() << "Utilities::isAPrefix: FALSE-6: " << prefix ; return -1; } //qDebug() << "Utilities::isAPrefix: -70 " ; QList validFirstLetters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T' ,'U', 'V', 'W', 'Z'}; if (secondChar.isDigit ()) { if (!validFirstLetters.contains (firstChar)) { //qDebug() << "Utilities::isAPrefix: NOT VALID 1 letter not valid" ; return -1; } } /* // The following if is to manage not format but specific IARU callsign assignments // defined here: http://life.itu.int/radioclub/rr/ap42.pdf // For the time being, KLog will not check that if ( (firstChar.isLetter ()) && (secondChar.isDigit ()) && (validFirstLetters.contains(firstChar))) { //qDebug() << "Utilities::isAPrefix validFirstLetters contains the first one!" ; if (firstChar == 'C') { if ((secondChar == '1') || (secondChar == '7')) { //qDebug() << "Utilities::isAPrefix: FALSE-7.1: " << prefix ; return false; } } if (firstChar == 'D') { //((secondChar == '1') || (secondChar == '8')) if (false) { //qDebug() << "Utilities::isAPrefix: FALSE-7.2: " << prefix ; return false; } } if (firstChar == 'E') { if (!(secondChar == '2') && !(secondChar == '3') && !(secondChar == '4') && !(secondChar == '7') { //qDebug() << "Utilities::isAPrefix: FALSE-7.3: " << prefix ; return false; } } if (firstChar == 'H') { if ((secondChar == '1') ) { //qDebug() << "Utilities::isAPrefix: FALSE-7.4: " << prefix ; return false; } } if (firstChar == 'J') { if ((secondChar == '1') || (secondChar == '9')) { //qDebug() << "Utilities::isAPrefix: FALSE-7.5: " << prefix ; return false; } } if (firstChar == 'P') { if (secondChar == '1') { //qDebug() << "Utilities::isAPrefix: FALSE-7.6: " << prefix ; return false; } } if (firstChar == 'S') { if ((secondChar == '1') || (secondChar == '6')) { //qDebug() << "Utilities::isAPrefix: FALSE-7.7: " << prefix ; return false; } } if (firstChar == 'T') { if (secondChar == '0') { //qDebug() << "Utilities::isAPrefix: FALSE-7.8: " << prefix ; return false; } } if (firstChar == 'V') { if ((secondChar == '1') || (secondChar == '9')) { //qDebug() << "Utilities::isAPrefix: FALSE-7.9: " << prefix ; return false; } } if (firstChar == 'Z') { if (!((secondChar == '2') || (secondChar == '3'))) { //qDebug() << "Utilities::isAPrefix: FALSE-7.10: " << prefix ; return false; } } //qDebug() << "Utilities::isAPrefix: 1-Letter + number prefix valid: " << prefix ; } */ //qDebug() << "Utilities::isAPrefix: After the if's" ; // It seems to be a valid prefix, let's count how many chars belong to the prefix, first letter after the digit // should be the suffix starting point //qDebug() << "Utilities::isAPrefix: Prefix length: " << QString::number(pref) << "/" << prefix ; if (pref>0) { return pref; } else { return prefix.length (); } } void Utilities::setCallValidation(const bool _b) { //callValidation = _b; g_callsignCheck = _b; } bool Utilities::isValidCall(const QString &_c) { //qDebug() << "Utilities::isValidCall: " << _c ; // Prefixes are at least 2 chars if (!g_callsignCheck) { //qDebug() << "Utilities::isValidCall - 009" ; return true; } //qDebug() << "Utilities::isValidCall - 010" ; QString call = _c; if (_c.length()<3) { //qDebug() << "Utilities::isValidCall: FALSE-1: " << _c ; return false; } //qDebug() << "Utilities::isValidCall - 015" ; call.replace('\\', '/'); if (call.count('/')>2) { //qDebug() << "Utilities::isValidCall: FALSE-3: " << call; return false; } //qDebug() << "Utilities::isValidCall - 020" ; if (call.count('/') == 2) { //Things like F/EA4K/P will become F/EA4K //qDebug() << "Utilities::isValidCall: Two /; Ignoring the last part: " << call ; QStringList parts; parts.clear(); parts << call.split('/'); call = parts.at(0) + "/" + parts.at(1); } //qDebug() << "Utilities::isValidCall - 025" ; //qDebug() << "Utilities::isValidCall: Call: " << call ; if (call.count('/') == 1) { // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp // We are just checking the call format not if it belongs to a country or whatever. // It may return true for wrong calls like "ABC/EA4K" // TODO: Add a check just for prefixes to fix the previous //qDebug() << "Utilities::isValidCall: Call with one /: " << call ; QStringList parts; parts.clear(); parts << call.split ('/'); //return ( ((isAPrefix (parts.at (0)))>0) || ((isAPrefix (parts.at (1)))>0) || (isValidSubCall (parts.at(0)) ) || (isValidSubCall (parts.at(1)) )); if (parts.at(0).length ()0) && (isValidSubCall (parts.at(1)) ) ); } else { //Both lenght are just the same or the second is showter, we need to check both parts and return true if one is valid // It may happen that we have a EA4K/QRP or EA4K/F or EA4K/TTT return isValidSubCall (parts.at(0)); } } return isValidSubCall (call); } QString Utilities::getPrefixFromCall(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c ; QString call = _c; call.replace('\\', '/'); if (call.count('/') == 2) { //Things like F/EA4K/P will become F/EA4K QStringList parts; parts.clear(); parts << call.split('/'); call = parts.at(0) + "/" + parts.at(1); } //QString prefix = QString(); int pref = -1; if (call.count('/') == 1) { // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp QStringList parts; parts.clear(); parts << call.split ('/'); bool secondPartIsCountryPrefix = isCountrySuffix (parts.at(1)); if ((parts.at(0).length ()0) { //qDebug() << Q_FUNC_INFO << ": R1=" << call.left (pref) ; return parts.at(0); } else { //qDebug() << Q_FUNC_INFO << ": EMPTY-2" ; return QString(); } } else if(parts.at(0).length ()>parts.at(1).length ()) { // Second one is shorter //qDebug() << Q_FUNC_INFO << ": Second one is shorter: " ; if (isCountrySuffix (parts.at(1))) { pref = isAPrefix (parts.at(1)); } else { pref = isAPrefix (parts.at(0)); } if (pref>0) { //qDebug() << Q_FUNC_INFO << ": R2=" << parts.at(1) ; return parts.at(1); } else { pref = isAPrefix (parts.at(0)); if (pref>0) { //qDebug() << Q_FUNC_INFO << ": R3=" << parts.at(0).left(pref) ; return parts.at(0).left (pref); } else { //qDebug() << Q_FUNC_INFO << ": EMPTY-3" ; return QString(); } } } else { //Both lenght are just the same, we need to check both parts and return true if one is valid //qDebug() << Q_FUNC_INFO << ": Same length, we shoudl consider the first one if valid, if not the second one " ; } } pref = isAPrefix (call); if (pref>0) { //qDebug() << Q_FUNC_INFO << ": R4=" << call.left (pref) ; return call.left (pref); } //qDebug() << Q_FUNC_INFO << ": EMPTY-4" ; return QString(); } /* QPair Utilities::getCallParts(const QString &_c) { // DXCC prefix, if different from original, full call QString call = _c; QPair pair; pair.first = QString(); pair.second = QString(); if (_c.length()<3) { //qDebug() << "Utilities::isValidCall: FALSE-1: " << _c ; return pair; } call.replace('\\', '/'); if (call.count('/')>2) { //qDebug() << "Utilities::isValidCall: FALSE-3: " << call ; return pair; } if (call.count('/') == 2) { //Things like F/EA4K/P will become F/EA4K QStringList parts; parts.clear(); parts << call.split('/'); call = parts.at(0)+parts.at(1); } QString prefix = QString(); if (call.count('/') == 1) { // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp QStringList parts; parts.clear(); parts << call.split('/'); //qDebug() << "Utilities::isValidCall: first: " << parts.at(0) ; //qDebug() << "Utilities::isValidCall: second: " << parts.at(1) ; QStringList validSuffixes = {"P", "M", "MM", "QRP", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}; if (validSuffixes.contains (parts.at(1))) { //qDebug() << "Utilities::isValidCall: returning a result just with: " << parts.at(1) ; pair.second = parts.at(1); return pair; } if (parts.at(0).length ()<=parts.at(1).length ()) { if (isAPrefix (parts.at(0))>0) //if (isAPrefix (parts.at(0))) { //qDebug() << "Utilities::isValidCall: first is shorter " ; pair.first = parts.at(0); pair.second = parts.at(1); } else { //qDebug() << "Utilities::isValidCall: first is shorter but not a prefix" ; return pair; } } else { //qDebug() << "Utilities::isValidCall: second is shorter " ; if (isAPrefix (parts.at(1))>0) { pair.first = parts.at(1); pair.second = parts.at(0); } else { //qDebug() << "Utilities::isValidCall: second is shorter but not a prefix" ; return pair; } } } return pair; } */ bool Utilities::isSameFreq(const double fr1, const double fr2) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(fr1) << "/" << QString::number(fr2) << " = " << QString::number(fabs(fr1 - fr2)) ; if (fabs(fr1 - fr2) < 0.001) { //qDebug() << Q_FUNC_INFO << " - true" ; return true; } else { //qDebug() << Q_FUNC_INFO << " - false" ; return false; } //return fabs(fr1 - fr2) < 0.001; } bool Utilities::isValidBandId(const int _b) { if (_b>0) { return true; } else { return false; } //return false; } bool Utilities::isValidModeId(const int _m) { if (_m>0) { return true; } else { return false; } //return false; } bool Utilities::isValidFreq(const QString &_b) { if (_b.toDouble()>0) { return true; } else { return false; } //return false; } bool Utilities::isValidGrid(const QString &_b) { Locator locator; return locator.isValidLocator(_b); } bool Utilities::isValidVUCCGrids(const QString &_b) { //qDebug() << Q_FUNC_INFO << ": " << _b; QStringList tmp; //QString a = _b; tmp.clear (); tmp << _b.split (',', QT_SKIP); if ((tmp.length ()!=2) && (tmp.length ()!=4)) { //qDebug() << Q_FUNC_INFO << ": NON VALID LENGTH"; return false; } //qDebug() << Q_FUNC_INFO << ": tmp: " << tmp; QString aux; foreach (aux, tmp) { aux = aux.trimmed (); if ((!isValidGrid (aux)) || (aux.length ()!=4)) { //qDebug() << Q_FUNC_INFO << ": NON VALID"; return false; } else { //qDebug() << Q_FUNC_INFO << ": VALID: " << aux; } } //qDebug() << Q_FUNC_INFO << ": VALID-END"; return true; } bool Utilities::isValidRST(const QString &_b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isValidPower(const QString &_b) { if (_b.toDouble()>0) { return true; } return false; } bool Utilities::isValidComment(const QString &_b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isValidName(const QString &_b) { if (_b.length()>0) { return true; } return false; } bool Utilities::isDBFileExisting() { //qDebug() << "Utilities::isDBFileExisting: " << getKLogDBFile() ; if (QFile::exists(getKLogDBFile())) { //qDebug() << "Utilities::isDBFileExisting - true" ; return true; } else { //qDebug() << "Utilities::isDBFileExisting - false" ; return false; } //return false; } bool Utilities::isDBFileExisting(const QString &_file) { //qDebug() << "Utilities::isDBFileExisting2: " << _file ; if (QFile::exists(_file)) { //qDebug() << "Utilities::isDBFileExisting2 - true" ; return true; } else { //qDebug() << "Utilities::isDBFileExisting2 - false" ; return false; } //return false; } bool Utilities::isValidADIFField(const QString &_b) { //qDebug() << "Utilities::isValidADIFField: " << _b ; /* This functions checks if the ADIF field has the proper format. Data */ if (!((_b.startsWith('<')) && (_b.count('>')) == 1 )) { //qDebug() << "Utilities::isValidADIFField: BAD FORMAT: No < or > delimiters: " << _b ; return false; } if (_b.simplified() == "") { return true; } QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; QStringList qs; qs.clear(); qs.append(_b.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::isValidADIFField-0 (not two): " << QString::number(qs.size()) ; return false; } QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::isValidADIFField-Field: " << field ; //qDebug() << "Utilities::isValidADIFField_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR: Wrong data type: " << dataType ; return false; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR, more than 2 \":\" - " << field ; return false; } if ( length != separatorPosition) { //qDebug() << "Utilities::isValidADIFField: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return false; } if (separatorPosition <= 0) { //qDebug() << "Utilities::isValidADIFField: Length problem <= 0" ; return false; } //qDebug() << "FileManager::checkADIFValidFormat: Return true" ; return true; } bool Utilities::isValidQSL_Rcvd(const QString &c) { if ((c == "Y") || (c == "N") || (c == "R") || (c == "I") || (c == "V")) { return true; } else { return false; } } bool Utilities::isValidQSL_Sent(const QString &c) { if ((c == "Y") || (c == "N") || (c == "R") || (c == "Q") || (c == "I")) { return true; } else { return false; } } bool Utilities::isValidUpload_Status(const QString &c) { if ((c == "Y") || (c == "N") || (c == "M")) { return true; } else { return false; } } QStringList Utilities::getValidADIFFieldAndData(const QString &_b) { //qDebug() << "Utilities::getValidADIFFieldAndData: " << _b ; /* This functions checks if the ADIF field has the proper format. Data */ QStringList result; result.clear(); if (!(_b.startsWith('<'))) { //qDebug() << "Utilities::getValidADIFFieldAndData: BAD FORMAT: No < or > delimiters: " << _b ; return QStringList(); } if (_b.simplified() == "") { //qDebug() << "Utilities::getValidADIFFieldAndData: EOR" ; result << "EOR" << "EOR"; return result; } QString aux = _b; QStringList qs; qs.clear(); if ((aux.contains("APP_LOTW_")) && aux.contains("//")) { // Trying to fix a LoTW ADIF bug qs.append(aux.split("//")); aux = qs.at(0); } //qDebug() << "Utilities::getValidADIFFieldAndData: -20" ; QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; qs.clear(); qs.append(aux.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::getValidADIFFieldAndData-0 (not two): " << QString::number(qs.size()) ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -30" ; //QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::getValidADIFFieldAndData-Field: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); //qDebug() << "Utilities::getValidADIFFieldAndData - DataType: -" << dataType << "-" ; if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR: Wrong data type: " << dataType ; return result; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR, more than 2 \":\" - " << field ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -60" ; if ( length != separatorPosition) { //qDebug() << "Utilities::getValidADIFFieldAndData: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return result; } if (separatorPosition <= 0) { //qDebug() << "Utilities::getValidADIFFieldAndData: Length problem <= 0" ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -90: f: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData: -90: d: " << data<< endl; //field = field.section(':', 0, 0); result.clear(); result << field.section(':', 0, 0) << data; //qDebug() << "Utilities::checkADIFValidFormat: Return true: " << result.at(0) << "/" << result.at(1) ; return result; } QString Utilities::getAValidCall (const QString &_wrongCall) { //qDebug() << "Utilities::getAValidCall: " << _wrongCall ; QString _confirmedCall; _confirmedCall.clear(); bool ok; if (_wrongCall.length() > 0) { //qDebug() << "Utilities::getAValidCall (Don't have VALID CALL): " << _wrongCall ; _confirmedCall = QString(QObject::tr("A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign.")).arg(_wrongCall); } else { //qDebug() << "Utilities::getAValidCall (Don't have ANY CALL): " << _wrongCall ; _confirmedCall = QString(QObject::tr("An empty callsign has been detected. If it is possible, please enter the right call.")); } QString text = QInputDialog::getText(nullptr, QObject::tr("KLog - Not valid callsign found"), _confirmedCall, QLineEdit::Normal, _wrongCall, &ok); if (!(ok && isValidCall(text))) { _confirmedCall = text; } else { _confirmedCall = QString(); } //qDebug() << "Utilities::getAValidCall: " << _confirmedCall ; return _confirmedCall; } QString Utilities::getDateTimeSQLiteStringFromDateTime(const QDateTime &_d) { return QString(_d.toString("yyyy-MM-dd hh:mm:ss")); } QString Utilities::getDateSQLiteStringFromDate(const QDate &_d) { return QString(_d.toString("yyyy-MM-dd")); } bool Utilities::isValidDateFromString(const QString &_s) { return getDateFromSQliteString(_s).isValid(); } bool Utilities::isValidTimeFromString(const QString &_s) { return getDateTimeFromSQLiteString(_s).time().isValid(); } bool Utilities::isValidDateTimeFromString(const QString &_s) { return getDateTimeFromSQLiteString(_s).isValid(); } bool Utilities::isValidDXCC(const int _d) {//TODO: Look for a better way to check, taking into account how KLog is identifiying the DXCC if (((_d > 0) && (_d < 523)) || (_d == 1206) || (_d == 1279) || (_d == 1248) || (_d == 2248) || (_d == 1259) || (_d == 1390)) { return true; } else { return false; } } QDateTime Utilities::getDateTimeFromSQLiteString(const QString &_s) { return QDateTime::fromString(_s, "yyyy-MM-dd hh:mm:ss"); } QTime Utilities::getTimeFromSQLiteString(const QString &_s) { if (_s.length()==5) { return QTime::fromString(_s, "hh:mm"); } else { return QTime::fromString(_s, "hh:mm:ss"); } } QDate Utilities::getDateFromSQliteString(const QString &_s) { //It may receive "just" a date or a "date time". if (getDateTimeFromSQLiteString(_s).isValid()) // if we have received a full date time { return (getDateTimeFromSQLiteString(_s)).date(); } else // If we have received "just a date" or an error { return QDate::fromString(_s, "yyyy-MM-dd"); } } QDate Utilities::getDateFromADIFDateString(const QString &_s) {// Expects an ADIF DATE format string: "YYYYMMDD" //qDebug() << "Utilities::getDateFromADIFDateString: " << _s ; return QDate::fromString(_s, "yyyyMMdd"); } QTime Utilities::getTimeFromADIFTimeString(const QString &_s) {// Expects and ADIF TIME format String "HHMMSS" or "HHMM" //qDebug() << "Utilities::getTimeFromADIFTimeString: " << _s ; if (_s.length()==4) { return QTime::fromString(_s, "hhmm"); } else { return QTime::fromString(_s, "hhmmss"); } } QDate Utilities::getDateFromLoTWQSLDateString(const QString &_s) { //qDebug() << "Utilities::getDateFromLoTWQSLDateString: " << _s ; QStringList datet; datet.clear(); if (_s.endsWith ('Z')) { datet << _s.split("T"); } else { datet << _s.split(" "); } //qDebug() << "Utilities::getDateFromLoTWQSLDateString: " << datet.at(0) ; return QDate::fromString(datet.at(0), "yyyy-MM-dd"); } QString Utilities::getADIFDateFromQDateTime(const QDateTime &_d) { if (!_d.isValid()) { return QString(); } else { return _d.date().toString("yyyyMMdd"); } } QString Utilities::getADIFDateFromQDate(const QDate &_d) { if (!_d.isValid()) { return QString(); } else { return _d.toString("yyyyMMdd"); } } QString Utilities::getADIFTimeFromQDateTime(const QDateTime &_d) { if (!_d.isValid()) { return QString(); } else { return _d.time().toString("hhmmss"); } } QString Utilities::getCabrilloDateFromQDate(const QDate &_d) {// Will produce the Cabrillo DATE format: "YYYY-MM-DD" if (!_d.isValid()) { return QString("0000-00-00"); } else { return _d.toString("yyyy-MM-dd"); } } QString Utilities::getCabrilloTimeFromQDateTime(const QDateTime &_d) {// Will produce the Cabrillo TIME format: "HHMM" if (!_d.isValid()) { return QString("0000"); } else { return _d.time().toString("hhmm"); } } QString Utilities::getOnlineServiceName(OnLineProvider _service) {//enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ}; //, HamQTH, HRDLog switch (_service) { case LoTW: { return "LoTW"; } case ClubLog: { return "ClubLog"; } case QRZ: { return "QRZ.com"; } case eQSL: { return "eQSL.cc"; } } return QString(); } QString Utilities::getClearSQLi(QString _s) { return _s.remove ('\''); } /* QPalette Utilities::getPalete(bool _ok) { //qDebug() << "Utilities::getPalete" ; if (_ok) { //qDebug() << "Utilities::getPalete - true" ; return palRed; //return QPalette::setColor(QPalette::Text, Qt::red); } else { //qDebug() << "Utilities::getPalete - false" ; return palBlack; } } */ void Utilities::setDarkMode(const QString &_dm) { darkMode = trueOrFalse(_dm); } bool Utilities::isDarkMode() { if (darkMode) { return true; } else { return false; } } QString Utilities::getLogColumnName(const QString &_column) { //qDebug() << Q_FUNC_INFO << ": " << _column; if (_column == "qso_date") return QObject::tr("Date"); else if (_column == "call") return QObject::tr("Call"); else if (_column == "rst_sent") return QObject::tr("RSTtx"); else if (_column == "rst_rcvd") return QObject::tr("RSTrx"); else if (_column == "bandid") return QObject::tr("Band"); else if (_column == "comment") return QObject::tr("Comment"); else if (_column == "modeid") return QObject::tr("Mode"); else if (_column == "cqz") return QObject::tr("CQz"); else if (_column == "ituz") return QObject::tr("ITUz"); else if (_column == "dxcc") return QObject::tr("DXCC"); else if (_column == "address") return QObject::tr("Address"); else if (_column == "age") return QObject::tr("Age"); else if (_column == "cnty") return QObject::tr("County"); else if (_column == "a_index") return QObject::tr("A_Index"); else if (_column == "ant_az") return QObject::tr("Ant_Az"); else if (_column == "ant_el") return QObject::tr("Ant_El"); else if (_column == "ant_path") return QObject::tr("Ant_Path"); else if (_column == "arrl_sect") return QObject::tr("ARRL_SECT"); else if (_column == "award_submitted") return QObject::tr("Award_Submitted"); else if (_column == "award_granted") return QObject::tr("Award_granted"); else if (_column == "band_rx") return QObject::tr("Band_RX"); else if (_column == "checkcontest") return QObject::tr("CheckContest"); else if (_column == "class") return QObject::tr("Class"); else if (_column == "clublog_qso_upload_date") return QObject::tr("ClubLog SDate"); else if (_column == "clublog_qso_upload_staus") return QObject::tr("ClubLog status"); else if (_column == "cont") return QObject::tr("Continent"); else if (_column == "contacted_op") return QObject::tr("Contacted Op"); else if (_column == "contest_id") return QObject::tr("Contest Id"); else if (_column == "country") return QObject::tr("Country"); else if (_column == "credit_submitted") return QObject::tr("Credit Submitted"); else if (_column == "credit_granted") return QObject::tr("Credit granted"); else if (_column == "dark_dok") return QObject::tr("Dark Dok", "Do not translate if unsure, common hamradio term."); else if (_column == "distance") return QObject::tr("Distance"); else if (_column == "email") return QObject::tr("Email"); else if (_column == "eq_call") return QObject::tr("EQ_Call"); else if (_column == "eqsl_qslrdate") return QObject::tr("eQSL RDate"); else if (_column == "eqsl_qslsdate") return QObject::tr("eQSL SDate"); else if (_column == "eqsl_qsl_rcvd") return QObject::tr("eQSL Rcvd"); else if (_column == "eqsl_qsl_sent") return QObject::tr("eQSL Sent"); else if (_column == "fists") return QObject::tr("Fists", "Do not translate if unsure, common hamradio term."); else if (_column == "fists_cc") return QObject::tr("Fists CC", "Do not translate if unsure, common hamradio term."); else if (_column == "force_init") return QObject::tr("Force Init"); else if (_column == "freq") return QObject::tr("Freq"); else if (_column == "freq_rx") return QObject::tr("Freq RX"); else if (_column == "gridsquare") return QObject::tr("Gridsquare"); else if (_column == "guest_op") return QObject::tr("Guest OP"); else if (_column == "hrdlog_qso_upload_date") return QObject::tr("HRDLog SDate"); else if (_column == "hrdlog_qso_upload_status") return QObject::tr("HRDLog status"); else if (_column == "iota") return QObject::tr("IOTA"); else if (_column == "iota_island_id") return QObject::tr("IOTA Island id"); else if (_column == "k_index") return QObject::tr("K Index"); else if (_column == "lat") return QObject::tr("Lat"); else if (_column == "lon") return QObject::tr("Lon"); else if (_column == "lotw_qslrdate") return QObject::tr("LoTW RDate"); else if (_column == "lotw_qslsdate") return QObject::tr("LoTW SDate"); else if (_column == "lotw_qsl_rcvd") return QObject::tr("LoTW Rcvd"); else if (_column == "lotw_qsl_sent") return QObject::tr("LoTW Sent"); else if (_column == "max_bursts") return QObject::tr("Max Bursts"); else if (_column == "multiplier") return QObject::tr("Multiplier"); else if (_column == "ms_shower") return QObject::tr("MS Shower"); else if (_column == "my_antenna") return QObject::tr("My Antenna"); else if (_column == "my_city") return QObject::tr("My City"); else if (_column == "my_cnty") return QObject::tr("My Cnty"); else if (_column == "my_country") return QObject::tr("My Country"); else if (_column == "my_cq_zone") return QObject::tr("My CQz"); else if (_column == "my_dxcc") return QObject::tr("My DXCC"); else if (_column == "my_fists") return QObject::tr("My Fists", "Do not translate if unsure, common hamradio term."); else if (_column == "my_gridsquare") return QObject::tr("My Gridsquare"); else if (_column == "my_iota") return QObject::tr("My IOTA"); else if (_column == "my_iota_island_id") return QObject::tr("My IOTA island id"); else if (_column == "my_itu_zone") return QObject::tr("My ITUz"); else if (_column == "my_lat") return QObject::tr("My Lat"); else if (_column == "my_lon") return QObject::tr("My Lon"); else if (_column == "my_name") return QObject::tr("My Name"); else if (_column == "my_postal_code") return QObject::tr("My Postal code"); else if (_column == "my_rig") return QObject::tr("My Rig"); else if (_column == "my_sig") return QObject::tr("My Sig"); else if (_column == "my_sig_info") return QObject::tr("My Sig Info"); else if (_column == "my_sota_ref") return QObject::tr("My SOTA ref"); else if (_column == "my_state") return QObject::tr("My State"); else if (_column == "my_street") return QObject::tr("My Street"); else if (_column == "my_usaca_counties") return QObject::tr("My USACA counties"); else if (_column == "my_vucc_grids") return QObject::tr("My VUCC grids"); else if (_column == "name") return QObject::tr("Name"); else if (_column == "notes") return QObject::tr("Notes"); else if (_column == "nr_bursts") return QObject::tr("Nr bursts", "Do not translate if unsure, common hamradio term."); else if (_column == "nr_pings") return QObject::tr("Nr pings", "Do not translate if unsure, common hamradio term."); else if (_column == "operator") return QObject::tr("Operator"); else if (_column == "owner_callsign") return QObject::tr("Owner Callsign"); else if (_column == "pfx") return QObject::tr("Pfx"); else if (_column == "points") return QObject::tr("Points"); else if (_column == "precedence") return QObject::tr("Precedence"); else if (_column == "prop_mode") return QObject::tr("Prop Mode"); else if (_column == "public_key") return QObject::tr("Public Key"); else if (_column == "qrzcom_qso_upload_date") return QObject::tr("QRZcom SDate"); else if (_column == "qrzcom_qso_upload_status") return QObject::tr("QRZcom status"); else if (_column == "qslmsg") return QObject::tr("QSL msg"); else if (_column == "qslrdate") return QObject::tr("QSL RDate"); else if (_column == "qslsdate") return QObject::tr("QSL SDate"); else if (_column == "qsl_rcvd") return QObject::tr("QSL Rcvd"); else if (_column == "qsl_sent") return QObject::tr("QSL Sent"); else if (_column == "qsl_rcvd_via") return QObject::tr("QSL rcvd via"); else if (_column == "qsl_sent_via") return QObject::tr("QSL sent via"); else if (_column == "qsl_via") return QObject::tr("QSL via"); else if (_column == "qso_complete") return QObject::tr("QSO complete"); else if (_column == "qso_random") return QObject::tr("QSO random"); else if (_column == "qth") return QObject::tr("QTH"); else if (_column == "region") return QObject::tr("Region"); else if (_column == "rig") return QObject::tr("Rig"); else if (_column == "rx_pwr") return QObject::tr("RX Pwr"); else if (_column == "sat_mode") return QObject::tr("Sat mode"); else if (_column == "sat_name") return QObject::tr("Sat name"); else if (_column == "sfi") return QObject::tr("SFI"); else if (_column == "sig") return QObject::tr("Sig"); else if (_column == "sig_info") return QObject::tr("Sig Info"); else if (_column == "silent_key") return QObject::tr("Silent key", "Do not translate if unsure, common hamradio term."); else if (_column == "skcc") return QObject::tr("SKCC"); else if (_column == "sota_ref") return QObject::tr("SOTA Ref"); else if (_column == "srx_string") return QObject::tr("SRX String"); else if (_column == "srx") return QObject::tr("SRX"); else if (_column == "stx_string") return QObject::tr("STX String"); else if (_column == "state") return QObject::tr("State"); else if (_column == "station_callsign") return QObject::tr("Station Callsign"); else if (_column == "submode") return QObject::tr("Submode"); else if (_column == "swl") return QObject::tr("SWL", "Do not translate if unsure, common hamradio term."); else if (_column == "uksmg") return QObject::tr("UKSMG"); else if (_column == "usaca_counties") return QObject::tr("USACA counties"); else if (_column == "ve_prov") return QObject::tr("VE prov"); else if (_column == "vucc_grids") return QObject::tr("VUCC grids"); else if (_column == "ten_ten") return QObject::tr("Ten-Ten", "Do not translate, it is a hamradio group name."); else if (_column == "tx_pwr") return QObject::tr("TX Pwr"); else if (_column == "web") return QObject::tr("Web"); else if (_column == "qso_date_off") return QObject::tr("QSO Date off"); else if (_column == "transmiterid") return QObject::tr("Transmitter id"); else if (_column == "lognumber") return QObject::tr("Log number"); else { return _column; } } klog-1.8.6/README0000644000175000017500000000177314166020407012332 0ustar develdevelKLog is an updated version of KLog The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. Check https://www.klog.xyz for news & updates. Check https://jaime.robles.es for the author homepage. Please join the mailing list at: - https://groups.io/g/klog You can also join the Telegram chat group: - https://t.me/klogchat The Telegram chat group in Spanish: - https://t.me/KLogES If you are a native in a language different than English or Spanish, please consider helping us translating KLog into your native language. Please contact me at jaimeNOMORESPAMrobles.es (change "NOMORESPAM" by @). Read the INSTALL.txt for installation purposes. Read the changelog (windows users, rename to changelog.txt) to see the changes from one version to another. Read README-DEVEL.txt if you want to help with KLog development. Please send all your suggestions & bug reports. I hope you enjoy KLog! 73 de Jaime, EA4K klog-1.8.6/aboutdialog.cpp0000644000175000017500000002704314166020407014446 0ustar develdevel /*************************************************************************** aboutdialog.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "aboutdialog.h" #include #include #include #include #include #include AboutDialog::AboutDialog(const QString &tversion, QWidget *parent) : QDialog(parent) { //qDebug() << "AboutDialog::AboutDialog" << QT_ENDL; QPixmap pixmap(":/img/klog_256x256.png"); setWindowTitle(tr("About KLog")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); QGridLayout *layout = new QGridLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); const QString br = QLatin1String("
"); const QString description = "

KLog " + tversion + "

" +tr("By") + " EA4K - 2002-2021


" + tr("KLog is a free logbook for hamradio operators.") +"

" + tr("Please be aware that this is a development release and it may contain many bugs.
Backup your data before using this software!") + "


" + tr("Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality.") + "

" + tr("Please provide your review in KLog's eHam review page:") + "
" + "https://www.eham.net/reviews/detail/3118

" + tr("Find more information and the latest release at") + "
https://www.klog.xyz

" + tr("Author") + ": Jaime Robles, EA4K
jaime@robles.es"; QLabel *copyRightLabel = new QLabel(description); copyRightLabel->setWordWrap(true); copyRightLabel->setOpenExternalLinks(true); copyRightLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); QLabel *logoLabel = new QLabel; logoLabel->setPixmap(pixmap); QLabel *logoLabel2 = new QLabel; logoLabel2->setPixmap(pixmap); QLabel *logoLabel3 = new QLabel; logoLabel3->setPixmap(pixmap); QLabel *logoLabel4 = new QLabel; logoLabel4->setPixmap(pixmap); QString author1 = QString("Jaime Robles") + QString("EA4K") + "(2002-" + tr("today") +") " +tr("Main developer") + ""; QString author2 = QString("Juan Carlos Reig") + QString("EA5WA") + "(2021-" + tr("today") + ")"; QString author3 = QString("Ladislav Foldyna") + QString("OK1MLG") + "(2021-" + tr("today") + ")"; QString author4 = QString("Akihiro Koda") + QString("JL3OXR") + "(2016-2017)"; QString author5 = QString("Andrew Goldie") + QString("ZL2ACG") + "(2009-2010)"; QString authorText = tr("KLog is developed by a very small team and you are invited to join!") + "

" + tr("If you want to provide support you are welcome to join the KLog mailing list!") + "

" + tr("You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog."); QString authors = "

" + tr("Authors") + "


" + authorText + "
" + author1 + author2 + author3 + author4 + author5 + "
"; QString translator1 = QString("Catalan") + QString("Josep Ma. Ferrer") + QString("KDE Catalan translation team"); QString translator2 = QString("Croatian") + QString("Kristijan Conkas") + QString("M0NKC"); QString translator3 = QString("Czech") + QString("Ladislav Foldyna") + QString("OK1MLG"); QString translator4 = QString("Finnish") + QString("Kristjan Lorents") + QString("Finnish Debian translation team"); QString translator5 = QString("French") + QString("Christophe Lefebvre") + QString("F4HWL"); QString translator6 = QString("Danish") + QString("Joe Hansen") + QString("Danish Debian translation team"); QString translator7 = QString("German") + QString("Burhard Lück") + QString("KDE German translation team"); QString translator8 = QString("Italian") + QString("Simona Pisano") + QString("IU5HIU"); QString translator9 = QString("Japanese") + QString("Akihiro Koda") + QString("JL3OXR"); QString translator10 = QString("Polish") + QString("Piotr Ludwig") + QString("LA7RRA"); QString translator11 = QString("Spanish") + QString("Jaime Robles") + QString("EA4K"); QString translatorsText = tr("Translators bring KLog into your language. They are really an important part of the KLog development team.") + "

" + tr("If KLog is still not in your language and you want to help us, you are welcome to contact us through the KLog mailing list!"); QString translators = "

" + tr("Translators") + "


" + translatorsText + "
" + translator1 + translator2 + translator3 + translator4 + translator5 + translator6 + translator7 + translator8 + translator9 + translator10 + translator11 + "
"; QLabel *authorsLabel = new QLabel(authors); authorsLabel->setWordWrap(true); authorsLabel->setOpenExternalLinks(true); authorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QLabel *translatorsLabel = new QLabel(translators); translatorsLabel->setWordWrap(true); translatorsLabel->setOpenExternalLinks(true); translatorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QString privacy = "

" + tr("Privacy advisory") + "


" + tr("KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs.") + "

" + tr("At present, the data that is provided is the following:") + "
  • " + tr("Callsign") + "
  • " + tr("KLog version") + "
  • " + tr("Operating system") + "


" + tr("Be aware that you can enable/disable this feature from the Misc tab in the Setup page.") + ""; QLabel *privacyLabel = new QLabel(privacy); privacyLabel->setAlignment(Qt::AlignJustify); privacyLabel->setWordWrap(true); privacyLabel->setOpenExternalLinks(true); privacyLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); tab1 = new QWidget; tab2 = new QWidget; tab3 = new QWidget; tab4 = new QWidget; QGridLayout *layout1 = new QGridLayout; layout1->addWidget(logoLabel , 0, 0, 1, 1); layout1->addWidget(copyRightLabel, 0, 1, 4, 4); tab1->setLayout(layout1); QGridLayout *layout2 = new QGridLayout; layout2->addWidget(logoLabel2 , 0, 0, 1, 1); layout2->addWidget(authorsLabel, 0, 1, 4, 4); tab2->setLayout(layout2); QGridLayout *layout3 = new QGridLayout; layout3->addWidget(logoLabel3 , 0, 0, 1, 1); layout3->addWidget(translatorsLabel, 0, 1, 4, 4); tab3->setLayout(layout3); QGridLayout *layout4 = new QGridLayout; layout4->addWidget(logoLabel4 , 0, 0, 1, 1); layout4->addWidget(privacyLabel, 0, 1, 4, 4); tab4->setLayout(layout4); tabw = new QTabWidget; tabw->addTab(tab1, tr("KLog")); tabw->addTab(tab2, tr("Authors")); tabw->addTab(tab3, tr("Translators")); tabw->addTab(tab4, tr("Privacy")); layout->addWidget(tabw); layout->addWidget(buttonBox, 1, 0, Qt::AlignRight); setLayout(layout); //qDebug() << "AboutDialog::AboutDialog - END" << QT_ENDL; } AboutDialog::~AboutDialog() { } bool AboutDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; } } return QDialog::event(event); } klog-1.8.6/database.h0000644000175000017500000002354114166020421013360 0ustar develdevel#ifndef DATABASE_H #define DATABASE_H /*************************************************************************** database.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include //#include #include #include #include #include #include #include #include #include #include "utilities.h" class QSqlRelationalTableModel; const float DBVersionf = 0.023f; // This is the latest version of the DB. struct AwarddxccEntry { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; QString qsoID; }; struct AwarddxccEntryCheck { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; }; class DataBase //: public QObject { // Q_OBJECT public: DataBase(const QString &_parentClass, const QString &_DBName); //DataBase(const QString &_softVersion, bool inmemoryonly = false); DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName); //virtual ~DataBase(); ~DataBase(); QString getSoftVersion(); QString getDBVersion(); QString getDBName(); bool createConnection(const QString &function, bool newDB=false); // If true that means that we are creating the DB, // not just connecting to an existing one. // That will be done in the default path bool reConnect(const QString &_DBName); //bool setDir(const QString &_dir); QStringList getColumnNamesFromTable(const QString &_tableName); bool isValidBand (const QString &b); bool isValidMode (const QString &b, const bool _tmp=false); bool isValidBandNumber (const int b); bool isValidModeNumber (const int b); QString getBandNameFromNumber(const int _n); QString getModeNameFromNumber(const int _n, bool _tmp=false); QString getSubModeNameFromNumber(const int _n, bool _tmp=false); int getBandIdFromName(const QString &b); int getModeIdFromName(const QString &b); int getModeIdFromSubMode(const QString &b); bool createBandModeMaps(); int getBandIDFromName2(const QString &b); int getModeIDFromName2(const QString &b); int getSubModeIDFromName2(const QString &b); QString getBandNameFromID2(const int _i); QString getModeNameFromID2(const int _i); QString getSubModeNameFromID2(const int _i); int getBandIdFromFreq(const QString &fr); //Freq should be in MHz bool isThisFreqInBand(const QString &b, const QString &fr); //Freq should be in MHz QString getFreqFromBandId(const int _i); //int getLogTypeNumber(const QString &_logType); //QString getLogTypeName(const int _logType); bool unMarkAllQSO(); bool updateIfNeeded(); void backupB4Update(); void logBackup(); void compress(); QMultiMap fillCountryCodes(); bool updateTheEntityTableISONames(); bool updateTableLogs(); bool updateAwardDXCCTable(); bool updateAwardWAZTable(); int getNumberOfQsos(const int _logNumber); //private slots: // void slotPrintErrors(QString _func, QString _msg, int _level); private: //bool beginTransaction(); //bool commitTransaction(); bool execQuery(const QString &function, const QString &stringQuery); bool updateEntity (const QString &_codeString, const int _code); bool createDataBase(); bool isTheDBCreated(); bool isTheTableExisting(const QString &_tableName); bool hasTheTableData(const QString &_tableName); bool requiresManualUpgrade(); bool updateToLatest(); bool updateTo003(); // Updates the DB to 0.0.3 bool updateTo004(); bool updateTo005(); bool updateTo006(); bool updateTo007(); bool updateTo008(); bool updateTo009(); // Updates DB and add the Satellite tables bool updateTo010(); // Updates DB and recreates the supportedcontest table bool updateTo011(); // Updates DB and recreates Satellite data bool updateTo012(); // Updates the flags and so on. bool updateTo013(); // Update the qsl_via_enumeration bug caused for calling the table just qsl_via bool updateTo014(); // Update the Satellite DB bool updateTo015(); // Adds the FT4 mode bool updateTo016(); // Recreates the satellite table to add the QO-100 bool updateTo017(); // Merges the qso_date & time_on fields bool updateTo018(); // Creates Subdivision bool updateTo019(); // Adds FTS4 and FST4W modes and RS-44 satellite //bool updateTo020(); // Adds Q65 mode bool updateTo021(); // Adds 5M & 8M bands bool updateTo022(); // Recovers the 020 that was not executed and adds the Q65 mode bool updateTo023(); // Fixes the cabrillo fields in the table band bool updateTableLog(const int _v); bool updateDBVersion(QString _softV, QString _dbV); bool createTheBandQuickReference(); bool createTheModeQuickReference(); //bool updateLog(); // Updates the log table bool recreateTableLog(); bool createTableLog(bool temp = false); // false creates the production DB. True a temporal one. bool createTableLogs(const bool real=true); // real = true creates the production DB. False a temporal one. bool createTableEntity(const bool NoTmp); bool updateTableEntity(); bool createTableClubLogStatus(); bool populateTableClubLogStatus(); bool createTableMode(const bool NoTmp); bool populateTableMode(const bool NoTmp); bool updateTheModeTableAndSyncLog(); bool createTableBand(const bool NoTmp); bool populateTableBand(const bool NoTmp); bool recreateTableBand(); bool syncLogQSOsOnBandTableChange(); bool recreateTableDXCC(); bool createTableAwardDXCC(); bool recreateTableWAZ(); bool createTableAwardWAZ(); bool createTableSubdivision(const bool NoTmp); bool recreateSatelliteData(); bool createTableSatellites(const bool NoTmp); bool populateTableSatellites(const bool NoTmp); bool recreatePropModes(); bool createTablePropModes(); bool populatePropagationModes(); bool recreateContestData(); bool recreateSupportedContest(); bool createTableContest(); bool createTableSupportedContest(); bool populateContestData(); bool populateTableSupportedContest(); bool createTableQSL_Via_enumeration(); bool populateTableQSL_Via_enumeration(); bool howManyQSOsInLog(const int i); //void showError(); //bool moveFromModeIdToSubmodeId(); bool updateModeIdFromSubModeId(); bool updateBandIdTableLogToNewOnes(); bool updateBandIdTableAward(const int _db); bool updateModeIdTableAward(const int _db); void queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery); bool created; float dbVersion; // The current version of the DB. May differ from latestReaded if we are updating the DB! QString dbConnectionName; QString softVersion; float latestReaded; // The latest version of DB readed in the DB itself //bool inMemoryOnly; // The DB is to be created in memory, no file support... Faster but less safe! //QDateTime date; QHash bandIDHash; QHash modeIDHash; QHash subModeIDHash; QHash IDBandHash; QHash IDModeHash; QHash IDSubModeHash; QHash freqBandIdHash; QMap bandQMap; QMap modeQMap; Utilities *util; QSqlDatabase db; QString dbDir, dbName; QStringList insertPreparedQueries, insertQueryFields; QSqlQuery preparedQuery; int constrid; // Just an id for the constructor to check who is being executed at one specific time //signals: //void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution //void debugLog(QString functionFailed, QString errorCode, int level); // emitted when a function retuns false due to an error }; #endif // DATABASE_H klog-1.8.6/downloadcty.h0000644000175000017500000000601314166020407014142 0ustar develdevel#ifndef DOWNLOADCTY_H #define DOWNLOADCTY_H /*************************************************************************** downloadcty.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "utilities.h" class QSslError; class DownLoadCTY : public QObject { Q_OBJECT public: explicit DownLoadCTY(const QString &_klogDir, const QString &_klogVersion); ~DownLoadCTY(); int download(); private: Utilities *util; //void setTarget(const QString& t); bool saveToDisk(const QString &filename, QIODevice *data); QString saveFileName(const QUrl &url); QNetworkAccessManager *manager; QNetworkRequest *request; //QString target; int result; // enum QNetworkReply::NetworkError QString klogDir; QString urld; QUrl *url; private slots: void slotDownloadFinished(QNetworkReply* reply); void slotDownloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i); void done(bool _success); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void downloadStopped(); }; #endif // DOWNLOADCTY_H klog-1.8.6/searchwidget.h0000644000175000017500000001475114166020407014274 0ustar develdevel#ifndef SEARCHWIDGET_H #define SEARCHWIDGET_H /*************************************************************************** searchwidget.h - description ------------------- begin : jul 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the search widget // #include #include #include "dataproxy_sqlite.h" #include "awards.h" #include "world.h" #include "utilities.h" #include "filemanager.h" #include "searchwindow.h" class SearchWidget : public QWidget { Q_OBJECT public: explicit SearchWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SearchWidget(); void setCurrentLog(const int _log); //void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setVersion (const QString &_version); // Defines the KLog version to be written in the exported logs void setShowCallInSearch(const bool _sh); void clear(); void showQSO(const int _q); void showQSOs(QList qsoIdList); void setStationCallsign(const QString &_st); void setCallToSearch (const QString &_st); void searchToolNeededQSLToSend(); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); public slots: void slotSearchBoxTextChanged(); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); private slots: //void slotDoubleClickSearch( QTreeWidgetItem* item, int); // Double click on a QSO in the search box void slotSearchExportButtonClicked(); void slotSearchBoxSelectAllButtonClicked(); void slotSearchClearButtonClicked(); void slotSearchBoxSelectionChanged(); void slotSearchBoxReSearchButtonClicked(); //void slotRightButtonSearch(const QPoint& pos); //void showMenuRightButtonSearchCreateActions(); //void rightButtonSearchMenu(const int trow); void slotQsoDeleteFromSearch(const int _qsoId); //void slotQSLSentViaBureauFromSearch(); void slotQSLSentViaDirectFromSearch(); void slotQSLSentViaDirectMarkDXReqFromSearch(); //void slotQSLSentViaBureuMarkDXReqFromSearch(); void slotQSLRecViaDirectFromSearch(); void slotQSLRecViaBureauFromSearch(); //void slotQSLRecViaDirectMarkReqFromSearch(); //void slotQSLRecViaBureauMarkReqFromSearch(); //void slotQSLSentMarkAsRequested(); //void slotQSLRecMarkAsRequested(); void slotQSOToEditFromSearch(const int _qsoId); //void qslRecViaBureauMarkReq(const int _qsoId); // void qslRecViaDirectMarkReq(const int _qsoId); void slotStationCallsignChanged(); void slotQCheckboxToggled(); void slotStartDelayInputTimer(); void slotDelayInputTimedOut(); void slotRequestFocus(); signals: void actionQSODoubleClicked(const int _qsoid); void updateAwards(); void logRefresh(); void toStatusBar(const QString statusm); void requestBeingShown(); void actionQSODelete(const int _qsoid); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: void createUI(); void setNeedingQSL(bool const _q); void selectStationCallSign(); void fillStationCallsignComboBox(); void setModelFilter(); // The following function is adding a line to the search list //void addQSOToSearchList(const QString &_call, const QString &_dateTime, const QString &_band, const QString &_mode, const QString &_qslrx, const QString &_qsltx, const QString &_stationcallsign, const QString &_id, const QColor _color); bool fillTheList(const QString &_query); // void addQSOToTheList(const int _id); QString callFilter, stationCallsignFilter, currentLogFilter; QLineEdit *searchBoxLineEdit; QPushButton *searchBoxClearButton, *searchBoxExportButton, *searchBoxSelectAllButton, *searchBoxReSearchButton; QCheckBox *searchAllQCheckbox; //QTreeWidget *searchResultsTreeWidget; QComboBox *stationCallsignComboBox; SearchWindow *searchWindow; bool qslingNeeded; bool searchSelectAllClicked, stationCallSignShownInSearch; int currentLog; QString mainStationCallsign; QString lastSearch; DataProxy_SQLite *dataProxy; Awards *awards; World *world; Utilities *util; FileManager *filemanager; QAction *delQSOFromSearchAct; QAction *qsoToEditFromSearchAct; QAction *qslSentViaBureauFromSearchAct; QAction *qslSentViaDirectFromSearchAct; QAction *qslSentViaDirectMarkRcvReqFromSearchAct; QAction *qslSentViaBureauMarkRcvReqFromSearchAct; QAction *qslRecViaBureauFromSearchAct; QAction *qslRecViaDirectFromSearchAct; //QAction *qslRecViaBureauMarkReqFromSearchAct; //QAction *qslRecViaDirectMarkReqFromSearchAct; QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; QTimer *delayInputTimer; }; #endif // SEARCHWIDGET_H klog-1.8.6/fileawardmanager.h0000644000175000017500000000444514166020407015113 0ustar develdevel#ifndef FILEAWARDMANAGER_H #define FILEAWARDMANAGER_H /*************************************************************************** fileawardmanager.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "world.h" class FileAwardManager : public QWidget { Q_OBJECT public: explicit FileAwardManager(DataProxy_SQLite *dp, const QString &_parentFunction); bool importNewAwardFile(); signals: public slots: private: void showError(const QString &_header, const QString &_msg, const QString &_detailedMsg); DataProxy_SQLite *dataProxy; Utilities *util; World *world; }; #endif // FILEAWARDMANAGER_H klog-1.8.6/worldmapwidget.cpp0000644000175000017500000002502014166020407015176 0ustar develdevel/*************************************************************************** worldmapwidget.cpp - description ------------------- begin : oct 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "worldmapwidget.h" WorldMapWidget::WorldMapWidget() // : mapLabel (new QLabel), scrollArea (new QScrollArea), scaleFactor(1) { //qDebug() << "WorldMapWidget::WorldMapWidget" << QT_ENDL; scrollArea = new QScrollArea; mapQImage = new QImage; setWindowTitle(tr("World map")); //setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); width = 0; height = 0; createActions(); mapLabel = new QLabel(); mapLabel->setBackgroundRole(QPalette::Base); mapLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); mapLabel->setScaledContents(true); //mapLabel->setPixmap(QPixmap::fromImage(*mapQImage)); mapLabel->setWordWrap(true); scrollArea->setBackgroundRole(QPalette::Dark); scrollArea->setWidget(mapLabel); scrollArea->setVisible(false); setCentralWidget(scrollArea); loadMap(); //drawLocators(); //QVBoxLayout *layout = new QVBoxLayout(this); //layout->setSizeConstraint(QLayout::SetFixedSize); //layout->addWidget(mapLabel); //setLayout(layout); //qDebug() << "WorldMapWidget::WorldMapWidget - END" << QT_ENDL; } WorldMapWidget::~WorldMapWidget() { //qDebug() << "WorldMapWidget::~WorldMapWidget" << QT_ENDL; } void WorldMapWidget::loadMap() { //qDebug() << "WorldMapWidget::loadMap" << QT_ENDL; mapQImage->load(":/img/worldmap.j"); *mapQImage = mapQImage->convertToFormat(QImage::Format_RGB32); //qDebug() << "WorldMapWidget::loadMap-10" << QT_ENDL; //mapLabel->setPixmap(QPixmap::fromImage(*mapQImage)); //mapLabel->setWordWrap(true); //qDebug() << "WorldMapWidget::loadMap-11" << QT_ENDL; scaleFactor = 1.0; //qDebug() << "WorldMapWidget::loadMap-12" << QT_ENDL; fitToWindowAct->setEnabled(true); //qDebug() << "WorldMapWidget::loadMap-13" << QT_ENDL; updateActions(); //qDebug() << "WorldMapWidget::loadMap-14" << QT_ENDL; // mapNormalizeSize(); if (!fitToWindowAct->isChecked()) { mapLabel->adjustSize(); } //qDebug() << "WorldMapWidget::loadMap-15" << QT_ENDL; width = mapQImage->width(); height = mapQImage->height(); setImage(*mapQImage); //qDebug() << "WorldMapWidget::loadMap-Size: " << QString::number(mapQImage->width()) <<"/" << QString::number(mapQImage->height()) << QT_ENDL; //*mapQImage = mapQImage->scaledToWidth(1260); //qDebug() << "WorldMapWidget::loadMap-reSize: " << QString::number(mapQImage->width()) <<"/" << QString::number(mapQImage->height()) << QT_ENDL; } void WorldMapWidget::drawLocator(const int _x, const int _y, const int _width, const int _height, const bool _confirmed) { //qDebug() << "WorldMapWidget::drawLocator: " << QString::number(_x) << QString::number(_y) << QString::number(_width) << QString::number(_height) << QT_ENDL; QPainter qPainter(mapQImage); //qPainter.setBrush(Qt::Dense4Pattern); qPainter.setBrush(Qt::NoBrush); if (_confirmed) { qPainter.setPen(Qt::green); } else { qPainter.setPen(Qt::red); } QPen pen(Qt::green); pen.setWidth(1); qPainter.setPen(pen); qPainter.drawRect(_x,_y,_width,_height); qPainter.end(); setImage(*mapQImage); //qDebug() << "WorldMapWidget::drawLocator-END" << QT_ENDL; } void WorldMapWidget::drawLocatorText (const int _x, const int _y, const QString &loc, const bool _confirmed) { //qDebug() << "WorldMapWidget::Text" << QT_ENDL; QPainter qPainter(mapQImage); qPainter.setFont(QFont("Arial", 12, QFont::Bold)); if (_confirmed) { qPainter.setPen(Qt::green); } else { qPainter.setPen(Qt::red); } qPainter.drawText(_x+2,_y-2, loc); qPainter.end(); setImage(*mapQImage); //qDebug() << "WorldMapWidget::Text-END" << QT_ENDL; } void WorldMapWidget::drawLocators() { //qDebug() << "WorldMapWidget::drawLocators" << QT_ENDL; if (width < 18 || height < 18) { return; } int x1, y1; for (int i = 0; i < 180; i++) { for (int j = 0; j < 180; j++) { x1 = (i * (width / 180)); y1 = height - ((1+j) * (height / 180)); //qDebug() << "WorldMapWidget::drawLocators: " << QString::number(x1) << "/" << QString::number(y1) << "/" <isChecked(); scrollArea->setWidgetResizable(fitToWindow); if(fitToWindow) slotNormalSize(); updateActions(); } void WorldMapWidget::slotNormalSize() { mapLabel->adjustSize(); scaleFactor = 1.0; } void WorldMapWidget::createActions() { QMenu *viewMenu = menuBar()->addMenu(tr("View")); zoomInAct = viewMenu->addAction(tr("Zoom In(25%)"), this, &WorldMapWidget::slotZoomIn); zoomInAct->setShortcut(QKeySequence::ZoomIn); zoomInAct->setEnabled(false); zoomOutAct = viewMenu->addAction(tr("Zoom Out(25%)"), this, &WorldMapWidget::slotZoomOut); zoomOutAct->setShortcut(QKeySequence::ZoomOut); zoomOutAct->setEnabled(false); normalSizeAct = viewMenu->addAction(tr("Normal Size"), this, &WorldMapWidget::slotNormalSize); normalSizeAct->setEnabled(false); fitToWindowAct = viewMenu->addAction(tr("Fit to window"), this, &WorldMapWidget::slotFitToWindow); fitToWindowAct->setEnabled(false); } void WorldMapWidget::setImage (const QImage &newImage) { *mapQImage = newImage; mapLabel->setPixmap(QPixmap::fromImage(*mapQImage)); scaleFactor = 1.0; scrollArea->setVisible(true); fitToWindowAct->setEnabled(true); updateActions(); if (!fitToWindowAct->isChecked()) mapLabel->adjustSize(); } void WorldMapWidget::updateActions() { zoomInAct->setEnabled(!fitToWindowAct->isChecked()); zoomOutAct->setEnabled(!fitToWindowAct->isChecked()); normalSizeAct->setEnabled(!fitToWindowAct->isChecked()); } void WorldMapWidget::scaleImage(double factor) { //Q_ASSERT(mapLabel->pixmap(Qt::ReturnByValue)); scaleFactor *= factor; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 2)) mapLabel->resize(scaleFactor * mapLabel->pixmap(Qt::ReturnByValue).size()); #else mapLabel->resize(scaleFactor * mapLabel->pixmap()->size()); #endif //mapLabel->resize(scaleFactor * mapLabel->pixmap(QT_RETURNBYVALUE)->size()); adjustScrollBar(scrollArea->horizontalScrollBar(), factor); adjustScrollBar(scrollArea->verticalScrollBar(), factor); zoomInAct->setEnabled(scaleFactor < 15.0); zoomOutAct->setEnabled(scaleFactor > 0.333); } void WorldMapWidget::adjustScrollBar(QScrollBar *scrollbar, double factor) { scrollbar->setValue(int(factor * scrollbar->value() + ((factor -1) * scrollbar->pageStep()/2))); } QRect WorldMapWidget::getScreenResolution() { QScreen *screen = QGuiApplication::primaryScreen(); return screen->geometry(); } void WorldMapWidget::mapNormalizeSize() { int _xMax = (getScreenResolution()).height(); int mapWidth; /* if (_xMax < 640) { mapWidth = 360; } else if ((_xMax >= 640) && (_xMax < 1024)) { mapWidth = 450; } else if ((_xMax >= 1024) && (_xMax < 1440)) { mapWidth = 810; } else if ((_xMax >= 1440) && (_xMax < 2048)) { mapWidth = 1080; } else { mapWidth = 1350; } */ if (_xMax < 600) { mapWidth = 360; } else if ((_xMax >= 600) && (_xMax < 960)) { mapWidth = 450; } else if ((_xMax >= 960) && (_xMax < 1080)) { mapWidth = 810; } else if ((_xMax >= 1080) && (_xMax < 1536)) { mapWidth = 1080; } else { mapWidth = 1350; } *mapQImage = mapQImage->scaledToHeight(mapWidth); //qDebug() << "WorldMapWidget::mapNormalizeSize: Screen: " << QString::number(_xMax) << QT_ENDL; //qDebug() << "WorldMapWidget::mapNormalizeSize: Map: " << QString::number(mapWidth) << QT_ENDL; } klog-1.8.6/mainwindow.h0000644000175000017500000006234514166020421013775 0ustar develdevel#ifndef MAINWINDOW_H #define MAINWINDOW_H /*************************************************************************** mainwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include //#include "database.h" #include "setupdialog.h" #include "setuppages/setuppagemisc.h" //#include "helpaboutdialog.h" #include "aboutdialog.h" //#include "dxccsummarydialog.h" #include "tipsdialog.h" #include "world.h" #include "filemanager.h" #include "fileawardmanager.h" //#include "contest.h" //#include "contest_cqwwdxssb.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" #include "locator.h" #include "dxcluster.h" #include "awards.h" #include "inputwidgets/mainwindowsattab.h" #include "inputwidgets/mainwindowmydatatab.h" #include "inputwidgets/mainwindowinputcomment.h" #include "inputwidgets/mainwindowinputothers.h" #include "inputwidgets/mainwindowinputeqsl.h" #include "inputwidgets/mainwindowinputqsl.h" #include "inputwidgets/mainwindowinputqso.h" #include "mainqsoentrywidget.h" #include "elogclublog.h" #include "utilities.h" #include "downloadcty.h" #include "dxccstatuswidget.h" #include "awardswidget.h" #include "softwareupdate.h" #include "logmodel.h" #include "logwindow.h" #include "searchwidget.h" #include "infowidget.h" #include "showerrordialog.h" #include "udpserver.h" #include "statisticswidget.h" #include "updatesatsdata.h" #include "hamlibclass.h" #include "elogqrzlog.h" //#include "pstrotatorsupport.h" #include "lotwutilities.h" #include "eqslutilities.h" #include "widgets/adiflotwexportwidget.h" #include "widgets/showadifimportwidget.h" //#include "widgets/advancedsearch/advancedsearchwidget.h" //#include "worldmapwidget.h" #include "widgets/showkloglogwidget.h" #include "qso.h" #include "klogdefinitions.h" class QTimer; class QDateTime; class QPushButton; class QLineEdit; class QComboBox; class QTimeEdit; class QDateEdit; //class QStatusBar; class QMenuBar; class QMenu; class QMessageBox; class QTextEdit; class QProgressDialog; //class QPoint; class QGroupBox; class QTabWidget; class QFrame; class QTableView; class QLabel; /* enum { Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 }; enum { DX = 0, NoContest = 0, CQ_WW_SSB = 1, CQ_WW_CW = 2, CQ_WPX_SSB = 3, CQ_WPX_CW = 4, CQ_WPX_RTTY = 5 }; */ //enum ExportMode {ModeLotW, ModeADIF}; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(const QString &_klogDir, const QString &tversion); ~MainWindow(); void checkIfNewVersion(); void recommendBackupIfNeeded(); void init(); private slots: //void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); //void slotTest(); // Slot for testing purposes only void slotOpenWiki(); void slotAWAImport(); void slotClearNoMorErrorShown(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed); void slotQRZReturnPressed(); //void slotQRZSpacePressed(); void slotQRZTextChanged(QString _qrz); //void slotSRXTextChanged(); //void slotSTXTextChanged(); void slotUpdateLocator(QString _loc); void slotLocatorTextChanged(const QString &_loc); //void slotMyLocatorTextChanged(); void slotFreqTXChanged(const double _fr); void slotFreqRXChanged(const double _fr); //void slotSplitCLicked(); void slotSearchBoxTextChanged(); //void slotCloseStats(bool _vis); void slotSearchToolNeededQSLToSend(); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); void slotToolLoTWMarkAllQueuedThisLog(); void slotToolLoTWMarkAllQueued(); void slotToolLoTWMarkAllYesThisLog(); void slotToolLoTWMarkAllYes(); void slotLoTWDownloadedFileProcess(const QString &_fn); void slotClubLogLogUpload(); void sloteQSLLogUpload(); void slotElogEQSLModifyCurrentLog(); void slotOKButtonClicked(); void slotClearButtonClicked(); void slotBandChanged (const QString &_b); void slotModeChanged (const QString &_m); void slotValidBandsReceived(const QStringList &_b); void slotRefreshDXCCWidget(); void slotLogWinShow(); void slotLogRefresh(); void slotQSODelete(const int _id); void slotQSOsDelete(QList _id); void slotQSOsExportToADIF(QList _id); void slotQRZcomUpload(QList _id); void slotQRZCOMLogUpload(); void slotElogQRZCOMDisable(const bool _b); void slotShowAwards(); void slotUpdateStatusBar(const QString &statusm); void setMainWindowTitle(); void slotSetup(const int _page=0); void slotADIFExport(); void slotLoTWExport(); void slotLoTWDownload(); void slotLoTWFullDownload(); void slotADIFExportSelection(const QString &_st, const QDate &_startDate, const QDate &_endDate, const ExportMode _eM); void slotADIFExportAll(); void slotADIFImport(); void slotRQSLExport(); void slotReceiveQSOListToShowFromFile(QStringList _qs); void slotTimeOutInfoBars(); // Clears the infoLabels when the timeout emits the signal void slotSetPropModeFromOther(const QString &_p); void slotSetPropModeFromSat(const QString &_p, bool _keep); void slotFillEmptyDXCCInTheLog(); void slotUpdateCTYDAT(); void slotUpdateSATSDAT(); void slotShowStats(); void slotWorldReload(const bool _b); void slotExitFromSlotDialog(const int exitID); void slotSetupDialogFinished (const int _s); void exitQuestion(); void fillQSOData(); bool slotOpenKLogFolder(); void slotFilePrint(); void slotFileClose(); void slotHelpAboutAction(); void slotHelpCheckUpdatesAction(); void slotAboutQt(); void slotTipsAction(); void slotDebugAction(); // MainQSOEntryWidget void slotShowInfoLabel(const QString &_m); void slotAwardsWidgetSetLog(); void slotAwardsWidgetSetYear(); void slotActiveHamlib(bool _enable); // MyDataTab void slotMyLocatorTextChanged(const QString &_loc); // logpanel //void slotRighButtonFromLog( const QPoint& pos); void slotDoubleClickLog( const int _qsoID); //void slotDoubleClickLog( const QModelIndex & index); //SEARCH void slotShowSearchWidget(); // The SearchWidget request being shown //SEARCH // CLUSTER void slotAnalyzeDxClusterSignal(const QStringList _qs); // CLUSTER //CLUBLOG void slotElogClubLogShowMessage(const QString &_s); void slotElogClubLogProcessAnswer(const int _i, const int _qID); void slotElogClubLogDisable(const bool _b); void slotElogClubLogFileUploaded (QNetworkReply::NetworkError _error, QList _qsos); void slotElogClubLogModifyCurrentLog(); //CLUBLOG // EQSL void slotElogEQSLFileUploaded (QNetworkReply::NetworkError _error, QList _qsos); // EQSL void slotShowSoftUpdateResults(const bool _b); // Software Update: Receives the signal to see if it is needed or not to update // EQSL // QRZCOM void slotElogQRZCOMShowMessage(const QString &_s); void slotElogQRZCOMFoundData(const QString &_t, const QString & _d); void slotElogQRZCOMCheckThisCall(); void slotElogQRZCOMAutoCheck(); void slotElogQRZCOMAutoCheckFromSetup(const bool _s); void slotElogQRZCOMModifyCurrentLog(); void slotElogQRZCOMLogUploaded (QNetworkReply::NetworkError _error, QList _qsos); // QRZCOM //SATELLITE //void slotSatBandTXComboBoxChanged(const QString &_q); void slotDefineNewBands (const QStringList _bands); //HAMLIB void slotHamlibTXFreqChanged(const double _f); void slotHamlibModeChanged(const QString &_m); //void slotHamlibModeNotADIF(); // PST Rotator //void slotRotatorShow(); // WORLD MAP //void slotWorldMapShow(); //DXCCWIDGET //void slotShowQSOFromDXCCWidget(const int _q); void slotShowQSOsFromDXCCWidget(QList _qsos); //UDP Server (WXJT-x) void slotWSJXstatusFromUDPServer(const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString &_report, const QString &_de_call, const QString &_de_grid, const QString &_dx_grid, const QString &_sub_mode); void slotWSJTXloggedQSO (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_opCall, const QDateTime &_datetime, const QDateTime &_datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_mypwr); void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level=Info); //void slotTakeOverFocus(int _id); void slotTakeOverFocusToQSOTabWidget(); void slotTakeOverFocusToMainQSOInput(); private: //void setWidgetsOrder(); void startServices(); void backupCurrentQSO(); void restoreCurrentQSO(const bool restoreConfig); void showMessageToEnableTheOnlineService(const OnLineProvider _service); void cleanQRZCOMreceivedDataFromUI(); void saveWindowsSize(); void setWindowSize(const QSize &_size); bool maybeSave(); void setCleaning(const bool _c); bool setHamlib(const bool _b); bool setUDPServer(const bool _b); void logEvent(const QString &_func, const QString &_msg, const DebugLogLevel _level=Info); void setSeverity(const DebugLogLevel _sev); void fileExportLoTW(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportClubLog(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportEQSL(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportADIF(const QString &_st, const QDate &_startDate, const QDate &_endDate); bool callTQSL(const QString &_filename, const QString &_call); void showNumberOfSavedQSO(const QString &_fn, const int _n); //QString getCallToUseForLoTWExportUpload(); UpdateSatsData *updateSatsData; //UPDATE CTY.DAT DownLoadCTY *downloadcty; HamLibClass *hamlib; QSO *qso; bool hamlibActive; bool hamlibChangingMode; bool hamlibModeNotADIFSupported; bool sendQSLByDefault; bool deleteAlwaysAdiFile; // PST Rotator //PSTRotatorSupport *pstRotator; //bool usePSTRotator; //RotatorWidget *rotatorWidget; // //WorldMapWidget *worldMapWidget; void createStatusBar(); void createUI(); void createUIDX(); void reconfigureDXMarathonUI(const bool _dxM); //void createDXClusterUI(); void clearBandLabels(); void createMenusCommon(); void createActionsCommon(); bool readCtyFile(); //bool isQSLReceived(const int _qsoId); //bool isQSLSent(const int _qsoId); //bool validCharactersInCall(const QString &_qrz); // Looks for SQLi and no valid chars in the QRZ QString readDataFromUI(); // Reads the QSO data from the UI and returns the SQL Query QString readDataFromUIDX(); QString readDataFromUIDXModifying(); void actionsJustAfterAddingOneQSO(); //void clearForNextQSO(); void clearUIDX(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setAwardDXCC(const int _qsoId, bool modifying); // Adds or modify the status of a DXCC entity // data << dxcc(id) << band(id) << mode(id) << confirmed(0/1) << qsoid(id) << modify(0/1); //void checkIfWorkedB4(const QString &_qrz); //bool checkContest(); void showStatusOfDXCC(const QStringList _qs); void showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log); bool createConnection(); void createData(); void openSetup(const int _page=0); bool processConfigLine(const QString &_line); void readConfigData(); void defineStationCallsign(const QString &_call); QString selectStationCallsign(); void checkIfNewBandOrMode(); void selectDefaultBand(); void selectDefaultMode(); void readActiveBands (const QStringList actives); void readActiveModes (const QStringList actives); bool checkIfNewMode(const QString &_mode); void addNewValidMode(const QString &_mode); void setModeFromFreq(); void qsoToEdit (const int _qso); void setModifying(const bool _m); void completeWithPreviousQSO(const QString &_call); //void showAwards(); //void showDXMarathon(const int _year); void updateQSLRecAndSent(); //double checkFreqRanges(double _f); //void setRSTToMode(const QString &_m); // CLUSTER void clusterSpotToLog(const QString &_call, const QString &_freq); QStringList dxclusterServersList; QString dxclusterServerToConnect; int dxclusterServerPort; // CLUSTER //LOTW AdifLoTWExportWidget *adifLoTWExportWidget; //LOTW ShowAdifImportWidget *showAdifImportWidget; QWidget *mainWidget; //QWidget *dxClusterTabWidget;//, *searchTabWidget; World *world; FileManager *filemanager; FileAwardManager *fileAwardManager; Locator *locator; Awards *awards; Utilities *util; SetupPageMisc *miscPage; //WorldEditorWidget *worldEditor; //HelpHelpDialog *helpHelpDialog; //HelpAboutDialog *helpAboutDialog; AboutDialog *aboutDialog; TipsDialog *tipsDialog; ShowKLogLogWidget * showKLogLogWidget; //DXCCSummaryDialog *dxccSummaryDialog; //QPushButton *addButton; //QLabel *distShortLabelN; //QLabel *distLongLabelN; StatisticsWidget *statsWidget; DXCCStatusWidget *dxccStatusWidget; //QSqlRelationalTableModel *logModel; //QWidget *logPanel; //QTableView *logView; //QTreeWidget *searchResultsTreeWidget; QLabel *logLabel; //QWidget *scoreWindow; //, dxWindow; //QTextEdit *scoreTextEdit; LogModel *logModel; LogWindow *logWindow; UDPServer *UDPLogServer; ShowErrorDialog *showErrorDialog; // //QGroupBox *gridGroupBox;//, *qrzgroupBox;//, *searchgroupBox; QFrame *dxUpLeftInputFrame;//, *dxUpRightOutputFrame; //QComboBox *bandComboBox, *modeComboBox; //QDateEdit *dateEdit; //QTimeEdit *timeEdit; //QStatusBar *statusBar, *qsoStatusBar; QString statusBarMessage; QTabWidget *dxBottonTab, *dxUpLeftTab, *dxUpRightTab; QMenu *fileMenu; QMenu *toolMenu; QMenu *qslToolMenu; QMenu *lotwToolMenu; QMenu *clublogToolMenu; QMenu *eQSLToolMenu; QMenu *QRZCOMToolMenu; //QMenu *lotwMarkAllAsQueuedMenu; //QMenu *lotwMarkAllInThisLogAsQueuedMenu; QMenu *viewMenu; //QMenu *setupMenu; QMenu *helpMenu; //QAction *TestAct; // Action for testing purposes only QAction *awardAddAct; QAction *klogFolderAct; //QAction *openAct; //QAction *saveAct; QAction *exitAct; QAction *printLogAct; QAction *addAct; QAction *editAct; QAction *removeAct; QAction *logWinAct; QAction *setupAct; QAction *helpAct; QAction *aboutAct; QAction *tipsAct; QAction *debugAct; QAction *aboutQtAct; QAction *updateAct; QAction *scoreWinAct; QAction *scoreeWinAct; QAction *ADIFExport; QAction *ADIFExportAll; QAction *ADIFImport; //QAction *LoTWExport; QAction *LoTWImport; QAction *ReqQSLExport; QAction *CabrilloExport; QAction *fillQsoAct; QAction *fillDXCCAct; QAction *findQSO2QSLAct; QAction *findRequestedQSLAct; QAction *findQSLPendingToReceiveAct; QAction *findQSLDXRequestedAct; QAction *lotwMarkSentQueuedThisLogAct; QAction *lotwMarkSentQueuedAct; QAction *lotwMarkSentYesThisLogAct; QAction *lotwMarkSentYesAct; QAction *lotwCallTQSL; QAction *lotwUpdateFromLoTWAct; QAction *lotwFullDownloadFromLoTWAct; QAction *clublogLogUploadAct; QAction *clublogLogModifyCurrentLogAct; QAction *eqslUploadAct; QAction *eqslLogModifyCurrentLogAct; QAction *QRZCOMCheckThisCallAct; QAction *QRZCOMAutoCheckAct; QAction *QRZCOMLogUploadAct; QAction *QRZCOMLogModifyCurrentLogAct; QAction *downloadCTYAct; QAction *downloadSATSAct; QAction *showStatsAct; //QAction *showRotatorAct; //QAction *showDXCCSummaryAct; QAction *loggWinAct; /* QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; */ QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; //QAction *showWorldMapAct; //QAction *delQSOFromSearchAct; //QAction *qsoToEditFromSearchAct; //QAction *qslSentViaBureauFromSearchAct; //QAction *qslSentViaDirectFromSearchAct; //QAction *qslSentViaDirectMarkRcvReqFromSearchAct; //QAction *qslSentViaBureauMarkRcvReqFromSearchAct; //QAction *qslRecViaBureauFromSearchAct; //QAction *qslRecViaDirectFromSearchAct; //QAction *qslRecViaBureauMarkReqFromSearchAct; //QAction *qslRecViaDirectMarkReqFromSearchAct; //QLineEdit *STXLineEdit; //QLineEdit *SRXLineEdit; //QPushButton *OKButton, *spotItButton, *clearButton; QStringList bands; QStringList modes; QStringList entitiesList, propModeList; // UI DX //QLabel *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; //entityPrimLabel QLabel *infoLabel1, *infoLabel2, *dxMarathonLabelN, *dxMarathonTopScoreLabelN; //QPushButton *flagIcon; // To paint a flag of the worked entity //QLabel *bandLabel1, *bandLabel2, *bandLabel3, *bandLabel4; //QLabel *bandLabel5, *bandLabel6, *bandLabel7, *bandLabel8; //QLabel *bandLabel9, *bandLabel10, *bandLabel11, *bandLabel12; //QLabel *continentLabel, *prefixLabel, *cqzLabel, *ituzLabel; //QLabel *gradShortLabel, *distShortLabel; //QLabel *gradLongLabel, *distLongLabel; //QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; //QLineEdit *operatorLineEdit, *stationCallSignLineEdit;//, *commentLineEdit, *iotaNumberLineEdit; //QTextEdit *notesTextEdit; //QDoubleSpinBox *rxPowerSpinBox;// *txFreqSpinBox, *rxFreqSpinBox, *myPowerSpinBox, QString lotwTQSLpath; bool checkNewVersions, reportInfo; // Selected in the Setup->Misc to check if new versions and report info back to KLog's servers bool logEvents; // Should KLog log the events for debugging bool debugFileOpen; //Is the debugFile open? QFile *debugFile; DebugLogLevel logSeverity; // Manages as syslog, the severity of the application debug log (7 means debug, 0 emergency) bool txFreqBeingChanged, updatingBands; //rxFreqBeingChanged // When the freqs is being modified it is defined to true to prevent other automated to change. bool txFreqBeingAutoChanged, rxFreqBeingAutoChanged; // This is defined to true when freq is being changed by the Sat tab to prevent a loop. bool qslingNeeded; bool noMoreErrorShown; // If true, the errors shown in slotQueryErrorManagement will not be shown anymore in that KLog execution bool noMoreModeErrorShown; // If true, the non-valid modes received from WSJT-x will not be showed to the user bool wsjtxAutoLog; // If true, logged QSO are automatically logged into the log when sent from WSJTX MainWindowSatTab *satTabWidget; MainWindowMyDataTab *myDataTabWidget; MainWindowInputComment *commentTabWidget; MainWindowInputOthers *othersTabWidget; MainWindowInputEQSL *eQSLTabWidget; MainWindowInputQSL *QSLTabWidget; MainWindowInputQSO *QSOTabWidget; MainQSOEntryWidget *mainQSOEntryWidget; AwardsWidget *awardsWidget; SearchWidget *searchWidget; InfoWidget *infoWidget; //AdvancedSearchWidget *advancedSearchWidget; bool keepSatPage; // UI DX SetupDialog *setupDialog; // DXClusterWidget *dxClusterWidget; bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; //QWidget *dxClusterWidget; //QListWidget *dxClusterListWidget; //QPushButton *sendDXClusterButton; //QLineEdit *inputDXClusterLineEdit; // // int infoTimeout; // timeout that temporary info will stay in the infobars QTimer *timer, *timerInfoBars; QDateTime *dateTime, *dateTimeTemp; bool yearChangedDuringModification; QString infoLabel1T, infoLabel2T; QString klogDir, ctyDatFile, defaultADIFLogFile, configFileName; QString softwareVersion; bool itIsANewversion; int dupeSlotInSeconds; QString stx; QString srx; QPalette palRed, palBlack; // To paint Text in red or black(normal) bool alwaysADIF, needToSave, useDefaultLogFileName, upAndRunning, qrzSmallModDontCalculate, imperialSystem, sendQSLWhenRec, manageDxMarathon, completeWithPrevious, completedWithPreviousQTH, completedWithPreviousLocator, completedWithPreviousName, completedWithPreviousIOTA, completedWithPreviousQSLVia; // bool realTime, UTCTime; bool cleaning; bool manageMode; // If true, the DXCC and awards will take the mode into consideration to decide if needed or worked. False implies only band is taken into account // Station Setup bool configured, modify; bool needToEnd; // Just to control if the software needs to end. //bool qrzAutoChanging; //To stop executing the slotQRZTextChanged just because KLog uppercase a letter QString mainQRZ, stationCallsign, operatorQRZ, dxLocator; double myPower, lastPower; int my_CQz, my_ITUz, defaultMode, defaultBand, currentMode, currentModeShown, currentBand, currentBandShown; int currentEntity, previousEntity; bool InValidCharsInPrevCall; int currentLog; // This is to be able to manage multiple logs without showing // them all at the same time. int modifyingQSO; // When modifying, the QSO is saved here. int selectedYear; bool readingTheUI; // While reading the data from UI after QSO intro or modificationthis is true // Station Setup QColor defaultColor; QColor neededColor; QColor workedColor; QColor confirmedColor; QColor newOneColor; QSize windowSize; // bool clublogActive, clublogRealTime, eQSLActive, eQSLRealTime, eQSLUseQSOStationCallSign; //clublogUseStationCallSign, QString clublogPass, clublogEmail; //clublogUser, eLogClubLog *elogClublog; int clublogAnswer; QStringList clublogPrevQSO; // // QRZ.com bool qrzcomActive; bool qrzcomSubscriber; eLogQrzLog *elogQRZcom; QString qrzcomUser, qrzcomPass; // QRz.com - END // Contest //int points, qsoPoints, multipliers, qsoMultiplier; QString contestMode; //Contest *contest; // Contest DataProxy_SQLite *dataProxy; //DataBase *db; SoftwareUpdate *softUpdate; bool callingUpdate; bool UDPServerStart; // LOTWUTILITIES LoTWUtilities *lotwUtilities; bool lotwActive; //eQSLUtilities eQSLUtilities *eqslUtilities; //LOGVIEW //QString bandOld, modeOld; //LOGVIEW signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution protected: void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; void showEvent(QShowEvent *event) override; }; #endif klog-1.8.6/filemanager.cpp0000644000175000017500000060230214166020421014417 0ustar develdevel/*************************************************************************** filemanager.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "filemanager.h" //#include FileManager::FileManager(DataProxy_SQLite *dp) { //qDebug() << "FileManager::FileManager()-1" << QT_ENDL; constrid = 1; dataProxy = dp; dbCreated = false; rstTXDefault = false; rstRXDefault = false; ignoreUnknownAlways = false; noMoreQso = false; defaultStationCallsign = QString(); duplicatedQSOSlotInSecs = 0; util = new Utilities; //qso = new QSO; klogVersion = util->getVersion(); db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); usePreviousStationCallsignAnswerAlways = false; world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); hashLogs.clear(); //qDebug() << "FileManager::FileManager()-1 - END" << QT_ENDL; } FileManager::FileManager(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_softVersion) //FileManager::FileManager(const QString &_klogDir, const QString &_softVersion, DataBase _db) { //qDebug() << "FileManager::FileManager()-3: Dir(2)" << _klogDir << QT_ENDL; constrid = 2; dataProxy = dp; util = new Utilities; util->setVersion(klogVersion); defaultStationCallsign = QString(); dbCreated = false; rstTXDefault = false; rstRXDefault = false; duplicatedQSOSlotInSecs = 0; db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); klogVersion = _softVersion; //dataProxyPrepared = new DataProxy_SQLite(klogVersion); klogDir = _klogDir; ignoreUnknownAlways = false; usePreviousStationCallsignAnswerAlways = false; world = new World(dataProxy, klogDir, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); noMoreQso = false; hashLogs.clear(); //qDebug() << "FileManager::FileManager()-3: Dir(2) - END" << QT_ENDL; } FileManager::~FileManager() { delete(db); delete(awards); delete(world); } void FileManager::setDuplicatedQSOSlot (const int _secs) { if (_secs >= 0) { duplicatedQSOSlotInSecs = _secs; } } bool FileManager::checkADIFValidFormat(const QStringList &_qs) { QStringList qs = _qs; if (qs.size()!= 2) { //qDebug() << "FileManager::checkADIFValidFormat-0 (not two) " << QT_ENDL; return false; } QString q0 = qs.at(0); QString q1 = qs.at(1); //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(0) << QT_ENDL; //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(1) << QT_ENDL; int len = 0; int i = (qs.at(0)).count(":"); if (i == 2) { // DATE:8:D / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else if (i == 1) { // DATE:8 / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 " << QT_ENDL; return false; } //i = (qs.at(0)).indexOf(":"); //i = (qs.at(0)).length() - i -1; //qDebug() << "i = " << QString::number(i) << "/" << qs.at(0) << QT_ENDL; //len = ( (qs.at(0)).right(i)).toInt(); //qDebug() << "len = " << QString::number(len) << QT_ENDL; if ( (q1).length() != len ) { //qDebug() << "FileManager::checkADIFValidFormat-2: " << (qs.at(1)) << " - " << QString::number((qs.at(1)).length()) << "/" << QString::number(len) << QT_ENDL; return false; } if (len <= 0) { //qDebug() << "FileManager::checkADIFValidFormat-3 " << QT_ENDL; return false; } //qDebug() << "FileManager::checkADIFValidFormat-4 (true)" << QT_ENDL; return true; } bool FileManager::adifLogExport(const QString& _fileName, const int _logN) { //qDebug() << "FileManager::adifLogExport" << _fileName << QT_ENDL; return adifLogExportToFile(_fileName, _logN, false, false, false); } void FileManager::showError (const QString &_txt) { //qDebug() << Q_FUNC_INFO << ": " << _txt << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Error")); msgBox.setIcon(QMessageBox::Warning); QString aux = QString(_txt ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); } QList FileManager::adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em) //QList FileManager::adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN, const bool LoTWOnly) { //qDebug() << Q_FUNC_INFO << ": Start)" << _fileName << "/" << _callsign << QT_ENDL; QList qsos; qsos.clear(); if ((!util->isValidCall(_callsign)) && (_callsign != "ALL") && (_callsign !="NOT")) { showError(tr("The selected callsign (%1) is not valid, please check it again to export the log.").arg(_callsign)); return qsos; } noMoreQso = false; if (_logN != -1) { // We will export data from ALL logs. if (!dataProxy->doesThisLogExist(_logN)) { //qDebug() << Q_FUNC_INFO << ": The log does not exist" << QT_ENDL; showError(tr("The selected log does not exist, please check it again.")); return qsos; } } QString queryStringCount; QString queryString; QString _queryStation; if (util->isValidCall(_callsign)) { _queryStation = QString(" station_callsign ='%1'").arg(_callsign); } else if (_callsign == "ALL") { _queryStation = QString(" station_callsign !='ALL'"); } else { _queryStation = QString(" station_callsign =''"); } QString _queryDateFrom; if (_startDate.isValid()) { _queryDateFrom = QString(" AND qso_date >= '%1'").arg(util->getDateSQLiteStringFromDate(_startDate)); } else { _queryDateFrom = QString(" AND qso_date != '1'"); } QString _queryDateTo; if (_endDate.isValid()) { _queryDateTo = QString(" AND qso_date <= '%1'").arg(util->getDateSQLiteStringFromDate(_endDate.addDays(1))); } else { _queryDateTo = QString(); } QString _queryLog; if (_logN == -1) { _queryLog = QString(" AND logNumber = '%1'").arg(_logN); } else { _queryLog = QString(); } QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ { showError(tr("The file %1 can't be opened.").arg(_fileName)); return qsos; } QSqlQuery query; if (_em == ModeLotW) { //qDebug() << "FileManager::adifLogExportReturnList: Exporting for LoTW" << QT_ENDL; // LoTW Required fields: call sign, UTC Date, UTC time, Mode, Band // LoTW Optional fields: RX band, Frecuency TX, frecuency RX, Propagation mode, Satellite queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + QString(" AND lotw_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, freq, bandid, band_rx, freq_rx, modeid, gridsquare, my_gridsquare, qso_date, prop_mode, sat_name, station_callsign FROM log WHERE") + _queryStation + QString(" AND lotw_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; } else if (_em == ModeClubLog) { //qDebug() << "FileManager::adifLogExportReturnList: Exporting for ClubLog" << QT_ENDL; queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + QString(" AND clublog_qso_upload_status='M'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, rst_sent, rst_rcvd, freq, bandid, band_rx, modeid, qso_date, qsl_rcvd, qslrdate, qslsdate, prop_mode, operator, station_callsign, dxcc, qsl_sent, lotw_qsl_rcvd, credit_granted, notes, qso_date_off FROM log WHERE") + _queryStation + QString(" AND clublog_qso_upload_status='M'") + _queryDateFrom + _queryDateTo; } else if (_em == ModeEQSL) { //qDebug() << "FileManager::adifLogExportReturnList: Exporting for eQSL" << QT_ENDL; queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + QString(" AND eqsl_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, rst_sent, freq, bandid, modeid, qso_date, prop_mode, operator, station_callsign, sat_name, my_cnty, my_gridsquare, my_lat, my_lon FROM log WHERE") + _queryStation + QString(" AND eqsl_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; } else { //qDebug() << "FileManager::adifLogExportReturnList: Exporting normal ADIF" << QT_ENDL; if (_callsign == "ALL") { queryStringCount = QString("SELECT COUNT (id) FROM log"); queryString = QString("SELECT * FROM log"); } else { queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; queryString = QString("SELECT * FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; } } //qDebug() << "FileManager::adifLogExportReturnList: Query Count: " << queryStringCount << QT_ENDL; //qDebug() << "FileManager::adifLogExportReturnList: Query data: " << queryString << QT_ENDL; int numberOfQsos = dataProxy->getHowManyQSOInLog(_logN); int i = 0; bool sqlOK = query.exec(queryStringCount); //qDebug() << "FileManager::adifLogExportReturnList: " << query.lastQuery() << QT_ENDL; if (!sqlOK) { //qDebug() << "FileManager::adifLogExportReturnList: Query Error" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return qsos; } else { query.next(); if (query.isValid()) { i = (query.value(0)).toInt(); if (i>0) { numberOfQsos = i; query.finish(); } else if (i == 0) { showError(tr("There are no QSOs pending to be exported with that station callsign.")); return qsos; } } } QTextStream out(&file); int step = util->getProgresStepForDialog(numberOfQsos); //qDebug() << "FileManager::adifLogExportReturnList: " << QString::number(step) << QT_ENDL; QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::WindowModal); progress.setValue(0); progress.setWindowTitle(tr("Export")); progress.setAutoClose(true); writeADIFHeader(out, _em, numberOfQsos); i = 0; sqlOK = query.exec(queryString); //qDebug() << "FileManager::adifLogExportReturnList: " << query.lastQuery() << QT_ENDL; if (!sqlOK) { //qDebug() << "FileManager::adifLogExportReturnList: Query Error" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return qsos; } QSqlRecord rec = query.record(); int nameCol; //qDebug() << "FileManager::adifLogExportReturnList: Entering the While..." << QT_ENDL; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << "FileManager::adifLogExportReturnList: Start of While" << QT_ENDL; if (query.isValid()) { nameCol = rec.indexOf("id"); qsos.append((query.value(nameCol)).toInt()); writeQuery(query, out, _em, false, false, _logN); // JustMarked = false, onlyRequested = false i++; //qDebug() << "FileManager::adifLogExportReturnList: Start of isValid" << QT_ENDL; } // END of if (query.isValid()) else { //qDebug() << "FileManager::adifLogExportReturnList: Querty NOT isValid" << QT_ENDL; } //qDebug() << "FileManager::adifLogExportReturnList: Checking if cancelled" << QT_ENDL; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportReturnList: ******************************** UPDATING THE MESSAGE! " << QString::number(i) << QT_ENDL; QString aux = tr("Exporting ADIF file...\n QSO: %1 / %2 ").arg(i).arg(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); //qDebug() << "FileManager::adifLogExportReturnList: ******************************** UPDATING THE MESSAGE: " << aux << QT_ENDL; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; qsos.clear(); progress.setValue(numberOfQsos); return qsos; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } // END OF WHILE //qDebug() << "FileManager::adifLogExportReturnList: End: " << QString::number(qsos.count()) << QT_ENDL; progress.setValue(numberOfQsos); return qsos; } bool FileManager::adifQSOsExport(const QString& _fileName, QList _qsos) { //qDebug() << "FileManager::adifQSOsExport: " << _fileName << QT_ENDL; int numberOfQSOs = _qsos.length(); if (numberOfQSOs<1) { //TODO: Warn the user NO QSOS TO EXPORT //qDebug() << "FileManager::adifQSOsExport: No QSOs received to be exported" << QT_ENDL; } noMoreQso = false; //qDebug() << "FileManager::adifQSOsExport - 01" << QT_ENDL; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << "FileManager::adifQSOsExport - 02" << QT_ENDL; QTextStream out(&file); QSqlQuery query; QString queryString; queryString = QString("SELECT * FROM log WHERE id IN ("); //qDebug() << "FileManager::adifQSOsExport - 10" << QT_ENDL; QString numbers = QString(); foreach (int i, _qsos) { //qDebug() << "FileManager::adifQSOsExport - query: " << QString("id = '%1'").arg(i) << QT_ENDL; numbers = numbers + QString::number(i) ; if (i != _qsos.last()) { numbers = numbers + ", "; } } queryString = queryString + numbers + ")"; //qDebug() << "FileManager::adifQSOsExport: writing the header" << QT_ENDL; writeADIFHeader(out, ModeADIF, _qsos.length()); //qDebug() << "FileManager::adifQSOsExport: writing the body" << QT_ENDL; bool sqlOK = query.exec(queryString); if (!sqlOK) { //qDebug() << "FileManager::adifQSOsExport: query error: " << query.lastQuery() << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "FileManager::adifQSOsExport: query: " << query.lastQuery() << QT_ENDL; QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQSOs, this); progress.setMaximum(numberOfQSOs); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); int currentQso = 0; int step = util->getProgresStepForDialog(numberOfQSOs); while ( (query.next()) && (!noMoreQso) ) { //qDebug() << "FileManager::adifLogExportToFile - Just in the While" << QT_ENDL; if (query.isValid()) { //qDebug() << "FileManager::adifLogExportToFile - Query is Valid" << QT_ENDL; writeQuery(query, out, ModeADIF, false, false, -1); } // Closes the isValid else { //qDebug() << "FileManager::adifLogExportToFile - Query is NOT Valid" << QT_ENDL; } //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso) << QT_ENDL; currentQso++; if (( (currentQso % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " << QT_ENDL; QString aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQSOs); progress.setLabelText(aux1); progress.setValue(currentQso); } //qDebug() << "FileManager::adifLogExportToFile - after showing progress (current%Step): " << QString::number(currentQso%step) << QT_ENDL; if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //qDebug() << "FileManager::adifQSOsExport - END" << QT_ENDL; return true; } bool FileManager::adifLogExportToFile(const QString& _fileName, const int _logN, bool justMarked, bool _qslRequested , bool _lotw) { //adifLogExportToFile(const QString& _fileName, const int _logN=0, bool justMarked = false, bool _qslRequested = false, bool _lotw=false); // If _logN = 0, then we will export ALL the logs. //qDebug() << "FileManager::adifLogExportToFile: " << _fileName << QT_ENDL; bool exportJustMarkedQSO = justMarked; //bool marked = false; bool exportOnlyQSLRequested = _qslRequested; //bool haveMode = false; noMoreQso = false; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; QTextStream out(&file); QString aux1, aux2, queryString, bandst, bandrxst; // bandst & bandrxst are to check if the band is properly defined //int nameCol = 0; QSqlQuery query1; int numberOfQsos = 0; int currentQso = 0; noMoreQso = false; int step = 1; //bool propsat=false; // Just to check if we have added the prop_mode needed by LOTW when SAT QSO //bool bandOK = false; // Just to check if the band is properly defined bool exportAll = false; if (_logN <=0) { exportAll = true; } else { exportAll = false; } bandst = QString(); bandrxst = QString(); if (exportJustMarkedQSO) { //TODO: Count the marked QSO and adjust the numberOfQsos numberOfQsos = 0; QSqlQuery query; if (exportAll) { queryString = QString("SELECT COUNT(id) marked FROM log"); } else { queryString = QString("SELECT COUNT(id) FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } if (query.next()) { if (query.isValid()) { numberOfQsos = query.value(0).toInt(); } } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< QT_ENDL; } else { if (exportAll) { aux1 = "SELECT count(id) FROM log"; } else { aux1 = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query1.exec(aux1); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); } query1.next(); if (query1.isValid()) { numberOfQsos = (query1.value(0)).toInt(); } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< QT_ENDL; } //qDebug() << "FileManager::adifLogExportToFile - end get numberOfQsos = " << QString::number(numberOfQsos) << QT_ENDL; step = util->getProgresStepForDialog(numberOfQsos); //qDebug() << "FileManager::adifLogExportToFile END - Steps = " << QString::number(step) << QT_ENDL; //step = getProgresStepForDialog(numberOfQsos); writeADIFHeader(out, ModeADIF, numberOfQsos); /* out << "ADIF v3.1.1 Export from KLog\nhttps://www.klog.xyz/klog\n" << klogVersion << "\nKLOG " << QT_ENDL; out << "" << QString::number(numberOfQsos) << QT_ENDL; QDateTime dateTime = (QDateTime::currentDateTime()).toUTC(); out << "" << dateTime.toString("yyyyMMdd-hhmm") << QT_ENDL; out << "" << QT_ENDL; */ if (exportAll) { if (justMarked) { queryString = QString("SELECT * FROM log WHERE marked='X'"); } else { queryString = QString("SELECT * FROM log"); } } else { if (justMarked) { queryString = QString("SELECT * FROM log WHERE marked='X' AND lognumber='%1'").arg(_logN); } else { queryString = QString("SELECT * FROM log WHERE lognumber='%1'").arg(_logN); } } QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); QSqlRecord rec = query.record(); QDateTime date; //qDebug() << "FileManager::adifLogExportToFile - before the While" << QT_ENDL; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << "FileManager::adifLogExportToFile - Just in the While" << QT_ENDL; if (query.isValid()) { writeQuery(query, out, ModeADIF, exportJustMarkedQSO, exportOnlyQSLRequested, _logN); } // Closes the isValid //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso) << QT_ENDL; currentQso++; if (( (currentQso % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " << QT_ENDL; aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux1); progress.setValue(currentQso); } //qDebug() << "FileManager::adifLogExportToFile - after showing progress (current%Step): " << QString::number(currentQso%step) << QT_ENDL; if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //Closes the While //qDebug() << "FileManager::adifLogExportToFile - after the While" << QT_ENDL; progress.setValue(numberOfQsos); if (noMoreQso) { //TODO: Remove the file (_fileName) //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = true" << QT_ENDL; file.remove(); return false; } else { //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = false" << QT_ENDL; return writeBackupDate(); } } bool FileManager::printQs(const QStringList &_line) //bool FileManager::printQs(const QString &_q, const QStringList _line) { QStringList qs = _line; for (int i = 0; i FileManager::adifLoTWReadLog2(const QString& fileName, const int logN) { //qDebug() << "FileManager::adifLoTWReadLog2" << fileName << QT_ENDL; //QSO qso(Q_FUNC_INFO); QString stationCallSign; stationCallSign.clear(); bool addNewQSOs = false; bool askedToAddNewQSOs = false; QList _qsos; _qsos.clear(); if (!dataProxy->doesThisLogExist(logN)) { //qDebug() << "FileManager::adifLoTWReadLog2: ERROR: The log does not exist: " << QString::number(logN) << QT_ENDL; return _qsos; } //qDebug() << "FileManager::adifLoTWReadLog2 - 10" << QT_ENDL; //QString fn = "blotw.adi"; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileManager::adifLoTWReadLog File not found" << fileName << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not opened")); QString aux = QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName); msgBox.setText(tr("KLog was not able to read the LoTW file")); msgBox.setInformativeText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); return _qsos; } //qDebug() << "FileManager::adifLoTWReadLog2 - 20" << QT_ENDL; int numberOfQsos = 0; QString line = QString(); bool hasEOH = false; //qDebug() << "FileManager::adifLoTWReadLog2 - 30" << QT_ENDL; qint64 pos = file.pos(); //while ( !file.atEnd() && !hasEOH ) while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); if (line.contains("OWNCALL:")) { stationCallSign = (line.section(": ", 1, 1)).simplified(); if (!util->isValidCall(stationCallSign)) { stationCallSign = QString(); } } //qDebug() << "FileManager::adifLoTWReadLog2 - line-1: " << line << QT_ENDL; numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { //qDebug() << "FileManager::adifLoTWReadLog2 - line-1: EOH FOUND!" << QT_ENDL; hasEOH = true; pos = file.pos(); } } file.seek(pos); int step = util->getProgresStepForDialog(numberOfQsos); QProgressDialog progress(tr("Processing LoTW ADIF file..."), tr("Abort processing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::WindowModal); progress.setValue(0); progress.setWindowTitle(tr("LoTW reading")); progress.setAutoClose(true); //qDebug() << "FileManager::adifLoTWReadLog2 - After header while" << QT_ENDL; noMoreQso = false; QStringList fields; QSO qso; qso.clear(); int i = 0; while (!file.atEnd() && !noMoreQso) { fields.clear(); line = (file.readLine()).toUpper(); if (line.contains("")) { noMoreQso = true; } fields << line.split("<", QT_SKIP); foreach(QString a, fields) { //qDebug() << "FileManager::adifLoTWReadLog2 - Fields: " << a << QT_ENDL; QString fullField = "<" + a.trimmed(); if (fullField.contains("")) { if (qso.isValid()) { //qDebug() << "FileManager::adifLoTWReadLog2 VALID QSO: " << QT_ENDL; qso.setLogId(logN); if (util->isValidCall(stationCallSign)) { QString aux = QString("%2").arg(QString::number(stationCallSign.length())).arg(stationCallSign); qso.setData(aux); } QList dupeQsos; dupeQsos.clear(); dupeQsos << dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qso.getCall(), qso.getDateTimeOn(), dataProxy->getIdFromBandName(qso.getBand()), dataProxy->getIdFromModeName(qso.getMode()), duplicatedQSOSlotInSecs); if ((dupeQsos.length()<1) && (!askedToAddNewQSOs) ) { askedToAddNewQSOs = true; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Add new QSOs?")); QString aux = QString(tr("Do you want to add non existing QSOs to your local log?")); msgBox.setText(aux); msgBox.setDetailedText(tr("There are some QSOs in the LoTW log that are not in your local log.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: addNewQSOs = true; break; case QMessageBox::No: addNewQSOs = false; break; default: // should never be reached break; } } if ((dupeQsos.length()<1) && (addNewQSOs)) { //qDebug() << "FileManager::adifLoTWReadLog2 - New QSO ... adding ..." << QT_ENDL; int lastId = dataProxy->addQSO(qso); if (lastId>0) { _qsos.append(lastId); //qDebug() << "FileManager::adifLoTWReadLog2 - New QSO ... added ..." << QT_ENDL; } } else { //qDebug() << "FileManager::adifLoTWReadLog2 - EXisting QSO or not adding, Updating LoTW QSL status to: " << qso.getLoTWQSL_RCVD() << QT_ENDL; if (dataProxy->setLoTWQSLRec (dupeQsos.at(0), qso.getLoTWQSL_RCVD(), qso.getLoTWQSLRDate())) { _qsos.append(dupeQsos.at(0)); //qDebug() << "FileManager::adifLoTWReadLog2: Modified QSO: " << QString::number(dupeQsos.at(0)) << QT_ENDL; } } i++; qso.clear(); } } else { qso.setData(fullField); //qDebug() << Q_FUNC_INFO << ": - " << fullField; if (fullField.contains ("getDXCCFromPrefix (qso.getCall ()); //qDebug() << Q_FUNC_INFO << ": DXCC: " << QString::number(_dxcc); if (util->isValidDXCC (_dxcc)) { //qDebug() << Q_FUNC_INFO << ": - Adding a DXCC" ; qso.setDXCC (_dxcc); } } } } if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLoTWReadLog2: ******************************** UPDATING THE MESSAGE! " << QString::number(i) << QT_ENDL; QString aux = tr("Processing LoTW ADIF file......\n QSO: %1 / %2 ").arg(i).arg(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); //qDebug() << "FileManager::adifLoTWReadLog2: ******************************** UPDATING THE MESSAGE: " << aux << QT_ENDL; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; _qsos.clear(); progress.setValue(numberOfQsos); return _qsos; //return qsos; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //qDebug() << "FileManager::adifLoTWReadLog2 - END: " << QString::number(_qsos.length ()) << QT_ENDL; return _qsos; } QList FileManager::adifLoTWReadLog(const QString& tfileName, const int logN) { //qDebug() << "FileManager::adifLoTWReadLog: " << tfileName << QT_ENDL; QString fileName = tfileName; QList readed; //QElapsedTimer time1 = QTime::currentTime(); readed.clear(); if (!dataProxy->doesThisLogExist(logN)) { //qDebug() << "FileManager::adifLoTWReadLog: ERROR: The log does not exist: " << QString::number(logN) << QT_ENDL; return readed; } QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileManager::adifLoTWReadLog File not found" << fileName << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not opened")); QString aux = QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName); msgBox.setText(tr("KLog was not able to read the LoTW file")); msgBox.setInformativeText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); return readed; } //qso->clear(); QStringList fields, qsToPass; QStringList modifiedQSOList; // This is to emit it so after reading the full file, it is possible to show a qtable showing the QSOs that have been modified. modifiedQSOList.clear(); bool hasEOH = false; int numberOfQsos = 0; int i = 0; //int numberOfQsosLoWTHeader = 0; QString line = QString(); QString auxString = QString(); QString aux = QString(); qint64 pos; //Position in the file bool inHeader = true; pos = file.pos(); fields.clear(); qsToPass.clear(); QDateTime _dateTime; bool alwaysAdd = false; bool alwaysIgnore = false; QString stationCallsign = QString(); //int step = 1; while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } } int step = util->getProgresStepForDialog(numberOfQsos); //847 //qDebug() << "FileManager::adifLoTWReadLog QSOs found: " << QString::number(numberOfQsos) << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog STEP: " << QString::number(step) << QT_ENDL; QProgressDialog progress(tr("Reading LoTW file..."), tr("Abort reading"), 0, numberOfQsos, this); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); //step = util->getProgresStepForDialog(numberOfQsos); file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << "FileManager::adifLoTWReadLog: Going to read the HEADER" << QT_ENDL; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << "FileManager::adifLoTWReadLog: " << line << QT_ENDL; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("OWNCALL:")) { stationCallsign = line.section(": ", 1, 1); if (!util->isValidCall(stationCallsign)) { stationCallsign = QString(); } } if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. - THIS IS USUALLY THE CASE FOR LOTW 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); //START reading QSO data... //qDebug() << "FileManager::adifLoTWReadLog: QSO data reading started..." << QT_ENDL; QDate _tdate; noMoreQso = false; //time1.start(); while (!noMoreQso ) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("")) { noMoreQso = true; } //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << "FileManager::adifLoTWReadLog-line:" << line << QT_ENDL; fields << line.split("<", QT_SKIP); qsToPass.clear(); auxString.clear(); foreach (aux, fields) { aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { qsToPass.last() = qsToPass.last() + auxString; //qDebug() << "FileManager::adifLoTWReadLog Modified in qsToPass: " << qsToPass.last() << QT_ENDL; //qsToPass << aux.trimmed(); //qDebug() << "FileManager::adifLoTWReadLog Added to qsToPass: " << aux.trimmed() << QT_ENDL; auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << "FileManager::adifLoTWReadLog auxString: " << auxString << QT_ENDL; } //qDebug() << "FileManager::adifLoTWReadLog fields: " << aux << QT_ENDL; } if (auxString.length()>0) { //qDebug() << "FileManager::adifLoTWReadLog auxString2: " << auxString << QT_ENDL; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << "FileManager::adifLoTWReadLog END fields" << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog Mod: " << qsToPass.join("/") << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog END2 fields" << QT_ENDL; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << "FileManager::adifLoTWReadLog: START of QSO adding"<< QT_ENDL; //dataProxy->isThisQSODuplicated() //int getDuplicatedQSOId(const QString &_qrz, const QString &_date, const QString &_time, const int _band, const int _mode); QString str, _call, _date, _time, _band, _mode; double _freq = 0.0; bool haveBand = false; QDate _qslrdate = QDate::currentDate(); QString _satName = QString(); bool qsl_rcvd = false; QString field, data; QStringList clearAdif; bool validQSO = false; int modifiedQSO = -1; foreach (str, fields) { //field = readAdifField("<"+str).at(0); clearAdif.clear(); clearAdif << readAdifField("<"+str); //qDebug() << "FileManager::adifLoTWReadLog: clearAdif length: " << QString::number(clearAdif.length()) << QT_ENDL; if (clearAdif.length()==2) { validQSO = true; field = clearAdif.at(0); data = clearAdif.at(1); //qDebug() << "FileManager::adifLoTWReadLog: field: " << field << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog: data: " << data << QT_ENDL; if (field == "CALL") { if (util->isValidCall(data)) { _call = data; } else { _call = util->getAValidCall(data); } } else if (field == "QSO_DATE") { //qDebug() << "FileManager::adifLoTWReadLog: field: " << field << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog: data: " << data << QT_ENDL; _tdate = util->getDateFromADIFDateString(data); if (_tdate.isValid()) { _dateTime.setDate(_tdate); } } else if (field == "TIME_ON") { //qDebug() << "FileManager::adifLoTWReadLog: field: " << field << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog: data: " << data << QT_ENDL; _time = data; if (util->getTimeFromADIFTimeString(data).isValid()) { _dateTime.setTime(util->getTimeFromADIFTimeString(data)); } } else if (field == "BAND") { _band = data; haveBand = true; } else if (field == "MODE") { _mode = data; } else if (field == "FREQ") // In MHz with 5 decimal places { if (haveBand) { int bandi = dataProxy->getIdFromBandName(_band); if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandi) { _freq = data.toDouble(); } else { _freq = dataProxy->getLowLimitBandFromBandId(bandi); // IF band is defined but not the same than freq, Band wins } } else { _freq = data.toDouble(); int bandi = dataProxy->getBandIdFromFreq(data.toDouble()); if (bandi>=0) { _band = dataProxy->getBandNameFromFreq(_freq); haveBand = true; } } } else if (field == "APP_LOTW_RXQSO") { //_qslsdate = data; } else if (field == "QSL_RCVD") { if (data == "Y") { qsl_rcvd = true; } } else if (field == "QSLRDATE") { if ((util->getDateFromADIFDateString(data)).isValid()) { _qslrdate = util->getDateFromADIFDateString(data); } } else if (field == "SAT_NAME") { if (dataProxy->getSatelliteName(data).length()>0) { _satName = data; } } else { //Unknown ADIF received. } } else { //qDebug() << "FileManager::adifLoTWReadLog: NOT VALID ADIF RECEIVED: " << "<" + str << QT_ENDL; } } //qDebug() << "FileManager::adifLoTWReadLog: If QSO is valid, we will call the addQSOToList" << "<" + str << QT_ENDL; //qDebug() << "FileManager::adifLoTWReadLog: New Add String query: " << QT_ENDL; //dataProxy->addQSO(&qso); if (validQSO) { modifiedQSO = -2; // if (qsl_rcvd) { modifiedQSO = dataProxy->lotwUpdateQSLReception (_call, _dateTime, _band, _mode, _qslrdate); } //qDebug() << "FileManager::adifLoTWReadLog: QSO Modified: " << QString::number(modifiedQSO) << QT_ENDL; if (modifiedQSO>0) { //qDebug() << "FileManager::adifLoTWReadLog: QSO Modified: " << _call << QT_ENDL; readed.append(modifiedQSO); modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); } else if ((modifiedQSO == -1 ) && (!qsl_rcvd)) { bool ignoreQSO = false; //qDebug() << "FileManager::adifLoTWReadLog: QSO NOT found but confirmed by LoTW - Is it an error or should I add it to the log? " << _call << QT_ENDL; if (alwaysAdd) { //qDebug() << "FileManager::adifLoTWReadLog: ADD THE QSO AUTOMATICALLY!!!" << QT_ENDL; modifiedQSO = dataProxy->addQSOFromLoTW(_call, _dateTime, _mode, _band, _freq, _qslrdate, stationCallsign, logN); if (modifiedQSO>0) { readed.append(modifiedQSO); //qDebug() << "FileManager::adifLoTWReadLog QSO ADDED readed: " << QString::number(readed.length()) << QT_ENDL; modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); //qDebug() << "FileManager::adifLoTWReadLog: QSO ADDED: " << QString::number(modifiedQSO) << QT_ENDL; } else { //qDebug() << "FileManager::adifLoTWReadLog: QSO NOT ADDED: " << QString::number(modifiedQSO) << QT_ENDL; } } else if (alwaysIgnore) { //qDebug() << "FileManager::adifLoTWReadLog: IGNORE THE QSO AUTOMATICALLY!!!" << QT_ENDL; } else { if (askUserToAddThisQSOToLog(_call, _dateTime, _mode, _band, _freq, _qslrdate)) { //qDebug() << "FileManager::adifLoTWReadLog: ADD THE QSO !!!" << QT_ENDL; modifiedQSO = dataProxy->addQSOFromLoTW(_call, _dateTime, _mode, _band, _freq, _qslrdate, stationCallsign, logN); if (modifiedQSO>0) { readed.append(modifiedQSO); //qDebug() << "FileManager::adifLoTWReadLog QSO ADDED-2 readed: " << QString::number(readed.length()) << QT_ENDL; modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); //qDebug() << "FileManager::adifLoTWReadLog: QSO ADDED-2: " << QString::number(modifiedQSO) << QT_ENDL; } else { //qDebug() << "FileManager::adifLoTWReadLog: QSO NOT ADDED-2: " << QString::number(modifiedQSO) << QT_ENDL; } } else { //qDebug() << "FileManager::adifLoTWReadLog: IGNORE THE QSO !!!" << QT_ENDL; } if (askUserToUseAlwaysSameAnswer()) { if (!ignoreQSO) { alwaysAdd = true; } else { alwaysIgnore = true; } } else { alwaysAdd = false; alwaysIgnore = false; } } } else { //qDebug() << "FileManager::adifLoTWReadLog: QSO NOT Modified: Error: " << QString::number(modifiedQSO) << " - " << _call << QT_ENDL; } } _call.clear(); _date.clear(); _time.clear(); _band.clear(); _mode.clear(); _qslrdate = QDate::currentDate(); //qDebug() << "FileManager::adifLoTWReadLog: END of QSO "<< QT_ENDL; fields.clear(); i++; } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << "FileManager::adifLoTWReadLog: fields DOES NOT contains EOR>" << QT_ENDL; } if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLoTWReadLog: MOD 0 - i = " << QString::number(i) << QT_ENDL; aux = tr("Importing LoTW ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); //aux = QString(tr("Importing LoTW ADIF file...\n QSO: %1/%2\nImporting speed: %3 QSOs/sec")).arg(i).arg(numberOfQsos).arg(step / (time1.elapsed()/1000)); //time1.restart(); progress.setLabelText(aux); progress.setValue(i); } if (i>=numberOfQsos) { noMoreQso = true; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); aux = QString(tr("You have canceled the file import. The file will be removed and no data will be imported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } } progress.setValue(numberOfQsos); //qDebug() << "FileManager::adifLoTWReadLog - END: " << QString::number(readed.length()) << QT_ENDL; return readed; } bool FileManager::adifReadLog(const QString& tfileName, const int logN) { //qDebug() << "FileManager::adifReadLog:" << tfileName << QT_ENDL; //QElapsedTimer time1; //int n = 0; //QSqlDatabase db = QSqlDatabase::database(); //int maxLogs = dataProxy->getNumberOfManagedLogs(); // To manage several logs usePreviousStationCallsignAnswerAlways = false; // This is to ensure that the StationCallsign is used in the process Line function bool sqlOK = true; QStringList queries = QStringList(); queries.clear(); QSqlQuery query; QStringList fields, qsToPass, qsAux; QStringList currentQSOfields = QStringList(); fields.clear(); qsToPass.clear(); qsAux.clear(); QString fieldToAnalyze = QString(); QString fileName = tfileName; QString line = QString(); QString aux = QString(); QString auxString = QString(); QString _band = QString(); bool inHeader = true; bool EOR = false; noMoreQso = false; bool isDupeQSO = false; bool askedToAddDupeQSOs = false; bool addDupeQSOs = false; qint64 pos; //Position in the file int i = 0; //Aunxiliar variable int numberOfQsos = 0; int step = 1; //int errorCode = -1; //int qsosInTransaction = 0; bool ignoreErrorCode19 = false; QFile file( fileName ); //bool moreThanOneLog = adifCheckMoreThanOneLog(file); int howManyLogs = howManyLogsInFile(file); fillHashLog(file); //I am creating several logs when importing a file //We need to fill the hashLog to process then in processLog //bool keepLogsInFile = false; //qDebug() << "FileManager::adifReadLog: Logs: " << QString::number(howManyLogs) << QT_ENDL; if (howManyLogs>1) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Log selection")); aux = QString(tr("There is more than one log in this logfile.") + "\n" + tr("All logs will be imported into the current log.") + "\n" + tr("Do you want to continue?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << "FileManager::adifReadLog: clicked YES" << QT_ENDL; //keepLogsInFile = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << "FileManager::adifReadLog: clicked NO" << QT_ENDL; //keepLogsInFile = false; return false; default: // should never be reached //keepLogsInFile = false; return false; //qDebug() << "FileManager::adifReadLog: default" << QT_ENDL; } } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileManager::adifReadLog File not found" << fileName << QT_ENDL; return false; } bool hasEOH = false; pos = file.pos(); while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } } //qDebug() << "FileManager::adifReadLog QSOs found: " << QString::number(numberOfQsos) << QT_ENDL; QProgressDialog progress(tr("Reading ADIF file..."), tr("Abort reading"), 0, numberOfQsos, this); /*progress.setWindowModality(Qt::WindowModal);*/ progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); step = util->getProgresStepForDialog(numberOfQsos); //step = getProgresStepForDialog(numberOfQsos); //qDebug() << "FileManager::adifReadLog (STEP)/Number: " << QString::number(step) << "/" << QString::number(numberOfQsos) << QT_ENDL; //qDebug() << "FileManager::adifReadLog (number & step: " << QString::number(numberOfQsos % step) << QT_ENDL; file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << "FileManager::adifReadLog: Going to read the HEADER" << QT_ENDL; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << "FileManager::adifReadLog: " << line << QT_ENDL; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); // START reading QSO data... //qDebug() << "FileManager::adifReadLog: QSO data reading started..." << QT_ENDL; preparedQuery.prepare( "INSERT INTO log (call, qso_date, bandid, modeid, srx, stx, srx_string, stx_string, qso_date_off, band_rx, rst_sent, rst_rcvd, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, eq_call, email, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, my_gridsquare, iota, iota_island_id, my_iota, my_iota_island_id, k_index, lat, lon, my_lat, my_lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, clublog_qso_upload_date, clublog_qso_upload_status, max_bursts, ms_shower, my_antenna, my_city, my_cnty, my_country, my_cq_zone, my_name, name, operator, station_callsign, owner_callsign, my_rig, my_sig, my_sig_info, my_sota_ref, my_state, state, my_street, my_vucc_grids, notes, nr_bursts, nr_pings, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, tx_pwr, sat_mode, sat_name, sfi, sig, sota_ref, swl, ten_ten, vucc_grids, web, points, multiplier, lognumber) VALUES (:call, :qso_date, :bandid, :modeid, :srx, :stx, :srx_string, :stx_string, :qso_date_off, :band_rx, :rst_sent, :rst_rcvd, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, :ant_path, :arrl_sect, :checkcontest, :class, :contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :distance, :eq_call, :email, :eqsl_qslrdate, :eqsl_qslsdate, :eqsl_qsl_rcvd, :eqsl_qsl_sent, :force_init, :freq, :freq_rx, :gridsquare, :my_gridsquare, :iota, :iota_island_id, :my_iota, :my_iota_island_id, :k_index, :lat, :lon, :my_lat, :my_lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :clublog_qso_upload_date, :clublog_qso_upload_status, :max_bursts, :ms_shower, :my_antenna, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_name, :name, :operator, :station_callsign, :owner_callsign, :my_rig, :my_sig, :my_sig_info, :my_sota_ref, :my_state, :state, :my_street, :my_vucc_grids, :notes, :nr_bursts, :nr_pings, :pfx, :precedence, :prop_mode, :public_key, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, :qth, :rx_pwr, :tx_pwr, :sat_mode, :sat_name, :sfi, :sig, :sota_ref, :swl, :ten_ten, :vucc_grids, :web, :points, :multiplier, :lognumber)" ); /* if (db.transaction()) { //qDebug() << "FileManager::adifReadLog: Transaction Opened" << QT_ENDL; } else { //qDebug() << "FileManager::adifReadLog: Transaction NOT Opened" << QT_ENDL; } */ //file.seek(pos); fields.clear(); // while ( (!file.atEnd() ) && (!noMoreQso) && (sqlOK)) //time1.start(); while ((!noMoreQso) && (sqlOK)) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << "FileManager::adifReadLog-line:" << line << QT_ENDL; //fields.clear(); //TODO: Check if I should clear fields... I think I should not because I could loose data if a line contains data after an fields << line.split("<", QT_SKIP); } //TODO: Check what happens //qDebug() << "FileManager::adifReadLog START fields" << QT_ENDL; qsToPass.clear(); auxString.clear(); foreach (aux, fields) { QString fieldToCheck; fieldToCheck = "<" + aux; //QStringList _TEST; //_TEST.clear(); //_TEST << util->getValidADIFFieldAndData('<'+fields.at(0)); aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { //qsToPass << auxString + aux; qsToPass.last() = qsToPass.last() + auxString; //qDebug() << "FileManager::adifReadLog Modified in qsToPass: " << qsToPass.last() << QT_ENDL; qsToPass << aux.trimmed(); //qDebug() << "FileManager::adifReadLog Added to qsToPass: " << aux.trimmed() << QT_ENDL; auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << "FileManager::adifReadLog auxString: " << auxString << QT_ENDL; } //qDebug() << "FileManager::adifReadLog fields: " << aux << QT_ENDL; } //qDebug() << "FileManager::adifReadLog-W-1" << QT_ENDL; if (auxString.length()>0) { //qDebug() << "FileManager::adifReadLog auxString2: " << auxString << QT_ENDL; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << "FileManager::adifReadLog END fields" << QT_ENDL; //qDebug() << "FileManager::adifReadLog Mod: " << qsToPass.join("/") << QT_ENDL; //qDebug() << "FileManager::adifReadLog END2 fields" << QT_ENDL; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << "FileManager::adifReadLog: fields contains EOR>" << QT_ENDL; preparedQuery.bindValue( ":lognumber", logN); while ( (!EOR) && (!fields.isEmpty()) ) { //qDebug() << "FileManager::adifReadLog-W-2" << QT_ENDL; fieldToAnalyze = (fields.takeFirst()).trimmed(); if ( fieldToAnalyze.contains("EOR>") ) { //qDebug() << "FileManager::adifReadLog-W-2.1" << QT_ENDL; currentQSOfields << fieldToAnalyze; isDupeQSO = processQsoReadingADIF(currentQSOfields, logN); if (isDupeQSO && (!askedToAddDupeQSOs)) { askedToAddDupeQSOs = true; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Add new QSOs?")); QString aux = QString(tr("Do you want to add dupe QSOs to your local log?")); msgBox.setText(aux); msgBox.setDetailedText(tr("There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: addDupeQSOs = true; break; case QMessageBox::No: addDupeQSOs = false; break; default: // should never be reached break; } //qDebug() << "FileManager::adifReadLog: isDupeQSO = true" << QT_ENDL; } } else { //qDebug() << "FileManager::adifReadLog: Not contains EOR" << QT_ENDL; if ((!fieldToAnalyze.contains('>')) && (currentQSOfields.length()>0)) { //qDebug() << "FileManager::adifReadLog: Contains > & currentsQSOfields.length>0" << QT_ENDL; auxString = currentQSOfields.at(currentQSOfields.length()-1); auxString = auxString + "\n" + fieldToAnalyze; //currentQSOfields.at(currentQSOfields.length()) = auxString; fieldToAnalyze = auxString; } currentQSOfields << fieldToAnalyze; EOR = false; } } if ((!isDupeQSO) || (addDupeQSOs)) { sqlOK = preparedQuery.exec(); } else { //qDebug() << "FileManager::adifReadLog: DUPE QSO, not adding it" << QT_ENDL; } //qDebug() << "FileManager::adifReadLog: executedQuery1: " << preparedQuery.executedQuery() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: executedQuery2: " << preparedQuery.executedQuery() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: LastQuery2: " << preparedQuery.lastQuery() << QT_ENDL; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifReadLog: MOD 0 - i = " << QString::number(i) << QT_ENDL; //aux = QString(tr("Importing LoTW ADIF file...\n QSO: %1/%2\nImporting speed: 0 QSOs/sec")).arg(i).arg(numberOfQsos); /* *qDebug() << "FileManager::adifReadLog: " << QString::number(step) << QT_ENDL; //qDebug() << "FileManager::adifReadLog: " << QString::number(time1.elapsed()) << QT_ENDL; //qDebug() << "FileManager::adifReadLog: " << QString::number(time1.elapsed()/1000) << QT_ENDL; //qDebug() << "FileManager::adifReadLog: " << QString::number(step / (time1.elapsed()/1000)) << QT_ENDL; if (time1.elapsed()/1000 != 0) { aux = QString(tr("Importing LoTW ADIF file...\n QSO: %1/%2\nImporting speed: %3 QSOs/sec")).arg(i).arg(numberOfQsos).arg(step / (time1.elapsed()/1000)); } else { aux = QString(tr("Importing LoTW ADIF file...\n QSO: %1/%2\nImporting speed: 0 QSOs/sec")).arg(i).arg(numberOfQsos); } time1.restart(); */ aux = tr("Importing ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } else { //qDebug() << "FileManager::adifReadLog: Mod: "<< QString::number(i) << " mod " << QString::number(step) << " = " << QString::number(i % step) << QT_ENDL; } if (sqlOK) { //qDebug() << "FileManager::adifReadLog: (1) in While sqlOK (QSO added) = TRUE" << QT_ENDL; } else { //errorCode = preparedQuery.lastError().nativeErrorCode(); //qDebug() << "FileManager::adifReadLog: QSO DUPE" << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (1) LastQuery: " << preparedQuery.lastQuery() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (1) LastError-data: " << preparedQuery.lastError().databaseText() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (1) LastError-driver: " << preparedQuery.lastError().driverText() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (1) LastError-n: " << QString::number(preparedQuery.lastError().nativeErrorCode() ) << QT_ENDL; if (((preparedQuery.lastError().nativeErrorCode()).toInt() == 19) && (!ignoreErrorCode19)) { // There are some repeated QSO QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Duplicated QSOs")); aux = tr("It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked YES" << QT_ENDL; sqlOK = true; break; case QMessageBox::YesToAll: // Yes was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked YES to ALL" << QT_ENDL; ignoreErrorCode19 = true; sqlOK = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << "FileManager::adifReadLog: (1) clicked NO" << QT_ENDL; sqlOK = false; break; default: // should never be reached sqlOK = true; //qDebug() << "FileManager::adifReadLog: (1) default" << QT_ENDL; break; } //; } else if(((preparedQuery.lastError().nativeErrorCode()).toInt() == 19) && (ignoreErrorCode19)) { sqlOK = true; //qDebug() << "FileManager::adifReadLog: errorCode=19 && ignoreErrorCode19" << QT_ENDL; } else { //qDebug() << "FileManager::adifReadLog: (2) LastQuery: " << preparedQuery.lastQuery() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (2) LastError-data: " << preparedQuery.lastError().databaseText() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (2) LastError-driver: " << preparedQuery.lastError().driverText() << QT_ENDL; //qDebug() << "FileManager::adifReadLog: (2) LastError-n: " << QString::number(preparedQuery.lastError().nativeErrorCode() ) << QT_ENDL; emit queryError( Q_FUNC_INFO, preparedQuery.lastError().databaseText(), preparedQuery.lastError().nativeErrorCode(), preparedQuery.lastQuery()); noMoreQso = true; /* QMessageBox msgBox; aux = tr("An unexpected error ocurred while importing. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-1 #" + QString::number(errorCode) ); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked //sqlOK = false; //qDebug() << "FileManager::adifReadLog: (2) I have just set sqlOK=False (1)" << QT_ENDL; noMoreQso = true; return; break; default: // should never be reached //sqlOK = false; //qDebug() << "FileManager::adifReadLog: (2) I have just set sqlOK=False (2)" << QT_ENDL; break; } */ } } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); aux = QString(tr("You have canceled the file import. The file will be removed and no data will be imported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } currentQSOfields.clear(); queryPreparation(logN); // to clear Values //progress.setValue(i); i++; } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << "FileManager::adifReadLog: fields DOES NOT contains EOR>" << QT_ENDL; } //TODO: Check how to stop the importing process } // END OF WHILE if (noMoreQso) { //qDebug() << "FileManager::adifReadLog: noMoreQso = true" << QT_ENDL; progress.setValue(numberOfQsos); } else { //qDebug() << "FileManager::adifReadLog: noMoreQso = false" << QT_ENDL; } if (sqlOK) { //qDebug() << "FileManager::adifReadLog: sqlOK = true" << QT_ENDL; } else { //qDebug() << "FileManager::adifReadLog: sqlOK = false" << QT_ENDL; } if (sqlOK) { /* if (db.commit()) { //qDebug() << "FileManager::adifReadLog: Last commit OK" << QT_ENDL; } else { errorCode = preparedQuery.lastError().nativeErrorCode(); QMessageBox msgBox; aux = tr("An error ocurred while importing. No data will be imported. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-3 #" + QString::number(errorCode)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked sqlOK = false; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (5)" << QT_ENDL; break; default: // should never be reached sqlOK = false; //qDebug() << "FileManager::adifReadLog: I have just set sqlOK=False (6)" << QT_ENDL; break; } if (db.rollback()) {} else { //TODO: Check the error if db.rollback returns false } } */ } else { //qDebug() << "FileManager::adifReadLog: sqlOK = NOK" << QT_ENDL; } progress.setValue(numberOfQsos); //qDebug() << "FileManager::adifReadLog END " << QT_ENDL; return true; } bool FileManager::processQsoReadingADIF(const QStringList &_line, const int logNumber) //, const bool _keepLogsInFile) //bool FileManager::processQsoReadingADIF(const QStringList _line, const int logNumber, const bool _keepLogsInFile, QHash &_logs) { //qDebug() << "FileManager::processQsoReadingADIF: log: " << QString::number(logNumber) << QT_ENDL; //qDebug() << "FileManager::processQsoReadingADIF: log: " << _line.at(0) << QT_ENDL; //qDebug() << "FileManager::processQsoReadingADIF: " << _line.join("/") << QT_ENDL; //QHash &hashLogs = _logs; //QFile &file = _f; //bool keepLogsInF;// = _keepLogsInFile; //TODO: Check if needed or remove it completely. This line is just to remove a warning int i = -1; QDate date, dateT; date = QDate(); dateT = QDate(); QTime time; QDateTime dateTime, dateTimeOFF; dateTime = QDateTime(); QStringList qs = _line; QStringList oneField; QString field, data; QSqlQuery query; //confirmed = 0; // 0 means worked, 1 means confirmed //QString queryString, stringFields, stringData; QString aux; // Aux string QString aux2; QString qrzCall = QString(); QString submode = QString(); QString defaultRSTTX = util->getDefaultRST(QString()); QString defaultRSTRX = util->getDefaultRST(QString()); bool isDupeQSO = false; int modei = -1; int bandi = -1; int bandrxi = -1; bool rstRXr = false; bool rstTXr = false; //KLog does not understand (and will not import) a QSO without these fields bool haveCall = false; //QString wrongCall = QString(); bool haveBand = false; bool bandRXDef = false; bool haveMode = false; bool haveSubMode = false; bool haveTime = false; bool haveDate = false; bool haveTimeOff = false; bool haveDateOff = false; bool haveFreqTX = false; bool haveFreqRX = false; bool hasStationCall = false; bool hasLotwQslSent = false; bool hasEqslQslSent = false; bool hasQrzQslSent = false; bool hasClublogQslSent = false; QString freqTX = QString(); //bool ret; //int length = 0; //int currentLog = logNumber; //qDebug() << "FileManager::processQsoReadingADIF" << QString::number(qs.size()) << "/" << QString::number(logNumber) << QT_ENDL; //TODO: To remove the next line, it was just to measure the time it takes. ignoreUnknownAlways = true; QString str; //preparedQuery.bindValue( ":confirmed", '0' ); //qDebug() << "FileManager::processQsoReadingADIF: Entering the foreach" << QT_ENDL; foreach (str, qs) { //qDebug() << "FileManager::processQsoReadingADIF: " << str << QT_ENDL; if ( !( (str.contains(":")) && (str.contains(">")) ) ) { //qDebug() << "FileManager::processQsoReadingADIF: NOT (contains : and >): " << str << QT_ENDL; } else { //qDebug() << "FileManager::processQsoReadingADIF: (contains : and >): " << str << QT_ENDL; oneField = str.split(">", QT_SKIP); //qDebug() << "FileManager::processQsoReadingADIF: (oneField)" << oneField << QT_ENDL; if (checkADIFValidFormat(oneField)) { i = (qs.at(0)).count(":"); field = (oneField.at(0)).trimmed(); // Needs to be cleared FIELD:4:D data = (oneField.at(1)).trimmed(); data = util->checkAndFixASCIIinADIF(data); //qDebug() << "FileManager::processQsoReadingADIF: field/data" << field << "/" << data << QT_ENDL; if (i == 2) { // DATE:8:D / 20141020 //length = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else if (i == 1) { // DATE:8 / 20141020 //length = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 " << QT_ENDL; //return false; } //field = oneField.at(0).trimmed(); //data = oneField.at(1).trimmed(); //length = field.indexOf(":"); //field = field.left(length); //qDebug() << "FileManager::processQsoReadingADIF (field/data): " << field << "/" << data << QT_ENDL; if (field == "CALL") { //qDebug() << "FileManager::processQsoReadingADIF-CALL:" << data << QT_ENDL; qrzCall = data; haveCall = util->isValidCall(qrzCall); if (haveCall) { //qDebug() << "FileManager::processQsoReadingADIF-CALL: Have CALL!!" << QT_ENDL; preparedQuery.bindValue( ":call", qrzCall ); } //qDebug() << "FileManager::processQsoReadingADIF-CALL-END:" << data << QT_ENDL; } else if (field == "QSO_DATE") { //qDebug() << "FileManager::processQsoReadingADIF-QSO_DATE:" << data << QT_ENDL; dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { dateTime.setDate(dateT); haveDate = true; } else { //qDebug() << "FileManager::processQsoReadingADIF QSO_DATE is NOT VALID: " << data << QT_ENDL; } } else if (field == "BAND") { //preparedQuery.bindValue( ":bandid", data ); i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i>=0) { preparedQuery.bindValue( ":bandid", QString::number(i) ); haveBand = true; bandi = i; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i) << QT_ENDL; } else { //qDebug() << "FileManager::processQsoReadingADIF-Band - Wrong band: " << data << "/" << QString::number(i) << QT_ENDL; } /* queryString = QString("SELECT id FROM band WHERE name ='%1'").arg(data); query.exec(queryString); query.next(); if (query.isValid()) { preparedQuery.bindValue( ":bandid", query.value(0).toInt() ); //qDebug() << "FileManager::bprocessQsoReadingADIF-Band: " << data << QT_ENDL; } */ } else if (field == "MODE") { modei = dataProxy->getSubModeIdFromSubMode(data); // get modeid if (modei>=0) { { if (!haveSubMode) { preparedQuery.bindValue( ":modeid", QString::number(modei) ); haveMode = true; haveSubMode = true; submode = dataProxy->getSubModeFromId(modei); } } } } else if (field == "SUBMODE") { modei = dataProxy->getSubModeIdFromSubMode(data); if (modei>=0) { preparedQuery.bindValue( ":modeid", QString::number(modei) ); preparedQuery.bindValue( ":submode", QString::number(modei) ); haveSubMode = true; haveMode=true; submode = data; //submode = data; } } else if (field == "SRX") { preparedQuery.bindValue( ":srx", data ); //qDebug() << "FileManager::bprocessQsoReadingADIF-srx: " << data << QT_ENDL; } else if (field == "STX") { preparedQuery.bindValue( ":stx", data ); //qDebug() << "FileManager::bprocessQsoReadingADIF-stx: " << data << QT_ENDL; } else if (field == "TIME_ON") { time = util->getTimeFromADIFTimeString(data); if (time.isValid()) { dateTime.setTime(time); haveTime = true; } } else if (field == "QSO_DATE_OFF") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { dateTimeOFF.setDate(dateT); haveDateOff = true; } } else if (field == "BAND_RX") { i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i>=0) { preparedQuery.bindValue( ":band_rx", QString::number(i) ); bandRXDef = true; bandrxi = i; } } else if (field == "TIME_OFF") { time = util->getTimeFromADIFTimeString(data); if (time.isValid()) { dateTimeOFF.setTime(time); haveTimeOff = true; } } else if (field == "RST_SENT") { preparedQuery.bindValue( ":rst_sent", data ); //qDebug() << "FileManager::bprocessQsoReadingADIF-rst_rsent: " << data << QT_ENDL; rstTXr = true; } else if (field == "RST_RCVD") { //qDebug() << "FileManager::bprocessQsoReadingADIF-rst_rcvd: " << data << QT_ENDL; preparedQuery.bindValue( ":rst_rcvd", data ); rstRXr = true; } else if (field == "SRX_STRING") { preparedQuery.bindValue( ":srx_string", data ); } else if (field == "STX_STRING") { preparedQuery.bindValue( ":stx_string", data ); } else if (field == "CQZ") { preparedQuery.bindValue( ":cqz", data ); //cqz = data.toInt(); } else if (field == "ITUZ") { preparedQuery.bindValue( ":ituz", data ); //ituz = data.toInt(); } else if (field == "DXCC") { //dxcc = data.toInt(); preparedQuery.bindValue( ":dxcc", data ); } else if (field == "ADDRESS") { preparedQuery.bindValue( ":address", data ); } else if (field == "AGE") { preparedQuery.bindValue( ":age", data ); } else if (field == "CNTY") { preparedQuery.bindValue( ":cnty", data ); } else if (field == "COMMENT") { preparedQuery.bindValue( ":comment", data ); } else if (field == "A_INDEX") { preparedQuery.bindValue( ":a_index", data ); } else if (field == "ANT_AZ") { preparedQuery.bindValue( ":ant_az", data ); } else if (field == "ANT_EL") { preparedQuery.bindValue( ":ant_el", data ); } else if (field == "ANT_PATH") { preparedQuery.bindValue( ":ant_path", data ); } else if (field == "ARRL_SECT") { preparedQuery.bindValue( ":arrl_sect", data ); } else if (field == "AWARD_GRANTED") { preparedQuery.bindValue( ":award_granted", data ); } else if (field == "AWARD_SUBMITTED") { preparedQuery.bindValue( ":award_submitted", data ); } else if (field == "CHECKCONTEST") { preparedQuery.bindValue( ":checkcontest", data ); } else if (field == "CLASS") { preparedQuery.bindValue( ":class", data ); } else if (field == "CONT") { preparedQuery.bindValue( ":cont", data ); } else if (field == "CONTACTED_OP") { preparedQuery.bindValue( ":contacted_op", data ); } else if (field == "CONTEST_ID") { preparedQuery.bindValue( ":contest_id", data ); } else if (field == "COUNTRY") { preparedQuery.bindValue( ":country", data ); } else if (field == "CREDIT_SUBMITTED") { preparedQuery.bindValue( ":credit_submitted", data ); } else if (field == "CREDIT_GRANTED") { preparedQuery.bindValue( ":credit_granted", data ); } else if (field == "DISTANCE") { preparedQuery.bindValue( ":distance", data ); } else if (field == "DARC_DOK") { preparedQuery.bindValue( ":darc_dok", data ); } else if (field == "EQ_CALL") { preparedQuery.bindValue( ":eq_call", data ); } else if (field == "EMAIL") { if (data.contains("@") && (data.contains("."))) { preparedQuery.bindValue( ":email", data ); } } else if (field == "EQSL_QSLRDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":eqsl_qslrdate", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "EQSL_QSLSDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":eqsl_qslsdate", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "EQSL_QSL_RCVD") { preparedQuery.bindValue( ":eqsl_qsl_rcvd", data ); } else if (field == "EQSL_QSL_SENT") { preparedQuery.bindValue( ":eqsl_qsl_sent", data ); hasEqslQslSent = true; } else if (field == "FISTS") { preparedQuery.bindValue( ":fists", data ); } else if (field == "FISTS_CC") { preparedQuery.bindValue( ":fists_cc", data ); } else if (field == "FORCE_INIT") { preparedQuery.bindValue( ":force_init", data ); } else if (field == "FREQ") { //qDebug() << "FileManager::processQsoReadingADIF -FREQ: " << QString::number(data.toDouble()) << QT_ENDL; if (haveBand) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandi) //if (db->isThisFreqInBand(db->getBandNameFromNumber(bandi), data)) { preparedQuery.bindValue( ":freq", data); haveFreqTX =true; freqTX = data; } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue( ":freq", data); haveFreqTX =true; freqTX = data; i = dataProxy->getBandIdFromFreq(data.toDouble()); if (i>=0) { preparedQuery.bindValue( ":bandid", QString::number(i) ); haveBand = true; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i) << QT_ENDL; } } } else if (field == "FREQ_RX") { if (bandRXDef) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandrxi) { preparedQuery.bindValue( ":freq_rx", data); haveFreqRX =true; } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue( ":freq_rx", data); haveFreqRX = true; i = dataProxy->getBandIdFromFreq(data.toDouble()); if (i>=0) { preparedQuery.bindValue( ":band_rx", QString::number(i) ); bandRXDef = true; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i) << QT_ENDL; } } } else if (field == "GRIDSQUARE") { preparedQuery.bindValue( ":gridsquare", data ); } else if (field == "GUEST_OP") { preparedQuery.bindValue( ":guest_op", data ); } else if (field == "HRDLOG_QSO_UPLOAD_DATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":hrd_qso_upload_date", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "HRDLOG_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":hrd_qso_upload_status", data ); } else if (field == "MY_GRIDSQUARE") { preparedQuery.bindValue( ":my_gridsquare", data ); } else if (field == "MY_ANTENNA") { //qDebug() << ": MY_ANTENNA: " << data; preparedQuery.bindValue( ":my_antenna", data ); } else if (field == "IOTA") { //qDebug() << "FileManager::processQsoReadingADIF (IOTA): " << data << QT_ENDL; data = awards->checkIfValidIOTA(data); /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ if (data.length() == 6) { preparedQuery.bindValue( ":iota", data ); } } else if (field == "IOTA_ISLAND_ID") { preparedQuery.bindValue( ":iota_island_id", data ); } else if (field == "MY_IOTA") { /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ data = awards->checkIfValidIOTA(data); if (data.length() == 6) { preparedQuery.bindValue( ":my_iota", data ); } } else if (field == "MY_DXCC") { preparedQuery.bindValue( ":my_dxcc", data ); } else if (field == "MY_FISTS") { preparedQuery.bindValue( ":my_fists", data ); } else if (field == "MY_IOTA_ISLAND_ID") { preparedQuery.bindValue( ":my_iota_island_id", data ); } else if (field == "K_INDEX") { preparedQuery.bindValue( ":k_index", data ); } else if (field == "LAT") { preparedQuery.bindValue( ":lat", data ); } else if (field == "LON") { preparedQuery.bindValue( ":lon", data ); } else if (field == "MY_LAT") { preparedQuery.bindValue( ":my_lat", data ); } else if (field == "MY_LON") { preparedQuery.bindValue( ":my_lon", data ); } else if (field == "MY_ITU_ZONE") { preparedQuery.bindValue( ":my_itu_zone", data ); } else if (field == "MY_POSTAL_CODE") { preparedQuery.bindValue( ":my_postal_code", data ); } else if (field == "LOTW_QSLRDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":lotw_qslrdate", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "LOTW_QSLSDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":lotw_qslsdate", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "LOTW_QSL_RCVD") { preparedQuery.bindValue( ":lotw_qsl_rcvd", data ); } else if (field == "LOTW_QSL_SENT") { preparedQuery.bindValue( ":lotw_qsl_sent", data ); hasLotwQslSent = true; } else if (field == "CLUBLOG_QSO_UPLOAD_DATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":clublog_qso_upload_date", util->getDateSQLiteStringFromDate(dateT) ); hasClublogQslSent = true; } } else if (field == "CLUBLOG_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":clublog_qso_upload_status", data ); } else if (field == "MAX_BURSTS") { preparedQuery.bindValue( ":max_bursts", data ); } else if (field == "MS_SHOWER") { preparedQuery.bindValue( ":ms_shower", data ); } else if (field == "MY_CITY") { preparedQuery.bindValue( ":my_city", data ); } else if (field == "MY_CNTY") { preparedQuery.bindValue( ":my_cnty", data ); } else if (field == "MY_COUNTRY") { preparedQuery.bindValue( ":my_country", data ); } else if (field == "MY_CQ_ZONE") { preparedQuery.bindValue( ":my_cq_zone", data ); } else if (field == "MY_NAME") { preparedQuery.bindValue( ":my_name", data ); } else if (field == "NAME") { preparedQuery.bindValue( ":name", data ); } else if (field == "OPERATOR") { if (util->isValidCall(data)) { preparedQuery.bindValue( ":operator", data ); } } else if (field == "STATION_CALLSIGN") { if (util->isValidCall(data)) { hasStationCall = true; preparedQuery.bindValue( ":station_callsign", data ); } } else if (field == "OWNER_CALLSIGN") { if (util->isValidCall(data)) { preparedQuery.bindValue( ":owner_callsign", data ); } } else if (field == "MY_RIG") { preparedQuery.bindValue( ":my_rig", data ); } else if (field == "MY_SIG") { preparedQuery.bindValue( ":my_sig", data ); } else if (field == "MY_SIG_INFO") { preparedQuery.bindValue( ":my_sig_info", data ); } else if (field == "MY_SOTA_REF") { preparedQuery.bindValue( ":my_sota_ref", data ); } else if (field == "MY_STATE") { preparedQuery.bindValue( ":my_state", data ); } else if (field == "STATE") { preparedQuery.bindValue( ":state", data ); } else if (field == "MY_STREET") { preparedQuery.bindValue( ":my_street", data ); } else if (field == "MY_USACA_COUNTIES") { preparedQuery.bindValue( ":my_usaca_counties", data ); } else if (field == "MY_VUCC_GRIDS") { preparedQuery.bindValue( ":my_vucc_grids", data ); } else if (field == "NOTES") { preparedQuery.bindValue( ":notes", data ); } else if (field == "NR_BURSTS") { preparedQuery.bindValue( ":nr_bursts", data ); } else if (field == "NR_PINGS") { preparedQuery.bindValue( ":nr_pings", data ); } else if (field == "PFX") { preparedQuery.bindValue( ":pfx", data ); } else if (field == "PRECEDENCE") { preparedQuery.bindValue( ":precedence", data ); } else if (field == "PROP_MODE") { preparedQuery.bindValue( ":prop_mode", data ); } else if (field == "PUBLIC_KEY") { preparedQuery.bindValue( ":public_key", data ); } else if (field == "QRZCOM_QSO_UPLOAD_DATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":qrzcom_qso_upload_date", util->getDateSQLiteStringFromDate(dateT)); hasQrzQslSent = true; } } else if (field == "QRZCOM_QSO_UPLOAD_STATUS") { preparedQuery.bindValue( ":qrzcom_qso_upload_status", data ); } else if (field == "QSLMSG") { preparedQuery.bindValue( ":qslmsg", data ); } else if (field == "QSLRDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":qslrdate", util->getDateSQLiteStringFromDate(dateT)); } } else if (field == "QSLSDATE") { dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue( ":qslsdate", util->getDateSQLiteStringFromDate(dateT) ); } } else if (field == "QSL_RCVD") { preparedQuery.bindValue( ":qsl_rcvd", data ); //preparedQuery.bindValue( ":confirmed", '1' ); } else if (field == "QSL_SENT") { preparedQuery.bindValue( ":qsl_sent", data ); } else if (field == "QSL_RCVD_VIA") { preparedQuery.bindValue( ":qsl_rcvd_via", data ); } else if (field == "QSL_SENT_VIA") { preparedQuery.bindValue( ":qsl_sent_via", data ); } else if (field == "QSL_VIA") { //qDebug() << "FileManager::bprocessQsoReadingADIF-QSL_VIA: " << data << QT_ENDL; if (data == "BUREAU") // This comprobation is to "correct" old logs, mainly from KLog // comming from older ADIF files { preparedQuery.bindValue( ":qsl_sent_via", "B" ); } else if ( (data == "B") || (data == "D") || (data == "E") )// M Deprecated value from ADIF 304 { preparedQuery.bindValue( ":qsl_via", data ); } else { // If values are not valid, are not imported. //TODO: Send an error to the user to show that there was an invalid field } } else if (field == "QSO_COMPLETE") { preparedQuery.bindValue( ":qso_complete", data ); } else if (field == "QSO_RANDOM") { preparedQuery.bindValue( ":qso_random", data ); } else if (field == "QTH") { preparedQuery.bindValue( ":qth", data ); } else if (field == "REGION") { preparedQuery.bindValue( ":region", data ); } else if (field == "RIG") { preparedQuery.bindValue( ":rig", data ); } else if (field == "RX_PWR") { //qDebug() << "FileManager::bprocessQsoReadingADIF-rx_pwr: " << data << QT_ENDL; preparedQuery.bindValue( ":rx_pwr", data); } else if (field == "TX_PWR") { //qDebug() << "FileManager::bprocessQsoReadingADIF-tx_pwr: " << data << QT_ENDL; preparedQuery.bindValue( ":tx_pwr", data); } else if (field == "SAT_MODE") { preparedQuery.bindValue( ":sat_mode", data ); } else if (field == "SAT_NAME") { preparedQuery.bindValue( ":sat_name", data ); } else if (field == "SFI") { preparedQuery.bindValue( ":sfi", data ); } else if (field == "SIG") { preparedQuery.bindValue( ":sig", data ); } else if (field == "SIG_INFO") { preparedQuery.bindValue( ":sig_info", data ); } else if (field == "SILENT_KEY") { preparedQuery.bindValue( ":silent_key", data ); } else if (field == "SKCC") { preparedQuery.bindValue( ":skcc", data ); } else if (field == "SOTA_REF") { preparedQuery.bindValue( ":sota_ref", data ); } else if (field == "SWL") { preparedQuery.bindValue( ":swl", data ); } else if (field == "TEN_TEN") { preparedQuery.bindValue( ":ten_ten", data ); } else if (field == "UKSMG") { preparedQuery.bindValue( ":uksmg", data ); } else if (field == "USACA_COUNTIES") { preparedQuery.bindValue( ":usaca_counties", data ); } else if (field == "VE_PROV") { preparedQuery.bindValue( ":ve_prov", data ); } else if (field == "VUCC_GRIDS") { preparedQuery.bindValue( ":vucc_grids", data ); } else if (field == "WEB") { preparedQuery.bindValue( ":web", data ); } else if (field == "APP_KLOG_POINTS") //Importing own ADIF fields { preparedQuery.bindValue( ":points", data ); } else if (field == "APP_KLOG_MULTIPLIER") //Importing own ADIF fields { preparedQuery.bindValue( ":multiplier", data ); } else if (field == "APP_KLOG_TRX") //Importing own ADIF fields { preparedQuery.bindValue( ":transmiterid", data ); } else if (field == "APP_KLOG_LOGN") //Lognumber in a multiple-log file { //TODO: Think about how to import a file with different logs //isThisQSODuplicated(const QString &_qrz, const QString &_date, const QString &_time, const int _band, const int _mode) } else if (field == "APP_N1MM_POINTS") //Importing from N1MM { preparedQuery.bindValue( ":points", data ); } } else { //qDebug() << "FileManager::processQsoReadingADIF (field) CheckAdif FALSE: " << field << QT_ENDL; } } } if ( haveCall && haveDate && haveTime && haveBand && haveMode) { QList _dupeQSOs; _dupeQSOs.clear(); _dupeQSOs << dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qrzCall, dateTime, bandi, modei, duplicatedQSOSlotInSecs); if (_dupeQSOs.length()>0) { isDupeQSO = true; } //QList DataProxy_SQLite::isThisQSODuplicated(const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs) } if ( (haveDate) && (haveTime)) { preparedQuery.bindValue( ":qso_date", util->getDateTimeSQLiteStringFromDateTime(dateTime)); //preparedQuery.bindValue( ":time_on", dateTime.toString("hhmmss")); } if ( (haveDateOff) && (haveTimeOff)) { preparedQuery.bindValue( ":qso_date_off", util->getDateTimeSQLiteStringFromDateTime(dateTimeOFF)); } if ((haveBand) && (!haveFreqTX)) { preparedQuery.bindValue( ":freq", dataProxy->getFreqFromBandId(bandi)); } if ((bandRXDef) && (!haveFreqRX)) { preparedQuery.bindValue( ":freq_rx", dataProxy->getFreqFromBandId(bandrxi)); } if ((haveFreqTX) && (!haveFreqRX)) { preparedQuery.bindValue( ":freq_rx", freqTX); } if (!haveCall) { QString text = util->getAValidCall(qrzCall); if (!(util->isValidCall(text))) { haveCall = true; qrzCall = text; } else { qrzCall = QString(); haveCall = false; } } if (!(haveBand && haveMode && haveTime && haveDate )) { //qDebug() << "FileManager::processQsoReadingADIF (Don't have all mandatory fields): " << QT_ENDL; aux2 = tr ("This QSO is not including the minimum data to consider a QSO as valid!") + "\n\n\n" + tr("Please edit the ADIF file and make sure that it include at least:") + "\n\nCALL, QSO_DATE, TIME_ON, BAND "+ tr("and") +" MODE.\n\n" + tr("This QSO had:") + "\n"; if (!haveBand) { aux2 = aux2 + tr(" - The band missing and the following call: ") + qrzCall + ".\n"; } if (!haveMode) { aux2 = aux2 + tr(" - The mode missing and the following call: ") + qrzCall + ".\n"; } if (!haveDate) { aux2 = aux2 + tr(" - The date missing and the following call: ") + qrzCall + ".\n"; } if (!haveTime) { aux2 = aux2 + tr(" - The time missing and the following call: ") + qrzCall + ".\n"; } aux2 = aux2 + "\n\n" + tr("Do you want to continue with the current file?"); //qDebug() << "FileManager::processQsoReadingADIF - Missing fields: " << aux2 << QT_ENDL; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog: Not all required data found!")); msgBox.setText(aux2); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked break; case QMessageBox::Cancel: noMoreQso = true; break; default: // should never be reached break; } } if ((!rstTXr) && (!rstTXDefault)) { //submode = dataProxy->getSubModeFromId(i); defaultRSTTX = util->getDefaultRST(submode); QMessageBox msgBox; aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem.").arg(defaultRSTTX).arg(submode) + "\n\n" + tr("If you select NO, maybe the QSO will not be imported."); msgBox.setWindowTitle(tr("KLog: No RST TX found!")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstTXDefault = true; break; default: // should never be reached rstTXDefault = false; break; } } if ((!rstRXr) && (!rstRXDefault)) { defaultRSTRX = util->getDefaultRST(submode); QMessageBox msgBox; //aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default 59 to all QSO with a similar problem.") + "\n\n" + tr("If you select NO, the QSO may not be imported."); aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem.").arg(defaultRSTRX).arg(submode) + "\n\n" + tr("If you select NO, maybe the QSO will not be imported."); msgBox.setText(aux); msgBox.setWindowTitle(tr("KLog: No RST RX found!")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstRXDefault = true; break; default: // should never be reached rstRXDefault = false; break; } } if ((!rstTXr) && (rstTXDefault)) { preparedQuery.bindValue( ":rst_sent", defaultRSTTX ); } if ((!rstRXr) && (rstRXDefault)) { preparedQuery.bindValue( ":rst_rcvd", defaultRSTRX ); } if ((!hasStationCall) ) { if (!usePreviousStationCallsignAnswerAlways) { QMessageBox msgBox; if(getStationCallsignFromUser(qrzCall, dateTime.date())) { hasStationCall = true; } else { msgBox.setWindowTitle(tr("KLog - No Station callsign entered.")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText("KLog - No Station callsign entered."); msgBox.setInformativeText("Not entering a valid Station Callsign may create problems in some ocasions, like when uploading data to LoTW.\n\n Do you want to try again?"); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { if (!getStationCallsignFromUser(qrzCall, dateTime.date())) { msgBox.setWindowTitle(tr("KLog - No Station callsign entered.")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText("KLog - No Station callsign entered."); msgBox.setInformativeText("No valid station callsign to add to the QSO."); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { hasStationCall = true; } } } msgBox.setWindowTitle(tr("KLog - Apply to all QSOs in this log?")); msgBox.setIcon(QMessageBox::Question); msgBox.setText("KLog - Do you want to use the same answer for all the QSOs in this log?"); msgBox.setInformativeText("KLog can use the same answer that you provided to all the QSOs in this logfile when importing it."); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { usePreviousStationCallsignAnswerAlways = true; } else { usePreviousStationCallsignAnswerAlways = false; } } //qDebug() << "FileManager::processQsoReadingADIF defaultStationCallsign: " << defaultStationCallsign << QT_ENDL; if ((hasStationCall) || (util->isValidCall(defaultStationCallsign))) { preparedQuery.bindValue( ":station_callsign", defaultStationCallsign ); } if (!hasLotwQslSent) { preparedQuery.bindValue( ":lotw_qsl_sent","Q"); } if (!hasEqslQslSent) { preparedQuery.bindValue( ":eqsl_qsl_sent","Q"); } if (!hasClublogQslSent) { preparedQuery.bindValue( ":clublog_qso_upload_status","M"); } if (!hasQrzQslSent) { preparedQuery.bindValue( ":qrzcom_qso_upload_status","M"); } } preparedQuery.bindValue( ":lognumber", QString::number(logNumber)); return isDupeQSO; } bool FileManager::getStationCallsignFromUser(const QString &_qrzDX, const QDate &_dt) { //qDebug() << "FileManager::getStationCallsignFromUser: " << _qrzDX << "/" << util->getDateSQLiteStringFromDate(_dt) << "-" << QT_ENDL; bool ok; QString text; QString aux; QString _date = QString(); if (_dt.isValid()) { _date = ", on "+ util->getDateSQLiteStringFromDate(_dt) ; } if (util->isValidCall(_qrzDX)) { aux = tr("KLog has found one QSO without the Station Callsign defined.\n\nEnter the Station Callsign that was used to do this QSO with %1 on %2:").arg(_qrzDX).arg(_date); text = QInputDialog::getText(this, tr("KLog - QSO without Station Callsign"), aux, QLineEdit::Normal, "", &ok); } else { text = QInputDialog::getText(this, tr("KLog - QSO without Station Callsign"), tr("KLog has found one QSO without the Station Callsign defined.\n\nEnter the Station Callsign that was used to do this QSO on %1:").arg(_date), QLineEdit::Normal, "", &ok); } if (ok && util->isValidCall(text)) { defaultStationCallsign = text.toUpper(); return true; } else { return false; } } void FileManager::queryPreparation(const int _logN) { //qDebug() << "FileManager::queryPreparation log: " << QString::number(_logN) << QT_ENDL; //Prepares the query, ALL fields to default except lognumber, as may change... QStringList columns; columns.clear(); columns << dataProxy->getColumnNamesFromTableLog(); if (columns.size()<2) { //qDebug() << "FileManager::queryPreparation: <2 " << QT_ENDL; return; } for (int i=0;i'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0) << QT_ENDL; //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1) << QT_ENDL; if (!logs.contains(data.at(1))) { logs.append(data.at(1)); } } } } else if (line.contains("EOR")) { atLeastOneLog = true; } } //qDebug() << "FileManager::howManyLogsInFile: JUST ONE!" << aux << QT_ENDL; file.close(); if ( (logs.size()<2) && atLeastOneLog ) { return 1; } return logs.size(); } bool FileManager::fillHashLog(QFile &_f) { //qDebug() << "FileManager::fillHashLog:" << QT_ENDL; //hashLogs //1.- Run the log and fill hashLogs //2.- Run the file and continue the log series to be able to translate the files log into our own log hashLogs.clear(); QStringList qs; qs.clear(); qs << dataProxy->getListOfManagedLogs(); int i = 0; for (i=0;i'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0) << QT_ENDL; //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1) << QT_ENDL; if (!logs.contains(QString::number(data.at(1).toInt()+10000))) { logs.append(QString::number(data.at(1).toInt()+10000)); } } } } else if (line.contains("EOR")) { //atLeastOneLog = true; } } file.close(); return logs; } void FileManager::setVersion(const QString &_version) { util->setVersion(_version); } QStringList FileManager::readAdifField(const QString &_field) { // This function receives a QString with an ADIF field and returns a QStringList with the following format: // ADIF-tag, value // If the QString is not an ADIF tag, it returns a clear QStringList. // We are expecting the ADIF format: // D // Data //qDebug() << "FileManager::readAdifField: " << _field << QT_ENDL; QStringList result; result.clear(); if (_field == "") { //qDebug() << "FileManager::readAdifField: EOR found!!" << QT_ENDL; result << "EOR" << "EOR"; return result; } if (!((_field.startsWith("<")) && (_field.contains(":")) && (_field.contains(">")))) { //qDebug() << "FileManager::readAdifField: NOT (contains : and >): " << _field << QT_ENDL; return QStringList(); } // Now we have the data in the result[1] result = _field.split(">", QT_SKIP); // Remove the first '<' and split in field & data QString data = result.at(1); QStringList fieldList; fieldList.clear(); fieldList << (result.at(0)).split(':'); // we may have 1 or 2 depending on the format of the ADIF field. int iAux = fieldList.length(); //qDebug() << "FileManager::readAdifField: iAux: " << QString::number(iAux) << QT_ENDL; int dataLength; QString field; QString fieldType; //qDebug() << "FileManager::readAdifField: analyzing..." << QT_ENDL; if (iAux == 2) { field = fieldList.at(0); dataLength = (fieldList.at(1)).toInt(); fieldType = QString(); } else if (iAux == 3) { field = fieldList.at(0); dataLength = (fieldList.at(1)).toInt(); fieldType = fieldList.at(2); } else { // Not valid ADIF //qDebug() << "FileManager::readAdifField: iAux != 1, 2" << QT_ENDL; return QStringList(); } field.remove('<'); data = data.left(dataLength); //qDebug() << "FileManager::readAdifField: field: " << field << QT_ENDL; //qDebug() << "FileManager::readAdifField: dataLength: " << QString::number(dataLength) << QT_ENDL; //qDebug() << "FileManager::readAdifField: data: " << data << QT_ENDL; //qDebug() << "FileManager::readAdifField: fieldType: " << fieldType << QT_ENDL; if (data.length() != dataLength) { //qDebug() << "FileManager::readAdifField: data.length != dataLength: " << QString::number(data.length()) << "/" << QString::number(dataLength) << QT_ENDL; return QStringList(); } result.clear(); result << field << data; //qDebug() << "FileManager::readAdifField: OK: " << field << "/" << data << QT_ENDL; return result; } QString FileManager::prepareStringLog() { //qDebug() << "FileManager::prepareStringLog: " << QT_ENDL; QStringList columns; columns.clear(); columns << dataProxy->getColumnNamesFromTableLog(); if (columns.size()<2) { //qDebug() << "FileManager::prepareStringLog: <2 " << QT_ENDL; return QString(); } QString queryFields, queryValues; queryFields.clear(); queryValues.clear(); for (int i=0;igetCfgFile() << QT_ENDL; QFile file (util->getCfgFile()); QString line; QStringList fields; fields.clear(); QDateTime _dataTime = QDateTime(); if (file.open (QIODevice::ReadOnly)) /* Flawfinder: ignore */ { while ( !file.atEnd() ) { line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("LATESTBACKUP")) { fields << line.split("=", QT_SKIP); line = fields.at(1); line.truncate(15); return _dataTime.fromString(line, "yyyyMMdd-hhmmss"); } } } return QDateTime(); } bool FileManager::writeBackupDate() { //qDebug() << "FileManager::writeBackupDate: current: " << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss") << QT_ENDL; //qDebug() << "FileManager::writeBackupDate: current: " << (getDateTimeOfLastBackup()).toString("yyyyMMdd-hhmmss") << QT_ENDL; QFile file (util->getCfgFile()); QString line, lineTemp; //QStringList fields; //fields.clear(); QDateTime _dataTime = QDateTime(); QStringList completeFile; completeFile.clear(); if(file.open(QIODevice::ReadWrite | QIODevice::Text)) /* Flawfinder: ignore */ { QString s; QTextStream t(&file); while(!t.atEnd()) { QString line = t.readLine(); if ( !(line.toUpper()).contains("LATESTBACKUP") ) { s.append(line + "\n"); } } s.append("LatestBackup=" + (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss") + ";\n" ); file.resize(0); t << s; file.close(); } return true; } void FileManager::setStationCallSign(const QString& _st) { //qDebug() << "FileManager::setStationCallSign: " << _st << QT_ENDL; if (util->isValidCall(_st)) { //qDebug() << "FileManager::setStationCallSign: True" << QT_ENDL; defaultStationCallsign = _st; //qDebug() << "FileManager::setStationCallSign: " << defaultStationCallsign << QT_ENDL; } else { //qDebug() << "FileManager::setStationCallSign: FALSE" << QT_ENDL; } //qDebug() << "FileManager::setStationCallSign: -" << defaultStationCallsign << "-END" << QT_ENDL; } bool FileManager::askUserToUseAlwaysSameAnswer() { //qDebug() << "FileManager::askUserToUseAlwaysSameAnswer: " << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Don't ask again")); msgBox.setText(tr("Do you want to reuse your answer?")); msgBox.setInformativeText(tr("KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } //qDebug() << "FileManager::askUserToUseAlwaysSameAnswer: - END" << QT_ENDL; } bool FileManager::askUserToAddThisQSOToLog(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate) { //qDebug() << "FileManager::askUserToAddThisQSOToLog: " << _call << QT_ENDL; QString qsoData = QString(tr("
  • Date/Time: %1
  • Callsign: %2
  • Band: %3
  • Mode: %4
")).arg(util->getDateTimeSQLiteStringFromDateTime(_datetime)).arg(_call).arg(_band).arg(_mode); QMessageBox msgBox; msgBox.setTextFormat(Qt::RichText); msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QSO not found")); msgBox.setText(tr("Do you want to add this QSO to the log?:\n\n") + qsoData); msgBox.setInformativeText(tr("We have found a QSO coming from LoTW that is not in your local log.\n\nDo you want KLog to add this QSO to the log?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } //qDebug() << "FileManager::askUserToAddThisQSOToLog: - END" << QT_ENDL; } bool FileManager::showInvalidCallMessage(const QString &_call){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Invalid call detected")); QString aux = _call; if (aux.length()<1) { aux = QString(tr("An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file?")); } else { aux = QString(tr("An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file?").arg(aux)); } msgBox.setText(aux); msgBox.setInformativeText(tr("Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } } void FileManager::writeADIFHeader(QTextStream &out, const ExportMode _em, const int _numberOfQsos) { if (_em == ModeEQSL) { out << "ADIF v3.1.0 Export from KLog\nKLog " << QT_ENDL; } else { out << "ADIF v3.1.0 Export from KLog\nhttps://www.klog.xyz/klog\n" << klogVersion << "\nKLOG " << QT_ENDL; out << "" << QString::number(_numberOfQsos) << QT_ENDL; out << "" << QDateTime::currentDateTime().toString("yyyyMMdd-hhmm") << QT_ENDL; } out << "" << QT_ENDL; } void FileManager::writeQuery(QSqlQuery query, QTextStream &out, const ExportMode _em, const bool _justMarked, const bool _onlyRequested, const int _logN ) { //qDebug() << "FileManager::writeQuery: " << query.lastQuery() << QT_ENDL; int nameCol; QString aux; bool propsat = false; // Reset the QSO in case it is a Satellite QSO QSqlRecord rec = query.record(); if (_justMarked) { nameCol = rec.indexOf("marked"); aux = (query.value(nameCol)).toString(); if (aux != "X") { return; } } if (_onlyRequested) { nameCol = rec.indexOf("qsl_sent"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( aux !="R" ) { return; } } nameCol = rec.indexOf("call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery: " << QString::number(nameCol) << "/" << aux << QT_ENDL; if (util->isValidCall(aux)) { out << "" << aux << " "; } else { if (showInvalidCallMessage(aux)) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qso_date"); QDateTime tDateTime; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); out << "" << aux << " "; aux = util->getADIFTimeFromQDateTime(tDateTime); if (_em == ModeEQSL) { aux.chop(2); out << "" << aux << " "; } else { out << "" << aux << " "; } } } nameCol = rec.indexOf("bandid"); QString bandst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::writeQuery-Band-1: " << aux << QT_ENDL; aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery-Band-2: " << aux << QT_ENDL; aux = dataProxy->getNameFromBandId(aux.toInt()); if (dataProxy->getIdFromBandName(aux)>=0) { //out << "" << aux << " "; bandst = aux; } } nameCol = rec.indexOf("freq"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::adifLogExportReturnList FREQ1: " << aux << QT_ENDL; aux = util->checkAndFixASCIIinADIF(aux); double freqTX = aux.toDouble(); if (freqTX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(freqTX) != dataProxy->getIdFromBandName(bandst)) { bandst = dataProxy->getBandNameFromFreq(freqTX); } if (_em != ModeEQSL) { out << "" << aux << " "; } } if (dataProxy->getIdFromBandName(bandst)>0) { out << "" << bandst << " "; } } // Now the BAND RX nameCol = rec.indexOf("band_rx"); QString bandrxst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = dataProxy->getNameFromBandId(aux.toInt()); if (dataProxy->getIdFromBandName(aux)>=0) { bandrxst = aux; } } nameCol = rec.indexOf("freq_rx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqRX = aux.toDouble(); if (freqRX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(freqRX) != dataProxy->getIdFromBandName(bandrxst)) { bandrxst = dataProxy->getBandNameFromFreq(freqRX); } out << "" << aux << " "; } if (dataProxy->getIdFromBandName(bandrxst)>0) { out << "" << bandrxst << " "; } // END of Band RX } nameCol = rec.indexOf("modeid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); // get SubModeId to check if it is the same or not from modeid QString aux2 = dataProxy->getSubModeFromId(aux.toInt()); //aux = db->getModeNameFromID2(aux.toInt()); aux = dataProxy->getNameFromSubMode(aux2); if ((aux.length()>1) && (dataProxy->getIdFromModeName(aux)>=0)) { out << "" << aux << " "; } if ((aux != aux2) && (aux.length()>1) && (dataProxy->getSubModeIdFromSubMode(aux2)>=0) ) { out << "" << aux2 << " "; } } nameCol = rec.indexOf("prop_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>1) { out << "" << aux << " "; if (aux == "SAT") { propsat = true; } } //qDebug() << "FileManager::writeQuery: PROP_MODE" << QT_ENDL; } nameCol = rec.indexOf("sat_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; if (!propsat && (_em == ModeLotW)) { out << "SAT "; propsat = false; } } //qDebug() << "FileManager::writeQuery: SAT_NAME" << QT_ENDL; } nameCol = rec.indexOf("gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("station_callsign"); if ((nameCol>=0) && (_em != ModeEQSL)) { aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::writeQuery: StationCallSign: " << aux << QT_ENDL; if ((util->isValidCall(aux))) { // User selected one station callsign from the log out << "" << aux << " "; } } nameCol = rec.indexOf("qso_date_off"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); out << "" << aux << " "; aux = util->getADIFTimeFromQDateTime(tDateTime); out << "" << aux << " "; } } nameCol = rec.indexOf("srx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("srx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("stx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("stx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } //qDebug() << "FileManager::writeQuery - 100" << QT_ENDL; nameCol = rec.indexOf("cqz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < CQZones+1) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("ituz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < ITUZones+1) ) { out << "" << aux << " "; } //qDebug() << "FileManager::writeQuery: DXCC - Now..." << QT_ENDL; } nameCol = rec.indexOf("dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; //qDebug() << "FileManager::writeQuery: DXCC " << aux << QT_ENDL; } //qDebug() << "FileManager::writeQuery: DXCC - Exported!" << QT_ENDL; } nameCol = rec.indexOf("address"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("age"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("comment"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } //qDebug() << "FileManager::writeQuery - 200" << QT_ENDL; } nameCol = rec.indexOf("a_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_az"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_el"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_path"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("arrl_sect"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("checkcontest"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } //qDebug() << "FileManager::writeQuery - 30" << QT_ENDL; nameCol = rec.indexOf("class"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("cont"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("contacted_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("contest_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("points"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("multiplier"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } //qDebug() << "FileManager::writeQuery - 40" << QT_ENDL; } nameCol = rec.indexOf("transmiterid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("credit_submitted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("credit_granted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("distance"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("darc_dok"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("eq_call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("email"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { if (aux.contains("@") && (aux.contains("."))) { out << "" << aux << " "; } } } nameCol = rec.indexOf("eqsl_qslrdate"); QDate date; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("fists_cc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("force_init"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("guest_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_antenna"); //qDebug() << Q_FUNC_INFO << ": my_antenna-0"; if (nameCol>=0) { //qDebug() << Q_FUNC_INFO << ": my_antenna-1"; aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << Q_FUNC_INFO << ": my_antenna: " << aux; if ((aux.length())>0) { //qDebug() << Q_FUNC_INFO << ": my_antenna ... printing..."; out << "" << aux << " "; } } //qDebug() << Q_FUNC_INFO << ": my_antenna-99"; nameCol = rec.indexOf("my_dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery (IOTA): " << aux << QT_ENDL; if (((aux.length())>=4) && ((aux.length())<=6)) { out << "" << aux << " "; } } nameCol = rec.indexOf("iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery (IOTA_ID): " << aux << QT_ENDL; if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>=4) && ((aux.length())<=6)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("k_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_itu_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("clublog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("clublog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux!="Y") || (aux!="N") || (aux!="M")) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("max_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("ms_shower"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_city"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_cq_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.toInt()>0) && (aux.toInt()<41)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("operator"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("owner_callsign"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_street"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("notes"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { aux.replace("\n", "---"); out << "" << aux << " "; } } nameCol = rec.indexOf("nr_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("nr_pings"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("pfx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("precedence"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("public_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qslmsg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; nameCol = rec.indexOf("qsl_rcvd_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { out << "" << aux << " "; nameCol = rec.indexOf("qsl_sent_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qsl_via"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qso_complete"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("qso_random"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("qth"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rst_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rst_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("region"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>0) && (aux.toDouble()>0) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("tx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (aux.toDouble()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("sat_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("sfi"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sig_info"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("silent_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("skcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("swl"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("uksmg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ve_prov"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("my_usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("my_vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("web"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } if (_logN == -1) { nameCol = rec.indexOf("lognumber"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } } out << "" << QT_ENDL; } klog-1.8.6/flags/0000755000175000017500000000000014166020407012536 5ustar develdevelklog-1.8.6/flags/gd.png0000644000175000017500000000117514166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ:^10203_,?!1@@1e`X:^ ߿bu  X _qoz4&̿7H)_f@,L o˿<} 7?~-y{ś__~1@, [#-o;@2&ߌ#~-x߿?b4@3-o?12<_@ t?3 /L o{/ߌ @ '{ï? x~ fQ~p׿?3ی8_~˰n,_oM "4H2f/l@60~=_[wb` Ư XA>Oÿ Y0B/!iIENDB`klog-1.8.6/flags/iq.png0000644000175000017500000000100314166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f9 x[ ֠j68%dT6d`8$v"e1Ӟ$]vpOb\bB'^gabfg󥷗|HO_YIZ-e13AO(e$pP: 10 d mwZ{Ds@h7Z1(e@,/^߿ MP1@A5@s-k޲UD(; UИݯ_jZ31!ԃm 3 00p3Z?Nv_vvS T @?EY;x D߿sͬx(/i Lׯ2o?*-@S~T=Z@_^AB@ ?Xj0R+7IENDB`klog-1.8.6/flags/lr.png0000644000175000017500000000072214166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<dIDATxbd`f@(?`BP6z߿ڼrk D߿?~|bcc@߿Y$$/L@ {ܴQڸ?%Zzf)'w^g A 4Ͽ߿X%eNZ@߾f?n b$,*3y w]r1l0h/Ʌ뗬`ōkrIT\'`c r4@_v9c7ODaH_ @,$FԨEf@ng ’IENDB`klog-1.8.6/flags/me.png0000644000175000017500000000070014166020407013642 0ustar develdevelPNG  IHDR 䅪tEXtSoftwareAdobe ImageReadyqe<bIDATxTR/CQ?#mc.!$"tb` `4u`"Hl 0T"b T{9ιy9y|~ET'fbD9"l}AcJ {́կmԛc=WV Ź,[ac0q9H`;/f{ Je;璐b,p#h~x#i;.F 饟U&oapӓC`A=~.'.*w|*#P_tZ락'ύ jKsm/_|h_2CgϐW ıýF4XڒI9MjRA)8=BOAj I~IENDB`klog-1.8.6/flags/lc.png0000644000175000017500000000101014166020407013632 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATx4Q=kTA3o7Y7F0! M@Ơ؄P,&bh*kH*6@A,}o{sgހ|{>/b첌tm D&Jath# MHCy7 F$FQ H6ʭ|+8;B4yGsnJ[/dQ*0T+:1@ƕtatFQUՕ:& 5ʺF!T5qh̒Z%`YKoTy}^ +y}$ͳ, [놝 ~7O E;*+._8(aٶ#"ϟo[%'ēߚNꯟ_~3X + /oWy>?@/0XQI  /Ԙ&y 6!j IENDB`klog-1.8.6/flags/ua.png0000644000175000017500000000067614166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<PIDATxbdh1 ?(# rr1Pz(* jd!7nG3K,TCœ~KG00T??߿ !~!@lTd6H+ks X. l$P*  rJSߟ wHʖbc:@20?/WdbRz@C, HTE( @ P6  @uJDA:#B?bz@I8`@pAHnGIENDB`klog-1.8.6/flags/yt.png0000644000175000017500000000112114166020407013673 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx$A 0To{ֹBRR|:f tY\(c@ w&/\$vY \/镽m-̝ɜH@D\1aapq02?3?P'###b/xϜy:&jý?{4ZE]cܻ/_``3[/OOOϟ?淯_UUU8L6:0s?PVS[˗HzU##f&ʟS~g󻓙_fO22@4:_X@ק_?~I@YXX~32r$X998 * Ʒo-yׯ_Mݻwp Z t`&C WM$BIENDB`klog-1.8.6/flags/ni.png0000644000175000017500000000077414166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd( cC@*b` g2/@5M_d J3 ?#÷bj *_hPDߟz 6IQ./nFFӿY8sgO>ķP1jd ĂQ_Y (@1O]h Eeal[ X.wZ;`80B&P2@lHBAEa%@o& ~(o`$1h?x@ _"(=v!Q /1blIENDB`klog-1.8.6/flags/tw.png0000644000175000017500000000072114166020407013676 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<cIDATxbdPЯ ?<|. PYK4fgfb: P+#l@,Esgee|07ރ?_f@,@k_7DP X5sǟ 4l[Pٿ>h2Ah20ߧ ?x47H@&N  f  @Q$ t@40S @~aH'#H DBP1@1~EHl ISf捧IENDB`klog-1.8.6/flags/fi.png0000644000175000017500000000075114166020407013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<{IDATxb|30I`2.?A0bab`*kƿePr!ڝ_l8Dٛ@S`dd@5_ ߟ?$d 15#o~ @m@w?Po Јa_հ tl@ 4Β*NW7T`S9bad%Pj" /c`dxqh*Ws'>~@0cfr @V@5:<Yƀz;@"rVQ_(@>}`iIENDB`klog-1.8.6/flags/fam.png0000644000175000017500000000102414166020407014004 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd8a`ï ?X@BQ?_L܌Uec??5e {K@  o & ~rK0&%7i>O'*k@ Q T??0 ÿ3y:  r_ d? \zd6P 6:I4CV4I@O'%soH H(xc?/FN/nc 3IC7F)!~Fff!D@@ aWpci6TP ];T@ae/IENDB`klog-1.8.6/flags/jp.png0000644000175000017500000000064414166020407013661 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb+Df($SHŋSط#of h @^…Ç?}?9Bb$ի/(ZpK@LG`˗YT @,@ gV h,))* &@ H :sqߵ L @@1}. e@?B޽ @ ޽{H &l争=IENDB`klog-1.8.6/flags/fk.png0000644000175000017500000000121014166020407013636 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb_XCrɛL~10%?hTc%e< '? ?~@ 1;3A 1Q1<5e; 1H|z"'۞?_~ 1J^I 3 7M+ m׶E"A~ן.Uf?Y__9$j ~L~~|?a'ןoA6 C~7/{)aSH?;0oϿ>gxׯm=+ _Rh30 r1ܼwP?p0p2Ä| Uݿb%> |`59bC_^̓IENDB`klog-1.8.6/flags/tg.png0000644000175000017500000000106214166020407013655 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ` v `da |u5' >? ~0s@5pp`05eX  ~d_@o&vV/b=qd_?/.[ X\\ W?[_ן@aݷ N|E _ "[{ 2oRpL 6{)GQF?3З~Aٕ?@,70H70&k@,Ry!- ?L<pl|/a FbO1&y qnC1IENDB`klog-1.8.6/flags/kw.png0000644000175000017500000000074614166020407013674 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<xIDATxbdN``1B^F䀡jE rbc?ŊW40|dӿ 7HP)׿_@,, 7,?O?UADY2_c"d"%)`dd41 ?vj?n 6,t|?ȉh_m:zЅ`ɿ_|ϗ?, +6P' $e/ʇJHJ_?`E@F F b _"he);IENDB`klog-1.8.6/flags/hk.png0000644000175000017500000000101714166020407013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb| Hd,fb`   0oN>޴ X@j{(/nOk_@L@V?T߿L@?9鿺:0#ÿ_ b ?9kj̓&q?5+ח/ A@j7;9ߴ?'7 `o5 q4^(8?[gN &PPuMb<d<6?+|XQ_?9c?/P1@?L cYTYP˫W,rr  P1@1>d`Ȍ?q`=歆bIENDB`klog-1.8.6/flags/vu.png0000644000175000017500000000113414166020407013675 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxL @5k C$^u"b24bҗ'wXVu??0ϟ0˦MpoF2Mno?A* / QV@15K7.c߿JA~_P=@ !8w,Z'!?_~H20HÏ;V.Ms?~o7 Ic/+u o?2ׯ@;~ $ $PTr@4;_&:@ 1 ߿D'C c@'}?I02|a -?ArI  d$P=//bad`0'`$h)PĀLr0$QOJQIENDB`klog-1.8.6/flags/cd.png0000644000175000017500000000102014166020407013623 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATxt?LAƟRL !LU8 CL?,jX]+L,4ơ$~URЄ āW^ہ{{=V;ߵP(> P ҃/]͐n9ʲ<[r-%M뇻by,Aˈ0f3tg?M^q,zZ ,|ik` +yV3> BA 7`+rԁKhu) $%{}р᫩l@Ҧ 7j `:'F3[PePP\0L"j Х#5FxL:_zL1^Q+f~x&x5^IENDB`klog-1.8.6/flags/nr.png0000644000175000017500000000101714166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdg1$  P#x?׵W bR?4Hʈ @S2/0?j0 d @, \03?Ю ׀ā ޟ^@,gҰ՟`d07!qS/@(K>~a#{O_ϯ 7]ϟ`W)H @L @glӞ/p0~]zӗo?}Ǐa4`O  &9w a?0S f@i FK(-r 9IENDB`klog-1.8.6/flags/kr.png0000644000175000017500000000112014166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb+1@18كGW_d--|w 5 ׯ_oݺ"bbʊg/^]F@PPXHHFVh@l~mhb,%Au bn^^o޼yPbիW\{pL/~%)"7RR= /EDDo0fl29}vvni)FF޾}U]7W؇?GIIIF o޼9m4= 8U-T0 1|$o'OB@,"UYyZ߿10Br10<h1VVnn..J;>2 c1Þ'44 w_,+tgϯ_@b;⺗ 'ɉ @,"ISXÊo~fc4fn{ϯ`[1쾾ﱱ H8UFߺ_v}zq|l*goW|￿mz/j2~bKߩp/y[ 1h߿ ivU叿f ۾ρ.b~j* X"M$(9?YeEJr?Pdb<>Ôs {10|g  +9IENDB`klog-1.8.6/flags/gw.png0000644000175000017500000000100414166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπd``b?"?$\] $L2m'O30_`Qh@_F߿KAV !~5Щ- I) @l߿Ϛq@ϿdS @2'/ׯ?_aJ|c ~0T @ @@2Tj? S D _II?s /а?q @_ G <700@A aq%#aIENDB`klog-1.8.6/flags/il.png0000644000175000017500000000065714166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<AIDATxb|%p.@1'*dALL  ##kYuߒ/Bq'@@\ Ua7g/?o5 @\5X?g+Uaޥ?w@ =)~ v\g Y ~@ $x 4@< @,.Z l ?e r?Êxmd J)yo~.IENDB`klog-1.8.6/flags/sy.png0000644000175000017500000000064614166020407013705 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<8IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,>~e!Fw@~{ѧ?_z@L@ 7u[u{ݏvM:fß? >T yZ4v0@1}!w F +--޽{@ ?UTT.^@`$P ( ?`0 @D20ϞJ* ҶIENDB`klog-1.8.6/flags/it.png0000644000175000017500000000064414166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxbd10ax*RU baPZ RIJJbb e&ba`?￿@Po QVh@ TFW @` 5 B1bbzh￿%(@ f F ߿T @Wa` @JCv > @c?ܒ o BFFF8PR)#(AlY8@ 8.VwQrIENDB`klog-1.8.6/flags/pk.png0000644000175000017500000000107114166020407013655 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#|Ez4 f1XH1߿ߛfl 㯏? e_ ZGh@1ATC?U+[;F,,@A5%$vϟ?ȇpT  F3߿ ~D N8@`HHHHC -@ V3azDIENDB`klog-1.8.6/flags/ht.png0000644000175000017500000000074714166020407013667 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxbdU?ï Ï? HI$A!}`䄂p& Tݫ=WR` ǎ?̱bj՛_@!rP~C~1EY Ъ Sd$j5? @ 9H!Yo D9iZ~ɿ@o. L `6] {@?I ~h)˿?0 57T؋ %AF7#D3PH @cpE?H BD ʐ!qIENDB`klog-1.8.6/flags/dm.png0000644000175000017500000000115414166020407013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd@ @(fU?WD~1@_ T $2 Z\9+ ϟVX@,~{_PC̕_)=͍$@=@L 0×v?QVS~y?~1BI/\Α@X}q ש1|{v d+1\ N ߿@=t/2Kd?)Ծ({bdf(.~¢H9οvnt!n&@()j?@Lr~r1%fz~4D5P @,@[SD@Zcπ3/vPH5#C.JDB/>}*" $M,8̃IENDB`klog-1.8.6/flags/ar.png0000644000175000017500000000077214166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<a Ͽ?E@󏍉 X>aHU?@ÿg/\= X~a @@K@\([?b})& h6  `> $YD:?a6bZ }/2q{p f .T B?2@ f`cN93@\O 0r+T l, @,YJ^~<@C4A'yD Xcd`e_`Ȃt2@ t78N@~ ~} ?@H-(l pmA`IENDB`klog-1.8.6/flags/ps.png0000644000175000017500000000073014166020407013666 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<jIDATxb@ ow20\L@߿a$شi@50zt߿7Po8@dHuWo FFƇ?oA)L`j* ?~ht@,?_ I`K $~d!ϯ^XU t?ݪ'xז~_e~-G=۟5Y%H? `|P0_? P 1$@T1p4qIENDB`klog-1.8.6/flags/to.png0000644000175000017500000000065214166020407013671 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<a{g1k2K@51Ȩ! Ƽ /e"l~8_7|ﯿw~b(? a>儕/_>n?bj( 5 h6 "3cϿr@5翤О?  oR_^qc?#C(j\+RL 2%>%IENDB`klog-1.8.6/flags/cv.png0000644000175000017500000000102114166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdH1 cJ rNCA2Ql$o&;0m+d4Ѐz>*}bO@` @r `~Wh@4R \<nY_5*N@L@`dFnzA$zMbɆ[@eddcF#33Wu5{Pi_?g<-3ɽڵ  <e޼y@,JӘo'2puծ/TuuXPSf_@ fL\l /H..mƋ/gxj ;#W2Q 1A `B% [IENDB`klog-1.8.6/flags/england.png0000644000175000017500000000076014166020407014657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#߷/礥10ܾ P?T'zQѿ?#gϞ D\5H߿߿@@,h!$P_J;@ pEF+.ONHh'P@12(D$O 0z79NIENDB`klog-1.8.6/flags/vn.png0000644000175000017500000000073214166020407013671 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxbπPX@_upɒ2ҒKF6hU wg@ տH_/8,bE5P 7P@1#P5?.'"4M /R Df{ $@ 䤿~;ͯ@ @ï~TIvo WM$w/o@C00H38ȀT3:9~P@ L0HJQd$ȗ@+jDc0RZ2IENDB`klog-1.8.6/flags/bs.png0000644000175000017500000000101614166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdfb`ccc60 R18: Mǎ Ȱwܽ7$䯨 =1~D@m x?3wn +@5@ f1~3c@4x1Fz`!J {ˏ~_P@ma~ ~'5䷬"7P@lׯ?A~1$98 ^/xJIENDB`klog-1.8.6/flags/gr.png0000644000175000017500000000074714166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxb?pb4x (" P]L3S@  ?ÃGѣG q02Ttxb(nߟ/$R? @1[v3أ TuhҶ ZPW0@֭G̍7s%CH?'˅Cwŋ7""H"31н@{@,}eI!fT apq0 Xy$˯@_y=$"ڹ&@1޼QTH(… 0:{ 7C#??;0kPl~IENDB`klog-1.8.6/flags/ie.png0000644000175000017500000000074114166020407013643 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<sIDATxbd10ax򔉁 ă??DTc 8 Ck5T⌌@ (ߟ11 XX@O>/|󅗕?|QXbh2P ?&_@Kj ?P_HP1@= 4b? lz0,rI`'HoA (t=@'1; 7aA XInI7eE###00)$bd(e`cP|`^]K @7dJr IENDB`klog-1.8.6/flags/mg.png0000644000175000017500000000070514166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxb|= O@XƁ(' $Ra_6m yP@ӧ ϟT@/ _@6,bAQ dMJHR 5 @p @e 쿿_$P?c` j y!}@`/>%ߧ~2@_?QTߟ^1InP_ b@Pz9H?/@1>~H3<G)<&I$cݛxIENDB`klog-1.8.6/flags/sg.png0000644000175000017500000000072414166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<fIDATxb|ׯ?s$  K)f_|I[ǏN1?|i@51kk>~Ϟ=,?,`cHݯ,+  @,/;vp VWT7P/@@ '>xښ~ 1HU3 XVrxx3qq l0ß?0JJxxLLLo |gp,?f0 @`! @, xB4`OVY}IENDB`klog-1.8.6/flags/np.png0000644000175000017500000000067314166020407013667 0ustar develdevelPNG  IHDR YgAMA7tEXtSoftwareAdobe ImageReadyqe<MIDATxb4<-;/p^  cc?G? 0 n1 ݱqEBtaR!BLmw%VD7rYIc G?s`Hfv  pi58|- ӥ-@~cFy \c-?I׎Rk`ɉqa=mO Kb/9p>)IENDB`klog-1.8.6/flags/rs.png0000644000175000017500000000064714166020407013677 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IIDATxtPMK@m6\DZ؜{UQG7QDWգ TQ4"q6ff罙 Q3Ÿx">HvdyȘE>_+*7>ao $k ;iܘLZ=K/-]wT ڋQߩθŒ*vd2렌\4jMxo\EunF8%dQAserw^2 :DBWNomy T,+ C$۶azyhBV -? 0Xx<4IENDB`klog-1.8.6/flags/cx.png0000644000175000017500000000114014166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdgYDf@120nUa;O?? (gߛvl 6o\O85:~o@=~Do:e6 kV|4߿W۔I@1U*qs1y!kZrcįX_ݪ~vWҕ_wic)*IU~vO vR̯}$j`HIz_~_~>ʓ#kO?~ T߯@j1S__)) ﯩ="{ll! ??B0X@ d,? 3XTR"@Cux23$KK0 [+>$ڰRd"G/0   P=BeIENDB`klog-1.8.6/flags/cs.png0000644000175000017500000000066714166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IIDATxbd` 10d@,1U&aFwOx$r3{IK&_m@U y< T T7￿~E20| SSMM!QQl<N0DE9o ƿ/_20?ݸ@,B h@< k>ІP@,~ z̀ dEDtv˿י0/0"~3ˠt3@IIH(7#B bb b@I@sg_IENDB`klog-1.8.6/flags/gl.png0000644000175000017500000000072614166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<hIDATxb#L) @,@ >>>  $" ={@,A|aX ߿joaϟ?U D ?x߾KWl: nC ˖aj ƿ!!?|Лџ??VV z1Gͨ{bH=#GQT-fhbj`r~d8df/^4cP 2 ,@40 ) 2ft1Q66G>|` BBP1@1~(b@I@[JăIENDB`klog-1.8.6/flags/al.png0000644000175000017500000000113014166020407013633 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb򏁁X0"#8@%'U߿,y5߹odr3ϯѕ |wB9t{ϯ_} eZ@,?Wq3߿~fs2߯_ ~53_K?=珟"_~ 5 _߿KA%/_ 7 !c~_k}cϯ>Kagdh6Б@~ ??rc0?~Qc@Aj@ Љ 6>f?f!ֿ~|r6  VEĘ!O0PȠ?@FX@1?`HBc ,0eB@Mv=IENDB`klog-1.8.6/flags/no.png0000644000175000017500000000100014166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|rsE]D3?`A @,@Qj )FFF0~ "߿n@,`{H|σ@ ׿_,+  U@_ @=@$@W߿@g@c@e>#sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-1.8.6/flags/bh.png0000644000175000017500000000071114166020407013634 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<[IDATxb n/*_1  xyy!*5ü_f? @6i@@._a5w ~ѿ_@ tu761CTĀ#fb/_f=x @@Lp'KKBb1ΜfXoà60@L@'#&j`pm1@AS{{?{P !5@1zJPP$Ç ?~+T=MWYɀwTmIENDB`klog-1.8.6/flags/cr.png0000644000175000017500000000073514166020407013655 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<oIDATxbdoe1$ F?Ĺ A>*Wm1z;d*,!{@?gf+`X3 ?|@, 1?Ŀ`/:lkJA @ ؀_!(h\HD ӽdުO=t/PF4\L@)@@J*~# % XD[9} q(s7엿L||2'?YAr J Pz-@120΋: h0= d@qeԐExt¹$@yIENDB`klog-1.8.6/flags/gh.png0000644000175000017500000000075214166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<|IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`J̓( 7P@ ` >7:BSx+)% =Z FL<q_ڴJNh#@1}2?DWD/9_?㣁ܟ0 j 2?￿~߯ߎmDemd ? }" R7 j D #- 6N? /05c Fd=  !pB0br(IENDB`klog-1.8.6/flags/nl.png0000644000175000017500000000070514166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxbπPX@`U 5/w9~LO)V*<'ρJ@~$(+  XD 3T j Ə??< AT40Ved@+o>Ƞ_^kן $߿ <{;g óOzH߯@u5@H?p20 _ uœ#@?`@hc`FDB2kgIENDB`klog-1.8.6/flags/nc.png0000644000175000017500000000111714166020407013644 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd>1@B!C O.3~.ϿFg  e'|0l@Ҧ`YEa3?-}߶Q ܻwR &1|((12AP60 7,<ԃ lME"#VJQB]@,`8Ot̯߿vNL{h?`@$# l{?{'ٱPϟRR~7[ h?~eѿgO1 ЂB\p!xh֛Z|Lg_*! zH ̀AǏ$IENDB`klog-1.8.6/flags/sardinia.png0000644000175000017500000000070714166020407015042 0ustar develdevelPNG  IHDR n pHYs  tIME-.^ (fIDAT(mQ=OP}|% :*IX 'vBXt؁h&= /|Y:l6qN @navVu4M~d2Mv+nPJa\$I~ZTp'& "c>HX/D"LlV<sAx` 81E xޏ,@SC-^$'(EI"napqw{p?-޹3b8H44RnRJ&aJdY J%tnz^3Ǝ7x<-ÍRoIENDB`klog-1.8.6/flags/br.png0000644000175000017500000000112114166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdHf@ `/03 @5F7g`￿6ZXl9 ϟ߿UOBY;K^?K_h@5T T5ToUդ $~涐eO; o bL_g~ UszhdČY/D:U6[R?f?OGsA_2ЖҶ0<t{W|x_D˒_.fg y)h)˖bU?}n[/I^r2|d   &go~Ko2,@ `H?$x$A^; 3˿kaܿ(@128"b9F1C/AnIENDB`klog-1.8.6/flags/mv.png0000644000175000017500000000103614166020407013666 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb| p(6 й'$PdK|K m @b'O@@߿?$+  Xvÿi-j?X??PdQaYy?1e@r1H3Is 2 E:_@ '_S]]= `? r$t?cd<K.d+ ou@2wͿp߿_T NWqyP߯ j`Y8P1@QR jH$ @xb110iK0{IENDB`klog-1.8.6/flags/se.png0000644000175000017500000000103614166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdpndu ?_~a Xs=1onߟD@Ml'3{@E07/bPba/_`P3йAF2_@0o&#0oFvO{  0 A!T I AEBHH#A8, ڒ`篲Ifد_@ՠ  0D O)@a`fԿ߲B<_9H FdxD@2B s$@ܹy'IENDB`klog-1.8.6/flags/lb.png0000644000175000017500000000100514166020407013635 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ`$cIbJHtT1_? @o dM3@i?a@~ٿ &)%1H```|ռS~h,',󟑑-<@11011 F ;w?0?btJw]_nƋȚrd21:@5@1oV$ʙ @r>z PO`8~yO 0.(  f&` LA ePb"e@`SD>|IENDB`klog-1.8.6/flags/qa.png0000644000175000017500000000070214166020407013644 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<TIDATxb?(/IB~10 ظCW߿&]|-@@^T" ~I!ibBV߿FZ `_  Xh[\U2/ PA^c & -? UL P_Rr/67H@1?l/ jo`5 Iq:? H%@1~| ep '޽@yY @k}[T^YIENDB`klog-1.8.6/flags/bg.png0000644000175000017500000000071614166020407013640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<`IDATxb+Df($SHŋS`ddZ@,w>ݑa/B? 0DL, Ff2G~ B $ Dt c 5S d޲IU%sX Raf:%@a´f!|g W0aן b@s @,=q S@;JB~3˨򷎁 X$P(? $ A@H&w߿~篊ŋR@9Ff?LlV} O<@ӠXF_Pdbad4 paw p1iIENDB`klog-1.8.6/flags/td.png0000644000175000017500000000107214166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbu/`='KL՟?3  $͇_}EZ ߿Ekپx~q@`$lk[-,3qZqA jCS @ $90BQN:T? ʑ͐-xP8)0aZMWC@ #o&+HNI?,R.Ku?i2ɥC;#iJ yp< @0t 6 @ @ fz~C X~5rPϿ N(H0Xj / QA6?Yف~gb#/9P  7Atpu(nfbG&H :"z[VIENDB`klog-1.8.6/flags/uy.png0000644000175000017500000000102414166020407013676 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#"AL8(MX0 ,=Ͽ߿~2ڏ۷o611``XgN?8c011]q Xw&e`k߀ An\@q0?ln? t?YA3 ho?^p?X_ @,E;0}|%8Yf +Ɋ?y KA0ϕ"@!& 5#l}`87$? t? o-Z@>4!,?`?(YL ̓"K{IENDB`klog-1.8.6/flags/es.png0000644000175000017500000000072514166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<gIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, 3}^_/03f`@1 T?'00t|}/jb@v_1bØUzW[Fz@L`EO?Zf]#l 7P@11Ęw/q?̆@7  200w,0Ɵ 2x XfARC!@T @_Q#OC@ ZGIENDB`klog-1.8.6/flags/gu.png0000644000175000017500000000077514166020407013670 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbɀb„PdMR@ ?@ܿ7P ̨ /߂U_໥LD@=K3a` & `{pć @Dm: 79ǿ~#P@0h@mI߮?u_Fbv{& k7;/Y* & \_J y̯ߌjiwۘW1*z,T @ '{Ӂ0 kFjzbb? 0HsdIENDB`klog-1.8.6/flags/in.png0000644000175000017500000000076714166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbA0!0 rpC1*%>^092v8Y% H@` @SR,0fd@,L9X;ܑ﯑mU #?_&Fضlk9O h ( T'bb;~,͵k_?b B`}) Zd ::~|ߟ?@#/q9@0a!_`00b  EE @I0?` !h?H"` ç ?~k}_Go?_~_RZi΍?~10}#̦,ǿwϛNn?oAԻOT2 $_bhm"$?1:૷ X2ݔ.<-)a3` 3׏o9f19'1~>e`````fd? ,,L n}~u _W0tVw15eadfb#R2?s_B20001orS/\x}c.Y<> rր Ϫ2IENDB`klog-1.8.6/flags/bb.png0000644000175000017500000000111114166020407013621 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`nds1u> Pz'?L2_ f?L,c/o0 X&߿bïe%6h?@3n~ϯ?~@, wUD/ _6oC_?/ ׯ`Kj ?_mp; 6 @@ lï̿x~1} /x@J;߿@~ b4 ` tOVa`GIAa X D o7/0cad` fg{5̽IENDB`klog-1.8.6/flags/py.png0000644000175000017500000000073114166020407013675 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<kIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, _gcc?CbG~nYo6 99o~ħpCA˧8?2``@1[5 WX Ʒsis>i! 3ӓ/Abs㗿&I8/'fiA 49P{AzK8 (UX_120F8IRS]IENDB`klog-1.8.6/flags/mp.png0000644000175000017500000000112514166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdmd~`Ə_ ?0/  U@1m,/O{I6w_/)KG>ddU~u Ϙ~+! ?PHGmml }/P@11?H5I㊭0HnM%NG? 6ZUm^!~6c1?'SYY P@m Ѐϟe\~W>8ACm `mL1~ox"Rv2 %9 ? otS9^>qn4}~S4 _Ƌr%G~٢7Y tP?bd`NDH0DB`0@ྭIENDB`klog-1.8.6/flags/bj.png0000644000175000017500000000074614166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<xIDATxbd 10Æ Ck5H@ 3&J~ XX|}߿2cG"Fe Ȯ@7#єBH@ 2/P?HP4 yma^Ӏ"yf3up& z/Xc/$o`(HȨz~@ @9@A4@TC4j/HrK񗅉ߟ<@#߿t@1220|G/021T4$k<@+IENDB`klog-1.8.6/flags/ng.png0000644000175000017500000000074214166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<tIDATxbd10av_M߿ xަb``a / ծ 3q00 o? M37 PPקL(x_~[Gh@1d ?H@t@?j A6P@=4_ 8  @p:?ir@տ$O &* @JCV5 P1@c ƒܒ o  LJJ!_ P Ǡp$+ gP430|v PIENDB`klog-1.8.6/flags/nf.png0000644000175000017500000000113214166020407013644 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb`pf{g~?~||ڽAsllxw)^)οNNMn{kH?|߿ ``AVBk V} t#ñǞ{ݳ ;&0g @  ??t!m~j &_@3UE-; ?`/~YPAm  (tȰ߿{˧߿yuo@=4_ bRY.Y7_ 2*@ I~I6VvMNMq@ʢ* $z@C86w_CGˏ/MZ >T GHIENDB`klog-1.8.6/flags/pt.png0000644000175000017500000000105214166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd`Xn2"baPZ Reˠ?a?aM O '׿ٖ_/jFYY 6 MöXo߿ 访[e7uZ_h:@11b￿Y~' L~f)Bhh@5d9_"ro$F_GX''o|Wj`(@ ov_X5D`X X1G_@CA7 P/j /@ ~0L ?cc0Fv|IENDB`klog-1.8.6/flags/li.png0000644000175000017500000000103114166020407013643 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd]00 1J_0brB9Pso?H3Vl 6`Zo߿ T7X86H ;r}cgAAJ dm?=7uw_SZ/oo_~e~ X4?P'#?@N7 b\fˁy1|_$f&(򍁁Z?$7  ? AJ!M5l P߿LA@,$~oƿ L`0Ͽ ` x`$* @}a0IENDB`klog-1.8.6/flags/jo.png0000644000175000017500000000073114166020407013655 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<kIDATxb@ ow20\L@߿a$شi@50zt߿7Po8@dHuWo FFƇ?/Z @QQ?~iǢ;&?xYJ$9 d= ߿?j`' P?@=UO`w-+_?ϿJG[H{?k%)J@`@￿ |UUb u#^|>Nl+jl~<(, c 3=σeYM6onm^Z過'4uN$. 3Ub '8?J({R 4OI=i L:ei  s 180 7 ioO^j=mQ}FX^q☙߀ &97o~ g;-W2WfvG޽?(۷k\AFOot߷9oOJIqܽ{ X A*LKz/̚_޿7^AԔBQ $995~|v劐_&&FFf $fhqhZ E v&[IENDB`klog-1.8.6/flags/mx.png0000644000175000017500000000107614166020407013674 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf`ba?^cb`$JQ$@25Fw200BLL ߬9 Ⱦ5o@ӫ~ ?7$b hȿ?f߻rY kf߿7a@hoxsꉭw:_~6 ï_ j`%- h?`26d6jwS!A]: l? /@50 L}y NT@@'1/ү_AA 5HyBLLr@O#-8m٘؀|yfkV@TLi)IENDB`klog-1.8.6/flags/zm.png0000644000175000017500000000076414166020407013701 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdndf2c`F@/0  X&yN>|߯_pٷ X f ߿? ,qϯ jhF D߬'WR("r@22Pk\8Gd) h6B~@dAV/oEK~Ô/ @u@ RBmi XJp,:03 WE Ȑx= | ͯwKݵIENDB`klog-1.8.6/flags/tk.png0000644000175000017500000000117614166020407013667 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd> c&y?01{!4'0$ %+ dÓiϓW#X>Y)voEϝ)#X#6t@11?~{U|@wyp+e_Nj@@}?cvK~Sad%'@e@ e{ֺg~fxoxG@#\+z7V_=J'(U'P1@l ǯ xع??w P_.{0~J;ayI^@120FK/ π1000e@[%tIENDB`klog-1.8.6/flags/cn.png0000644000175000017500000000073014166020407013644 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<jIDATxb@@n", @,@D}5o,Xx? $}m&i,7۪f3˪ u~,@K/k붿fϯ/AJ~I( X@u8M~@Uk q8V7T@@ / : D UM@ @ĉ΀l0X X@$P (7xX_bb<Ȍ?Ha `:s056IENDB`klog-1.8.6/flags/et.png0000644000175000017500000000112014166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdTda/_0_`ap0 çwթm ydޔ; X~1f| տE_/@VDh.@0(H?3139_~x@Hs321v̄> 2x:` ٿ@>1 ZϿNK|#@4!(#ӏB%scHNp 51jQ T"?f(W]su m`Xj9_j/9$ؘ ~342`T @_QPhR@`! =ڮIENDB`klog-1.8.6/flags/gm.png0000644000175000017500000000075514166020407013656 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<`0D v@?\9Up,IDAT(ϭ=n@wm,c_@DD(%9 pq b6"fӛ7#zw?pB<) .+r!ZId}!ۃc1vNIK $Ep5 !+ 'j)`y,+s3`;%SchC$;{'hʥt`n *A_XIENDB`klog-1.8.6/flags/aw.png0000644000175000017500000000101414166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx, (}XUِ9 aJs9H ͗DQbykIϣk7G`` -?a1b`ҞAſ A< ӧ_Zg_@*TR/B@/,l~%߯PK"/!n &a}@,?Av1hd `j ߷yt< edse@NOCf[*v=KkU"`0Mb'(H =@60K!?çF$(:_h2\,hҪUIENDB`klog-1.8.6/flags/la.png0000644000175000017500000000106314166020407013640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbˀ 8a "[36:u${6kz?XB߿￿џ%61"p#YFϿ~cǟL2\@T(AH/@1 ab|̿`@ ïcx |? ? @~ TN{' ɫuC@ @ ) տ~@LA`rjeAG @@h1ÿ0p@@1"") Bzf?IENDB`klog-1.8.6/flags/ec.png0000644000175000017500000000076414166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbyS' @A0P D@0{,V@!@?nt g$BJ$#8zr V u n O?; ,8E-/? IL} @,oI= o4?L\ J$Ư?@_Py_P/ 6$eUR:{ @(00p|  RbYT/ou!Pl?H $@l#KIENDB`klog-1.8.6/flags/gp.png0000644000175000017500000000075014166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<zIDATxb} c 1PQV8GUګBcƪp"R٤)1O1~KK ##??&>47t 7 QBÔ C_aK!H(@L _-X gcb 2A  :f @,L_= tr17㟿 7 *p4ҌB#G =4(d| %J:`7YOEIENDB`klog-1.8.6/flags/cg.png0000644000175000017500000000101114166020407013626 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd8@R XՊ`? 'F &}@MSҿHUK6P/Zq,zbd0LRD[sA~ob* 4n_fh:@42ߟ4v @yR߯$?|k~/FhbDÔI_@U3 j럿B~ XgQ` CbaǏ_(oi0 !$bʰ'4"ݘ fv&RIENDB`klog-1.8.6/flags/cl.png0000644000175000017500000000070214166020407013641 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<TIDATxbdH?&.b``00 ×?Qf N/'3#FFFfff&&H˗/!B?CУ?~ T  ;]x7?_P@0p|ڸ 9K5 ý;L8??ӿ8X&o_߿~ F"ޟ:@,@0AQ$0`"Lm2 @~aH'#H DBP1@1~.b@I@h9?9IENDB`klog-1.8.6/flags/bw.png0000644000175000017500000000067314166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<MIDATxbT=߯@H̀0,V@@$U0JN.%)s[҉z yX_0gxV$U@ b#///I@+ $Vx}b(++{ Q@R^^럿@>\DE9H߿ ſ~Rl6bb|-???~Cd~u@iQgx a!A HpcdXG X@I  0eF_ 0~G-@12l)R0@Z gu}a^eNIENDB`klog-1.8.6/flags/zw.png0000644000175000017500000000107614166020407013710 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbf&`fBb1_9gno `ߟ?@_~betW307Fe?}@, ;q:&_?@Ư~ "Y_@,&U1+0띧wU7H_ d{@1=y/ϟP D+**=z XXL^:R}{Ud`~~s@,EQ_X~12 @J~ Ӓbg`FF @KȢ/?4+ ZW 1Y\]OQ͞NMGK//zzHY`Xٿ=@P FF>_N^aA_EVS̠y´˿oo_ ~1LX\@P*˾Xv[^ r99I? _ qasG_ ?0__6O FPq'k1|`tI0?$* Z4K.IENDB`klog-1.8.6/flags/vg.png0000644000175000017500000000116614166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbܟ^VoŜ8~վ!/`1: 1 ͻ@; 1:b' ! %P]1>^!<,,)!V?7שc+T=Nd|ױ7r3/*E ?1ӫ ,@߿~?PC*/ۭ[d,@5uTݺ͡#ߟk9j@@ @IJrI?@ڀ.X2_ȑ􏁁 )CnIENDB`klog-1.8.6/flags/cw.png0000644000175000017500000000035314166020407013656 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIME6HN8xIDAT(cdЮw^<ÚW:@*`fshx+Gox~Nwc`ddb8*ATaױ;Dc<{!c;ãIr#v gJ30|!B R(2at'Yb IENDB`klog-1.8.6/flags/sh.png0000644000175000017500000000120514166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|k9-k۱7=P=CeAo ~10@1KWR)>*Dz5I%Ѯ&1 gK 1/W j1\?c3Z = 1P|8 H)#%wXO~-o.]{6#Ы}t{o8i ?0(g߿ߟ_{3Kq:/(h 0ԀP9xJ:?^)# ~OB ( >0JR ,"&y G9I٫h_xIENDB`klog-1.8.6/flags/mm.png0000644000175000017500000000074314166020407013661 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<uIDATxbd`8~10c``a`(VQ\MWǏ|o?0ϟ0˦Mʤ.+ g{ u~ee6`YnaG%jH$H@gO j`~3|wڏ31V5h:@;~ӧ?eo m K~ Ln6`' o},$0d pE5ei`ARl_? `# $ A@5".\  3V[YIENDB`klog-1.8.6/flags/hr.png0000644000175000017500000000101414166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@$?߿~eJk`S(ZG;(\~ee6pտZqܔ~ R   ߿}/Gǟg03ӷo߾~ sj)/'N|@O>  65{jU@Ǐ!p{?}~|c:}$5" YL5*e 0q az@$ bȿ`$X@12dU@ Df08v%3%&IENDB`klog-1.8.6/flags/gs.png0000644000175000017500000000116614166020407013661 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbYYY{tA(IuݴA(@ O2~eÇB*U˞|9qׯ~BM1b~  T=q1`?MR ( <,ͮJJ/bb8 洴ѷCL0;!ُjZ(G98 fK12wPŒT!3y*$ŴTST1io@ m8%}p I~ {C"^} X~PXP3$.:xi ۷**@  ȗA/X3d_^ @f`f  $)OIENDB`klog-1.8.6/flags/ro.png0000644000175000017500000000075714166020407013675 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd>010?`` !@0SݤTL?D~?߿_6m  O^L=b`o(_f@, 3U B@&C40 @, UxEtba0 Nbh@4P_$ `I`'H u `n@0I?@  TR䍿LL R0: 20K\|o0 ÿ?xC 'oEEIENDB`klog-1.8.6/flags/dz.png0000644000175000017500000000110614166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbT ǯ_|af[(` @,o}$,*)T?ϯ~fV~mv_@?_[= @1 &:]'<^O䇗w Ji000>Fj?|׷b~o `1'@(@]ۯ>?z,o~ Ÿ@  @^6rgo~ϟ~1KϮ \`x տ1Mec`z<&I>mP!j&@IENDB`klog-1.8.6/flags/mo.png0000644000175000017500000000111414166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd 10` B0 jjed)ϟOJ,/8/~_@ղ<@; &?$)qj? d~D@=@W :?i_5~i &ofu1 Z)Z kVP./P)@1>6"6k,j;;/0  ռ  _%J8Y8wFw?޽h9P?  $ PP)n)]Am}a5bb0%%A~o|߿@#$@ t_ P `)!E?@A>wAIENDB`klog-1.8.6/flags/mk.png0000644000175000017500000000123014166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<*IDATx< 0TK"RDxiD{ybr2}1x{rf _(NAӧ Q7HY~?P8Oa1#@H*15+25(Ў?ρ ݯJf Xl'|@ ?ͨ$bwd a߯>7Wa` ?O͠wY_A`8a30/SǒfxA7ߌj0(nahP?Yb_ÿ @L?k T@DV;0IENDB`klog-1.8.6/flags/fm.png0000644000175000017500000000105014166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx4 g4Z >㤭YL0"5bT_?s' *!@ͽn202 TMbar H1cd`Xy1Ph HHP@_CW~xPP?ДSނg m! tɏ/nV7/π2$bL^ @P6в@`IEt|rIENDB`klog-1.8.6/flags/gn.png0000644000175000017500000000074014166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxbπ5|c.c`F@ X@@@%\302af;&ϟMS7XO2 Df`o~T-#  Xf Q?` @Ư_ D@ t7#P?an6DÿH4I@f#i$!@`'i%6 NU~?=P@40Qdm@ `/@ L0HJ 00fd L @ +8*?1h4ѳo 8I313g!=IENDB`klog-1.8.6/flags/hm.png0000644000175000017500000000124114166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx?{CABHJ*d1ba`*Sҿ@@T{@?~120)@ח_J#~ߟ<@Hat__~f_X~+JH'PH@1_ h׿8ׯ~?寵Ͻן ?5?~ei~זӿ  @@> _{wץ_U 4h.P@49@:k)@_@qc"k0 o @ _8vbi!zh]3IENDB`klog-1.8.6/flags/pr.png0000644000175000017500000000105414166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`@_ 0b1 XUa8t?o 2N[@ k=󪰚W@? 01u @6pXn,X?13ca 1FF0>PǀI6c+VP n0ڍ7~aP_ 7a@nWȯ4Guve;z ]x>PwYLB\FFg׮?0ݩ_$?`H-XP÷o{vSujc@2j'6_[7- -+1UIENDB`klog-1.8.6/flags/gb.png0000644000175000017500000000112714166020407013635 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATxb4sC^a``ߊ+mS[_wo~Ȫr:]v'E>л?FUE!5Cn_?+ yF[L5]^gw^ +TWy'##Ż Ogwxci7;N07z*mn0|;?f`׊+7>ݷGĀ\{re7; 3%?qp׿߿Eeѐy lmY@?'`Jk<7BtΫ>0{+%_my3gCsv͋Llnqa3;/Y0ϟ@0o\d>S\3}l7s!30jJ3jJ#.氦9mY~;-m0m?2z!9[ A K~IENDB`klog-1.8.6/flags/tr.png0000644000175000017500000000075414166020407013677 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxbπPX@ $-(ҼN33Ȗ\F8U@'?yT R;R߿d3m `ALMAꔕwtk` @ڨII7lZT @L ' uq1W/$͚ffP M 10kk%=oDIČ`K/ E2@40 hYYAN5Bi`ARl_':8  F$8;\FoIENDB`klog-1.8.6/flags/do.png0000644000175000017500000000077414166020407013656 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd\c߿|'( T7? YDSS Lݴ @J_? ,{P5, 0 ¤(?L!5L 6b rvYD$rТDW_0LAJ:k ƿ222pF&>]?mȼ߿wSzh??q}  PK<D?/ۀUt (lp C 20f H@5$) rLLb\A @$0*jDBH?p+ C IJwOI;WIENDB`klog-1.8.6/flags/fj.png0000644000175000017500000000114214166020407013641 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<[TkؘʟˤK~ 0T ?`?o@@1o]G\+}cvCC_  rҴ/2*ƫj2w6A,?bl/X $@l2HTzB ?xK!"^ 0W1@1=3rcXyoX}fW|~/?@61*( &%*.5WQ2Uo3ó1@\ Jտga~gr$ X  ׷)nۏO  ?F4B{)w{g_2 XI/IڀlF@ܳ/N  F̯ _`W @`8FIENDB`klog-1.8.6/flags/my.png0000644000175000017500000000107314166020407013672 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8)yaӒ?I{ @3gT]G[ ohaga˳g1vnP5. JApVbcܨxɣw 0{ƃ FffbfwLJϴ6/Ie+d,#s}bd`8:e"vU@';a*QN_`30mx@1d`/Loߟ9$={󧌼|eu,@!fI# ˛w垤h~@&2 &pȀ/= @g u 0,Mbُ'O0@f3@ L g[fTIENDB`klog-1.8.6/flags/mz.png0000644000175000017500000000111014166020407013663 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbg(c`a`DF`$ @`q"UĈp%lWI[ W000(|˿*(߯_ܲ@|v /dJcaa.u X10?uݗ~?@~ H 귬] I7ƺb\|}/}zK z-9 [v~{Yga~ d  200WepϿڏc@_ 4Û?3xf`? #edWQyv X$!No@r$(~30!_a Ư z1@~PL`c0fI@3IENDB`klog-1.8.6/flags/pm.png0000644000175000017500000000126114166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<CIDATxbTMf8#?K^ol``  0  1Pmf{5>w+G!:;!EE @ B?>~I$&/1WG Ƿ^dꬨЛo$E_h* 1sl!^P.'.TLARK@߿c￟n߾c{?_N10'/$ :*E9̎r1 nPx =N΃17 3qrɰJ x]r?'3c 30|GtwD?6ps c RIENDB`klog-1.8.6/flags/ph.png0000644000175000017500000000103214166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb\vzp7/  aP ʊʩ!\c3dҀH/(U#@߿۶ɚ5}/eeo@L |cbZR%+?4$bH=f`tm-z??!@ X>30<\ W}n?t՟_ ?NP2gcV?[) X.ka`)?kd P-@5|e`_afY/0 K/?yA@`# $ A@_ ` mL7!U_)IENDB`klog-1.8.6/flags/ml.png0000644000175000017500000000073214166020407013656 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxbd10ax\ 3 A2p@, _]*O/adI?D~ٴ XX?￿ 7CѯoP5,baY d?` 7P@ 0bbzh￿k(@ f ID$i տfÿpの@`' jd5} nb$%Aߌ ho? J@J$bd(e`B{x` DB c4r2 ZIENDB`klog-1.8.6/flags/ga.png0000644000175000017500000000075114166020407013636 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<{IDATxbdhf@ `$!0 RA7DUFjo;͚v9ђɐ}M} y?￿ ~/ CG@ amTv)fTooZ<|?N+X002/00~32d@,`k SI5?i*!C!j Fr  l?i92@0h`?N)ba4?L`SCx90~#zo~3<A`#h_plIENDB`klog-1.8.6/flags/ne.png0000644000175000017500000000103114166020407013641 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbc`@?`/021a@0ۀWx9֖a2,-E#DudG6\!U<22 R߿EdJ͓ @u@K6 32>= Xdt89@yZ.a@j.S[3bi!/ 0 X̬@ ɩ`Ucga?@123x@ D߿UT.6] `f#' T?  ϟ@ PPƀ(c0eA IENDB`klog-1.8.6/flags/uz.png0000644000175000017500000000100314166020407013674 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`H\LCC…Yw+5_" 0ӧi;w=wſM3ᅴ6U ޼'a!Ǐ s޽~P,?bIep/D=߿y(߿[ kb'//+О3!.xbr,#?^6@130$e5ߟ?n "@to $rm {Vן_ϟ߿ s HJ1 {_' !! 0:̀$LX ``@,=,/J0~ ~}Y,YY,*;V)~gzP\b:h2PAD~*{_7ӯN2 @Oog/ά/ QQ--zIr]"@=t{_[_I1#E~26*|ӊbЋ^j<~@s+.aVضd/F%  CoY_Ӧٺ_bE +Yp$+_@?ߧz ¿kI|f9R_"B@" XURSppHJJBι\\/d: aqa r c!@q`u)=IENDB`klog-1.8.6/flags/northernireland.png0000644000175000017500000000075214166020407016446 0ustar develdevelPNG  IHDR n pHYs  tIME 5OIDAT(}QM(a~C3ʞVٙRr&j~Ϧ\\6)Q$E}EZV&-'v}yz^lЬϊ2+P(s!Hn^qd#n90nu"DI +T  @eBs"W{􈫤|];r >_Q8w<CĴ1+"@lci3OMD#qI %"hY'旵RƇ=Ϋca8W|5F hdBEy֗RhqIJjy~68o!|YiXQ=daL$=n6IJplEpdcFIENDB`klog-1.8.6/flags/mh.png0000644000175000017500000000116414166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf~c~!61M2' &T vABF+w\з̜?8*") 11221CLZ7#`3+;y?Wqo/t@1 [ H'96^(1C^+*:)줆t$L 5oV]w9pы_@` @K~3{!/Q=&]'_:7?j5G &o O޴S{޿?P&ߠ ?iQ|f|C_?/1Na~@sg``xQ4lKIENDB`klog-1.8.6/flags/cu.png0000644000175000017500000000106314166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb긜7 0 H0DE?? ϟ"sgOϞ%%a`?`Ǐt9<}ׯ  a L22211Gvf3߳gcv0r %9n , ̿Nḑ]__@ b`@ v`?˫*ZTc b|& 00;ϟpehH`ËJ~ EzgM a߿?þ9xTt&4RS0 L ` SvepIENDB`klog-1.8.6/flags/an.png0000644000175000017500000000075014166020407013644 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<zIDATxb#A DϟH$@,@ >>>  ϟR3b*2>7!FF? j ~!k;@1yvvNut.}}  h@nϿӵ5~__o_D?tҟ_ |T$mǓ@ze`@o߾燺>zs@<:jP !W TJ}y"G} @cO$=i X f TR/ßd?UMBE~1@E SAe z/o ߿/@h@qfOOV9h:d0ؿؿ L/^ ./g_XI&&!>6bz$Uj?σO/$1*=!9HXωU +:I6F- jK Fd @#$8!\  hGIENDB`klog-1.8.6/flags/wales.png0000644000175000017500000000121414166020407014355 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|9 `ɟ00bJKv~?"D٤.UMVA!i.Ii{H#˽;~Ywߘ߼_uD?? )Y_up~}7?y~TX#/_b: @.Zr]~rʷb}⟓ ӂ,C|6Qq1 wu  wo$*1 FzP  'bo) "1E%P$>ZRw1. [HS1$%x-ٟ= K^xP_! L20hzIENDB`klog-1.8.6/flags/europeanunion.png0000644000175000017500000000073714166020407016142 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATx,Q=KA݋1+!)$_`%Z[$""D'v4Dce!Q$ΌovΛyo[(y&&b5,3 %"K`0`p(@KViaYvZ'xh83Tck*UƉ{PbBĜ DNvcGJ-qQ|1<2T(dfw\xbrstGC!cbFvsϮ7Q2DylYJ׳v % #sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-1.8.6/flags/lk.png0000644000175000017500000000116314166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxDƱ 0%3 Rpqg ҈3O1v=ڼ- `g˟??\"bd _@K]7-S=!(ﯿ_{|{  ߿7_sAn;7'Bn&( & Hj/.7r3K%8hbZT / ` S/?W} XaP X_H?ٕ_h@؆~7I?~><ǟ16#bF \,L2300񑍕ֿX3{n#RDPe}`TsRS_IENDB`klog-1.8.6/flags/ws.png0000644000175000017500000000073414166020407013701 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<nIDATxbd`f@ `䏟 w9 XKDLLnd${W^߿F~ٴ X9Я_ QVh@1a?кzP?@`u?A/i޽7!~u  4/d @IX`Ԯwo` @'A!T X2g{ob ѿa$#IČ`!(PUd@ c+/߿@?H? `c2d!_* ƯɀR@`o] .oIENDB`klog-1.8.6/flags/bo.png0000644000175000017500000000076414166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb/e~01@`8ގ(oKlhF[l܉B)Ѐp ߼**?H(& XEeSO?X`<@|Ib0?Po]0oXy?0 # A@PE13 ?ojfl%`@,k0? f@a1@~bO(\  WO ($" ?Ib H| a#8 !,n! P #|9FIENDB`klog-1.8.6/flags/ai.png0000644000175000017500000000120314166020407013631 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx1]hP9J+ 71, G0XaD\emlz_#n^)ryOXϿg2120| ^6R=m/]"#cjghS gުk ?1+  ?  OMwԕ' X~;ﯿJX+k?Pwbd[jÏD_#yvF?|! ~/8q}gq@~ o`1%B_u￟h_Y~  @ym8 A2@9? @#P'RD~#ܿ@7$@YH@{IENDB`klog-1.8.6/flags/th.png0000644000175000017500000000070414166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<VIDATxbπPX@ a@oHRWZ"{ <"bd3c>} FG׍9:hAϿBe[e3"}$Ͽ߿ѯ__8)/ ~q'ȑ@z~@D(,߿ h/lfI 7/;8vЌ`6IISϟ8۷o;;SI č2FJmٻ F$8bͪIENDB`klog-1.8.6/flags/ag.png0000644000175000017500000000111714166020407013633 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd vo#_οaߟ~߿[a&1.g 2!1H[z1?9-<0J*w?3 .??{LgQbi?Vv.&?25<_ W0bz?~-) %(%D2b 2~4y}oϟ#o#"%K~2T @L@ t?u?.^q@!I䇿Lb⌿uy=wT[&Sh( ƫ i.6 "iIENDB`klog-1.8.6/flags/fr.png0000644000175000017500000000104114166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,zߟ??022*'b ¦$A@? ~mE@40g߿ _~@6x=|Ϟ "@K890Kt&8@[zM"-b봗bP߿@*)qm@@/A00q;^ 7Lh3 |Tt@P?zD_6ˏ_@A]T aUV j=I,$߿@|z?.Nf &H@ %1d@|m?~}ˏ_Ҝ@ǏzA {f uDIENDB`klog-1.8.6/flags/vc.png0000644000175000017500000000110114166020407013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8߻  D?  Puu"Iղ/Pf?L'"~i&j~o8~-#  Vϟ`@\5ϟ xkF"Yx_ᗉ_@5@տgʻ'^2+؋_gfdt0tbHoZ~|~ qI7oйfLD~mï~RA6(X$/oTCD`a {$$؀>abd`e` #o,3e0 @ [q(h!PhEcO{Zέ IENDB`klog-1.8.6/flags/ao.png0000644000175000017500000000065414166020407013650 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<NIDATx\QJA=/wp\qH! |~e`..;n82y3N~NH)DB!HI K!ELp((p0&/`ol(D\"M5d|о' ӱ[-4a-bݺğu`f#bo 5Će3X#:y\YUAkWe[+|u({^Q&aQ=GgčSPej7``y"o)7cvfR\^+)m~/(4!1# /ଜݢ! )  Hu?|PWz5%3_]Hƛ1e,i73feqp놅0Əϊa:@};~%"x߿C$n7`ee>3@aC얯& }h&tIENDB`klog-1.8.6/flags/sk.png0000644000175000017500000000106214166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb;?8A8 @,@Y&.. &f 2 @@>1ç//P0?`dd@1Bdm^G {}הwl1EBEjk]]vzCƔ?__L?b @t-[=Gi ? lĸA뻽KFr?\{~20 aL@7JJs"YY@ $ A@pĀE\*=MIENDB`klog-1.8.6/flags/am.png0000644000175000017500000000076114166020407013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbׯ0?1@1QW)'veýL02 OW001$T~joF ? t &B5&a2~: XDf51yۿ*_2HW7lWAouMp~ 8<Ý q 9^?(T_?o?/?[ŜH@9jp=X'2000#F F ?>0^o ~1 01 ?Hq ͦWIENDB`klog-1.8.6/flags/ad.png0000644000175000017500000000120314166020407013624 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbL?~bZ1I?~Ea @?`d1\Oo04&@K M ;1ן~u\5 (7T} @ B.c^=VBzE҈Rf a,l@, @ԁLj D #- 6N f/@123@T$p<31ShBIENDB`klog-1.8.6/flags/st.png0000644000175000017500000000111014166020407013663 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb:c`#/@,V >Uz00Ͽ?Lu7 s>- T_0ׯ~-#@,@p}wҵ~r of[E `+8yw>_|쿙:1w/~_ld~k+W^.hɯ_~E @B\A~fgrLToN_!: X¿O"F?yW`?0y @[0 t! :ez ?=%$?#_/ ĸ!8"!E/hD?@^mI9џ\IENDB`klog-1.8.6/flags/de.png0000644000175000017500000000104114166020407013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbqf?f_ pb{qq9 / ~^n5@011U8y $?A~N@" ,X_@:~"?~@Ne@b@ь7h4LVg2-K , z#2ׯP `@;D?H%@1??ڀ T /@b`PPI@҄ab_A*$B$b`.a ?FL A@@@ X~e3o?6fA1?`@03b21@wt_XIENDB`klog-1.8.6/flags/ma.png0000644000175000017500000000066014166020407013643 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<BIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`<_ =` 5 3UUHY6>/=P @ ?Hnԯp! S AM Ȇ߿n?4d#IvX*_g@V00H3ċ` P@ L0HJl$"pP1@1~EHIDATxb#L) @,@?DN!/^ Ld@1  PUcvOw?h?P m_N7n|"gbb_?p1@ 03 ֻo^a; Xƃۗ3ݼ0xW{e95Cݻ[>>>dc,HwAb0]/uTIENDB`klog-1.8.6/flags/sr.png0000644000175000017500000000100114166020407013660 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdg``/0 $YP(F0p4I\"=  fkJ7܁*1$ŠO1?0 0,$#w$9߿@C"?Ц߿ d0JI}\ Xf|S:@*~gk @ ?A԰_e~!;i߿@nOO߿$^`7Lo(Mk^6`?@4,?3#W!;?pHBй ` Bybd(f`_H pH0i hIENDB`klog-1.8.6/flags/tn.png0000644000175000017500000000075714166020407013676 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@  rr_ee6 Pqq ?1eeoh߿ nj ?t迆 %@rџ W^^8?//H~_F GGl$9 "CCA~53$|@n@50Cڀ._X_L J۶߳}5Bi`ARl_y:F2@H%%HP1@1~EH+( H ܿ>81 ()̌ @ 516F23   po濿?~g{W;$ _ϿTܐKt@(!.?_?wS1>4@120#G$A$@/Z:YIENDB`klog-1.8.6/flags/ck.png0000644000175000017500000000111214166020407013634 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbܝ^K/:aaWG+坟Hm 2 ?~!#b47o\]@k~#&%"³޷33r߿ -/14 eH^i?MUB K]Q Tʩɿ~jt@1=0pƹ Sg Vx_z'N~OT<n߱g^_~nݏ:ue*Z?3= ۀ^IJ;e@,⏞ ;[̤A}_mmm 謿A2H t̞%y@R^B]2 H__ /e:P@5Y 1? @1[AF@ `?`_l vHn IENDB`klog-1.8.6/flags/fo.png0000644000175000017500000000073214166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<lIDATxb3 ʽ^Ub/yYR $Bgb6D?>xlh@UV 1 vFu&hc'JHo `S(@3_{ϯ E/ 2l$r2@# qk~$L=}/G X _@ af!#+ 4P=Kx,>`ȰMC x0_i{IENDB`klog-1.8.6/flags/ke.png0000644000175000017500000000107114166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb` 9 Law]2-$w>@U;;qX'O<~<-IIw?}[n޼ T @WOTտ%K%&Ȧg7P],}|߿?tܭ;P,9@07Bϔ8b۪dljuyd9#/5؇9FxAZK$3 (N;5,bG/ʟ# ƫ+)C>x0yӟ?$@b /gaf9pd%@1ylJm 3"+)ʈП8~D6!?~?P?bbdgR ~$a0[b=+ `iIENDB`klog-1.8.6/flags/ge.png0000644000175000017500000000112214166020407013633 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|5 BH2e?0\ X^8Ϥo((?ï~KJhj )ubwgxgO><~ h@l*bua7p?; Y@tր?101߿s(P6v3ӿo?^ˏ3D?6o;Porr_ P&3UF?mI~&;G6032IPm.1YTRM瓋 ?6}k۷+ &ٷSw,v#37oͬ (.'###;$ЈCM_h'\: ҶNsKIENDB`klog-1.8.6/flags/us.png0000644000175000017500000000114114166020407013670 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbLN?1?%o^P rn@+0Dc0P,Je >{2}RjL{D`bjX~ @AefxG/}cq@m4h}ݯ_ZU|~>}ûw޼yo/N<@, wofk ˟ -W~z+n `/_/Τ?WCrm~~Ѭׯ >~+W^|ݲe@d?[/i'7 GJJ-t΀!0eb^0#i/_2|t1_@K [.˫}feqQ?b`x?I U?(?A"?>30|`.D [0+IENDB`klog-1.8.6/flags/mn.png0000644000175000017500000000075414166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxbπ^20x@+?$U]`?j|?af'@>i@50/_w$E_FYY RA/C_? `AQ`bbTϟP!D !a\L?UgZRj$N PO 6 ?00H?f`j?@ : @fa"觿RL\ #I?L@J "" 3\f`@A‚N[YIENDB`klog-1.8.6/flags/mq.png0000644000175000017500000000121714166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<!IDATx1%xB& ɼvYoJ2.ucӡэLIYB^IT' gzp)ԅ#G?W_<~">O"\g`@, /UUZ ߾oE7o~ ٫ϛJ?}^nV#'}W6?I_w /Ͽ ,?| yk.K 𲳱2>y_@F$x{6VE1uzLgV.PBb ta4{?_>ySn.VN߿AFP ?m$/_ %! ɦ_bb+@%>4310b`ݗ/W}") G.!$@ :hIENDB`klog-1.8.6/flags/mu.png0000644000175000017500000000076014166020407013670 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<`0D X?D`>i@b`pbP? _@@lYy R\?iVo 4ᯜ0'8@iPڦ aF\(`T #X$H 2y4 6*)1 _?VIS FF0Pmb } (hBA o} 2C0%A  3jc@123E1gb0eWIENDB`klog-1.8.6/flags/ug.png0000644000175000017500000000102314166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb` #wt?0֟ V U?A 0fd}i;@c`J1 X_ ƿ_ 3f;@,L eo |;Q 12߿d ?? t@25{VQQQwg߿BS@,@ϟ_=ocbbbV H1=R@ P@o6 ֿ h6$ Csn'397ؖEHsP<T r 1׍EM w xn p` x1{qjDM9jP{R~eQ[wnUW O=>WRSW>_z;_}S# ]Ƞ<ށEz{}ɷK ”*s>H[E]@?@1gt5U9}PH߿/~?~{+}7 1wET(5M͵cq,S_2GW4  8IENDB`klog-1.8.6/flags/cm.png0000644000175000017500000000101514166020407013640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd X3Ȁ+ÿ0B97_`fSVEWֆl]LtkFXr]h@#S TO>_ƿfP_oFFY%8c`9T'Eu&.$l4eD| Jd*P[ 0߿ ~__ _PT @_~:??@,@ I@gd} =P@4$_!k:& <zI? `@ Ʌ J D dPIENDB`klog-1.8.6/flags/na.png0000644000175000017500000000120714166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`_ -2q/)W` 1~}C  26OK h*U;(_} d96oD פO"͇x?K1-h@L tc <_zl @@ɯ9{2ߘ  @e2_5-k߿ /ba&n% 70(FͻßpcȐh!(. `DOaIENDB`klog-1.8.6/flags/ci.png0000644000175000017500000000070514166020407013641 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxb?cSG  Կ'āR  X00V?? {ӱM_ۿ,,*bTo4@/%~]@,@12e?P i WfK@? 4~1kIt`at̟@ @U"`˿ L@Mܒ =8^~1R@q D}PL3c vCIENDB`klog-1.8.6/flags/ba.png0000644000175000017500000000112114166020407013621 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`8.O.fQ/$ 1VIƷE1Sm*>^3mŮwaf20~l@K h˿ 0m.KOj @ Ts?8G?ϟ~AT Tq٫߻z'@?5_ @ l?_CN]?e`?6 ߟ?u¢w>A["``@s$>{ۀ @h:@l_Rhb2@{{ƏY3 ȱ@ ;@ Tj/ `@IENDB`klog-1.8.6/flags/tj.png0000644000175000017500000000076014166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ gCV"`Ml_O(H_@Ư~l@WNNN$i` fSb{?,f&G AT̲y.@gb{Ǐ<<Y~a`bf!!?0 3ʅ3(OL< #6qL-AIENDB`klog-1.8.6/flags/sl.png0000644000175000017500000000066414166020407013670 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<FIDATxbd8̀103` 0@1n⨷8T۫BdeX%Nt@ O?Q￿ TR׿_44bUaWd ߿@PiEYDJ Ư_sr2- qFFG˿  e@ybbսX\,a_,_\ @\|1{߯_ a@ zp20\ `JKJBC;"0 a%"?$1Rq}IENDB`klog-1.8.6/flags/nu.png0000644000175000017500000000107414166020407013670 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,.2W݉"Y?~t'IK9 A_by%u'gb7?_>z?feLL*c1!3% 22ɚ F08(0Stګ'$“HMciSm9,3l Sμ 7X0h|:epkHP|ן?@5^'sq {ϼ 1hNyV *:yLVO~ 1pG U  .c ATCCh-$DA$ @@@ 30'+ I@e`wXhg?@F hc Hx|!IENDB`klog-1.8.6/flags/cf.png0000644000175000017500000000114614166020407013636 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbԿ/Vҿ9~axA/c 2L1ئ}2k m<n_9loO R? ). }@LB e߼тObBW 11>D5s-;;3g~?A}@LB]~~g-j0?Ĩ_XXkR_MZ]$mmmr}ZZڽ{~/00@$4EEEŋ V@)(0[b_* @NcHIENDB`klog-1.8.6/flags/is.png0000644000175000017500000000102414166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdПϥcfVYaï? LD`Pm l#1QBaKwi^fz ,CtԮ ? ϣG@_T_ :94_@H`@=@@% [g&@)+g8@,l ~0I D a @w  DC@`k/|IENDB`klog-1.8.6/flags/mc.png0000644000175000017500000000057414166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`J̓( 7P@1#P5Pş? $ ++p1!$ԿBBB q&&ׯ˿ |q,P1@4@85?j\0222 * @ /^b b0 P _{IENDB`klog-1.8.6/flags/scotland.png0000644000175000017500000000121114166020407015046 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|C[\b`b?_`ýw w?H;@1|&ߦG/H xۤ0E.fM;@̇.[21 <o{Ǜ;lm$=eX 7=\ < D8|!#b l".)ճS*=g˹; XvgwbR̛@{=-[7boV\' 7ٻ/_l~c @60ϯd k8]kd_9~N0*s3aaG_(_V`X2ñ gT~OfF#=TxδF @1ο,F(ew<[7?ϣk1g @Ƿk0r0H0|fR P+@@)KӣiIENDB`klog-1.8.6/flags/kn.png0000644000175000017500000000113414166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd 10@ D20aH* FVjjpp o'O|ߛ6m O>*o-!쿧Wk]\b:h2P@~5w_F<>fԙg  r0߳[~_t¯/{2^@ѿf`>- _?fP bh)?1Bwܶe׿~-!kZocOׯ3 @, L ! Yr/;VqpP @5@u`8K@m|ZZK u ӿ@?#g'7 ߬G~3 4l00+d_}< GAA@S- \0~IENDB`klog-1.8.6/flags/au.png0000644000175000017500000000124114166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx?jN !Lgdl_s `K ~I0U@,`m{Ue;UM.w~S_([gIYit ;?1BP" 1 ̷R=<.Ϻ.IÝw4LUg#,\4_ r[fέ F>?\?L[8)~Qoh(?BϞ= ?{ףGXA##? (,&a66%R @'#*ee?f~/ ׿_`]^?7ï_ @CH$V 4o ~3Jz @_J~_ l[mg P(r7P'PBr뿿e@JJW /P {*T@1e L&20iyx9IENDB`klog-1.8.6/flags/pf.png0000644000175000017500000000076214166020407013656 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb"$6@a = )Bl9֬J )rE|@ @@A  f@_3\tc5#;!?FFƏ>?W?.:ϝ?}sb}󟷟2J^fW7 j /?z13AĂP+4Y9e@,%$w/W0Ƚa_v/(X$)7㟿@9߿ad"/q_Cb1/IENDB`klog-1.8.6/flags/pa.png0000644000175000017500000000100714166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#L)aa @@,@y>>> 2^ }כ6 g9qfLR|{ϟ~U3 $/×@Q&C4"b^?8 X)Xo߿6VKWϿ2I?~b:$oF11>o BY*&&?ߟ 0u '׌&LxS/0?P_w^  XN't=0d3TfMMΞPtC \]ï? _@Pp?y] z-IENDB`klog-1.8.6/flags/hu.png0000644000175000017500000000066014166020407013662 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<BIDATxb<ˀ0B@bp 'VBBء,irN<6'O 2$P)d*+  XfGV  V V @10>}@'AUX#@@123ddw?~ D  UR:[p X~H_~AUH?  t@0b$$0Pf P/H@12X3 g@"m~gIENDB`klog-1.8.6/flags/bz.png0000644000175000017500000000113014166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbɀ0 & v E𓝃7n_y 3'㻏2ϟ/ .g?? vd~_7hT D2L j@oD7u^c&Y>")yX~-b@L@'習 v>wG?%ytt"`eQ|!_GǓ?W`P~_@Wi &_^<?>dP}OoHog{P;^g ÿ?@,0__agr? W4;<{ S!@, ^1~ _,6=/@? H o _ 0b@f 0(t0IENDB`klog-1.8.6/flags/gq.png0000644000175000017500000000103114166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbA10da &~Ǘo&߿_0￿7@,@]|>< HI4 Y^Yo #? AH-@1aã?~0B˗']8& ~aOh` 0 ?D3/8X٘8>}(L| bb0ā~}@, L~ h?'Pϟ@:@, _>"&OX/H5p|,210 û71 `C&5aIENDB`klog-1.8.6/flags/sv.png0000644000175000017500000000076514166020407013704 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdп c?(B PZ ?˜Qw XJcx?` ? u@ORh/@1?UYׯ3ur@4٘|@edd:?HXwcR>}@,B ׿ _L \5|CuOmk͉bةĸGU9@?@@yg~Kы_08~C/$I3O IQ?7H05(b 2eG$cCbtXlMIENDB`klog-1.8.6/flags/jm.png0000644000175000017500000000117514166020407013656 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb '_1?0~10``c 1U;{ MA%11=D26'. k 103<4 =[p ߿?~Y٫b*do _W[_@ۄ~* & o0zwR_ 0 l_b*~K׭?~Tj  @N}zbi;UWJ| 1FB1bKMG3I:.Q$^K0FGO_w_w@_2<`tc - >sw!IENDB`klog-1.8.6/flags/bd.png0000644000175000017500000000077014166020407013635 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdpf@ /D1XúLVwO²\9fgYdR'p5!t@,`?y/H_'ߏYׯ~-+, T @,@gMlwڥL~o/ _{Vj &s o'@$/{~/_ Ͽ?@UIC9H?F5 /67Bj@4Y@!À$A6 0t hV?5_% 9ʿWȀ @,  6(@DQbdDH _ak9IENDB`klog-1.8.6/flags/kh.png0000644000175000017500000000104514166020407013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbda` dC` _ }j@@d_aG _^**?D/ 7H5PWZ @ ZO6 wn3~lA2 tDud]-+/7)P/b_32 gp{x2pp2ppga X6a93' H>OO&&6V` `  1Fv rK0}^@#²Oua`/8X@nz^A{Utߧ"`9P<(LAa/>ڰyЈDC1 AL43UIENDB`klog-1.8.6/flags/za.png0000644000175000017500000000120214166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb`hfh_~ 7O _>30|d`x 3bt#,G1?1MY3_>|yrDo_XHݯ(+ 1~!' s1h$ LGㅃ-Of A 7o4 Xqwxǟo? ' idxDxߝQC&,~}lS./xYde~3KI7_0.6Iؽu/^? @+HE]ϋ"7hyg}c0H] 2f/` F ` B._CIENDB`klog-1.8.6/flags/um.png0000644000175000017500000000107314166020407013666 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbn?[(ۿ<nۉW~r߿}˗O`Ç bj0j@״0|߿IX-(`#@ yeȚ/?q(LL̷v  = h*P5gx?@3 @,@9 9dW@r恗6µ^2/] $3ٳ@Q@8U_~ǟ? RG絴 p 1g E$%gN }߿%A?~_6ii'СC&&&smO?=xtxD100|10|@`FEH{IENDB`klog-1.8.6/flags/bv.png0000644000175000017500000000100014166020407013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|rsE]D3?`A @,@Qj )FFF0~ "߿n@,`{H|σ@ ׿_,+  U@_ @=@$@W߿@g@c@e>#sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-1.8.6/flags/pl.png0000644000175000017500000000056614166020407013666 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb# ?l X@ 3300G_= Ȍ##?H)VFj0ģ X?{? Yi I_ !~_ 69vXd<"T00H3 pE5ei`ARl_? `# $ A@pĀE\Ǵ]IENDB`klog-1.8.6/flags/ru.png0000644000175000017500000000064414166020407013676 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb?BAX )̀l#/ dj?6 ==gd䌿 d@$$XX XoH7?_Iyy?|4D/ THRH\) @@,5|HӟD efE ?phU=L0HJ倢 `g1 H W*M  ?e8aIENDB`klog-1.8.6/flags/ss.png0000644000175000017500000000045614166020407013676 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIMEUIDAT(c2(),*n*f^2? _ܖ&1AS1C{>}/Sh-k `b```􏁑? >0=W($-*;sc O <IENDB`klog-1.8.6/flags/pw.png0000644000175000017500000000104614166020407013673 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd c"?#Yp('E0 ) YHkps{2ǿRʈ)kRqQ{@, L OHv?P,#ÿ2@;0+WjedxAPhub/H @WP_~{Mddx01>T^> &02a >[Ǭ  7ߊp ' X_??ވ c@s eÜw?xʬsw>+$> ~cfK0\}v+(3/#0f! t@12e?@P?h :ZYIENDB`klog-1.8.6/flags/tm.png0000644000175000017500000000112114166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdd$?|!ѐ~10`? 1|s" u  Rss ?çO~>|u'ϥ7x۷ 1sn=xٽ?;3&ۇ{+ן߿~hobjϿ~_]LSyo  X~/+o_r'RTK({Ƿ@ K8 Xa_8~}/هW~؆?@o5 /ǯ\q/`j50ghn `~q0pi >߽"s)I?  Vl bdEğ 2 w A&IENDB`klog-1.8.6/flags/sz.png0000644000175000017500000000120314166020407013674 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx (>lк,~$ˡdöMC_,ίj ,2 0@OO߿woֿ]y3-fN6 o`@+_mu/0E3(. '1b P Fo>D$? <PKT`$aN::yIENDB`klog-1.8.6/flags/tt.png0000644000175000017500000000115114166020407013671 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxA0ڧr%tF~QWkf1xy8 \y)))DF2N?i@17{hooqҥ[n]s.,ׯzD<|/_"7` v P3w~޼Mj@?00 3ga;7?oj[}_ïܿj w,ވpQg}yo? 4?滏z>)Lexp/Li_?@,L< ?Vn?2|bg`?0 F| ?"CA@!#IENDB`klog-1.8.6/flags/pe.png0000644000175000017500000000061514166020407013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπs (*KA@VW1f?@˦M rdp_ee6 Pտj߿6Lh@/ĕ44 N_50@`' *V `うa` fprV @t@40 ) 6/$ѩ C * ƯH "B =a;n'IENDB`klog-1.8.6/flags/tv.png0000644000175000017500000000103014166020407013667 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd@ C`X T[Rÿ2 bo%KA9s?x%@1BFFO> D'^~Ͽ@Ȁ_6N]*0-@1\Bu|t/ R 3N7 І/l?Zd!=2HOB S ~ ,pI?@t܎)'ȱt+@1ןߗV/Qt[  ,0޾} @ io0_[N뗂gw^߿u ݑ"~2E'sր#?,5&SPɽIENDB`klog-1.8.6/flags/bq.png0000644000175000017500000000064014166020407013646 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIMERz-IDAT(ύ̱Kqg T$CA D NAMA`JAK$fVf(AF*oxZ,ڧ^ZQ ? $JGZ"-$&3‘^6@$/ֽKR[&u|YⴇgEQHdo Wbdl6(F9t¯&PNykFBMӈbD幇p':i=sTgs]оDSw,U}IENDB`klog-1.8.6/flags/ch.png0000644000175000017500000000055714166020407013645 0ustar develdevelPNG  IHDR &qgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπP@, ^u5###7Ï0gl`S-d:II$/T~7@hYe@ׯ@ 020q/@m,*~  fe֭PIssSeeR@_@q)@T0HQ|?ڀ)&ǏIENDB`klog-1.8.6/flags/kp.png0000644000175000017500000000106114166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb4 ï?@ bc ƃ7(?v @1~d`d_ ,L|? ~IJb|9(Q^_Wٽo߿@oFf /[?k栠ll~?B@ /U0 tN ϟ? r.Э/^޼% ߿{ϟ E?BUm* v-Y–_REMgm7ofx& b` -xx=zP򕁋?+?:p(c?AA`˩ߵY@ sH,cq5@12x @6@ Xg "IENDB`klog-1.8.6/flags/ms.png0000644000175000017500000000114614166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<]{IvէzM|,9+_/`1/%@ 1Ȼ96&88i oy5Y?e5?s _T_z 7P@'&drJ?cZiƢS73 @~ mT; ß?oܼ*ǭ׏_@@15+<-Q,4(ٺ v@c~a|ww9?u,h?5@ :=?(!! $@:&D~//#C$,FH 2wF-5 IENDB`klog-1.8.6/flags/lt.png0000644000175000017500000000077414166020407013673 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb}D $l bb j&f2?P@ÿߟ. &Fg  BUh.@\ _@3B7`0beu@a(s˗? /_ 6? X~0i)Ii@h XϟB`~h@T @,k[t hֿ?e`/PN?.2?_J?0.?Y8z00/fKJ  $?`` #rāg%"wCݙIENDB`klog-1.8.6/flags/va.png0000644000175000017500000000105114166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|}^; #=&Ͽr?P5 H?E8/^`?Hϟg`??` ! u0 @fϗOP@16lzE]?ÿ``4g'O7 X}b<ٿ~.%>iFǎIɲ1 E +Ż7ؙߚ勗 u?P@<Y?n F&F&FVEb20 pN!!`xw?ÿe I ?hh0SF.7IENDB`klog-1.8.6/flags/lu.png0000644000175000017500000000074114166020407013666 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<sIDATxbo??_ÿ  X>al 2/ӟ!0KS'@0ׯe? U"Aߌ@/俒*HP'O^ ߾}+((r ` 022~ X ޅX##0T@@ ; 9s cC pA;eO>_p0@A.:47ß@i=~c00b/`_`LA $@yk ߿IENDB`klog-1.8.6/flags/ky.png0000644000175000017500000000120314166020407013663 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbZXOxޕr[L D M> ?01'3sW   jE} p116(Ŝ5 1 ("$!! ,*WY"12: rz1$ "V'ԙںe'nu ßߌ~ɯ_<c@`UѲ h@00]ןʯgmXNy6P.@_o@5+ ([ @P矿 ح+~0@P? ~8 ~~b %bd`Ѕ(2  %WIENDB`klog-1.8.6/flags/si.png0000644000175000017500000000077614166020407013671 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb+Df(?Ïsq05(|@,<~=󿿭 LLFFF%,xxBB,~? CB}CO~ԙg[s=bof_@ ~ɿ>f`x@@'aW"__`b B Xcl@@#0/ïPL@ӧ@gr2:ן@@%'3L /vo!.7A?T=L@JJ@ba@/#0!!T.^\1 Pp,IENDB`klog-1.8.6/flags/cc.png0000644000175000017500000000116114166020407013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdef?I_0?lsA/oZ.߿W{8ξcT6 @|d&any5l+Ǐ?}?_μa@L "9~)7boV_jl_7L@1W1 Rg7lm"27^"1 } %  ,~ﯿש I'v_ 0~'6ٯEA@,@  ϗ9~/_`@,`HCKh @߿@@ /1?P~'a(w#@шU;MlAƭG\Mˏo4{qr13c~$b9@?˿2KsojH/bat?~@]?Dv:\37P@@zn: _p @ @uBO3'_?2 >qE^~ibd@a c8ƒ:8.EiS^wIENDB`klog-1.8.6/flags/dk.png0000644000175000017500000000075714166020407013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb zAR Q] VxyK}ϟ3I /7m jP~P@r`r2 ? @?0!n{b###H=>Y/ R4mhD d@@.H @~h0bvBIENDB`klog-1.8.6/flags/so.png0000644000175000017500000000101714166020407013664 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbTߟ? 1 /B97hh&ȰO@Q]z7$a*8 W_AJ2`8#P@1*6vr? t@a f8gd; _ NR<%* ? `W+ g?$ϿAfd2@,@[e Ӱ_@vy / 3a -W  ` t@12~eHb@G < mxȮIENDB`klog-1.8.6/flags/at.png0000644000175000017500000000062314166020407013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<%IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, 5DŁVY?~&.ovb|򥨨(ؖ `J!$77۷o$*8; BV?bXXk$_oeߴ˿4Xa%!?at@CIIPEr0@HT @_Q#OC@|WZ^IENDB`klog-1.8.6/flags/by.png0000644000175000017500000000100214166020407013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA {$mYJ֚a&N 0tg!fKq(|qn@2$EO0|Ȱk| jP H(+ XP Q Rob5ƍ `?9 A?!@  *wRTyPmp@?6׭?i20O F'?H߯_߿Qs mnj)}f $?AOL>2,> X2|TS"'_a @譿@~0/I?x|ڴʔa@0  o7u[TbeIENDB`klog-1.8.6/flags/canary.png0000644000175000017500000000036414166020407014524 0ustar develdevelPNG  IHDR n pHYs  tIME 0p57IDAT(c?zxgL 3y˝DU D[)#럕'W1~"230(H?Տ??1'Ө'M4-1BIENDB`klog-1.8.6/flags/balear.png0000644000175000017500000000061614166020407014475 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<0IDATxTMKA UUŏPԛTxAUۃ+ Kw233;KLƘj,TbU9u f(fLjW'YBHZYer$3L +Lt؂"$|lu{؟r2rqOڕ L |~}"# @1!;&  ; !6[1D# 0/JN&rH 鿿~ z:|5s6y,l\1YY21= ?X~`'0A?z11`?|MZyˋ` d.$1310H10 !IENDB`klog-1.8.6/flags/ae.png0000644000175000017500000000063014166020407013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<*IDATxbπk P V8)妛/F4e{/ђ"[@` ?y/=߿_ Ȑ@,`CTt^`dd| XNe;ȓI@f;/ NU~q: @Af kk_~JY篊ŋII?es!$=p$@ziٟ>IENDB`klog-1.8.6/flags/az.png0000644000175000017500000000111514166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdxÿ? @?@l XvU)DT߿? ? _ 4@0pq10< g߿@3_@ r1aFFI~x_@$$͜ @, LL M?EEJIU^߮^߿ ğaWTfUP|ed.,$00P#$~ak?ޗLK{f폻w8#P'H0@ gsf?^y"?_ŵ!*_B2? X>1GM_pЀl ߟ1#C)P(j$a0e#WIENDB`klog-1.8.6/flags/ly.png0000644000175000017500000000064314166020407013673 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<5IDATxbdɀ00ؿ$@b`BWZ\}`f6{jW&ɱ"4E} x_j "$296H! T/ *b9/ PE Ư_06H@lo`JAF im @W qfj ?,P9ӑ@6( (!!(@V* ` %"$ r(IENDB`klog-1.8.6/flags/lv.png0000644000175000017500000000072114166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<cIDATxb 10db` / @߿I 37m >y R D@90 _~ree =( 4 ߿?10˓'yBg: 2A9,ll ƿ222pF&>˛sed60@n ɓX}P8( P_I9bz  ?W@` X.II1E0B:0,"!E/hD?@|(IEPZIENDB`klog-1.8.6/flags/gt.png0000644000175000017500000000075514166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdNc`,$ߧo#8(." FϿ*  H@! Q@Ew_4_Zh@]21@s_6,a XcrT{~5b  P?}4 @I!N rҟ a s ï0E@E @4@#?&1>%?~102D!3#0nY \2No{ϟ`W{1p*1 sIENDB`klog-1.8.6/flags/kz.png0000644000175000017500000000115014166020407013665 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd.? >Q ?`d0I @@ U1a@џ?ba``x w0qAr2n>_4/@113cmͿ֚@ $[/h0L~p| O/f ?'Ko_\o%B XaQ[]KO?/@ @"}?*{kKf tҿ? Rnk(0XSO+ =FPI@`2(r3Eix_d_q@ bdX_%;x\@0001iZsqIENDB`klog-1.8.6/flags/ee.png0000644000175000017500000000065514166020407013643 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<?IDATxbdp~cF@?P(0 v`yS+4kvrOVȦܙR60 2 OA߿ (/ ?Yav?t?@AU R R$ tba״ϣG7B_`FIr4P @)|dFӧO @J/\@,^+%@P @PHUm>mެT A@e@ _/R=mګ_UV7!&3uvVo5?@SA$+$Rz X1e=!Cp?`@,@k~aEd0@H :+4f&Zt8IENDB`klog-1.8.6/flags/marquesas.png0000644000175000017500000000056314166020407015251 0ustar develdevelPNG  IHDR v 9bKGD pHYs  tIME88YIDAT(ϝ-O`FOӎ: &0$nĐZ6dEѥkbϽ(&P@1RJQCr _wo#cz q@J,v `}cfϵҘiEbI~3G 0<)%e)hAA|uM wau,Əy <~rSbIENDB`klog-1.8.6/flags/kg.png0000644000175000017500000000077614166020407013657 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbȀ`$2p) 0أꊐ{3# pzU}ߓ @7_F ] ($+  XGfߌ~.` @T @L @΀ΤQŨYH/%@ ߟ(?/~}20'od/b˯O~BU-: ~bï_fd`]P1@5@<uկ~1ן}N %%A 1@7#ِ0$b|03v!f Tg_TIENDB`klog-1.8.6/flags/tl.png0000644000175000017500000000100214166020407013654 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA ]=3=\$IfMNp :J!s#5^ 1|?@?$˦Mp¿Oc/ $ f@ ?/aJAC40 @L@ Gg 6biknn8syI_`?6Hm[_~&VbWb:@,@'1|W|<F"I O{_P?f >CL\22@u # !~1˴ӊ3|``0&` ` |^#iIENDB`klog-1.8.6/searchwindow.cpp0000644000175000017500000010142514166020421014642 0ustar develdevel /*************************************************************************** searchwindow.cpp - description ------------------- begin : sept 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchwindow.h" SearchWindow::SearchWindow(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SearchWindow::SearchWindow: " << QT_ENDL; dataProxy = dp; showStationCallsignInHeader = true; //sortingThroughProxyModel = false; searchModel = new SearchModel(dataProxy, this); util = new Utilities; connect(searchModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); //logView = new QTableView; treeView = new QTreeView; //dxccStatusWidget = new DXCCStatusWidget(dataProxy); //elogClublog = new eLogClubLog(); currentLog = -1; //proxyModel = new LogViewSortFilterProxyModel(this); awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "SearchWindow::SearchWindow: - END" << QT_ENDL; } SearchWindow::~SearchWindow() { // emit clearError(); } void SearchWindow::sortColumn(const int _c) { //proxyModel->sort(_c); searchModel->sort(_c, Qt::AscendingOrder); } void SearchWindow::clear() { //qDebug() << "SearchWindow::clear " << QT_ENDL; qslingNeeded = false; } void SearchWindow::createUI() { //qDebug() << "SearchWindow::createUI" << QT_ENDL; //logView->setContextMenuPolicy(Qt::CustomContextMenu); //logView->setSortingEnabled(true); QStringList labels; if (showStationCallsignInHeader) { labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Station Callsign") << tr("ID") ; //treeView->setColumnCount(8); } else { labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("ID") ; //treeView->setColumnCount(7); } //searchModel->setColumnsToDX(); /* QStandardItemModel model; model.setColumnCount (1); model.setHeaderData (0, Qt::Horizontal, "Player"); */ //treeView->setHeaderLabels(labels); //QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); (treeView->header())->resizeSections(QHeaderView::ResizeToContents); //treeView->clear(); //searchResultsTreeWidget->collapseAll(); treeView->setSortingEnabled(true); treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeView->setSortingEnabled(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(treeView); //layout->addWidget(logView); setLayout(layout); } void SearchWindow::setDefaultData() { //qDebug() << "SearchWindow::setDefaultData" << QT_ENDL; } void SearchWindow::setStationCallsignInHeader(const bool _h) { showStationCallsignInHeader = _h; setColumnsToDX(); } void SearchWindow::createlogPanel(const int _currentLog) { //qDebug() << "SearchWindow::createlogPanel: " << QString::number(_currentLog) << QT_ENDL; currentLog = _currentLog; searchModel->createSearchModel(currentLog); treeView->setModel(searchModel); treeView->setCurrentIndex(searchModel->index(0, 0)); //logView->setModel(searchModel); //logView->setCurrentIndex(searchModel->index(0, 0)); //setProxyModel(false); //QString contestMode = dataProxy->getLogTypeOfUserLog(currentLog); setColumnsToDX(); sortColumn(1); //Initial sort by column 1 (date & time) //qDebug() << "SearchWindow::createlogPanel " << searchModel->record(0).field(1).value().toString() << QT_ENDL; //logView->setSelectionMode(QAbstractItemView::ExtendedSelection); //logView->setSelectionBehavior(QAbstractItemView::SelectRows); //logView->resizeColumnsToContents(); //logView->horizontalHeader()->setStretchLastSection(true); //logView->sortByColumn(1); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); treeView->setSelectionBehavior(QAbstractItemView::SelectRows); //treeView->resizeColumnsToContents(); //treeView->horizontalHeader()->setStretchLastSection(true); treeView->sortByColumn(1, Qt::AscendingOrder); } void SearchWindow::setColumnsToDX() { //qDebug() << "SearchWindow::setColumnsToDX" << QT_ENDL; QString stringQuery; //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, id FROM log LIMIT 1"); stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SearchWindow::setColumnsToDX - Query: " << query.lastQuery() << QT_ENDL; QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.count(); for (int i=0; i < columns; i++) { //logView->setColumnHidden(i, true); treeView->setColumnHidden(i, true); } columns = rec.indexOf("qso_date"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Date/time")); searchModel->setSort(columns, Qt::AscendingOrder); columns = rec.indexOf("call"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Call")); columns = rec.indexOf("bandid"); searchModel->setBandIdColumn(columns); treeView->setColumnHidden(columns, false); searchModel->setRelation(columns, QSqlRelation("band", "id", "name")); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Band")); columns = rec.indexOf("modeid"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Mode")); searchModel->setRelation(columns, QSqlRelation("mode", "id", "submode")); searchModel->setModeIdColumn(columns); columns = rec.indexOf("qsl_sent"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Sent")); columns = rec.indexOf("qsl_rcvd"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Rcvd")); if (showStationCallsignInHeader) { columns = rec.indexOf("station_callsign"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Station callsign")); } columns = rec.indexOf("dxcc"); searchModel->setDXCCColumn(columns); columns = rec.indexOf("lognumber"); searchModel->setLogNColumn(columns); //columns = rec.indexOf("id"); //treeView->setColumnHidden(columns, false); } void SearchWindow::refresh() { //qDebug() << "SearchWindow::refresh" << QT_ENDL; searchModel->select(); } void SearchWindow::createActions() { createActionsCommon(); } void SearchWindow::createActionsCommon() { //LOG VIEW //connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); //connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); connect(treeView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); connect(treeView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); } void SearchWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << "SearchWindow::slotshowRighButtonFromLog: " << QString::number((treeView->indexAt(pos)).row()) << QT_ENDL; //int row = (logView->indexAt(pos)).row(); int row = (treeView->indexAt(pos)).row(); //int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); showMenuRightButtonFromLogCreateActions(); rightButtonFromLogMenu(row); //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::rightButtonFromLogMenu(const int row) { //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSO_id: " << QString::number(row) << QT_ENDL; int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID) << QT_ENDL; bool qslReceived = isQSLReceived(_qsoID); bool qslSent = isQSLSent(_qsoID); QMenu menu(this); menu.addAction(delQSOFromLogAct); delQSOFromLogAct->setData(row); menu.addAction(qsoToEditFromLogAct); qsoToEditFromLogAct->setData(row); menu.addAction(checkQRZCOMFromLogAct); checkQRZCOMFromLogAct->setData(row); menu.addAction(checkDXHeatFromLogAct); checkDXHeatFromLogAct->setData(row); menu.addSeparator(); if (qslSent) { } else { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); menuSentQsl->addAction(qslSentRequestedAct); if (!qslReceived) { menuSentQsl->addAction(qslSentViaBureauMarkRcvReqFromSearchAct); menuSentQsl->addAction(qslSentViaDirectMarkRcvReqFromSearchAct); qslSentViaBureauMarkRcvReqFromSearchAct->setData(row); qslSentViaDirectMarkRcvReqFromSearchAct->setData(row); } qslSentViaBureauFromLogAct->setData(row); qslSentViaDirectFromLogAct->setData(row); qslSentRequestedAct->setData(row); } if (qslReceived) { } else { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); menuRecQsl->addAction(qslRecViaBureauMarkReqFromSearchAct); menuRecQsl->addAction(qslRecViaDirectFromLogAct); menuRecQsl->addAction(qslRecViaDirectMarkReqFromSearchAct); menuRecQsl->addAction(qslRecRequestedAct); qslRecViaBureauFromLogAct->setData(row); qslRecViaBureauMarkReqFromSearchAct->setData(row); qslRecViaDirectFromLogAct->setData(row); qslRecViaDirectMarkReqFromSearchAct->setData(row); qslRecRequestedAct->setData(row); } menu.exec(QCursor::pos()); } void SearchWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << "SearchWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()) << QT_ENDL; int row = index.row(); //qsoToEdit((searchModel->index(row, 0)).data(0).toInt()); int qsoID = ((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt(); //qDebug() << "SearchWindow::slotDoubleClickLog: n: " << QString::number (searchModel->data(index, Qt::DisplayRole).toInt()) << QT_ENDL; //qDebug() << "SearchWindow::slotDoubleClickLog: emitted: " << QString::number (((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt()) << QT_ENDL; emit actionQSODoubleClicked(qsoID); //qsoToEdit((searchModel->index(row, 0)).data(0).toInt()); //TODO: To be added to the SearchWindow and create an action that emist the QSO id to be edited searchModel->select(); } bool SearchWindow::isQSLReceived(const int _qsoId) { //qDebug() << "SearchWindow::isQSLReceived: " << QString::number(_qsoId) << QT_ENDL; return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL //return dataProxy->isQSLReceived(_qsoId); } bool SearchWindow::isQSLSent(const int _qsoId) { //qDebug() << "SearchWindow::isQSLSent: " << QString::number(_qsoId) << QT_ENDL; return dataProxy->isQSLSent(_qsoId); } void SearchWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "SearchWindow::showMenuRightButtonFromLogCreateActions" << QT_ENDL; delQSOFromLogAct = new QAction(tr("&Delete"), this); delQSOFromLogAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog())); qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog())); qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() )); qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog() )); qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau")); connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() )); qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t")); connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() )); checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this); checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com")); connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() )); checkDXHeatFromLogAct = new QAction(tr("Check in DXHeat.com"), this); checkDXHeatFromLogAct->setStatusTip(tr("Check this callsign in DXHeat.com")); connect(checkDXHeatFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckDXHeatCom() )); qslSentRequestedAct = new QAction(tr("&Request my QSL"), this); qslSentRequestedAct->setStatusTip(tr("Mark my QSL as requested")); connect(qslSentRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLSentMarkAsRequested() )); qslSentViaDirectMarkRcvReqFromSearchAct = new QAction(tr("Via Direct and mark DX QSL as requested"), this); qslSentViaDirectMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via direct and mark DX QSL as requested")); connect(qslSentViaDirectMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectMarkDXReqFromSearch() )); qslSentViaBureauMarkRcvReqFromSearchAct = new QAction(tr("Via Bureau and mark DX QSL as requested"), this); qslSentViaBureauMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via bureau and mark DX QSL as requested")); connect(qslSentViaBureauMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauMarkDXReqFromSearch() )); qslRecRequestedAct = new QAction(tr("&Request the QSL"), this); qslRecRequestedAct->setStatusTip(tr("Mark the QSL as requested")); connect(qslRecRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLRecMarkAsRequested() )); qslRecViaBureauMarkReqFromSearchAct = new QAction(tr("Via bureau and mark my QSL as requested"), this); qslRecViaBureauMarkReqFromSearchAct->setStatusTip(tr("QSL received via bureau and mark my QSL as requested")); connect(qslRecViaBureauMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauMarkReqFromSearch() )); qslRecViaDirectMarkReqFromSearchAct = new QAction(tr("Direc&t and mark as my QSL requested"), this); qslRecViaDirectMarkReqFromSearchAct->setStatusTip(tr("QSL received via direct and mark my QSL as requested")); connect(qslRecViaDirectMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectMarkReqFromSearch() )); } void SearchWindow::slotQSLSentViaBureauFromLog() { //qDebug() << "SearchWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); searchModel->select(); } void SearchWindow::slotQSLSentViaDirectFromLog() { //qDebug() << "SearchWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy-MM-dd")); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); searchModel->select(); } void SearchWindow::slotQSLRecViaBureauFromLog() { //qDebug() << "SearchWindow::slotQSLRecViaBureauFromLog: " << QT_ENDL; int _qsoId = ((searchModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); searchModel->select(); //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::slotQSLRecViaDirectFromLog() { //qDebug() << "SearchWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ) << QT_ENDL; int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaDirect(_qsoId); searchModel->select(); // Mark Sent, Bureau, date, update log. //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::slotQSOToEditFromLog() { //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString() << QT_ENDL; int QSOid = ((searchModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int QSOid = qsoToEditFromLogAct->data().toInt(); emit actionQSODoubleClicked(QSOid); //TODO: To be added to the SearchWindow and create an action that emit the QSO id } /* void SearchWindow::deleteQSO(const int _qsoID) { //qDebug() << "SearchWindow::deleteQSO: " << QString::number(_qsoID) << QT_ENDL; //int QSOid = (delQSOFromLogAct->data()).toInt(); emit actionDeleteQSO(_qsoID); elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID)); dataProxy->deleteQSO(_qsoID); refresh(); searchModel->select(); emit updateAwards(); emit updateSearchText(); } */ void SearchWindow::slotQsoDeleteFromLog() { //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number((delQSOFromLogAct->data()).toInt()) << QT_ENDL; int QSOid = ((searchModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int QSOid = (delQSOFromLogAct->data()).toInt(); //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number(QSOid) << QT_ENDL; //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID2: " << QString::number((delQSOFromLogAct->data()).toInt()) << QT_ENDL; emit actionDeleteQSO(QSOid); searchModel->select(); } void SearchWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << "SearchWindow::qslSentViaBureau: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); searchModel->select(); } void SearchWindow::qslRecViaBureau(const int _qsoId) { // //qDebug() << "LogWyyyy-MM-ddRecViaBureau: " << QString::number(_qsoIyyyy-MM-dd<< (dateTime->currentDateTime()).toString("yyyy/MM/dd") << QT_ENDL; dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); //Update the Award status searchModel->select(); //refresh(); emit updateAwards(); } void SearchWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << "SearchWindow::qslRecViaDirect: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); searchModel->select(); //refresh(); emit updateAwards(); } void SearchWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); } void SearchWindow::slotCheckQRZCom() { QString _qrz = ((searchModel->index( ( (checkQRZCOMFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //qDebug() << "SearchWindow::sloTCheckQRZCom: " << _qrz << QT_ENDL; QString url = "https://www.qrz.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void SearchWindow::slotCheckDXHeatCom() { //int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); QString _qrz = ((searchModel->index( ( (checkDXHeatFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //qDebug() << "SearchWindow::slotCheckDXHeatCom(): " << _qrz << QT_ENDL; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void SearchWindow::setFilterString(const QString &_st) { //qDebug() << "SearchWindow::setFilterString: " << _st << QT_ENDL; searchModel->setFilterString(_st); //qDebug() << "SearchWindow::setFilterString: - END " << QT_ENDL; } void SearchWindow::selectAll() { //qDebug() << "SearchWindow::selectAll: " << QString::number(searchModel->rowCount()) << QT_ENDL; int rowCount = searchModel->rowCount(); //logView->selectAll(); treeView->selectAll(); for (int i=0;iselectRow(i); } } void SearchWindow::clearSelection() { //qDebug() << "SearchWindow::clearSelection" << QT_ENDL; //logView->clearSelection(); treeView->clearSelection(); } QList SearchWindow::getSelectedQSOs() { //qDebug() << "SearchWindow::getSelectedQSOs: (Total: " << QString::number(searchModel->rowCount()) << ")"<< QT_ENDL; QList selectedQSOs; //QModelIndexList selection = //logView->selectionModel()->selectedRows(); QModelIndexList selection = treeView->selectionModel()->selectedRows(); foreach (QModelIndex index, selection) { int row, qsoID; row = index.row(); qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); selectedQSOs.append(qsoID); } //qDebug() << "SearchWindow::getSelectedQSOs: (Selected: (" << QString::number(selectedQSOs.count()) << ")" << QT_ENDL; return selectedQSOs; } void SearchWindow::slotQSLRecMarkAsRequested() { int _qsoId = ((searchModel->index((qslRecRequestedAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { emit updateSearchLineEdit(); } searchModel->select(); } void SearchWindow::setNeedingQSL(bool const _q) { qslingNeeded = _q; } void SearchWindow::slotToolSearchQSL(const int actionQSL) { //qDebug() << "SearchWidget::slotToolSearchQSL: " << QString::number(actionQSL) << " - LogNumber: " << QString::number(currentLog) << QT_ENDL; // 2 means QSL_RCVD = 'R' QString stringQuery = QString(); QString message = QString(); QString aux = QString(); QString filter; filter = QString(); //int i = -1; switch (actionQSL) { case 0://void searchToolNeededQSLToSend(); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 0" << QT_ENDL; stringQuery = QString("SELECT call, qso_date,dxcc, bandid, modeid, qsl_sent, qsl_rcvd, lotw_qsl_rcvd, station_callsign, id FROM log WHERE (qsl_rcvd<>'Y' AND lotw_qsl_rcvd<>'Y') AND qsl_sent<>'Y' AND qsl_sent<>'Q' AND qsl_sent<>'R' AND lognumber='%1' AND (bandid, dxcc) NOT IN (SELECT distinct bandid, dxcc from log WHERE qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(currentLog); //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, log.id FROM log JOIN awarddxcc ON awarddxcc.qsoid=log.id WHERE awarddxcc.confirmed='0' AND log.qsl_sent!='Y' AND log.qsl_sent!='Q' AND log.qsl_sent!='R' AND log.lognumber='%1'").arg(currentLog); message = tr("Needed QSO to send the QSL"); setNeedingQSL(true); //qslingNeeded = true; emit requestFocus(); break; case 1: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 1" << QT_ENDL; filter = QString("qsl_sent=='R' AND lognumber='%1'").arg(currentLog); message = tr("My QSL requested to be sent"); break; case 2://void slotToolSearchNeededQSLPendingToReceive(); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 2" << QT_ENDL; filter = QString("lognumber='%1' AND ( (qsl_sent='Y' AND qsl_rcvd!='Y' AND qsl_rcvd!='I') OR qsl_rcvd='R')").arg(currentLog); message = tr("DX QSL pending to be received"); break; case 3://void slotToolSearchNeededQSLRequested() //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 3" << QT_ENDL; filter = QString("WHERE lognumber='%1' AND qsl_rcvd='R'").arg(currentLog); message = tr("DX QSL pending to be received"); break; default: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE DEFAULT" << QT_ENDL; // should never be reached return; // break; } clear(); setFilterString(filter); } void SearchWindow::searchToolNeededQSLToSend() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function" << QT_ENDL; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END" << QT_ENDL; } void SearchWindow::slotQSLSentMarkAsRequested() { //qDebug() << "SearchWindow::slotQSLSentMarkAsRequested: " << QString::number( (qslSentRequestedAct->data()).toInt() ) << QT_ENDL; // bool qslSentAsRequested(const int _qsoId, const QString &_updateDate); int _qsoId = ((searchModel->index((qslSentRequestedAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslSentAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); } void SearchWindow::slotQSLSentViaDirectMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: " << QT_ENDL; int _qsoId = ((searchModel->index((qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); // Mark Sent, Bureau, date, update log. } void SearchWindow::slotQSLSentViaBureauMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: " << QString::number( (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt() ) << QT_ENDL; //int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: - END " << QT_ENDL; // Mark Sent, Bureau, date, update log. } void SearchWindow::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start" << QT_ENDL; //int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslRecViaBureauMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01" << QT_ENDL; //qslRecViaBureauMarkReq(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId) << QT_ENDL; if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03" << QT_ENDL; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04" << QT_ENDL; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05" << QT_ENDL; emit updateSearchText(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06" << QT_ENDL; } searchModel->select(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07" << QT_ENDL; } void SearchWindow::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << QT_ENDL; //int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslRecViaDirectMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //qslRecViaDirectMarkReq(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); // Mark Sent, Bureau, date, update log. } /* void SearchWindow::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate() << QT_ENDL; dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END" << QT_ENDL; } */ /* void SearchWindow::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId) << QT_ENDL; dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWindow::colorTheList() { //qDebug() << "SearchWidget::colorTheList: " << QString::number(treeView->model()->rowCount()) << QT_ENDL; for (int i = 0; i < treeView->model()->rowCount(); i++) { //QString _qrz = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(1).toString()); QString _qrz = (searchModel->index(i, 2)).data(Qt::DisplayRole).toString(); //QColor getQRZDXStatusColor(const QStringList &_qs); // Receives Entity, band, mode & log //QColor color = awards->getQRZDXStatusColor() QColor color = QColor(Qt::blue); //searchModel->setItemData(searchModel->index(i, 2), color); //qDebug() << "SearchWidget::colorTheList: " << _qrz << QT_ENDL; } } */ void SearchWindow::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; // Just to pass the colors to the awards class searchModel->setColors(_newOne, _needed, _worked, _confirmed, _default); } klog-1.8.6/charts/0000755000175000017500000000000014166020421012722 5ustar develdevelklog-1.8.6/charts/statsqsospermodebarchartwidget.h0000644000175000017500000000462114166020407021435 0ustar develdevel#ifndef STATSQSOSPERMODEBARCHARTWIDGET_H #define STATSQSOSPERMODEBARCHARTWIDGET_H /*************************************************************************** statsqsospermodebarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerModeBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerModeBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerModeBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERMODEBARCHARTWIDGET_H klog-1.8.6/charts/statsqsospermodebarchartwidget.cpp0000644000175000017500000001136514166020407021773 0ustar develdevel/*************************************************************************** statsqsospermodebarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsospermodebarchartwidget.h" StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(){} StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget" << QT_ENDL; #else #endif dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerModeBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerModeBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); //categoriesTitle = QString(); //categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per mode")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart: SelectedGrapth-1: MODES " << QT_ENDL; categories.append(dataProxy->getModesInLog(_log)); categoriesElem = tr("Modes"); categoriesTitle = tr("QSOs per mode distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { numberPerX = dataProxy->getQSOsInMode((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; aux = tr("Reading data ...") + "\n" + tr("Modes: ") + QString::number(i) + "/" + QString::number(categories.count()); //aux = tr("Reading data ...") + "\n" + tr("Modes: %1/%2").arg(QString::number(i)).arg(QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsqsospercontinentbarchartwidget.h0000644000175000017500000000465714166020407022523 0ustar develdevel#ifndef STATSQSOSPERCONTINENTBARCHARTWIDGET_H #define STATSQSOSPERCONTINENTBARCHARTWIDGET_H /*************************************************************************** statsqsospercontinentbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerContinentBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerContinentBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerContinentBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsqsospermonthbarchartwidget.cpp0000644000175000017500000001134714166020407022174 0ustar develdevel/*************************************************************************** statsqsospermonthbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsospermonthbarchartwidget.h" StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(){} StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerMonthBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerMonthBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per month")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList months; months.clear(); months << tr("Jan") << tr("Feb") << tr("Mar") << tr("Apr") << tr("May") << tr("Jun") << tr("Jul") << tr("Aug") << tr("Sep") << tr("Oct") << tr("Nov") << tr("Dec"); categories.append(months); categoriesElem = tr("Months"); categoriesTitle = tr("QSOs at Month"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { numberPerX = dataProxy->getQSOsOnMonth(i+1, _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Months: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statssentconfirmedpiechartwidget.cpp0000644000175000017500000000702514166020407022301 0ustar develdevel/*************************************************************************** statssentconfirmedpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statssentconfirmedpiechartwidget.h" StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(){} StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsSentConfirmedPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsSentConfirmedPieChartWidget::prepareChart(const int _log) { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int sent = dataProxy->getHowManyQSLSentInLog(_log); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(_log); //qDebug() << "Confirmed: " << QString::number(confirmed) << QT_ENDL; series->append(tr("Sent - %1").arg(sent), sent); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Sent / Confirmed status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-1.8.6/charts/statsworkedsentpiechartwidget.h0000644000175000017500000000461314166020407021273 0ustar develdevel#ifndef STATSWORKEDSENTPIECHARTWIDGET_H #define STATSWORKEDSENTPIECHARTWIDGET_H /*************************************************************************** statsworkedsentpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsWorkedSentPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedSentPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsWorkedSentPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsqsosperdxccbarchartwidget.h0000644000175000017500000000462114166020407021432 0ustar develdevel#ifndef STATSQSOSPERDXCCBARCHARTWIDGET_H #define STATSQSOSPERDXCCBARCHARTWIDGET_H /*************************************************************************** statsqsosperdxccbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerDXCCBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerDXCCBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerDXCCBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/barchartstats.h0000644000175000017500000000630414166020407015747 0ustar develdevel#ifndef BARCHARTSTATS_H #define BARCHARTSTATS_H /*************************************************************************** barchartstats.h - description ------------------- begin : ago 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" #include "charts/statsqsosperyearbarchartwidget.h" #include "charts/statsqsosperbandbarchartwidget.h" #include "charts/statsqsospermodebarchartwidget.h" #include "charts/statsentitiesperyearbarchartwidget.h" #include "charts/statscqzperyearbarchartwidget.h" #include "charts/statsqsosperdxccbarchartwidget.h" #include "charts/statsqsospercontinentbarchartwidget.h" #include "charts/statsqsosperhourbarchartwidget.h" #include "charts/statsqsospermonthbarchartwidget.h" #include "charts/statsworkedconfirmedpiechartwidget.h" #include "charts/statsworkedsentpiechartwidget.h" #include "charts/statssentconfirmedpiechartwidget.h" #include "charts/statsgridsonsatswidget.h" #include "charts/statsdxccsonsatswidget.h" #include "charts/statsfieldperbandwidget.h" //#include "charts/statspiechartwidget.h" class BarChartStats : public QWidget { Q_OBJECT public: BarChartStats(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~BarChartStats(); void prepareChart(const int _selection, const int _log=-1); void clear(); signals: public slots: private: void createUI(); void cleanLayout(); DataProxy_SQLite *dataProxy; //QChart *chart; //QChartView *chartView; QWidget *mainWidget; StatsGeneralChartWidget *genchart; QVBoxLayout *mLayout; //QBarCategoryAxis *axis; }; #endif // BARCHARTSTATS_H klog-1.8.6/charts/statsgeneralchartwidget.cpp0000644000175000017500000000425514166020407020362 0ustar develdevel/*************************************************************************** statsgeneralchartwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsgeneralchartwidget.h" StatsGeneralChartWidget::StatsGeneralChartWidget() { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" << QT_ENDL; } StatsGeneralChartWidget::StatsGeneralChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" << QT_ENDL; } void StatsGeneralChartWidget::prepareChart(const int _log) {} void StatsGeneralChartWidget::createUI(){} klog-1.8.6/charts/statsqsospercontinentbarchartwidget.cpp0000644000175000017500000001127414166020407023047 0ustar develdevel/*************************************************************************** statsqsospercontinentbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsospercontinentbarchartwidget.h" StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(){} StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerContinentBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerContinentBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per continent")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList continents; continents.clear(); continents << dataProxy->getContinentShortNames(); categories.append(continents); categoriesElem = tr("Continents"); categoriesTitle = tr("QSOs per continent"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { numberPerX = dataProxy->getQSOsWithContinent(categories.at(i), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsqsosperhourbarchartwidget.cpp0000644000175000017500000001143014166020407022015 0ustar develdevel/*************************************************************************** statsqsosperhourbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsosperhourbarchartwidget.h" StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(){} StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget" << QT_ENDL; #else #endif dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerHourBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerHourBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per hour")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList hours; hours.clear(); hours << "00" << "01" << "02" << "03" << "04" << "05" << "06" << "07" << "08" << "09" << "10" << "11" << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20" << "21" << "22" << "23"; categories.append(hours); categoriesElem = tr("Hours"); categoriesTitle = tr("QSOs at hour"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { numberPerX = dataProxy->getQSOsAtHour((categories.at(i)).toInt(), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsgeneralchartwidget.h0000644000175000017500000000424614166020407020027 0ustar develdevel#ifndef STATSGENERALCHARTWIDGET_H #define STATSGENERALCHARTWIDGET_H /*************************************************************************** statsgeneralchartwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy_sqlite.h" class StatsGeneralChartWidget : public QWidget { Q_OBJECT public: StatsGeneralChartWidget(); StatsGeneralChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); virtual void prepareChart(const int _log=-1); private: virtual void createUI(); }; #endif // GENERALCHARTWIDGET_H klog-1.8.6/charts/statsqsosperhourbarchartwidget.h0000644000175000017500000000462114166020407021466 0ustar develdevel#ifndef STATSQSOSPERHOURBARCHARTWIDGET_H #define STATSQSOSPERHOURBARCHARTWIDGET_H /*************************************************************************** statsqsosperhourbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerHourBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerHourBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerHourBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsqsosperbandbarchartwidget.cpp0000644000175000017500000001133514166020407021750 0ustar develdevel/*************************************************************************** statsqsosperbandbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsosperbandbarchartwidget.h" StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(){} StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerBandBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerBandBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); //categoriesTitle = QString(); //categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per band")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << QT_ENDL; categories.append(dataProxy->getBandsInLog(_log)); categoriesElem = tr("Bands"); categoriesTitle = tr("QSOs per band distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { numberPerX = dataProxy->getQSOsInBand((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; aux = tr("Reading data ...") + "\n" + tr("Bands: ") + QString::number(i) + "/" + QString::number(categories.count()); //aux = tr("Reading data ...") + "\n" + tr("Bands: %1/%2").arg(QString::number(i)).arg(QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsqsospermonthbarchartwidget.h0000644000175000017500000000463014166020407021636 0ustar develdevel#ifndef STATSQSOSPERMONTHBARCHARTWIDGET_H #define STATSQSOSPERMONTHBARCHARTWIDGET_H /*************************************************************************** statsqsospermonthbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerMonthBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerMonthBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerMonthBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERMONTHBARCHARTWIDGET_H klog-1.8.6/charts/statsentitiesperyearbarchartwidget.cpp0000644000175000017500000001123514166020407022642 0ustar develdevel/*************************************************************************** statsentitiesperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsentitiesperyearbarchartwidget.h" StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(){} StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget" << QT_ENDL; #else #endif dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsEntitiesPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsEntitiesPerYearBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("Chart title")); //*set0->remove(0, set0->count()-1); //qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsEntitiesPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << QT_ENDL; //qDebug() << "BarChartStats::prepareChart: SelectedGrapth-2: DXCC " << QT_ENDL; categories.append(dataProxy->getOperatingYears(_log)); categoriesElem = tr("DXCC Entities"); categoriesTitle = tr("DXCC Entities per year"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { numberPerX = dataProxy->getDXCConYear((categories.at(i)).toInt(), _log); *set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Entities: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart DXCCs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; } series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); // chart->setAxisX(axis, series); } klog-1.8.6/charts/statsqsosperbandbarchartwidget.h0000644000175000017500000000462114166020407021415 0ustar develdevel#ifndef STATSQSOSPERBANDBARCHARTWIDGET_H #define STATSQSOSPERBANDBARCHARTWIDGET_H /*************************************************************************** statsqsosperbandbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerBandBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerBandBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerBandBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsqsosperyearbarchartwidget.h0000644000175000017500000000462114166020407021451 0ustar develdevel#ifndef STATSQSOSPERYEARBARCHARTWIDGET_H #define STATSQSOSPERYEARBARCHARTWIDGET_H /*************************************************************************** statsqsosperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsQSOsPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsQSOsPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-1.8.6/charts/statsfieldperbandwidget.h0000644000175000017500000000522214166020407020002 0ustar develdevel#ifndef STATSFIELDPERBANDWIDGET_H #define STATSFIELDPERBANDWIDGET_H /*************************************************************************** statsfieldperbandwidget.h - description ------------------- begin : jul 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "qso.h" #include "utilities.h" #include "charts/statsgeneralchartwidget.h" #include "klogdefinitions.h" class StatsFieldPerBandWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsFieldPerBandWidget(); StatsFieldPerBandWidget(DataProxy_SQLite *dp, ValidFieldsForStats _field, QWidget *parent = nullptr); void prepareChart(const int _log=-1); signals: private slots: void slotConfirmedClicked(); void slotModeComboBoxChanged(); private: void createUI(); DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; ValidFieldsForStats selectedField; QComboBox *modeComboBox; QString modeInUse; int log; }; #endif // STATSFIELDPERBANDWIDGET_H klog-1.8.6/charts/statsqsosperyearbarchartwidget.cpp0000644000175000017500000001075214166020407022006 0ustar develdevel/*************************************************************************** statsqsosperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsosperyearbarchartwidget.h" StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(){} StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsQSOsPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerYearBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX= 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per year")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); categories.append(dataProxy->getOperatingYears(_log)); categoriesElem = tr("QSOs"); categoriesTitle = tr("QSOs per year"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { int numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; aux = tr("Reading data ...") + "\n" + tr("QSO: %1/%2").arg(QString::number(i), QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsworkedconfirmedpiechartwidget.h0000644000175000017500000000465114166020407022272 0ustar develdevel#ifndef STATSWORKEDCONFIRMEDPIECHARTWIDGET_H #define STATSWORKEDCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statsworkedconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsWorkedConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsWorkedConfirmedPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsfieldperbandwidget.cpp0000644000175000017500000001414314166020407020337 0ustar develdevel/*************************************************************************** statsfieldperbandwidget.cpp - description ------------------- begin : jul 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsfieldperbandwidget.h" StatsFieldPerBandWidget::StatsFieldPerBandWidget(DataProxy_SQLite *dp, ValidFieldsForStats _field, QWidget *parent) { //qDebug() << "StatsFieldPerBandWidget::StatsFieldPerBandWidget" << QT_ENDL; dataProxy = dp; util = new Utilities; selectedField = _field; modeComboBox = new QComboBox; createUI(); //prepareChart(); } void StatsFieldPerBandWidget::createUI() { modeInUse = "ALL"; log = -1; QString allString = tr("All"); modeComboBox->clear (); modeComboBox->addItem (allString); modeComboBox->addItems (dataProxy->getModesInLog (-1)); dataProxy->getModesInLog (-1); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(3); tableWidget->resizeRowsToContents(); tableWidget->sortByColumn(0, Qt::AscendingOrder); tableWidget->horizontalHeader()->setStretchLastSection(true); QLabel *textLabel = new QLabel; textLabel->setText(tr("Mode: ")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(modeComboBox); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(labelLayout); layout->addWidget(tableWidget); setLayout(layout); connect(modeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotModeComboBoxChanged() ) ) ; } void StatsFieldPerBandWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log) << QT_ENDL; while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Worked"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); QStringList bands; bands << dataProxy->getBandsInLog (_log); QString aux; int gridsCount; foreach (aux, bands) { tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((aux)) ); QTableWidgetItem *item = tableWidget->item (tableWidget->rowCount()-1, 0); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, aux, false, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 1); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, aux, true, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 2); item->setTextAlignment( Qt::AlignCenter ); } // Now we add the "All" row. tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem(tr("All")) ); QTableWidgetItem *item = tableWidget->item (tableWidget->rowCount()-1, 0); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, "ALL", false, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 1); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, "ALL", true, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 2); item->setTextAlignment( Qt::AlignCenter ); } void StatsFieldPerBandWidget::slotConfirmedClicked() { prepareChart(log); } void StatsFieldPerBandWidget::slotModeComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << modeComboBox->currentText() << "/" << QString::number(modeComboBox->currentIndex ()); if (modeComboBox->currentIndex ()==0) { modeInUse = "ALL"; } else { modeInUse = modeComboBox->currentText (); } prepareChart (log); } klog-1.8.6/charts/statsdxccsonsatswidget.cpp0000644000175000017500000001702114166020421020246 0ustar develdevel/*************************************************************************** statsdxccsonsatswidget.cpp - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsdxccsonsatswidget.h" StatsDXCCOnSatsWidget::StatsDXCCOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget" << QT_ENDL; #else #endif dataProxy = dp; util = new Utilities; confirmedOnlyCheckBox = new QCheckBox; onlyLEOSatCheckBox = new QCheckBox; numberLabel = new QLabel; log = -1; //chart = new QChart(); //chartView = new QChartView(chart); //chart->setTheme(QChart::ChartThemeQt); //chart->setTheme(QChart::ChartThemeBlueCerulean); createUI(); //prepareChart(); } void StatsDXCCOnSatsWidget::createUI() { confirmedOnlyCheckBox->setText(tr("Show confirmed only")); confirmedOnlyCheckBox->setChecked(false); onlyLEOSatCheckBox->setText(tr("Only LEO sats", "LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure.")); onlyLEOSatCheckBox->setChecked(false); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(7); tableWidget->resizeRowsToContents(); tableWidget->sortByColumn(2, Qt::AscendingOrder); tableWidget->horizontalHeader()->setStretchLastSection(true); //logView->sortByColumn(1); QLabel *textLabel = new QLabel; textLabel->setText(tr("Number")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); numberLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); numberLabel->setText(QString::number(0)); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(numberLabel); QHBoxLayout *checksLayout = new QHBoxLayout; checksLayout->addWidget(confirmedOnlyCheckBox); checksLayout->addWidget(onlyLEOSatCheckBox); checksLayout->addLayout(labelLayout); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(checksLayout); layout->addWidget(tableWidget); setLayout(layout); connect(confirmedOnlyCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); connect(onlyLEOSatCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); } StatsDXCCOnSatsWidget::~StatsDXCCOnSatsWidget() { delete(util); } void StatsDXCCOnSatsWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log) << QT_ENDL; while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; QList _qsos; _qsos.clear(); _qsos << dataProxy->getSatDXCCStats(log); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Callsign"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Date"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem(tr("Mode"))); tableWidget->setHorizontalHeaderItem(4, new QTableWidgetItem(tr("DXCC"))); tableWidget->setHorizontalHeaderItem(5, new QTableWidgetItem(tr("Satellite"))); tableWidget->setHorizontalHeaderItem(6, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); //qDebug() << "StatsDxccOnSatsWidget::prepareChart: QSOs: " << QString::number(_qsos.length()) << QT_ENDL; int number = 0; QList entities; entities.clear(); if (_qsos.length()>0) { for (int i = 0; i<_qsos.length(); i++) { bool confirmed = false; bool printThisOne = true; QString satName = _qsos.at(i)->getSatName(); QString qslStatus = QString(); if (_qsos.at(i)->getLoTWQSL_RCVD() == "Y") { qslStatus = "LoTW"; confirmed = true; } else if (_qsos.at(i)->getQSL_RCVD() == "Y") { qslStatus = "QSL"; confirmed = true; } else { qslStatus = QString(tr("No")); confirmed = false; } if (confirmedOnlyCheckBox->isChecked() && !confirmed) { printThisOne = false; } if ((onlyLEOSatCheckBox->isChecked()) && (satName == "QO-100") ) { printThisOne = false; } if (entities.contains(_qsos.at(i)->getDXCC())) { printThisOne = false; } if (printThisOne) { //qDebug() << "StatsDxccOnSatsWidget::prepareChart: QSOs: printThisOne: " << (_qsos.at(i)->getCall()) << QT_ENDL; entities.append(_qsos.at(i)->getDXCC()); number++; tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((_qsos.at(i)->getCall())) ); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem( util->getDateSQLiteStringFromDate(_qsos.at(i)->getDate()) ) ); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem((_qsos.at(i)->getBand())) ); tableWidget->setItem(tableWidget->rowCount()-1, 3, new QTableWidgetItem((_qsos.at(i)->getMode())) ); tableWidget->setItem(tableWidget->rowCount()-1, 4, new QTableWidgetItem((dataProxy->getEntityNameFromId(_qsos.at(i)->getDXCC()))) ); tableWidget->setItem(tableWidget->rowCount()-1, 5, new QTableWidgetItem(satName)); tableWidget->setItem(tableWidget->rowCount()-1, 6, new QTableWidgetItem(qslStatus) ); } } numberLabel->setText(QString::number(number)); } } void StatsDXCCOnSatsWidget::slotConfirmedClicked() { prepareChart(log); } klog-1.8.6/charts/statssentconfirmedpiechartwidget.h0000644000175000017500000000463514166020407021752 0ustar develdevel#ifndef STATSSENTCONFIRMEDPIECHARTWIDGET_H #define STATSSENTCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statssentconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsSentConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsSentConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsSentConfirmedPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-1.8.6/charts/statsentitiesperyearbarchartwidget.h0000644000175000017500000000465014166020407022312 0ustar develdevel#ifndef STATSENTITIESPERYEARBARCHARTWIDGET_H #define STATSENTITIESPERYEARBARCHARTWIDGET_H /*************************************************************************** statsentitiesperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsEntitiesPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsEntitiesPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsEntitiesPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-1.8.6/charts/barchartstats.cpp0000644000175000017500000001317714166020407016310 0ustar develdevel/*************************************************************************** barchartstats.cpp - description ------------------- begin : ago 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/barchartstats.h" BarChartStats::BarChartStats(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { dataProxy = dp; mainWidget = new QWidget(); mLayout = new QVBoxLayout; mainWidget->setLayout(mLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mainWidget); setLayout(mainLayout); } BarChartStats::~BarChartStats(){} void BarChartStats::clear() { //qDebug() << "BarChartStats::clear()" << QT_ENDL; //cleanLayout(); prepareChart(1); } void BarChartStats::createUI() { //QVBoxLayout *graphLayout = new QVBoxLayout; //graphLayout->addWidget(chartView); //setLayout(graphLayout); } void BarChartStats::cleanLayout() { //qDebug() << Q_FUNC_INFO << QT_ENDL; QLayoutItem *child; while (mLayout->count()!=0) { child = mLayout->takeAt(0); delete child->widget(); } //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void BarChartStats::prepareChart(const int _selection, const int _log) { //qDebug() << Q_FUNC_INFO << QT_ENDL; cleanLayout(); switch (_selection) { case 1: { //qsoPerYearBarChartWidget->prepareChart() genchart = new StatsQSOsPerYearBarChartWidget(dataProxy, nullptr); } break; case 2: { //cleanLayout(); genchart = new StatsEntitiesPerYearBarChartWidget(dataProxy, nullptr); } break; case 3: { //cleanLayout(); genchart = new StatsCQZPerYearBarChartWidget(dataProxy, nullptr); } break; case 4: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-4: per band " << QT_ENDL; genchart = new StatsQSOsPerBandBarChartWidget(dataProxy, nullptr); } break; case 5: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-5: per modes " << QT_ENDL; genchart = new StatsQSOsPerModeBarChartWidget(dataProxy, nullptr); } break; case 6: { //cleanLayout(); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-6: per dxcc " << QT_ENDL; genchart = new StatsQSOsPerDXCCBarChartWidget(dataProxy, nullptr); } break; case 7: { // How many QSO per Continent //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/Continent " << QT_ENDL; //cleanLayout(); genchart = new StatsQSOsPerContinentBarChartWidget(dataProxy, nullptr); } break; case 8: { //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour " << QT_ENDL; //cleanLayout(); genchart = new StatsQSOsPerHourBarChartWidget(dataProxy, nullptr); } break; case 9: { //cleanLayout(); genchart = new StatsQSOsPerMonthBarChartWidget(dataProxy, nullptr); } break; case 10: { //cleanLayout(); genchart = new StatsWorkedConfirmedPieChartWidget(dataProxy, nullptr); } break; case 11: { //cleanLayout(); genchart = new StatsWorkedSentPieChartWidget(dataProxy, nullptr); } break; case 12: { //cleanLayout(); genchart = new StatsSentConfirmedPieChartWidget(dataProxy, nullptr); } break; case 13: { //cleanLayout(); genchart = new StatsGridsOnSatsWidget(dataProxy, nullptr); } break; case 14: { //cleanLayout(); genchart = new StatsDXCCOnSatsWidget(dataProxy, nullptr); } break; case 15: { //cleanLayout(); genchart = new StatsFieldPerBandWidget(dataProxy, GridSquare, nullptr); } break; case 16: { //cleanLayout(); genchart = new StatsFieldPerBandWidget(dataProxy, DXCC, nullptr); } break; } genchart->prepareChart(_log); mLayout->addWidget(genchart); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; //delete genchart; } klog-1.8.6/charts/statscqzperyearbarchartwidget.cpp0000644000175000017500000001111014166020407021603 0ustar develdevel/*************************************************************************** statscqzperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statscqzperyearbarchartwidget.h" StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(){} StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsCQZPerYearBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsCQZPerYearBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; int numberPerX = 0; chart->removeAllSeries(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("CQ Zones per year")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << QT_ENDL; categories.append(dataProxy->getOperatingYears(_log)); categoriesElem = tr("CQ zones"); categoriesTitle = tr("CQ zones per year"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { numberPerX = dataProxy->getCQzonYear((categories.at(i)).toInt(), _log); //numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), -1); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX) << QT_ENDL; *set0 << numberPerX; //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX) << QT_ENDL; aux = tr("Reading data ...") + "\n" + tr("Years: %1/%2").arg(QString::number(i), QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statsworkedsentpiechartwidget.cpp0000644000175000017500000000717614166020407021635 0ustar develdevel/*************************************************************************** statsworkedsentpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsworkedsentpiechartwidget.h" StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(){} StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget" << QT_ENDL; dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsWorkedSentPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedSentPieChartWidget::prepareChart(const int _log) { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(_log); int confirmed = dataProxy->getHowManyQSLSentInLog(_log); //qDebug() << "QSOs: " << QString::number(qsos) << QT_ENDL; //qDebug() << "Confirmed: " << QString::number(confirmed) << QT_ENDL; //qDebug() << "Worked: " << QString::number(qsos - confirmed) << QT_ENDL; series->append(tr("Worked - %1").arg(qsos), qsos); series->append(tr("Sent - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Worked / Sent status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-1.8.6/charts/statsworkedconfirmedpiechartwidget.cpp0000644000175000017500000000740214166020407022622 0ustar develdevel/*************************************************************************** statsworkedconfirmedpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsworkedconfirmedpiechartwidget.h" StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(){} StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget" << QT_ENDL; #else #endif dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); //prepareChart(); } void StatsWorkedConfirmedPieChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedConfirmedPieChartWidget::prepareChart(const int _log) { QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(_log); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(_log); //qDebug() << "QSOs: " << QString::number(qsos) << QT_ENDL; //qDebug() << "Confirmed: " << QString::number(confirmed) << QT_ENDL; //qDebug() << "Worked: " << QString::number(qsos - confirmed) << QT_ENDL; series->append(tr("Worked, not confirmed - %1").arg(qsos-confirmed), qsos - confirmed); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Worked / Confirmed status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); } klog-1.8.6/charts/statsgridsonsatswidget.h0000644000175000017500000000504414166020407017725 0ustar develdevel#ifndef STATSGRIDSONSATSWIDGET_H #define STATSGRIDSONSATSWIDGET_H /*************************************************************************** statsgridsonsatswidget.h - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "qso.h" #include "utilities.h" #include "charts/statsgeneralchartwidget.h" class StatsGridsOnSatsWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsGridsOnSatsWidget(); StatsGridsOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); void prepareChart(const int _log=-1); signals: private slots: void slotConfirmedClicked(); private: void createUI(); DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; QCheckBox *confirmedOnlyCheckBox, *onlyLEOSatCheckBox; QLabel *numberLabel; int log; }; #endif // STATSGRIDSONSATSWIDGET_H klog-1.8.6/charts/statsgridsonsatswidget.cpp0000644000175000017500000001643514166020407020266 0ustar develdevel/*************************************************************************** statsgridsonsatswidget.cpp - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsgridsonsatswidget.h" StatsGridsOnSatsWidget::StatsGridsOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsGridsOnSatsWidget::StatsGridsOnSatsWidget: " << QT_ENDL; #else #endif dataProxy = dp; util = new Utilities; confirmedOnlyCheckBox = new QCheckBox; onlyLEOSatCheckBox = new QCheckBox; numberLabel = new QLabel; log = -1; //chart = new QChart(); //chartView = new QChartView(chart); //chart->setTheme(QChart::ChartThemeQt); //chart->setTheme(QChart::ChartThemeBlueCerulean); createUI(); //prepareChart(); } void StatsGridsOnSatsWidget::createUI() { confirmedOnlyCheckBox->setText(tr("Show confirmed only")); confirmedOnlyCheckBox->setChecked(false); onlyLEOSatCheckBox->setText(tr("Only LEO sats", "LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure.")); onlyLEOSatCheckBox->setChecked(false); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(7); tableWidget->resizeRowsToContents(); tableWidget->sortByColumn(2, Qt::AscendingOrder); tableWidget->horizontalHeader()->setStretchLastSection(true); //logView->sortByColumn(1, Qt::AscendingOrder); QLabel *textLabel = new QLabel; textLabel->setText(tr("Number")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); numberLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); numberLabel->setText(QString::number(0)); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(numberLabel); QHBoxLayout *checksLayout = new QHBoxLayout; checksLayout->addWidget(confirmedOnlyCheckBox); checksLayout->addWidget(onlyLEOSatCheckBox); checksLayout->addLayout(labelLayout); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(checksLayout); layout->addWidget(tableWidget); setLayout(layout); connect(confirmedOnlyCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); connect(onlyLEOSatCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); } void StatsGridsOnSatsWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log) << QT_ENDL; while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; QList _qsos; _qsos.clear(); _qsos << dataProxy->getSatGridStats(log); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Callsign"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Date"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem(tr("Mode"))); tableWidget->setHorizontalHeaderItem(4, new QTableWidgetItem(tr("Grid"))); tableWidget->setHorizontalHeaderItem(5, new QTableWidgetItem(tr("Satellite"))); tableWidget->setHorizontalHeaderItem(6, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); //qDebug() << "StatsGridsOnSatsWidget::prepareChart: QSOs: " << QString::number(_qsos.length()) << QT_ENDL; int number = 0; QStringList grids; grids.clear(); if (_qsos.length()>0) { for (int i = 0; i<_qsos.length(); i++) { bool confirmed = false; bool printThisOne = true; QString satName = _qsos.at(i)->getSatName(); QString qslStatus = QString(); if (_qsos.at(i)->getLoTWQSL_RCVD() == "Y") { qslStatus = "LoTW"; confirmed = true; } else if (_qsos.at(i)->getQSL_RCVD() == "Y") { qslStatus = "QSL"; confirmed = true; } else { qslStatus = QString(tr("No")); confirmed = false; } if (confirmedOnlyCheckBox->isChecked() && !confirmed) { printThisOne = false; } if ((onlyLEOSatCheckBox->isChecked()) && (satName == "QO-100") ) { printThisOne = false; } if (grids.contains((_qsos.at(i)->getGridSquare()).left(4))) { printThisOne = false; } if (printThisOne) { grids.append((_qsos.at(i)->getGridSquare()).left(4)); number++; tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((_qsos.at(i)->getCall())) ); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem( util->getDateSQLiteStringFromDate(_qsos.at(i)->getDate()) ) ); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem((_qsos.at(i)->getBand())) ); tableWidget->setItem(tableWidget->rowCount()-1, 3, new QTableWidgetItem((_qsos.at(i)->getMode())) ); tableWidget->setItem(tableWidget->rowCount()-1, 4, new QTableWidgetItem((_qsos.at(i)->getGridSquare()).left(4)) ); tableWidget->setItem(tableWidget->rowCount()-1, 5, new QTableWidgetItem(satName)); tableWidget->setItem(tableWidget->rowCount()-1, 6, new QTableWidgetItem(qslStatus) ); } } numberLabel->setText(QString::number(number)); } } void StatsGridsOnSatsWidget::slotConfirmedClicked() { prepareChart(log); } klog-1.8.6/charts/statsqsosperdxccbarchartwidget.cpp0000644000175000017500000001602114166020407021762 0ustar develdevel/*************************************************************************** statsqsosperdxccbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "charts/statsqsosperdxccbarchartwidget.h" StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(){} StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget" << QT_ENDL; #else #endif dataProxy = dp; chart = new QChart(); chartView = new QChartView(chart); createUI(); // prepareChart(); } void StatsQSOsPerDXCCBarChartWidget::createUI() { chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerDXCCBarChartWidget::prepareChart(const int _log) { QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per DXCC")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); aux = tr("Reading data...") ; progress.setLabelText(aux); progress.setValue(0); QStringList entities; entities.clear(); entities << dataProxy->getEntitiesIds(); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart: SelectedGrapth-1: YEARS " << QT_ENDL; QMap map; // key,value = number of QSO, dxcc //int qsos = -1; map.clear(); aux.clear(); QList> data; data.clear(); data << dataProxy->getTop10QSOPerDXCC(_log); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart: Length: " << QString::number(data.length()) << QT_ENDL; foreach(QList pair, data) { map.insert(pair.at(0), pair.at(1)); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(0): " << QString::number(pair.at(0)) << QT_ENDL; //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(1): " << QString::number(pair.at(1)) << QT_ENDL; categories.append(dataProxy->getEntityMainPrefix(pair.at(0)) + " (" + QString::number(pair.at(1)) + ")"); set0->append(pair.at(1)); //*set0 << pair.at(1); } /* for (int i = 0; i < entities.size(); ++i) { qsos = dataProxy->getQSOsWithDXCC((entities.at(i)).toInt(), _log); if (qsos>0) { //qDebug() << "Checking: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; if (map.size()<10) { //qDebug() << "Inserting: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; map.insert(qsos, (entities.at(i)).toInt()); } else { QMapIterator it(map); while (it.hasNext()) { it.next(); if (it.key()< qsos) { //qDebug() << "Removing: " << QString::number(it.key()) << " / " << QString::number(it.value()) << QT_ENDL; //qDebug() << "Replacing by: " << entities.at(i) << " / " << QString::number(qsos) << " - " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << QT_ENDL; map.remove(it.key()); map.insert(qsos, (entities.at(i)).toInt()); it.toBack(); } } } } aux = tr("Reading data...") + "\n" + tr("Entity: ") + QString::number(i) + "/" + QString::number(entities.size()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = entities.size(); } //qDebug() << "End of for iteration" << QT_ENDL; } */ /* QMapIterator it(map); while (it.hasNext()) { it.next(); categories.append(dataProxy->getEntityMainPrefix(it.value())); //qDebug() << "While iteration: " << dataProxy->getEntityMainPrefix(it.value()) << QT_ENDL; numberPerX = it.key(); *set0 << numberPerX; numberPerX = 0; //qDebug() << "End of while iteration" << QT_ENDL; } //qDebug() << "Out of while" << QT_ENDL; */ categoriesElem = tr("DXCC"); categoriesTitle = tr("Top ten DXCC per QSO"); sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); //chart->setAxisX(axis, series); } klog-1.8.6/charts/statscqzperyearbarchartwidget.h0000644000175000017500000000461614166020407021265 0ustar develdevel#ifndef STATSCQZSPERYEARBARCHARTWIDGET_H #define STATSCQZSPERYEARBARCHARTWIDGET_H /*************************************************************************** statscqzperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" class StatsCQZPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsCQZPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); StatsCQZPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-1.8.6/charts/statsdxccsonsatswidget.h0000644000175000017500000000512114166020421017711 0ustar develdevel#ifndef STATSDXCCSONSATSWIDGET_H #define STATSDXCCSONSATSWIDGET_H /*************************************************************************** statsdxccsonsatswidget.h - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "qso.h" #include "utilities.h" #include "charts/statsgeneralchartwidget.h" class StatsDXCCOnSatsWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsDXCCOnSatsWidget(); StatsDXCCOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsDXCCOnSatsWidget(); void prepareChart(const int _log=-1) override; signals: private slots: void slotConfirmedClicked(); private: void createUI() override; DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; QCheckBox *confirmedOnlyCheckBox, *onlyLEOSatCheckBox; QLabel *numberLabel; int log; }; #endif // STATSGRIDSONSATSWIDGET_H klog-1.8.6/klogdefinitions.cpp0000644000175000017500000000531414166020407015341 0ustar develdevel#ifndef KLOGDEFINITIONS_H #define KLOGDEFINITIONS_H /*************************************************************************** klogdefinitions.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include enum ExportMode {ModeLotW, ModeADIF, ModeClubLog, ModeEQSL, ModeQRZ}; enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ}; //, HamQTH, HRDLog enum OnlineErrorCode {Ok, Fail}; enum OnlineErrorReason {Other, Auth, DupeQSO, WrongLogBook}; enum DebugLogLevel {Info, Debug}; enum ValidFieldsForStats {DXCC, GridSquare}; struct EntityData { // Used to pass a list of data from World to dxccstatuswidget int dxcc; QString mainprefix; QString name; QString isoname; }; struct EntityBandStatus { // Used to pass a list of data from Awards to dxccstatuswidget int dxcc; int bandid; bool confirmed; }; extern bool callsignCheck; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 2)) #define QT_SKIP Qt::SkipEmptyParts #define QT_ENDL Qt::endl #define QT_RETURNBYVALUE Qt::ReturnByValue #else #define QT_SKIP QString::SkipEmptyParts #define QT_ENDL endl #define QT_RETURNBYVALUE #endif #if QT_VERSION>=0x041502 #else #endif #endif // KLOGDEFINITIONS_H klog-1.8.6/INSTALL-linux0000644000175000017500000000343014166020407013630 0ustar develdevelFollow these steps to build KLog. KLog requires Qt5 to be built. Currently, many distributions are still distributing Qt4 as a default Qt version so it may be needed that you install Qt5 to be able to build KLog in your system. install may depend on your distribution, however, check for similar names & versions and it will probably work :-) If you have any suggestion for this file, please contact me. (Contact details in the AUTHORS file). 1. Install the KLog dependencies - Install g++, make, qt5-qmake, qtbase5-dev, qttools5-dev, libqt5charts5-dev, libqt5sql5-sqlite, libqt5serialport5-dev & libhamlib-dev packages In Debian it is done with: apt-get install g++ make qt5-qmake qtbase5-dev qttools5-dev libqt5charts5-dev libqt5sql5-sqlite libhamlib-dev libqt5serialport5-dev In your distribution, you should know how to install new packages :-) Make sure you have qt5 available. You can do it with the qtchooser command. The output should be something like: user@debian:~$ qtchooser -l 4 5 default qt4-i386-linux-gnu qt4 qt5-i386-linux-gnu qt5 user@debian:~$ It should return the list of qt versions available, qt5 must be one of them. If qt5 is still not there, check your instalallation as one of the previous packages may be missing. 2.- Select the appropriate Qt version (Qt5) export QT_SELECT=qt5 3.- Untar klog tar xvzf klog-version.tar.gz enter the KLog directory cd klog-version 4.- Generate the Makefile qmake PREFIX=/usr/local src.pro 5. Make everything. make If everything goes OK, you should have the klog executable in the folder. 6.- To install KLog, execute the following from the root account. make install Now you are done. Just execute klog and enjoy! 73 klog-1.8.6/img/0000755000175000017500000000000014166020407012216 5ustar develdevelklog-1.8.6/img/play.svg0000644000175000017500000000022714166020407013705 0ustar develdevelklog-1.8.6/img/klog_256x256.png0000644000175000017500000012210614166020407014703 0ustar develdevelPNG  IHDR\rfiCCPICC profile(}=HPOS";HuP,8J`Zu0y4iHR\ׂ?Ug]\AIEJ/)}Qa5e11[Ajz"wQ}կMD9̦s' #e8xfȤCbf%C%&(FBegRc> ym%uı!2*]#DcOK&W BlԤ/1 vfݶmy+6Om-r lmM.w']2$GS ~Fߔo5wns> pp){ݽsNk~?>rrLbKGD { pHYs  tIME' IDATxwxTeLɤJ C 节]'X]e@"k%@HHB3q&! '!5W̐9ߧ?>>>>>>>>>>>>>>>>>>>>>> !~އ0zpN ߲_;ƨ$w)\ Vc"ɲ(K ˲ + $!2҉$I,˲$IKThquf)((+))9n|h7n\f$I]4h$It . ]/ |~GQDQDQ<vKn,vҽ囁=]>T7xT^?Pt4ZӉnN u_ON(ʂ(nr+%IP[[|(>48q}oG-PAD{m-NIzO'zT5#+rUUc8>t}bcc'^SSS#\S Nvǃvrq9@ yuA>s̛%(ښF'P[[K͆jm6(.*pڵk4 z=ZF 6 ^G2 p* CG1Nzcn #$aoTWSUUEYY9R/Hi!h4FDPSGD`W;C`9.X~wqǃ!!,Jx<' zY]]Myy9%%%dgSTTkZ.Y{wO.̀&6А!ǣlNĺnxYNJػgUUU;S߁U@{iذah```[MvOj!';۷j'xx(CgX]U%JT/ )*,Aoo+#)))7 8ε55AQErQZZJnn.yyj"p) CoU|0 CǏbHppV[',SSSñc8?ˈm%"pȰ ڷ">h+D <[%r<}fj[ | J|K#V[{:tAlb]Nm6o.<2QG-]0n7"N_K;1 l2| (.xxN#AnKPIn Om WYRrm}z6(޼Z>T|.ߒJFu$Y4u$IŹL w>l[9_Bh|{)ƒ"X|@! }CSKDBo9.CLxn?:@O帬;+k\SiOh}ܲ)F‰Cs#_'& ! HxpڧRpx.fwL=jba>,@( D  iRӞpɪp` S؞Vy?؉>YpgHt APC+ڃ 'dw+-o{~)tV6w^pU^?l>o}{1Zֺw{00!ok˸ Xv vߣ[uy〱k68e;9y95\GPۮGm`%n>LEGnP`Pq݊3"w jj py@,֨`mRdunm =-7ҵkh`5DVs:SI춼G?׾lm eՑ#w/XL t.BT+ KV3ίkWڴIKCXXNQrrrO>tnߏ\`Op y %s"V+EW57R WB08e(e`j;ި>kNEkJ QG1|8dDj2wEQp8|7nU{ 91mR( Lf )KP/4K'5-};dkKI*/%wChnXY,$᪭ŖONɣ/Z8j$=H~CB V K|ɯ^V_7hTQĮ6(28j&ScF$$$ݳ{H0V4fff))6՚",x&v K{H;5X"ۡŴ,lc= pf[_܏ZӖDtw7%1c?!BvUkCu5qTeȑb'oA)P tpS5}`j~-{E\tEoPL^rmIԓo``Cy7^8x[L b|F9d0؎m+̌g 0PPÊe*-mLzFFF{~AoR:):RPǔ_ZETW-!w4h=a{G50髯H:\s#{ۏKq "p[o1{2nܸEQj'I$LJ/ !R&%M z`zʿF[FՊڀR'GB?wVEv>.rr#N؏q`b2"I$3}t4 |G[JK?Z,{D- ګIv:F`((7b TyioS#j$馛sL,`YtEsIb@QA.G4jPbFBfSۉI[exK ц表>hq U <Ķ[B"lt2cc61! Aܔb?p!B( 7ˡ mPSEQF nh$>^B9x$DLkΓ}yh(? .o ty=ncHYyϚ$ Om-:UtXmm-#M.U`K|j,ej")h≹IFoagKqcv1 AY$C LiD0G`^ˤLrR\E_ g%( Eԝw` h2$La՝sk `"''cYkE)pL-ɂ8X$,cs>vIm9-0φ'iUSCW\@zv}5)3fD"$} I6TOdzЧy m2-\/it.>PQŻap3P < <ؔ#GdÿUzNJ=v@y6*Ft?>G:NH;P|UWgT祧g/((}yؽf 0աxG(CV WH,eokIPSg_ڋ'T1AOΧUW(߹͑<, 8VVA@]֡ ޻^]H5lxec$%%( ?˲5 vu(P!&\\|ٳGJTt4+t&wj}RX57MOС..0[PaNj/IHK#j ( k##5ln'@8y1QwPG:vJz|РAA 9|TC԰[k JSOa8Dm A"+ ({"bu|݈հ?Cl®]'T'3< $,,Ju/B5YxX oaj; < 1LfⵯVVV^:k&X,~ZoHRs>0[x򤋝v#}f/:Ei\gYuh:u{#h.<#\g}r A;vh4l؉+)9w˞}?asf'+po*͑@ngBBBӏknqOt.BK"SN$ YjTg+ j^to163gLGJos7nURJO˨*(/6CPЅ$Se%"Æ+ۗc;wh,V`^z(7y5ZTpi(jqFFmvZLk`tz^_Ne2IWwOQdYFQDQ$<"}eKU[K{ֻ&}2 ҹENÇٹFICǃ5.[# rv@^m-XI2K\,7? L:%9:::"GFFƒcE~蜖6Lن!Uc?ꫯZ> )9ٔw㾽sir_%L:1BEQ(2h 3h=$'$Ľ;N{O߿ FZJQWچm E=>ѲО=фP}trpPv6o92E5n'kسgYY% jʱ~~Ħ76ڲ2ƒ Y5vZwrzzVfZԠxXh%> |p}N;E:۷Zhэ*uGC:{ε͡$3 ZMB ֍c( {,>^FT!e$k dm@Ы&9jD)ǦPǏ'bbr9a{~R^=[,8 Ϧ8>0fLZlZژniicBҪ222ZKVѣݻ!,,\kׯߠ~nBt)GNqW]yutrp\fGɣ>:PSZ_I0h<:ME@r8XȣRjC=r3~@*6n:s/i$Ncx) ȒKlPeF:ɯ6l{n޺ =u}8cQ (O>?m۶ze=E̝U Hi-A}a2vXXm̙jyK#;ȥ{ q#h\??=%_-k8e h)13f .)Bn?/6}`Y*+ }Aҭ[.LnnvӦM=qqqg&4Ɍ!+}|y8qbW^/J$Ix<Z-q1)qEm([o$;;l3 59~iV?}fދ)e*+<ɉ|NDxb'GFM9[GM"[?pJjq1r$I{wb7v,h^ }jf@IR322Zh4N>|x,x< ?@`[zM0.=Qy_nl޼|0-ZP#Inx/}5--)qJS[N.y_[ǣ5 F'kWǍEO"2,qqZzjj-^B?MM)4c׏\'ʠAEJ~O^87-mb!Ԑ]IFFFkv/zmu¯(DFD eg죝W`/paRa?|*a~=nr=LQ[[֭)ݹk&"t|<knۆl3iҵXV$I?g=P,_caroFF77㏡ӧO`24 I@e矻9ۓ)p)Q^|.IIڦ3|b }^/ BFﻗO=Eh]{N0]cME∻bڰPʷhVW\.J׮hFU8 o &zHu27Oy)(rh`۱KэЮ]x5 DrQ-?C$vxiaJJ{4##QfނXKK9--Msʗ/=ñ^\5rhEQHeUX̖uk9b~ WL*rKB7~hѢEQctQ6 tɓѝ&][˲YTWSg|"D]7 w_Y9W*|lWNC.Ď>:mg&3YoB~5{aڴSj: `߾}deUǛzٌ(Ogz?1-mkɲ|eZژY~aÆ]csz<dY&<<ܐHVIB] ٳzq[RRb{衇~υoЃ GH}wA8kr>qj?g6z?[:t8R;\.7~qqNs NG`J 1WL@1ܾؽe˩;l $__zDk>} ;(ڕe mYYq&N ?ƽD 6fiFFƅ }9jժɓ'DˉRÍ˖-(g;=l$*<7AQ7áC]gF!_I 437-*bsP\'Bϩ>Kdie !z(]Pyg]/ ł_UxLX߾D[N-0y~[fL4.(4t(qSԹ3G7mBv46KKKq:wW׮]Ws6&y7PK{ 1ر}՛Vuݻwu.n.)DV IDATɢZ2f />83n{8@$vq{P 돿>g5g jn>+h ?AsspQ~]#CJ$~xaT܅v7¯_O #±DFV7=b{Sy}ڠ@-۠]QAH,DؑdR]P֟t4d2(OO8Q&-mL0 y k׮->|VXC+44xȑNǎKG2W%-0/0(`nJ?3gvd="z?pp.Ua"pjaP[!O=E҄ =V<('2:z+C-n7yyˁo*u!:O?MС1 *Sz)[ @썿!iLgHeed/^tE-3HJjqsYY֪g"rƄ$ۚ7`\ǎYΩ{44gܮ(rQbΝooSO-0p@=l9Zbw9Vc;ho;gֵ̘K7ů^TNPBj q\۷>{yIi.ccϽC pxdba_m$˯Nm,SRZdPe {çV,tƍ=s_Eg} 3n&q$-iʶmgAQ/b k{"2~&nͪSNquUo4Wϟ䄖֨7^|qc6[ Add˿Kg~v0ƍNÇRjxMM͑;vL2'%&bAn7& ?qqB] %+5U.; 3n蘘lݺcELjjGA۷ӱc"xvڡkWZ5 Rֿ ]﹛ފN'Aصc6?{ccrDC`R"Ƨ P?:V\B&R|m$w:ߕN\},Esr':s7H³Ĕ ɮHv_diXN/hɣ>|M9bgE={ba"KUUUZOpp0555j￟w)ҰtJ޽߱Cr:駥lBՠi1͘- ظqIIIh5^ ^bGQO9P 06|Қ.S6lPO&4LO8fChEcMPr'i 0ñc?Ҽewtڱ&$ ԉ hrf]VFT9_\Jxm]޽ۅTSCy|?zRs"JQ'7-vDZicVdYfӦЁh &<"j֭[$I$ZfʟIF/\.p߃{&ªUVԫtqhZvIJr2 4%%Iهߧq_x=WpC=g6tv3΀-o㙙JVS%[gCSGԠAh ncPѣF߽9Hv!МE d"o_GQS-'yr9|ovߪ eZٞ3c!+ԉ;jOrZc sm&#oclt [ndMu^d Bޑ#\.bQkvڽuneAOz-cģ zBBChukt:FQ[[( eeoj8zigc̫ IulΆn$iiw&zԡDwb<;BM +fSy1F$b5AKRK);VnJ׭p:LQg?5|{Su8UE?"X{>]p!$kFhu:;wīZ8!^wިb൓AC srEJ:AZٷw1fܒK"CFWiQ\᠖],s$?Q#RU]rxPd^QhTYd=8].A $$؀ZOP; IA-rש^m= 'M"sgaaw7Rϵ󎖷D1”K` ,sm%%{F ݣ'7՝UgG}7 θpr:DA/tj$; ]O 4"0WМQ'l_kf O Q}1KSGSVy7Up$&gj%j3ʍ媴l(xdI%J(2lZ.555^Ru5*lfTlܞ]]SgDFEyzZNF#FIvf3( A墰 tEm @9s0nl(2ᇱİlt~f߆>fnF׏EAc2pՕD HΒ9f3%s Jm|:޽H] GWB;)?9#Ooqqk+LRQgod$c4n?IR\nFҲTW#QQj_V.C,dm6q8l>r<˩UW=OEe9}ߒx/;cMNfؼg.3ߟ+& ]nMp,v[Wkf~s(^~ړd"oGQ}_^}a+vk5ہU;5BaB ci4a)Y-d̲/;w;ll^}AP,U5:Q h41A?zԾxⲷ|{yii=SQ8sOm,ˀ݃N8E=23sN/}m7ЀDNTnlD+2x&7M7DPZ.\TXv6îw #ۨfH F{ _~/**yst.1cF㕳R^g٬ޅZ'_ }_|Ih'MȑDc>y6.|z+zeeQc!{$B:BH.'$[!ݻ3*Rm-]3JwfkQfmV+'O|f(\ǁWvؽd׎GFF\@NjqụC6[{M.zK+V$.^YG\.p:p8~HSuwT;2mO3Q'aX,^'枰u:wl[f_8ED߾m2篡&⬬p'Lh$} Q4;7oIgh]m69˴f`n7n;F$@FZXUU{ߪU>kh&(b޽'_~b( U9NԾ[QϻOkO`꠬e{"ˠxT-.&q)c+(#٪O`mJ< qlV2{%Kudd$yG =\ 6駟6|j!},]tl6 FQh4 """Ą۷O@Q_|\^^+ft:q88ƣ+++ܗg;ިUkmNѧq5)mۑ'OnFWC@@BiUwhe [:VeEף&GOnopX7wΒ̙ÿ/ T;{=֭[P BӱcǻFPw/DQ`0iBRR Q'$$$,۵kWeA)˗/nߤj:#WzBڵkel&*S_Ck{Nf/!]>>&((ݛ7o>p(ɓٳKVUeNg;Nv{}*dVV־͛7_) R+QD\{g" ! LD>$NUYzo,'F%5"čD-[_9 .F%؊kl~FjBoM^ԆիWD g?r@@H, `5 7ܜbmӠ(~,͍do1n:_ r KJpE!k؁ T4):Ӛ8 Y]SsYu~><$+gnC+_3bĈyY?SQ#N-6mcǎJ$IPNZ-}9p{gL&EQիWHOO_hk4 vs16mthʕn-t i[zi)k凙R~C`D6sfD:^u,h4e PdeӐrQKΝ8]cSHN'%S'wqVyW^y%ׯgΜ9_@%euu5O7%Zx*ܿrrrdH?n޼nJ/.ZW,FF(x<N'6bo߮[ܙ($p'4MƁ$NJ;ѵ/VhVVΝˈ&z`}M[ )d؎WO5qKȒDO?Ss Q3|a(79O'[o1c o-ᣏ>ooT:֞wرc?1bDhdd$ٌ^PW IDAT#MEEׯ%KT PE\pc!AAK+>V }V^JOO|B?wҤI(U_˲ZNW/ Q6j h0)]lG D*tfs]y3?~G[DŽ,l}mvVS}}>3g⮭eg7 9)97lZI}ٳ[DHMM%?ω:B8OW˔V9,%%eN ^)A.d+rXΝc5$?Ċ+~Gssss.:0iLJbohmg%[}KaӫQfMc߆Fðaر#ٳIHH8ϒezg}Ӈ&{ɍ:\t_~~R'UUN[3kn/kcbb^kg:T[蒜Ldd$+xLJn IZ< 0vn>3WDDD5k(|ͷwˠF*M6!&&6=,4l(&Yg/ݳ&O3~Ũ EOeDaoI3$rڼ*HrkC+VphG:VI ~!2-.?/8N.8>-( 44*++A#<¾}GEi44t(jho0TP D]}lĤY3g-:tms333HKK駟yZ:ymmmaddd!CPT*zՆbɰ 9/bSFQRPըT*DQy@˗OV͛7&L3;;[Z&'''/-LJ NZ* ,9}9~yע ҧL?"-/H{yץθ!j92;$;̙7ySאe&{un.|1RciӦ2`s.JEVVO?tK{}5kx+ߟGbB|}NWǎ)L 7yQ%KҟKdd$('""]6_M*۾}'O|}wy&ݧw^mA~WARÕBIOƍ=77Wp,z!2"ABP9F+4,D")~3p J+Ύ^ȗ_26J#p8S-j&~-[""ZM5iDhvO!.*E>KPLW;شyL~rr2w}7SN%#ûGSOu ɮbѨQdn$k 0'-9iiV=< :$dY\CZMrr0nܸ;TK.M'O#pZjejjk N2IV+fѣGߖ'xmKVL rVs^麊2ނ6t*s4wMkɽvzedπ.8IH<sS3ٌZKţG$c^`5wȋg@[u {î3[naʔ)dddзoKv.]tU*nLNEED ߓe(+c?5L1}aذaWUUٸq_ZA8:s8} \Ɏq 1bĈg Uޚ6,26LP!*ew!K5(O\w'PJ?8;r~ӧ8@]jlx[eekj܎1_w.’l66mbs ֹWFGGOҿ̼dy'Sy$7]޽<};_gx̽lj***߿溺8P?VJFq l6^EpUhe.~of̠oeI+$[0TX(y]csq<AI6A`РA;&T*ӝϨ\/,yX V+lL;0lvdT >Vlq;A#h9raeM'ƭ\@kkkdvnwFYi 1cd'%%=܍S7:`ِDLd2wEjuh"00Il%:l';'Xp ʮ7fп+۞؀"k:}k%}LBpbK66 AȘv 8l. dY.?>I@'Ap.^̉5> Ǐfgۉ@_|?3/2g$67Wuljbڵ$56Cǫ8~8e󝑑 MD%l Ijshmm5Mf%5jN{l̘1aMB>,cTBI.O,Ow]G?O?cɓs0ǿ6>G֮E2{?8CkȢH5p Iclf3G _|UXXILLDe5jX <Czz:ӧORY|9wr ӣi0"4|XS+#I| Wy~2:7aVeԨQJJJ=|>wl6* (bX,ߞ0-&eYvE8'a7y9\'Ʉ^gnkQkwE8J[p!frTD__y7ϡrHo L¨+FxRO@\WJ܄drKNA܏߿G_kﻟ w3`x yR%//nͭѣl( :6_h(eNΘS/+*P[/NXw!@?PQQa3s}n8p-9U!Djڜuھ4/,, jnğ7d2:D܃v)Hs cfΜСC;P{`*/Gn-*"$K9dIb_R6M) 1o{ki)8yVJoVw{ĉ,^1ct("^yj),,gҤIh:,ܹs'cz"`e}ޢu:D(6߽7tА}W||fS[mVl'Nԟ] **M$Ip$Kj""":})884" @IfCIhk$GHHSLQ=K,\;vkQ2\ɜyz d5 ju:qAO\BCqlJTf-]S\֗^i{/LPP>(C qkOy@NСCoIMMwIn1UWm)ֺQ;yo4㏩xA݌ '&&y'iP`Pͪt#Kjj"J"Fh4v3IHH+++K>|3eYHcc!iXШ5`eki,G"/ pFg&22:5k 6>!Oq.fZA6{F!.sM >f `jlGw8yRRR25ӧw۶mc7,5l AlM8X^λKޗ[fVfn@5z{gSfJvf޽o˒aِQ2lVńf@KKKh:,yt:uCC vUDu{32ۑr'wpNe ӦMcС||keD/O?Ͽa ︣[ =y V 8 ZgQFc7| hՋnlNp z& lrH(ؿmfq8Oi>' (c;$ ꖥrH9"@6J6mZKR]+5 Gfɒ%̝; )_dl , "45A/$SSxncѢEd'ɲLxx8cǎ{:s K]]BRss j5gobb4~#zVaD_ LFÁ@`4@8~0Zi7cY ELfS$I:BNG[[ӭqU7 "V8GTRe%Iꑬ^޽{CCC[9r$~!?<QD=;NW([>u2~dddxdNmӦM/L2QFe~7s&BBX]XHoǠ. ,Iu޹\';[]@\?$ɭ}׏gતR$ M&S/ 475%1{JC )s*#TA222=RGh4RQQAUUYYYF$I$&&O2~xx g+@ϛdz Ygwڮ{ 4pcJ⡇⪫`0t:3gMƊ+=^x'l~>eSЍ<&'~)%"(>H$O~bJY|#p0}Il8SwF徲,; fyQיpx.ޗe_!v.1Mͥ+))ȑ#TPPo XhYO?Eעj=Y6oe/thv1b6V`0`0;w.C ;`mg(6͟eSc0{ZNM.=0owvJ~MP )q1-f'v\W/`0W D@JjFxJ:8sf4ЍB=8k'L@^^yСCINN;֭[@(|2 L8AW_矟 {$Ͽ?dأ;=rm}ͧ (s;zi Nm[W_MwGjh=RM|lBьnbO^a Gb6[zk cٳvCM`РA ׋q fm`۶s0; _KjV|^s>--L}}=k֬!--, ߟP:ĉIkoѣI={\]իjeUJQK @yR__OՉ*0;yqk9N[@l||mfɌZV9bqNr0)]&Q?(vY-=4ڿW|wy̪T*(r絔RQQAvv6iii|322ضmz+7ͯFڝ:p̋v3L>ީSTTDNNW歷rKqsܳ$`O4)y}J/`'Oo&<<<絜Ȳ0a/H躙ٰ2o8[8^ad^V;Vs3z!eZnpBW5hZ1Ƣt>-@5qv~nh|$gMrkyݪ\ϗBr9-:~7֐ gD^Haa!iii޽YB IDATm4ٲe ; 1cÇO?eժU\-Op/ƍn6&cˇ0gCv}C7~G/{;v$QD:= ooU~&l͹[r "*dp#pvpzc0pUW1hРN_R,;cL2c ;Jŕpfر;n+Y;w2t\BSS›**uT}ٳgs}&**rlªUXX:f yEEݎf'TT%2c7@FDQ}3h:g*X'<LK ɶF)M8rY !!zI0BmGfAjJ]]{YNO,Q߉qY|loh9CD?D[; ?~Y??W_eӦM,Zv//I:O $1>}tR)F(Ȣr*>ո` @:z(ӟ mF֭#ّRJx܅,7ۃOQS}|N ᾈ?_$kAPg'.CL_Vt-ܷmv0j9.%l6F#J$`y^̛7fZ[[p>7#h1G#/NEFl~ ))'K޽{9z[cǎ%??+VtR)kBC II&,*ssgNj/UV˝11T\wAn\IF#f|Nq=x4&(RX r u;#ǏpurAIhkoss+44rWJH8ժTU, ˒;/>**kۯ?|0 99ξ S=f1g*QY&ӒOT0(("jkkٵkJqkpϝ;#GGaC(H$%%1aRSSe<륛yr).4dA`\n"~D7|W~=,كlnnvjI6Nuy#el6s5.+4LYqZhP 0˽1w?(:_E YR,ɥH.L:G0__C]+Wr!3ҨYȞ5$z4m^9?.@F@I 4n8 ׳n:nJ[[3=O<ŋ曻]pSRR4iW]u6={t*.I=o<޵61zMV*L¿ҖOuh9xyP׏LOΉ'رc:u'N`6 $114HHH RZZܑ]$)vkwe^_yLW4556$bv 3.'x^^'<@` ?gy LrwŀHIII8<I _~ϭIe!{gg5? v~Xn7s$ԑ7qrC-Dn}9r$555>W cԨQ:uݻw;A 6ӧj݌߱B |zyȑK=+0Ǟs3:3|X 8"۩#$Q|̇ \g4I|%Ƨ(4559 Q = K㉵^~zl8|gڮ8eNrr2qqq:t8ϥǏMzz:SAϡ#D޹7cdޣ=.GcvLG7q$&&2`bw8Xzͱcػwӫڲe Qm琐@ny5g6bv,7(ۀte^|;v~G\g}߃g "fǛ@:3~WConn* Ӏ$#T]ݘz pIe0U11vX9H騑vSB4e%6}k+3u^enn.'NtkXr\4]*ۯA_~/*,=2bk>; *+naOll>؉@ǹw8]\4?Nxavd sooowvPb@Rj$%d]큤Y9 ȲLDD&L`컼 N~`۶m d ݍ&s'},2b*71L/_nz~a>}aû^TTpPV8LGٲn<'P:ï ^Rj08O>ǡ! v/ۏ4oZ}Nu9_Yl mmm^;69=.`;_ZeM޹;LjSz>]IS TםkZMLLdʔ)丽~`4̚IkD/n'ϐd8~ְ0=K⯻:+?0l0'ظ}1Vs?鉽ӄd'FR6%n;u}70UQ s0Ȏ=Nleni@:Tz6y޹vv>.yFmmWS1q5>oC;RoN@է|A@]Xr6ctޫB֛"QLz }<G<. <9Κ<=J^~I^OϏ͞ų L&J)6"0bmK¿5R{Ϟ=,\f268 qd*mul5>|8Ǐ͛Y~= z?dsf jȒu 7\G/QD"k2`l*++}-b۶m<{z4]YX u?dIfL^8xR-vbO kPw'[Eܷo.b¡`EԽp㘧 Oѧ Сk{`µ^bP4xK!&/`2S<'/vgHOvm( ahrJ^GU$]k^?~CVXъZ"*{$KpvT.S_L *̏[p=7'؍pE7}πj5 sO'/t@dj:zޚV+}Ӹfԕ^beF]9F㕝ji$+;fVdED!Z. ؙV8q[p޽ |'N&_E\ DH]K:Ggզ0U0!!)S0`.Uطo6p~6ػiYTAĦ-HZ-Mh!=!n ERR{졲RqIx ZhBJ{v&5=ΟGw88?m6A뇕28,g Z~ANy`O.Jv*  ϼ/]FRvpj[zlvajEoГTi)IDFEr֭KZ>y#rV/%$ƻ]HW hS:m6lv >I&88믿gy7fٲe ݻOӑeoZ8# ,*>\_?;?e'? N0HkJȈ.Ә999L8DdY!_mqS(+/CBIkŗlȲhH{1W.qa*Z=F_4XQ6[n,XO?f9ӂ$'ÞҾ;@ ZBB'O&''kJo4shtJ6[Y>G'x饗|Փzy*J[-n} `̙lkjbƍӧkO:O?I<{Z=)w5l7:Z)C{???z:7 Z맰vj>\!֭c%g,˼~ t .6Av p &}{Q9r;31f=yם蛑NJJ2Yٙ+"Y'([6o;:+qS`/H7)/E3y*@^ێ$ LJ_kz ѿinnvz>6vMdd$UQjRpr3oAmlN+nj+5HHHO>4559wmFUUO&44%UR 6dMkq5jf⡇3Cd2QYY<4+ndgڬnv9xT+|wL82쒒fϞA)kDp#ݨFMy.ePv>1-PrCSS,sa G ',,U'x3uuGSWW+/fo~Do0AX0 5jjkjY*7ohZ'r Jr#N<ٳuR ج6,Vewmo7RCEYuԩne#5 }]0YDz#VeD`Ы HOOɓm۶QUUEll,h~`` y'KimD$I?z(?)))SWW|F#eeeҫW/u76:MHXM- AMf#Hz9v׏3gSO1gcwxf._Qƪmg0Y$Bz+XT7&~c-%t:K?#GvY|J˓O>Iqq鞌O Mn D֦4k{G!,,̭@pI[ZZ9p iiDFELpp!QzuJuJ .s>)Tb:~ce^_Ü9sbiFNC8ՆvMiQi1[-dI]]xApB|Iĕ fHϘݶm_} cǎeܸq c;ؙ3ghii`N"ERcat Ww۟Aɗ_rWv]w}ǵ^zh70\9jy;ﺃn/U1M䓑6hiiaɒ%:u{?ALKs ;wbwk/(,Н7jVԼ]vQ^qXt:bԝc/\-[̙3;\S;&mH~bi:L&6559\{ ӦMcnL=LitZ?)){RQz r`Rni4M͔{0<0~Kw 75!$%C5Llܸ?NcҤI 8rW7ߐۣNijg2n8~WWv~%Sn?Ξd2`6̡np$ҥK3..F(ٳ$T*ݻ(':&Nha(F.j>3g@oo5` V 4X^'0ЀN<1t3::o,i0Vt#0U ư^1 IDATHwx׮])(( <<\M0ջɰnO/Y|9?ێs;ֿ/>CʗeF[B@? &{Zlзo?2`X0ndakk+K.=tRs }@rrr㦸,sip pT SQ^SDў@e>222:tR4@QJ8\fNd3離#8HʅHKK/?~BBBШhAͨٹWd찳NLP+f YJv!!!cǎNh(RRRHCX "a70 Z 5瓝MUU,;vPVVFtt4=Rf͚*-׊ȥ_2z9h4F6{M!DDD`޽>Eus/5܏~]AAAdggw |pSS#T0^lFi-w|嗄ۑQKKnHOԱs6*NXmAR#**ÇNYY=Ś~'ۉCߏ9$?_t4bcVE$_E^|E~G7zserh!JHJ:8(Hs2ba߾} Lb(] \󿮻99"T*eeeN#-++czh4 VGCKޑzZjCeNMtj5Nzܿ?۷o'""(<()A= R_+¼[az;WEuunXFNKQzzz[r]w:"iL0u#8Ft%QtN "22C5'q|J/% YYY<PAGQ_(8ݻwn:҈) 藪C(9dXh-,\;Joo7&7SPPV?`Zٻw/ń+jj2Rt1fD01 %*2Ңk7L|tj򨭭uTB yGZZ1xau'FذTjjۗaÆFmm-wuW \W{{;w{|k6]y]+&If$Dp =t1*b$z3+[V)$} ` 6M/W_u=r{ 3PUX,TEΠw^/>0i:t bmG{uu5-MTbM&{z ǀ"[ \b~mdY&==9|*@~) Zr2tH,zX q}V#V @"##)**"""RtWMM 6mh7N'jjLNV0b9z[Km66q]`ҵ~:,9칪1ckƟ G/9Ot( DEEu(Z"tI o@ݪ<4ӡ V1͔ Xq0JY*?#K,!22j-N#@J%P qQr *5zC0+~h#8PED2B=!!"j5ǎs2?FgPT%_c`Um|S5"Y~ⲧ1|pgٯc˾}عs'ᑑD:aJ;2{ T?_zh1J^sz }3QTJ(++"z?n=/h{\,Xlo'h.߿8nZuu5t: J@`ݺ sy;訪{Ι33y` WA "WQѶ.|,/VeWyI{Z]+j Z >H \- ( L$L&̜>3# ,a&!=ݿ;im]V| :4>kؑV̚¨ {;lĠ4 UUHLPǏ?v߲w^RSSׯ_P8~<0+ql?=JL< jX- ;ѣGSYYImmmБ^ii8EIKE+'vi`~g?YEaCd5sGMNn&+5Z}Xqнt:9tPWmDNԝE ܕ'ihhl0i8ko5t[)//筷deehvD3IT2Yf/Y̬CN9df&őʢܟV;kah+;n⤛Q-M}MMق:ƌү]0qDLYYݧ444>f ;!p\<.21 994 ?ZIK־p2w8ʢu<3ٕhf UQQTIE4\.wGEa |,7<5ܷo˖-CQrrrŽSIkbH+'m:&]_?77`2d&&OL߾})**'TUUm۶&.eePNQ[hnp,_͍d5K'OnS(,,b}AWF`ӦM<裁OC#p/m4lL mt݃b 3]d%UQx*[|W%pKZ5 LNN'Nk@u8_~I>}HKKkM #{, s\F mǣc6[HKKkup8Rm krss;3v4$.~U5B p, HcqpB2222dH،>Mh&/\ss#fM#N2h|}ɌQ1_aԨQ7voP t0S4>y,^vY_Fy>{nJKK0`@)+Vꫯ>XĹ^`Xl K]]h]5</8rHWbSY:my461Li)in~}0qD t>}v,./cǎq7N)jB՝ U墨+ tV N1%$$t#0f ٌgDǣ믿fɒ%X,rrrBU gɗc44z4.c.Ylt9O!99"iee%[nٯ䍲22ǂ-<`bf7ʹxijb^uUQRR!99o5̉x~G~ׯLȯW3!/xPTt5HM5呞uoSSs *2T :Wލ?%H @8`9a2f.ڻtOio HhkcBUT*ZwtHhහ شiSNeΜ9Go)]g$ha/SX^5:u7o>gx'N矧 ̝7%TRcS nnsKhV|G[.-jz1/aw,3cl[@vvv6qg2a4)(9\_my݁|HF ݻyݻ7999_16U}[(*srձ\=!>m㊼xFdɓ'),,r1x`V+qKslW#ӧ$z,DUUzk`D08ك l`P,ߘ; l䠻u. z<"0N߹)F]8blb`||̈Lz z())a۶m$''3p@ŠPνKEEEZߍYX&Jf0N!=t$$$ҷo ܂ȥ Qm@p9:z\(9BYY3gd̙l߾="Cg(ie+?բP]s8Y>,'ӟz<;p8X|9V Y/"w!Vߏ?wOd9F)`g,ߨv"DDDu,&\X,&$w) ׯgʔ)̛7ÇG7̱`(h¸K~l2?ABI{ aUG7B>T;'0m4̙c:W<( 6v63J}j(J!{|Q/1 x:CD.tCݑe %b3]A++pex'Ͷw#>ՌṐ?UU_D4#jHϹхa]N#YF6$QnAW!/]~;N;մ4H=.\f2(ãy5IKKK K'vb#H$o5k1lۅØs̚5[n%*} Dx^^{5Vj|yf`̆$rd mu}6btsDOwTWW7 kJz3[b8XhGv>yfMܹs9p@W՞O?~ 0b15qC f(Ff5;Z҃VWW8 -v)H>}`4"#(\t)ǏgѢEQQXXȌ3B]?Oiz1/ҮpP[[X գ*=55Pc? DyBRoyǘJ]r6hO7VTTlolllW!Z|)fp.;[ =ʬY7nl޼'OFTVVό3BXildwu^{-i8N8;ϧ2n&~< Cj:iIy!m[o)/+(H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"DIENDB`klog-1.8.6/img/klog_logo.png0000644000175000017500000001076414166020407014710 0ustar develdevelPNG  IHDR00WiCCPICC profile(}=HPOS";HuP,8J`Zu0y4iHR\ׂ?Ug]\AIEJ/)}Qa5e11[Ajz"wQ}կMD9̦s' #e8xfȤCbf%C%&(FBegRc> ym%uı!2*]#DcOK&W BlԤ/1 vfݶmy+6Om-r lmM.w']2$GS ~Fߔo5wns> pp){ݽsNk~?>rrLbKGD { pHYs  tIME(…CIDAThytT?wd2d @XH$ а b߂VyoR ־֥*J}#V$V! %dLf{?0TZO9g9e?o_"y}gt\'Hw~ʁ5x<z4y<nA-GXt]]pn0x^BBHQ躎i$ˁp(ԣ& :vcF6l!)/)uinn[ .߉lOdgf}N`Q"6 n SY"xf 0@:aL/Z(Q塇FL&7};3e?cc^+S<>浣FHG+޽{wBB%>жM_SN{gΜkOG&$!L |:֤DM㘬6pt]G008 A@t]GAYUٳq\lڴ}{u;%%wgg ?Jw2[6yCt} 7܀F\ OrJ f3gΐR^]gS~;NOE1y`NVg4hZX +Wc3b(Է??9l[Nt]<#71cpnTW9q"V.lJڵZ|-Ql6 /] $z**B 0ɒsgc>ORnb-ՆiNOR8Ust?|BY5#ʂ}Xbat8B!Fc4[0휯Ƕw/$|aƉu740}|@BG75>}>3,"9(%I -fT5LH _6 'Mfb@\ V>|oSS3u%O.,D aZf1|2i=zϚ54lئ&bxAVJ ]] ~E'^vNWgǍ(HD  (Yg̘q[l/+t<|P`gWbX²FݴmYVWUQ&<}LjZ` ikkd20^G5t<$!2^׋A hlld?HizjV#Gгs8tMJ~TBGrm_qO>if3@Ip݈Ju C0ǃ\*˳M4FPj$RɈ0r67S Đ#"\ONQ2#+^L|NxWw7^$Hm.3p8EEx^\.2% kq[1%nL~G-'!2V,in8ZL"3Ӿ`Kd!1hZ YmV@jz*~׋}׋b4ţDFco 'R&`枇$Ҏ4nNیt0g?sӺ /JχC  ;' ( ` 'ͳVURǎs;na Q%qvMV9^Su }H~`';VNlpyf***]d_rEB$6VmxmGaTVӧOxQ?@ccK^O>1=9|X9~Bv@Ni?< \7n"p8x<o?O )!<^/]]. m=Rs |& CߏAOMP^IYYY^vet+3ƷJg,S[wxذaf͚gs~ް~]'] @P`0H0Y]z~p± ,X/1hg5cOP\J=nr_9}4ȑ#}QKi $ @ݕ!EM˗ٳ%K\;p#G(L.lk۷gyiDFQU~:܈^Ik(!R^8CN,c@BH(GNg~QQ{|s GPT0YHrAw}DQ$e I.F+}_ `0H(B5DAxtɒ%K/_6Gt3udF#@ڍ0d+idETU(N_gΜ7\/e Ijt#!ru q]{ N92bR#.4vXи77 tG{A?fIENDB`klog-1.8.6/img/stop.svg0000644000175000017500000000022714166020407013725 0ustar develdevelklog-1.8.6/img/klog.ico0000644000175000017500000032473514166020407013664 0ustar develdevel ǩPNG  IHDRx IDATxwxŵ[Ҫf⊻ز1z %M#!b !&!_ \XЌ{rQ_i;?feKldIyYiv9̙3 B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!שD7@0 ҁ4A@a >4Z [ B: 8,`0(r\.WzaaaYvvvYVVVQFFFLKKKs8nbe`YRJ)˲ZsFڶvGkm۶mH$bH0~_sss}ssaϷyڇ  BG$"yXh(333oذaSdeee GjjJKKSn[E"D"DLg(H۶}mnmhTEQhHGoǮmc(\J)ҭo eYZt(#vccccSSuLp>Pwf! Z;Nsرcg 6ltiii:222,׫" *DB* p8L8&;;۵6AAsQeYڲ,[YBYv8H$b~; p8l766mͶ&M%a%!B$;&;CVedd8rss-m* p8L0  p(tL}`NaYeY6JE~A666lhhx7 ^BBLO1c‘#GJ-((pn B*U(2mx?WtM)p3Җ B߯@i[cccz"+v!' =)b`3*g̘qFqqqV~~#== * 'wD ]q޿,Hc?m5(*ˊh }>߾a $X<`=3&;-˲pDgvIy#gv~1J)m9a RP( і]Pd@ Rqjs***_paȑ#3JKK]n 4(K HP:uYw;u]m9=6?V!4DmCP( CpM߀! "]7Ͳ-|ƌc vh'pO!w3m@ @0$ FZW~  XNӉr²,s:N͵j& ?L"! 8-[ &VTTjniY~I:x:u---~N:55۝' Ávvq8G qp"FCPCH-yx zIO!ڛdYև-[vӇ 6mG)wd8CwOG0:xzh>}N)u$@pFZG ?N@&b=&DR@={',X0vĈ).57ب΁N PW[޽{9X]?H#i8#x/@GJ,cw{ $k/Kƌh~'kO¾ٻ{7I9\ߵh~4Db- a$MR꺥K~f֬Y` T0}gh4Jmm----ݻ۶Q__-z X _.0!NB1XLe]vرc332Qu:پu+;o'&6* 1y?Kl˄b s7ssδѣGAȲ=8vY^ٝ9~~mm-{eu'!h-;@ĶJC1:?3s̢ gC]UZSWWGMm-֯z,4b@SW+/ M`eY7.[SLLz555V|pοuh!l`;p?,}N*/M2%aYZ+?ٙ>󵵵8p|@sKK^1`ȑߜ={̊$$rfzzO'NxZisG q!8m nH"1|)/Ox~:tp:8bE0KpD@n1cT]fϭm3h4JSStBOrB=nܥ8! D_[ TTX ձmOCCTb}^3k n$meY?,..oiX6B|>Z !-5Aw*t7///C۶7 9}z/Y64 I<&~F2=eiH8Ekqy_$_^&A,:M# ԣ.k`0-H$B4%D2/D/S!$z% =z; < 28 !n|-1 DOp(p[ !eCP)u}W$Hq gXU!N@C6 6`$  NTLёd)3(XhS2`~%@]W`6 q@ TƬܩJlD_@t(Hu@62$DRj3j7< n.G R-&ABSgC@/N w|C!+ |IpD/@ģxdAw$y F*`O$zdF2%ٯ@4vq'ӯsjPm.trY?F3m7I< Om:fQ}ft'B11c?viݏ}W%΋$yc4̴P f>{ơLp vHbK ȍ]tLP .\TlɊ}\Jޓ͎CG0 Dgٱ_'=$3GC{7总ŮPyp`P *}׍ZØ `]#zEG1t&v6luUC[E1h/Ku+p*3b5$=]u S:Ӧ:ћ9wk0Y9Q241i Adș\bCXgGꛁ&E\Ha\L0pfjuS$Ŷ^i 0S"A^/Cy֌F @Ov.`>f#1S pݱсI0I:ƾO|]A^-@&7wgB-W`rt=~{>齅 exX> @f D{tfLg.pPV7Bf6] G1S%U@U0 ml"o4|YCP'T7iGin٫_ `=i$Kr`߶8fpl[L?/HMM哟$EEhOUJ=ncoV+%sp;#;I˗7<d_$ jv&MĆmVHa&qbk:m殿 Lǔ蝿a^̙MqqQΟ͛7|ov+AU 71G54><߲cў)fqRV| `"L-tt2uvR㏧޽/{˿ Z+\va}XcCcL:vu;]jY ,w屈;ر\#L0C) p)}:u*p8իinnw ?qHW+50Nׁs5챡.&(SمIpsD$sbK؏@, [`YJV⸆||%Š,mcBOˁDQs9fhRGvw1aFe|gu lTm_8ǀg;4\eV $nP܁o &v%ْhtcp%PS3G||[XHZATtmlDC!B>voPXTmmf{tmL/}xlrĶ&l+-N$t+9R6;'50$nI65cY&4(4L sr8g)㮺qcq8Oĵmw!i\xrr{i =짟6.1>-[`&&[0rȼ[ke40`AZKIo,Xj&/Nؐ uPh\*YʤO~ k3$Zw FA=iihߐ,},mm RxRZo巨TmS vRֺ:--\ww10 ,xm3rt & ү(".8L~-6 Uwfp-`L-Rz5MX\ʍX_?$xg&L-zќ;V83 2QSy]R֣v{}5(Lo` e%i@$ˀ>Ur/t-z0ЅO猛Bԩ;?}(zv#Fqp]?O>k;F˲ ~qmsϽh4a׈oӡ(ԗ@W-_M2>Ӏ RRh0K| VI-.+t ൘e}EMh!f HK[nጯDfERI߻]/(oQeS0i:|wʶmO4]9ߏ X|*Ċwjc j17'0EC$`\ma1NǴ96$[fo61kT 1YFH[̙, ]\\OΝpVRm,Q#,˩ߵP]]W~ES(hwZ3\wFӀW>jU`Y)6x XMA.mVݘH F~chc}Tn{88?_)EE̼WG@]q r{m8n 'MbBl؀0&;~R 0>ervoꖸ&-QEJ5 l?g >ˁ!'aØ/1%} :Ć[n II97DIn$,ٔÁ 7xN.]ʼys J)'ڜW?: R"˗S)/-i؆fmJJO<>"SL./5gjea8o<ΰ}f?,8v5@Cc`XTҫ^6&90ͽ!VЁ9}DFǥ@e_3t)>ȑ?ثgI~'59'p5U/@xzT FQEܹNDgqhM$ztށٿ&d_X ;6hmm?ah"Gc0#ՎDq2r75D}ҶO%-}$ xd\KL<;r8O)+OmnA)gP*ǟR{HgZN;GR۷H$Uh=J뚛[RSSۍ$(^' ~8jb֔`TR֫-˱nW n nb@3&y"0$|(YmDEdF`&hC"G\ҳbS\epؒpc#CqzHÑ@}(}eҪ7::p873S\\Lff&h|77u+Z_|3bsLZfT?\ݨ:̨'Qb=IJwc{~`,z̒8e1 O3jTB?OJM͑۔R??իL6-:v~K{Vs.'7&є P Z-1_Y}/uܸq̛7>)z]z xt(F45b~t>j%}{=Hu:(JOc6aً+Qg=nﻇї^IhA.T߀֛d: ‹4gd))::5J)2ZYIΘ1mzZ9.2MDQjjjt7|[w}5<_,Y̥}΀,6ZU%菲1žJ1\>C 1{= CJA^/~e~5umis{L)WVnY~FYvQ))=z"  -\.rNͰsSTmHԩS9s&mRyJ1V+++#e~txݿ1@7wI`xJR!5s 0p<`pf\PE Ypu z5GV"Hm xH-vFQRsr8Y,(1c1߻w+W>:J'S)urs_ q'{;5b' %l1&a9ڎF{,PC6sہ+=6]*v2/3 pz7ld$ee萎m5lg~ ?<}ARXXHQQQ۶y-/3cQ75mzh@oT f?=X2nfE9\lnh>1s /bw"+Ճ#5 ێƚw~J)TY4mКɓX5f G"MRqccjFlHA}S;G&;$StL2 +O8g1UZZ3>XizL}p]ZS` ftS X]dڛ\̝sLԥ$JmXn7C++9c9K=^)'gR:q7lp{ R,=o)@6XR-**,F{oM8 R'!{ h$fOJYrpҞH+ vZP~Emÿu[&'MJl`JV6el۶5gJOKK[P]]RXXeY+ Ze;:t%f!qm^t&t@ת:u; U@wc <^"B s.2p8F(H`]~6嘝$GLr$G`]wq>+#d_9x5>tk $gdLH( "'+&{&(/"-q?O8vZׄeYdddt:?HIq+;}O5kɕC,`&G4(ÕFWVV]UU՛ s4|`ww_W=)/JK]mx̶k{ ra&9)x ##۶ZZþ={N^M'{s&p3fΒ:?}sﺓї\3--?Pλx57i%%8SSM `\8RRzlBٚ Pm^rc^HZY)ׯ'҅5 jͧgc*o b]毘|.jWLb6YFG.JnvQeQ^^Nwzʏ (=H:C*s-+Pm;IaQ۶n=YO,2w XB) ?߲;ʳ;!Ӂ˗/w:'08'lT XdVjVL2L<Ͷm\N.<).zx-r%C+JvgkiidsN0700:\LA9U2>﹇E8#^RgJ)TWU\]'~pdoۆnӱ+EȑhzX c6ٌ8 ^5{^JCfL p.f$ O>ӦMkw֚h4JZjCܼis&/ --is/pYј1_sM0:Ŋz^VUV.|Gi? ᪪ڮ$": XoqW{Fh)/Tٹ&`,0.ǀ;&rQQA~1gBZ;_˂-~MM:d\,z XHUw^δHjnnvvm)Ckְg?z0QCF^R0?@|^rS=])E LOo8F)E ?\P-[< /8fA#7rqcvP\R쮫 oܰ)>~-N|TL+h)).9Vme˖rʃ?cΖ9x 7L Y/shf~㯹ug,ˢ33ݻ:4q4oN /5V\; CZYEsK [6ouرc7uuu#S kX2ǎ9ȏψs%$vWV.On4  aCe墏>@+~jU`n5PaB~'kc>m 7/'wmٽt]_Dĺ}H8nGYfq~1gG%lf 'e\Lg}mLxJbQ>HJn. 2 r1)4I{Y)t8Lk9xKK}~m<,v$B8 #.OQaO1b#;66rG߂JY>AnL0T6 sGkN }JZUյlāYL@>o۶-Kxf 5i{3jRUVr2f~/M. .L,U=Q"??߁?o_r  S&\Sή{R;Fhcʕ8I/+rwܱmLKhlϘALbkQ4څ O~~Q ch ڍƌk2K_SP`P< WZSekU}}=UUU:KKK)))3˗/ɞ`Ŋ;]K,Ztʳ*+]Yhŋ++Ν{v )ee>¥Kv5OqgDw}=۷ jjjy74֞={֮]@ =OOOw~=\Z}+@]QX)s5r8K*+>{Ѧ瞫J@p'sE89m̌Lii_\ BS1# ${6c]_XX|L0}t{コ+V$4q́-^Mg3UKц7m)E㖭G%"t0}=񖗑Z(9k"w"pJkrѶ[ZF9=i"9O;t {yzGCΆ]ؾ}s͚7uMMoٲeww߽ 0fkr:ߪ]a .ך-:륪瓹F𪪪*+:^-Ҽ֌Yj(0XWE5eYΏ~c:/(( 777pWxIf׾` ,s sC++MI uŽFg?D[4+SyNDaez0? gxhڶ  u{`5Ԭ7S?@kSFi7OWzݼ;еjZkguuu-[t!VcŊ3l pׅU8EJB_ԜDK,I,:庚6nvcJ?L$;W@`<0N6t:9s}hss󟁟]OD񏘡̸2R8[r }QCkd/~YmSy\~Ky@m82aUJ>S⯯÷[;z%g ǹO f`ܗѨ~j1ϒ|5)9?Bq7ߺ]ԲJ[RBJNΩ{/WTPͼ;$ܸ۾6Iiܾˉbm)hٹ='`oi)Snm,q(?+#M)4SΌt%%=3r@v(~TO:V8̫=S&6mc\OŢEsrݼhɧǏYg-h)#z}wn} ?_]df&̴ZwIe_TU=g޽✜9s椵nt@kǓJFFz ZjkF[0E Hn-\ +mNo7ݕ|S`,q?߾.gjjoWRvFfۦ-4TWS0gvקmK g[5.r23fS׿gbI)UV`ܝ0G)UU0gS1N@SkŋGgI驕+Kbz+W,UUZ?$Ipس{K|V '_J9KϳZ]b!333|q?Iwo܋7' >0.\*bS Yy릛PN2ƎAZ1‹4 )SȚ=`_Eٲt{+TWcL_,( w\Æ9\N_mvQ0!:vEYaM[ !I䜽SvqD_"'mGh8*1<Уfϧ?)pa`_ɒ?;7|7:@Ā:}ju.ZDwf')e߳g,| > Nn.[hoJqԨQ<[n]<|r+Ș>.>))L7zם$b/lpG՚5|?Jڰaf 1Ph55H;JBM}>r!g^/BB2|8y ҺsF8gB5 6!6?\i`@ȒMe72iȑ/]37;1.]CKUU֭[ǁ]:gb 0Kf͚b;kt*-1{k.]j/((P|զZ?xC&ayg;r`60iB9B NJO<(..ҺuEHf}|s}{諒eNS^ξ_ v5aXV1~@HV+}4[O֭I8rr-jBTN%}4|MM+TVRj\$9CI;9֖n7[z:JJH|ﶶb9dȐeVI:f7ʅ/0?B\Yb.uŋy.\phժU\kv.995|g81+`p:m[616S%ӦOz뭙9yvG{5VPP?^q5OtpLљy-Jٳ(Z_{a`w~Je>ҫSnw"p8X,{ΎOC%YNL>҅]]3wbŋזjkժU;<{zz1Ԏs˙a_SiN"xo5aloOGv2Là%*l0?@=).f#3&''d!$z#b`ִ4r%e|uk [R/2jޔGv24nZ;FẌp̨n`9~|&\Rœ<`*ӝB*,$o>L.~AΝԾ:μ|T3mJرMh۾=jnGÖjWu^\Eس7Ɓ!77㬮>Ҵi|3AÖ-z gظ,|䑇uxG] "`˕} ƺK ƍB!"ZA?:f0`Xq:?X g+9\TO> 9 w͜4=~ͪהd^~7|sg4pa.1s5(6{]W_?z[=IU=zC1:j$9!;x}Nvٍ[88rsքEδid͙ߡ}`૪n\ŃL~VO#G Ex`Mg%۽חK@pb9gftql3&1!xD)rL,(_[ZZz/J B@_|N.kz|Υt:+٥|ysc)ݟ=qdLXf5]7-_1St zSin /#G&ܵOR/T-_x!psB0Lɓɚ6?&jW]^5={vV -$e8Zv3?@iER$WQQB,>NixsSHh%LFӾ}{'oó i0 eqW,RZZ쳗`ƇN>B m۶_tb8,\0) -z<*DJj%XUYx1-x|$Kje]jڢ֡ feee:EtvcMAy BS%$wa#]gc=7v5=I;_C=>+*YYJ݆='4ZJ\ּB@Qq yy\=0.*B$ARQ!/ZFbj6mF},Y2]It]w}Ko߭X(---_x.t.ddeaeWuY|1~Ӧ˜o-Tm` b)Sc ˩w߽y#EttDZʔzL&HZQ”{fw\Tԭqi>cW೗/u,B7@qq=rPSs{.֮E4HBڨ{$h۽ʇ3qYX-#c`:{CӨ(NMlzgS&#j璢9f Ö-Cq8hxkkL0=|_#(ŋԀqv+--d7`Y~Y]tQ$ILR2aηSJJrJ۷`jv,n|.̔Ϛ%ѣG9"-:Zr=mp0S04:]' F&f/0mmc Z j;k!C"ϙ;zUWY,6ofDѺTTR7)z뭖իWt;Y?i4 dУUܒƌ`—#R}F #]{H̴}&Bnć?gk4hi%% -9yYӧ4e/jjn{ʢĤۣ-fo2f{]5z̙%kUL#%*--Kˑh@uYxrʺų첊ɆZ,df[_}>Ř[0l̮Ss'_8}b |h:|s=זS s -!$i;x4#9R[ 2Ia0o .ewTg@VUv>'Wd1  s{!@|O ׋x;s.$=}3ﻏi4~~ȥ>̝q -B0PqBiA0dϞ=^!DX 9\ڍ{E֯D"b껼iqy||Ņ@a;RL+.6;6EQ: y9#a ^`0ӍXtT C}7Vןkb*AEL.쿺\O!ޚVt$%q@ΤI]$!$j**9*]ÐT\oǙCP!ID^j־Os_cdХRty23V _WЃ~Y#dΞͰk&u(\8D˯R2c$'1w$~Yv?irX&~?oqu`0XJ &EQ{。c)_Frĉі@=-6_BlXVdYiooҢx֯[۶mG3qxXs.9`-}}9gMhT4HJb s/b"(BBEQ$r5ߏA:ؾmc3p;'VB`ַ_葠(:'LxwQfuǍjF^~y_$ah:UUT]?u>ȁ_iv""@Ӹm{_x"c$e`T%Ι2LG!l8 ˎO'k M'?w%YP`*? z:j^|!'ꜪI.OR0HINNCYGv".L׼es32ҋdYb._NgNV%bFj!?A <23HKK#-5̌ rsrT4Sf-Bn7ee&3Q;עCTZMo2dEEkLD֬h~--ԯyef+`22_#i;\N44(]Pd(WtXRRdӲ# lh3䦛mgeQ4dh'!UUl){{fyv}܉kV G%% 2d H)ÜǑ$$$jBA~mv5fh`[g4p.&qn%<x.}w̛\ ?II|*00!DJԳC(b݇_z6@ }_ fcm_aڷEzI V04u?J=]$Susojnv>)|k%nkF3\<Gffv(.g &L v㫨{]UG-]gA !p D%Xhۿ̅д~65ߣAEMX *(~WۛqIa]:a444۶mSS2%%+yݓΝlۄC exI v&]HHD9]$Zm呕M8V&LZȁ]E+6  М ?s]$ jt:tel۶j`bS%//cQR2aÇ#G YFEn``C ][VV^*G*}˘!o,@ױdf2K(d_m^z7:x IDATW=` 2gbصא:z ", ~ބ }>ҷo?#`Ckڂ1sNJ0;#cΜV#FT6l#܌or6ӱZLL4A`VP(oֻ{f1U O;w/k79EOyHINx0\I|á0m6ٻo/^.S( o6 O{;c?\^HFbUZr= hG[_2-;[N/I;[ZZOBghBQd=2J,olzY-j3tǐ! Z35 Yu?>#7 dsb|2"-[fAI?Sbe]寒MK1xeɒ%W_suvvvY2Zfm 0fǎlܸ]3FUU ݠN}}=)̘11ǐMn܂۷QW_ˆ OfVe ^L,L~,G,iXTK۠43m4FIVvIIIX6TjfLVVmX 2eDEQ$E,0oY˘mOaz4k,Y_-ZtSڲ앗OsZ,dϜɄ/ʔoŤnh|;gD֭;H9!CT`Dg&={6n'ܽFn׼G˞=زp&j23[#TVjl쳚 {NWEYoKi!bàŋ?Ou5Y\>S0TC0a믿.777G 37r04 /e23:y*'NdK?n<99l޼7z M^^PDϙE[tnkH8 ~kJ>_'E\I$\'@UUB0$&++ ]3ԓcZ vG&`LLHP f?SizӣB|CD='yԴ4F^s5g~;S-\{ cbKMER^f$xm 5a<ΜPx kj*3>e8\/~@ڕxkjpš`~EXsr:D;? iF7oFMNƑΆ!}>?a4iAHN۾ԮZEpBq$_@UI3y@i?t=XMԭZ!Y33M^A `:O"!u:>ZYJ H J Zj!t!&c:( D+sf͞- %9/akױhb223f017:e acN$V6ے dޟB"))ںZ j]b8iL yVeR_S,Y4"E[C$! C@a>wMӐJŻ+eȑ88EaX `.=384|83 _[z!EILMl_bDK+׌*r&M–Y+2{OYֱq^Rr̒@eRJ`>jZ{1>M6S~jJ΂cKaIdLJ_eeZe,'ގ#/kKt${ȑ# }QTCw8H3:Zȟ53x:0 3??e_+ L;$^o4Mci8Nd5zOƎ1n^, %9lFd 1 j% !$!'%9;vI|_>L ߘ6cs M2YfmoΟ7KD"6Ɠ3g$ѶKS?Ѽ{7\3 [fn,uuBf^L$Us=7w䉶|lVѕ -[PYUӱ;QH:-"/h,h{*l6\N>INN6=TWg{nS[L_NMNJffbZ1{x9r$vId IdH2 DF@|p%4 ??.$~"TQQljj9b5;?co dU?o#dO{fHlj:汎\s }9t㲦Ocwȫ!6S [.ȁjjVo5kjjBybͥM6Paj G~ihllb۶ܵ*ZZAZs9}(d!C(^Wa!mUU{3 |<Sy|EQ.eR~vT<̳0g\\.D5I"`)&njy<9_V,V+־ǔSd7QTYBȁ-OoI}@֍7}>[tguW^}I'JJFedEFddYҧwFA MI" Xa=30SF%Pm55Z1B4p)[͟G`@X 6v,da8[2+I+)Aׅ-+]\2G[˶sab-hq~@.9sT2*MM}fF۞=ԬZEp~0s=\J]*܇cžuxi߽ i8J&Ń=쮵 j%s8#ѼcgoRa6'N'O>c W~np:b-oCzz"nvT-H%q45gx<_ mn7 465ʪ5^LmyZ@J233ԴTIUTWJNBV0@@ H8&1Gh#G_t `$$\$v;et MӈhD`rl/{/}F_sMbvZ'Bhzu+5;?xGVֱ[!ݴ˝_otIQK׿=.u(˷>@H7Ϟ=hmڍ#7{vvbר@Μ9uuvȊ 8 7$BA?dIfftvf6nf ƈ+^$tIɟ1sX`?i50|$Ef&>蘿aF]w=୩aGuSRUf|d705u Sh7>Q~Upw(?`6m*JFjfIRxU\p^2Ǎ# {MI\ۧ'+/VTT(ZK/LFzv=KU2CQ5ïq4_Cq .&iP(/\}Ű.Ė_EEOL4;'?62UUl6D8fa+)(( [Gwzlqc-`,bpc@CH2Ke2e2FT5Ѳ|'gJ ȲWhB@8 }URj({׃0̛2n* (- \1 X9^_~鋜umv_Bn7~hrBqt_g7 ,Fz%Aö{n3 _0tWPU#cVe, IDmӟ~p=s皖|H[f&EQ IX>d)2^v)A `φa`D?[̞Ÿߺ@M LmY[ubb\DZV" ѭWgVS+@j׃X&ci/2_z"p8IK=@)$@CY'V1w~xvv=^-*' !QiOiDSHzt7] B!={1_0ĸ4 u`O⭬9)^GF+{z5ƮG4>o,r2ǎPBa:d^~9s~[_y!r?S6w?[&,p34Ùx??'u٧J/_|ۍHadOȢ_jjjoxĊb뺮iV~O &/$ ľ|~|t􈆮ixuMCD4 -A4$I2.t 4㟃"wZ]"NQ nf$IB_cYEFdsȨj-5 ߇((aEUQd9vQ@!RW -խG"?$2Sr%n$Ew?t{l1[PX ]ǒ}j'@L;Ԭ4l#.b;&GA>co rgi\1c8g_Q'd!Ih^wY7Hy}Cɝ2߿^oޓ0>HP|PH'~ BBA5qDwZ4P"a`N@\  mo?%&ƔxNt+dBp;}MuJJ2mmx<@@\j@*jj# 05ӽ>/YYt\ "TVV"$Ea1|ٲWf6?q+>\rLO`[WP~ؠZ[cf$$1I*(8ޗ"vicF3i8g#|ꭽ551ګ):\D"6/9ʫT2'~(h?r_:G" 9< uػ#^z5 4Moll"q>UT\,VQ0f+v5ae[ :šA@'%5k0Veb)84)=,PP4 \'%(H4BhimaȒN xv.䚫)b| `MN'ͷC%WSR{ ⶽ][S/DIU+Ǖ*Κ6{F-a:";w6gze)|pKyBx8?S7(&rA8z8-3_ 8 ԽOKN` :q0S. D*+CMhϪ&%%!>/%uM7u"ff"ᰙݕ$"FCcH$c 2x(  q8pp'gJ B;Λcu8쪪ZP;p[uS_8!mD"DH\'JjooGњuv:HJ:nsa|0gϘ|KrIxb!kX]r1XT>^*^.*.fh? ޻nk#}Dt\ڨQ.Z(x3'}T鋴Q}Zv=;_=j$gLRƌ@u}cƜ1az v~d BMMMn q)0 0MMCAϟ׉1k?}V7!$1+fY(\z#) Y }>ïW^Ak{oBYO~AZ쥗}%I.&竛7}5j3-5=> 3k:dhQ"yhiiϋ,ˤ:eK}C=ӦMW|>/$^{J5I0{ggdcƌv!VI.67>F ݈ZZ[raPYكz6%EMZZs4sah -al&qv!ILH1nDΛk ]g?F[BFdww{- 9%B4K޹ yӼi3EMM1Uva\dML鄃A>u\ |Ef!$ C^~~C Ν;] "#2JRRGfEoP0ێ+jƅ)vx&߄uαlIIaʝwtcqCԨiy9".j+}`GH̡7fRGbttyg#7j$yK E]ANhٽ[v`f$e--A$6<@$--yyJ++Ѻ|u\c=F(b͚5]YoMP=~,.˴EilhDUxY 0}m6tCF00 TU=n7 ,YAEE-\.Ӎp}'gZƬA;wvp( Ń9\^n47IN6-Q2 1aX,t  \wEۢLπںj^zx1L,*bn| V+{"c`\v3ª~sb2sS&-  k4f"҂o(Լ.&XSRDΜ .ȟG"T^{MwY$ϟ?NAA$CUL=DM:l#-=CˊLII V&´m3 𴵱eGPUUUq9477raXhdH̝ ?peOnpm' gZ8H錌;ج6FPWWbӉ$:Z֬( %, u_Gfffu]Wna5Xg~>#.X4ouu r=T?*ycm!*p' 5-wQ;5d )" E ֵ]\uW]t-+b/t"Mj@@zOd7&e%3{綹<98djZQqd̃Y Ip+f7짨Oq'%u?qAP/*b[ KX++ݞ;i$.\H||<}΂8mts2p隢£ ILVA֯_i95աRZٛ4Ms]р$!5 SP"vJ̓(ZM( 7 e8_vޣ kNV%>>In#BK9 ($oݎdR*|||RdI5j^evE`e+g qnr\XXXg G) " WV,_d6[3g ^4JU"njfhP22(%qxORE]HʱlMVc·)F x\v@[[7(ΠQkw$Ҩehn(QGzzeѢ/rsL@!ڳDPGtYa#Z5s]¢.Ml_jHf|cUz ՊwT۷ir? &_t!c'@աCl{esoOOONQw}P Nwʲ5R wu{Aj//oAq=<<>|:O? AZ@dzh4b0 QXM_%{F\M8Eү~Ț_6VXu#-,G*rA`p`X44Աo>jBtP~fY] xB\tȒ!<+.GAU>NG`~6'yW]u~)wy'-3G؎/usE#3v@eeU5}u:Nhȧ}V[)FC~||VXU1o+ v ()3};y]vU'"sH"I~>TTwl^w*+Jp K"~h6 dĈA tH'O=@M7Fci)8MGZȿwA.ټ Ε?$˧" 2]dI"iD]yEo|c?/t;zoSO=E;$Z'XBq'(eyԾjjZA(/+'#@K$\whd?tPss^(ݳ{W=pdjY=/ҹYYY 4He4ihhbb:B:J6mTű@Qr%؃Tz=~[vlaˋsipRopUE:v\4SJ&j$NÑXR ŊghH x#:l/dP{:̾7ޢbfh߉R)>_͞Ie3T*=s'ݿ^xPZ݇7&@/0|07P}GJ"44OOOf37njkk,K)"-yh,ˢb y{lNJj5fΤ0z j4;}*H7APMTXϟϔ)SПD믿f r`0z-0=#FcZ[dA Rl6/Լw?s>KȲYv>g ũ5懯s9WVihhʼndV\\ #(%*$L*5e;w{ՕeO>E]nn|M c}$w`?I;b*.:˒~#gj5xGE=n;2+@BMFQ$'dY+,Q>€)S0WT*T*-dnG#j.W݉CJ︃S.CyVwl6Li8Rtn9.[/\\X^{@QQQgWHn~E F,H qT*bXX{n2eʭ˗/_r[q4˲,ʲ<`o\常8c``` KVWgXV' ;1/49¦dj|={ZĻήb~BuYYl~ eegf `X23(P\̦gnZ3<ƍ˻755ِLzyαsz=maĉ~ߏ=z,g|?,˺C]p*++'DDD]hnUT}}EdQf h15Ά;OMlzz0P}KP1:_F^dYfܗݶMtIqczyu y4g2~ӟ(۶&FO>;\`vͫy< ::booo9w} ͛8lذU;rR8˗!˲ r^h&1""Bp7iu5;A\pj/X,[+Jc{sl }]}79n?2? r6c6p&BeOnc4;w.˖-c„ =ͥN@ӁC[М. vۄS=s& ˲/[lMlavw'`2ؾ}j>NujB!@Z))A:A' :|̝4rµk)ۗcd$Z}B]E23Y>{epDLk"|D} tveYȣT4iӦpBfΜ.]e i&WCL()Ξ8O ԓvDVT 111[הg=DYe]MM%K̭Jl6l6oEȷ\޸qj>T8A(+B"Cs$z+Jp (b%_6j""L#OH@nn.lf3_~TNJi~e?O 7A⿉js,G~@* mB Vr{^pp0=3gǧP3]vGt_Ō.(#( p~t:t:]HNNU 7͙3T84,ˁ^t|Z+HJ{@$IdeeI[l9lۧw9qdN\Ry+ijl׷B2*x^3 /[=2+Vb71Ġq -[9N5Ȥ7`+:+##t2;wb*)p_K3g [C_}͆j~Θ1w}Sq d7mļy\.Pt ,sssi4 ???mAnpsIxhh{ǏQudY̙aÆy;wc@@^Gvƾ3f3;wlJ wPyJ1:Z)s܂ӓÉ:KCՙn͓fnpfT:-ƨ(w :.nr_#|X:ooRR{Jm0x[ՇA)ޱO=MHnoOqJ$Igڵt_dQ |TRRU__jБok_>>>ѐ{oO ,˺IK.}|BPP b+0vN*++5k֘+++HBJ [++)\ ~~x+ʁ}i#<̃Xݚg_(ݛh;"BYm=@e~vΟ5I~omY1c5(ݱ1 Ϝrj5ֺ:y[[o?fĉ'-s<(..Ր]|N;N xzzxK\;^zh .6k֬eVg ˲_vvWZEe$IwEs$ÇK6mʶWߝòKP"n tl%xԣ;x6A#"xUxEGstӦW˩300pb4?;]n#`0F?qeIBg4rpW~n$nt4=DCw@hFV?0+WOt~_|_|EgC ;Esm͝jABm_%!!!Bpp={L?~-['xq֔6nݺQڶm_G;&;vvp4b=$f0WT倏j_{-ӗ.%ܞ'\?͊t'(X[n6BKV+pp!"v5V{/ ye5 <7ofƌNC}H ( ތ}Ϸmd6n8ޓ$~1eʔA:o.Y{pdYV=,,Lj[.$IXVf3ի͹sWP[= QZˬzaVCe;Bd*2>56 އ Pi /]ɜ9sx1bDY IDATOʒwl}Q]K83vi4Aն4kw[E8VM,%X?#0@s?dOozyyiuoY,jjj(++c۷/Fpe+]p?J%jC_;JV}7[ϧ&//pT*"/id3Owٚy?Eռk}}Wp' uw+hi;v|i&[ii)rhDEE ]vY,ZpF>U嗯߿~uTۋ8Gl6MMMRVVFaan:kqqs(U |DSA(OK#oz`8.1s*d.òɓv}JXGﺳ]bw!#*:pMx~dG)۽U]/l^,JkM_ T:ĖŞ7ߤڭy_|瓔tZrmuV}Q]+YJS(g",UUUU999F`0Gߔ3?@h4~yVsƹ,k233/Z|>$,,Lt-'w{jHII v,*TMd"w*y]VKwl,Ch(.Y0䚟~d#p(XC]@kZs; )رU,nO\ve̙3#G :c+i٫'cƌ0b1,, //n΂mAhgl6VLy˖-[WXqZz&dYoܸŋ,8^Ws$B ؾ}mϞ=z':`- n!w2JK1uV8 QG}^>)>H3,.77c ED}Oҥ.DŽM̙HFNv/Sեg7(۹C|  >11J ]BTطu{|y*_~s2`Ӛo9st%Uy60nNkoZ-F!000-@eÒ%K_uy Dee%>|X_G}l@1# vĪ W,GZD̫C% / ȁ/DX;܎_|Fg\}ZB@G_/f)ZzPRz#g x8hIwN̤Ihƾ;e*ZT~C׻RS_Y_u, yqڏ?ۿ?,#%iin;LJ L9Al~q.坈>FaԨQɴiHNNUN/̣>ِ"`pt&;T[nRAj}||~a-Aސ|vD7N˫U ZE}F"#"6iO>mܧNAz@eᄏlѢE~mǎE ZFl=iv)F]]cOZZn^fNYF͔fEGw|բQ$dz_&\D⭷6r$bGp\(ٵnuGf|]nmKPH#v}HMI\e P/gSyv \K{RSo%אs8RSSqIDjj*W^y%111=-δin溸@ur>?>t^3} *blf??АJANwWċ/Bubb"~~~h4-@%D`` ^Ra1Y(-)7߰G///ש8^3gO?i"N"мzifUl6Ԣ IFFnݺr 3_=$irAh4訫V}("j7]n9KXU1< Biz:~nEPJ 8,/zGeV+̡l{=:6W(ޱɓ PΆ!ov ƍcСxxxrAѣן /ʕ+ X(ɟMu\ܠPFCnc6)..۷7z޽# guP3hsrrt:. 2*aCmPJa*QErbXXTx~eunBwVe~GDUshWɎIq0=BQQIk֬hllx[n3~/ ?CCC}6׌;J h(dw%^,SN/ "HpU*$o:^2VSE@B"97dwy NN7)Q%.iH.<$IwEw;mƁTdT[n Q#|Xeaml>kAi,+cX^PQEfϞ͍7ވlvWqf{ڵ?ɴ1==}$I^A0$eY&i|F6 S Tmv6;,ƛLzz{ ˲n,Hv19 "v[M1U444ٺumΝdYҕ%0O>3OD6=?_8j ݆ffkj׉l2 3u @ Is ٰ❻y{JsGp0ZE PsQF]gdSy7fܜ9hW >(Mu퍷3Fb^~9h <:ɓi2[ܷ~l| ;a7=@/̙3G|g?CHv`F *? AY7[,_Ž;_~&V=Dzh̙ W ~~~ !!!JAZRbGp#;VǼAgՑz#K@8nD:D?d6׷/p;&n=o* CcoZ*+6eee.%'sk1xv Hѣ^}Ezz)}Aa?EHΊRyV4h1s>WDDD0zht:YYY\uU :;ฑ_JJJ=.^ȣÇ^ы"^^}Le&͒%|+JKhhGdj5vYIb I}.K&Mѯ_?2 IwWojɴu޽S$I0 !C֤Dw𿺙050YL_~aF)1MMMkkqqQQQ0AU*,Kllђ#ʿY8i߬ڂ F!v ʾw#g ﺓS+tΈ+4^n>t6 ?GԄ J|:; j4yo$;YFygqkߚY~,b澈rӷQ=(Z-?N|||F#W]uG4K.v}]NZ8~~RZA<__ $ɮ&_}0th 1}-R'z8 {z=^_ EKɽ$+V 'NTvȩT]R/YeAAA[Y#EG i1bYX";;[B =ziӦMc0EnG`4ղ$(~%,Z4n#/aop K4$oj#Q}iN 7$|Ç7)\տ?c aF:JEA'|#85O=tWl&xHn6o˧跅(NIIX]]͛odTj(uo!;ӂVVH]w|}}keYhyNN0HmBB___7shdP7Qhj7_9Q_ `d>hA?w6hc+ DNۻ dYFj 9~cƐzx+*i(+C@ m6.^桏 @~(K~~6%%gffKDj5H#,[cni=ߙRS[xwavpm4kJm„ wx&''c4;5HbAjIW-j}׻E$Lָ x4o(QtPo&8kÇoxZN\"m'攙hpт=2CXh5(bb'TqҤIu]a0 i:'y斿T*^511 0~w\GA**-eaz:>$\Ҽ"l}LE&Z<...QSST;jZAl`DQe/Gu1[Y)++$R]] 2-\Jrʝx8DRjjsqqq~4mQ,cX~rm\SVp  D)`pj~"{Q8[j q)d> @l, 7{u5m^r~aƌRСC8/2' hù4&{@$aia!jeE QB!+ͪаPT*: DQDדJuuoAAm۶ݝxtU ,ɭ 㕛cfN ܉,< ঠq#00pÒ ϯUJa;$Il1h戭Z8!$qBV'|,Ir.#?uR6 1j5!#S;vd2:N%lacA P{z:@EL~]|q=z4g&$$ECד89n455w^ x L\II\GK{V6xun6Rs|7$;$4ع#ɗ](TX]eQח$_~~kpѩj[2 6dZA%V+=J30L5H U+Y0xuw!#G9p@̀oG IVUiu߬6'ur_m4VX; 7-ee^?~cǢ qrq7Ra1']y "yxӦN f8y _x]'::LZm xȐ! 7 `2ywXx1,s̊nNGf -}uuPBn \@b""Q"&sps`LL EEEC믿f;] ZX9=NF4L>WZ~* IDAT;ؓ#Nx=͐H0`4Щ.w?(+zՊFFtvqB>MN5M.E:DD&^Bwם1`4r3CtC@;m` VD`bЮ5D,6=lӓnU?Ai(.f{qpܞ'",q̴iQ5kDR7D_r1'ii菇Ħ/{Ra6w[c(CRTTsСsrr~tuz>Q$YI8$YJEwjkkf< Xdm܀<7lذСCZ;9{$dEѶ|.tP¶)Sw w؎_HM~ l0ntqCA`ܗ:<I<8~*tqVS9s,?; YmӐ`FIXb6t=ʴi9rd9r @//^;|%‘$ 7ݘvPVY~(8RT&Z;mݞ :Мa7:NQUZIU$-nTtޱf5ۿMę (Ҷ݁ 6666V1jAwT$te ZF$ec8-glT7-f'hB%' ҝRS|C?D3RFᄡ@7@$]{-%;vRjUcJ6ofCtmDwd$Fl4O}]Rx{BJEjdZf8vܾ PQQ~>}: ?)dddxb.\Hqq1/fjt4׶Mr832`4J c0lDj;D@g0`]jjiii_wn:$IBT)DoH$KL&8 )z? [{^^ gHyyfvfx/++W^y#GrWm.dYfÆ ,Z?µQQ3u* SwǵEm66Nz:_0A 'v+! >(i ةouA`ذaٳ$IZI WRK%PjeG躶$b-ZЎ#grddG-?@bbJ3_GQ0cԷ֪v&5;\itS6+ģ|-$8D!\glZ-HMMحV~iNFCl{e[Gb h@[28cV[ܕedIb>f NСLzu;^}#uDJ?- LZqh;{wvm6>>>L8ZvAQQKB(X,{6n5\È#zPQQ%KxWؽ{7a:/w @}}*E,(`ޮ]d8Չo9`J%=]9 :twǎ[qAn8v#pJ:e ,Il6ɒ,&9&D4Z |ѣGG$%%c7ffR[qlyNqr yҰ54y?\ڳ Tr~ ֮#r862sы&{2?nُ!wE`Ri1FC޽﹔m3<<7|3֬~[z!aIhM#fxbL|twS;_WSUB('d/Zc~: &7#vRSn=.oД~ p[gYYY\~̘1YQFQPP y9 66.ӧRVVfw:C/`VRR\(† x饗X|9YY,+, :@_ $ R‹.!!_"7)..T^+}Q({Y*z7L? Yu. g%<) PkFPd$QQHz!{/*( 3| 2]c v>-eYfѢE\r%GoVV?)++/s9~(’%K<~zx V^M).fiv6vo ff߾Wjj@Ӹ "D-r@vf}=o&^{8pBff&III$]i@dHd﷡1P`Sm(ۏU+~8 @/5M$W"@f@GHHw/'IT2jfCU~-rEF@F梋.MԗYfQ\\_/_N.Ks3_qK~F´Tɾbv?Wm6XȽqi}% fc#rxs}OZc?$4U᫯̳[WՍtaa&%Ih믿f͚59rHNNf̙nu yf\NON&-,w$vW倗FnjkkyG @pp0?cICBB. V|"15N!+#ZCNB:/%I /$--mlX0L\r%|,_իW\R]Gƒ%\vQ9})ZV6{MQt}SE%Α}'IV+Ͽrs!qcne??:3~ ]tK,O M(,,$:ڣv~)9fEQ袋 = k.V\wM{{;##y}B1&8X~_ _ef3jkyh2Qg)HB" ܽ{y׹.@hhh p/iP{ PTPqh}Сz?,hmko7w6aIٖ]|vXXJww7j6W!g֩;?4@DZ#G  'YYY,\Mdd$v{.>(C~-.-#s?EBbb8/aO2UoI;s%2q@6PV쪠7/tx IhBCUM7Daaz墋.bԩ|HD^@öm׿3<(M1mB^ >4:;yk޺:LD ]ND! ?ɏ~#"## HӔ)S߷oz8 Xj"@Ҁ(joXSSڊ8`/)н~Pl6fv|5wL4p#3s]Ϗ.(yww7?Yyy\>nG>,v⩲2Zm6gIhG?s~5\=cbb833f )| xxἪI6I<R oSm㪭 xA$I2h.$zG^MޕwKnnXXݘfÔ_Gɵ@*81ԝE":ٳg3}tc͟?So/0Ҽ?_T͛Gu?%Nw̠iO‚'gP5JkwN%snZ~=.Ͻ`̜9ɓ'7TRR|ٮ8puqSRRB|@LƹdFD 2 I|̋<_YYQ8 Uod40zSvD;шfફbԨQnh"""`۷/O?V`e晴Roq7I3{8ؿfsl_HGww͇']%@݅+9'==9sGFFg:8M}/Y{rU81ԑ2`їQQQ\| QӃ?\s r =iӸ~=yW_M.&<5U|&HҬYl~q:k|툼\d IiWw>J퇞7c͛"??@||$a˿aZe "oSNx iF dffxS?hbaĉ<3]gy6Woc3喛I9S`hƨ8&^{-'wߥWQ,ޅ.>i W,Ӽs'[zzP#"""(**"-- Ϡ,4򈈈GEEQPP`X[X,JKK{ywQss$+9 Ⱦl IX,mx=&w1J|Ot#  \hFR8 ?ǟ4Ma~EΒ%|{?n >\FdVv۟~ŋz*\s lٲZCqVUUQ__ϸq&((p}b믹())$I237U{rߖ-Twv <违wF+(Ex-COEx3h7w\ z">n<`SD i 1׍GX?3҈Ե>4YfӡCgaUU~pŝh5=TomxDLp=3QI&9.nAEůwMMmUXd~)[H IDATt^bD@Z0セ<. ܎GŲ$0ޮ:p:Q~,[h`ty((~ϮIr/4ItCm6+weUյkzyC 3gd9ꢳѣG p3w\^z%>#KJX}d.]ʄ$"=8֐>|'W<^Ox\~zTKWeO8tmF]]a>YQU 6uV,Xܹs{V\I,smN1-&vIfc_RǍ`LE'5"a>Xyj^+F{{披yv$FAG/,WEfE5BţG"@0B(=,_Wk1./3[D0#2}?W0{'@Ot3Cwy$%%K۩"33|BCC X,ESOQVVqUoM$s :&32j֬eaG=ٯz gn(59splÇ3?Dgg'o6_}sŴvZ-[ȝ\FTQE{s3҈Ql6ˉ#=FFR4mC_{{qk2bi8q!WDխmӻ?y1cڐe!xC]ӊw>` !3:c ͛spajjjejGAAYYYGBnn.?06l'(< +^fm u\$P!d:PTCPPW\qgq.( ~f֯_Ç &M/hjj"/Luu5;v@QN rRRÿgV&w3resBDžɈYP ?z;Es @Y`c%peg76IbWk+wr5>|x (,AX)d߈J;e j 6sN!0ْޞ4^yw0bi[Ztj.=B@#`D8߹lJoMjgp.򍾌s16J+]4U|sj%99;~i<>_`׊vX=Ʉ7ޤOQQ?>&Dj '&&tRjkkY|9LiD.7pLhۏ-[xs^Mrf#S߅?F{_) ,'W@fV}4I%,VK w^o5`pUU8pq#H.;_İ0, &iЋΥs8~;tcoP9ǟPkݭdƎ{LqY5kֺ]V$K}}=yyyoFǥ*&MO?g?V0w%qƌAGH2}~l2N?~e}Mӈ ??_kX&V^w*++I Y8;=$G"c$l6>t7m⳦&nE.fdm%`/ -g$X4r$cˍȁ'p;-fGNWSSS;w. 񯬬dʕl63><,`^Rz?_$nf~;J! bd*kATKLOC7z=GIL>@۰8drm@~0 MQk @OOmmmF .77wB[{ۀ (thE!<`nء ɑج675{͵n*i,,Ycסi,ѣ_gW_Muu#;}@TT?Y`=We>ZE5LFr^Hǔ}_4%%lZvx^HHӧO'##YOHNN(\n[z-~dIn<ɱ a$ޒ*%6{"V8%".8awrDNbThmmi/G$,=C<:}B&*uy鎎U@K8 B4>"9r@m8IUU{3g_sw(>3F`-ZĤI۱j?YYY$&&RQQݻeC駟A^^fwƍyꩧhhh8iJc󥗘~`~#1DOk+O>_$rrr(**w@߿rrrvh????7/A&7)1A**R{zhU{6aiP1)2B# ;c"+.ٳq\k$I 89~iN)+ J#"2%)FԩScimk^ ءpFXX08vNրI\W/cȱb`6!00߉vjpܕtt0":y0jB+1 @p#n*^z饤k#WήNp @XX{clFߝ_?6e= Њd{. ܆ĸqX`ⶎFK!֯Ebb"P^^>>@>f&L@\\[}@\\z+ .ge7ޤw(խ{.QQ'4$ UQf }ΚMOOgٲeٯM||GO? Fߗϒ$a4>mhyDYۛpB'0"ww H@DB E?\54G3!!!9d`9X˹9o]$83R $$7VEDx@ppjmt/2]y \ fگz b.wॗ^JLL׳I/"ro63؂=Ki999PQQAeeÇgw~<|<~~~\}՜s95H~~>)))o>$I@vv6ƍobgy֯_\5yyL3Q&0Kª}xO\P< BpBا"e<>Cxc6ijlI5?suQ`("@1!ݫxoi=( bp 95r߀{Õy9UUQlٿ꽉 ]߃ij`:Ә:ub̼5$#7 Υ-#+@pp0'N$55;vAg555߿rrrvu8|xxWlanheaҲe.(8a,Ӽc^~6 |v;4Q"uڴidddPVVƁCYYYtttꫯcM&~?aee1>&}{"c鱻f`+o4q|ZlP }(8Q @$L&sT M5h!Njettoyp\Vߟ: e\A~fOps\zdggkRoKMS944574M1O(++s[fYlܸj o0vXn6 ~h@C' }3dDlG= xw_U{ɓ xros\IbbIϣ zK`{@u=WD@Q::: ofvg;, +|O3p3ƥpan4$Bj-11|9w9Yr. %Mq怦r8CXnL<~>{Jo̴ę3[Yajf*񏊊?)Ϸ7*4MƏOJJ eeelٲ2ك\ƏǏQ|_6<;UUܻ};2p[(t3!;#"'` }`F5 #I"zI}?p:kYͮfFSjc$,_0j( EShZVYV#GsınflmK0Z#p 0Zn87W^y%96pl!kieׯnB 퍷_r`T:Hk_ ΦSQx4M(..&--R&Mػw/8묳6moew'eB&^{-QY{Uj#} TH,^ .TUl6S[[{w}/*/IGEU {pQN8¾g3n%#ʾw"/"\BL^zjߘ٫p~^^Gw=xugHC (=^op 4>>~./f1h;ԏ8{f3498/gX0*,p|Ogf̙;.'Iuu^VF(vil\B[V&tVfI"tw,?kDEE1g)--T`XL0zhzϟo=6uWSz5)NI6h$ nL) Gv7y}rCBB曙?ǹRVX={1kd.%]ogA8jec#n'MM fK q Dň Yu.]9/Mܞ+Xm61W< b0ú:0g8'F!P&?B bmmvտ?`tuur,pg&g.-J}Y 'Ʒ/vUo艎0ψ}}_HhD"?r!JNDFIJJ"..jlܸ* oyŝw7|ó>QF5k_d"$LAL^.c3_of$!ɲ=t$LhLϑ66r`f? ϓd[oOv;UUYf +Vqaa<3{6ggpl ,susƍTvv&P4t v#~%ߓHgRFK6W̧:k@xGqӫq,&0Nn<Y0 G$IwEZZjח 0?z5:UsٿfCӴ>1Y~zf IDATRv!IK.%77_ߞ~~̣c|L*"NBI?7d~A[fә'-dENӄ MP^^n?A|gPPP@ddWd2qI'QXXȚ5kxfѰn= aQATVv#t )ğ'̙{`fl,uut޽oiZIGN}C= JǗBE؇H{<ͦW@S{o C 8axa*(xSȨp;! F7`qKEGGcX˷S_?xe7Ao!&Bj@;P\XN @ll,/>&=صkEEE=d5;eq&ӝ V+O=S1cߖDTאFU7UUM bddd lrss S$u^Ȍ3x7RihGGÛKZSq3a/'x3O.$;=_gw'.;~TFe%ݺ2 0x_F!B}J_'6h9eIBU<>;gOKQb%O Yၺw& _<7111466"IyAqw8׳Zvߌ,47ůu"{dY?1qqq>7z=֮]KFFjoJPGJC Ф"zzX92j%|_)?&rWz,l! >xd hFdd$sΥ[Zjcjkk'==ݰ$%%q-`^xJKKYxe(HKK[na>mLUVV]wńqI<{uc?lӇWJWPTG|Nߵ EUj6#F G 2S[uݣWیh07Ttuv9zt+r\=N"#='!8R_N40_G{{=eΓ222:f3{hg82!UUqf4{߉8q"s=&V7_,Z(W\Bak+k$󽕄 Oĭg` #n&y%G 8AvMqq1.~N {/yg9tJFȠb/;\p]w% 1*wȒ̽+>fYs$aVJyd6^}(;1$Xo]_bEV2ѻow{{?.x8,˧%݅ѣGj=g7ÕSWDzBW_}L]]]Llݺ={P\\LRRRЃ$bNI$/m#shi|ԕѓ@W$Uůτedbܸqc477駟ʄ 0$r)L< 6믳~q BBBxEEc񤧧;rzC"ݬxe$؛D ПG_im <xJV+<=7qSV1`=c#Dxfw5E?C{>T##+:::"@jnC۪R`wr.Ce(Jflܖ uHrr;wEӴS_E+C3f6 1\ܹnI?'>>Bbbb[ `WHs^.̏VSph; d"U.$jgaj Y5:Бo{MNJff&۶mP?޽{ QU0,Y©裏زeˠc0L$''Njjݸ;&I顤{ګ"yLZZZxᇩWkOy4B=O@IS2ƨ$qba}]woV"32"fe|7!fQiQ3?H "8uo䥕n܅ %:yǎ۷ &f0M7D[[UUU_~fmI3g2n8bccٿ?۷ow;$6l@RRx))-̓'7:4@Y/А [ٸglF;z$ڮ.VVW["x1By}V_h@%&7}a/+F1#_qEgg:%'Ր8w e )y^mtH`,ˆXVzzzG ]ͮhXT5MvMYYYllܸ HHHp;X,3a +444LGGﮮ.DTTѤǘ1c*aFFTVVRQQ\HDCCMMMdee1n8BCC]n>#}*,4h֟Mtd(mV+Ơ@vFEOqba:wtF /!ȋ aP /*IJ}#ل܉p$"@l,; WD'F:?sgE1ñބ~ p"X?؎>;B${h@ l@})St~5^\yKKKinnv{l6Ү0Lh@s8Z3do6F/9E ISBԠne܃ ['w}vGaݺu$%%1qD=;0vX;s<9B +cDaa!cǎe+uuu(G}s=n>LgdI檋o>GJzx8/TTУ(y?NiD: X,JV#z(bu>Vկߋn}  ̹z9s1. Ӌl~h@ɖeiqnzz~YDmϏ;0ELyy9fy<%''GMM ۶mp$e- _/!HNE4;Ir/=$7o%fu?ًM mMFVV%%% $hhFhv:bFѯDdlT;QaU{=ʮP`$[ʣNHjnpYsʼnRCW}f?s$z\5C.+6*ǿ`qq1ftN:$jkkt)ګ%''sNv=Ō)2d)I|4Y UCR5dz e/JݍWs$gh2UUdSRR>BҎI%o I'#ߺ>/ )) EQxᇙ7+o]JDІ?Ikuxu=c/w#TqxcWZBw"n+E6 q} UUXT\f4wߍsd;6nF'd2W]=ΟID[[[7$Utxcɒ%y$I;vM}}Ga]Ua$t1*AVU`&MdW۷6%I{RXXHVVJ4Q^6*EHE3+WSfgNW4HRUB#9ɣ[HHH;v oaKd2MRR޽{P͛Yr%)Y2DudsOW5#!ރH+@B A$w¾}nD=y]Ѵ=jOCF)0 il6!!5>|za78QBdcz76OE\|dYj?>GbۮN^8qgᢸ|@@톱|MU_Db2EB|`Μ9dggSRRBKK6wII {졨~8k:ɉs2au?Qvo%1;vs#4\>@${mػwĮ>d khfFYYaIVVZQ|$EV{30.;+s'nߊ0/ fV4,;AvD@y]7wjX41}TF 7`;G p&򁁁^^/ 1=Q@Q_qC%5+B{{__NWh`>}󎏪Ji+JB@Dq-뺶]u]]]]ײ[۪RTJPZ5^H&eڽ?ndL@>|C292gy>2m49tPuzJ\AFmZғ{gHLL eeeڵ e7o&11 Z--=h:T@SёLgdD]XHcH+bF.z$P]$ s#F`Ν׻1TVVFUUp]}5T|G^%D?g|Й10;8y7 wO!YwBy`1cpw=Xףww ۱lh4>3Q^ K2ХZ܏'n`G||<QRRc^N m4xZ5޽6: $&&KII 粒M6ªڏcX?s,Q Ib2Cַ7J p JDWix Eg V1{m-*z{z ϥ]!`1&CBn>x_˧P  W@kk[ s?vɎ v<̥7.@:DQd$Z2{Tk;Ԍ1NkGjse^U<GRXXرc6lzM{Ak/\h45Jd]0 'M@jn4$+Q@k$''SPP@~~>ţ!/0XZLxꩧ?.dqUxM @@eʢJ|_v?GvFGt*O8P3WU_z\vBr΀ \` ˲CmSE6WP|neYd29vSՆ.?oC}}= 8Zn`V|HBvMl"|˾B#!6bEhh(3gdĈ477{Ȳ̞={z8tv;YX ڦzϟCo/q`'T>kPaQFN^^.&RRR3f aaajttti&TݎfsZu'Nފ_ԕj4L.,MRseYw A!8l<'4;Q9wRfNoaב@~ Ʋh"O0Aw}ǦMq\[ R>fݷ` 0fLzmd?v^ӹ ^5hJKK !/V+k֬7;r0Nov)L(43+e< xe6duBL.D110i>sc#toݮ<3foY~ ut{Zi'񫽫hkkpG=^)2pvG50@\H[$\=q a`]TOΨ;5hD3PСCIKK۷cX@RWWd}ele8RLDϦ>k$-HZ-N3>ߥkv3$NvTϧQ_7n8eN'$IbÆ ,_?x>BN%t+,ħ &`7eZAW[(~P$Q~:OEW~v ;\Cz{܅vJF`0FzS5CE3DGGԅvCર7%@*˚uq2k&&:TSPǖA2 g`Jv(#IG0nT3z]g& Q4''LvIiiG=nQ9v옣mff&FQ(`>9cjٿ# -蚟M`]=YE\t75# [$$$PPPj"P;]cD Idҥ}c74 mmmlٲƎKLLcQ7l8cU 9=CTUMM®7dl Dį^-EKu0uT233ٳgUUUTVV2rHFѯEEE klhh <rmj9>JJJ">>Gr:::30,>]ofh-":T: ]uOg/ET{~__?%K"wj~G|JaFGzC`5hNRݿ8 yCٵo0aHHO?Ar,G=A6QHv쒈˝Z oa˖-?~ǏsafϞͼycG6&RxVf$;S(MΟᛆN;w.lݺ6={8RSS v` m#5ca)2-xXDw?D %s khf:Ou܍5T:({ƍIKKcرl|r,%}ϺIKdnga'/`k o{Z0=2MƠYa zt.@㷡,E)'j\_qFJJJ<J lY|tF?m0FOk 藘=ETT_ ({ {|:yXV;6$8W-Y"9;_J/af֭[?͛=pۍQ|J"5JX]SMU3}|#s&`vV+,]3fxu[qFjkk{UwD>sXn{Cq S}QE/DEw&t.~v)@g_dOrBn' I&qӂ^ZZڵkI?bn:U6rϰ@)h}u} ].PT| ڈ?Rz-MˋPS?*P^G_:Q{z38pSz[kP'>fNZ.ꇞ 9]`s##]pO9v0> pư?DZ HG{0\ {,;b4\FIVRWzCYeu1Ԓ.?j*3up$St$$cfq-˫$97N߾6t F4 uuulذ۷Hz=rBݸ1w``^'xi hHX 3/=Sb QfJNxx8fbDDDxN~~>֭Up֬Y{籿5'Xx+ѝAq7T|@G ;b~.sɜ:MEH' e!F /D '%p=J@Kl,:J_޺ZC`Pa`<vӮg&KR ٞv}wp^d@`k0N""zow套]Cr6rNr5w5Wwq8Yyf;R^|E^~eݶS1)'Oǣ ̘B-c13i5Dwxv d *Im.&L.#99[QQׯg߾}n&b4) љz-||-%)-~ ɂ,X)S88 E/ajkk{ܣ$IlٲW^y'B]%c -G8S4"cCyhF0 xZ?A -|\H4+WranFX,xn?Jm|$p}"ng8s_hN@&S+Ægr @ͷDH 4b^Jד㘈nͯ<ܿ-,u1SL.*78@pp0grZw'?֩^҅aLڻy%&h̶DoY* @eU %dl6̞= .k|\EV+c!NȋE 4 J{BǍu۾w}uup$):f(,vI@U 'I 0DEEqUW1yd֮]ˁ<Vu֑˒%K:u/NxȽeVzH-}!=1#L2VQP֘GQRחՒIXf͒%K(,,d׮]􉢈db۶m;vl┝ В D!XM.>In4"X,h,$X1MAi6e4w_L0!Co>ʼ'R^^Npp0OFM~Oph^OĴ,3,1 8?nўdqU//~ ̙҅{ ^|Eor`ŀ2*t< ްy 8w˖Pmmi%,uY5Z-W^3ZL=3s(q}  ~` rrjj qqqtQ-dL@ ֑:"t( (z>8FaᤥǺu(++(\s ~m6mIJeP$vᆦ5!-u|Ffr' + I2vKu:h#>dRSSٿ?QsG@)2W` F$:"h;;+ccMb{'C2Θ&O;މ3N$)Ig̘AUUc mSS+W[qv (Ӷ;.J)mb-F_- 7ɓ=׵kײrJG\<;D{)Vz%Y<&=Oʯb 3qa7s0aڵJZTTDee%ÇgĈR5B{'$ahi#: ViMmd&ѫS9|2ŭC,7ԱD\\%%%۷> Wgg'ׯ?_9XNxQd* BEOqwp3j(r}YozK>,#kJ@"?nы-߻+"P 6@R¸qݳa]`0^|eYdrr"Q0_ zƥddɎ,HѱN h0fy,¸袋fƍqݵkc,XPƞ^'pe̟B[DB? ҋN % C`bV;'L^4[*f#009sP]]O?јQ0vXҺ eSx٬,5"՘bu} @S2I,P L8|0vdX,֯_Զ+4({ kN~MU(;(᭿q?In{cO g @%J=Szs!2vf\ε=; ]]M'5=!.KV$ =**D$'9t]k 0@``{h1biiiݻraěoƍ5j3>\ݮ|cH2,[DmM3$1JBl'}Ƕ} v8q͈wYaC: >|أ ׳i&RRR7n=Ɨ`NC<'e#HN?0e09rss9v)8Pjbݎ>>P1'.b= TUUyjJ 2I6{ _tE7z{Թb鴴j?,}V=;'ի`ڴi}0w((( 8$F,k.n0^u088W~W .I(A4eBv l༉:$\ ̼iʬq3]FJRw* iӦ1j(4i\r .ۂ@2)-bd66Ehm#ٚ/סY*N| HVe :ݻwSQQ㤤*ȑ#1 C`߯n$jLڣc舌Z- iMKSƍ]/n>㫯}oO@' joPځI&ᇙ;wIrUl޼_X˧Eo0{y۸v*_WҲGEE{ƌhlj{iOW-8F`, |}0Whjj?`y3z_^^Auթ{UBzZ)뀅=w<\3 1-;~M?1p]w1k,.~v#<ªUhm\ _Es`Ny 3 12v  !8ζa%‚$wv"##=~n*?`]"ǽ4 FGD;Vxk? ^ewc0ad?PhՌ2(^F) tޅw߱uV/^|J]]?TP -8=ovkx{J j@}jK?ZSSQ1=γ{8Y@~~ϡ!,RoA5^~QG޳^gxbzdK(/ā#fM2614U!IDky lh yVRwqcǺfP!I_~%=۶mI""Lo 0w2sxjE{S{vN3N\\\pӦM뱳wAhoo'77oZ-[S(_#So m$$1>{lhhAxaa`?,QMWYo { x#^;|'n&t x El$Ut+7ʃ'///nDqqqSO<'tȲ֭[6l{ gEW`5pe/رc_|1Æ #,, Yijjbٻ)S&r z_xNOPH$;.U+vE"36qrW4o31)K'_v3/<Ű!ziq?jZ? //kRQQ1,믿Ά +>goo̜h`ss'qJ:;FUTYy̙˩LRRR8tnUZJ61Dixf6@ * 泵T͞Mk .A/^̜9s(..b֬Yf;) O _HZ?(&Ei>\@q]wqW2n8k{BAA/fϣdM8ξNUp]ԋ|} wmaÇw tEGGQX΁=s(@e6lqz?qo/rϻL6^ 7mdȒ  zb/&+kTdYfg~m0x[{Gd0]MJ +7oW7!:3r͑DcV#=";Rö"3&1Kxw:!ݮNC?ĉSxꩧ2e \rVbxf^yLFJ"FKyQL&S 6Đe M^$It:Əϐ!Cˣa uQUUȑ#5j:AZkNH@`M-_oKcEQ 8Ę1c뮻f3ٳr6mԃb Ԁ42+7ݞfP!lP {a.dғbaŊR,[M0ݕ5u$xe f̙TWWw^z| &#Cn nangk@p (`hn!y.D49{COHHƍ# FKK Ga޽,_Bl6[[5 F%%:`FYB$N= 9$3?|y(u 逸 tW^ȑ#faڰXX>F{{;a8\v;VㆯbъJ6+'IOO#-#Q+qcHJJ1/vJ>__u7\$pScW}uE={w[UȂ H(uV|M.xMc=4Xl`>kP1| f%ᴴJ) ~*? 55|֬Yʊ+ؼy3_~9Æ I =I-A\8g,{i2fV=Qff Տ {ğn.Ck!CÇ9rVu555ߒBNN!!!nDi::GtϠd @QLٗ?Gkj2?lgR;~-=Ա=aodΜ9ҷC*^0LTWW[kxQ@ K bɌ8bI2"ܨd 5RdV ()Sx3gI ֮]쩉[zؿBz{3.c#ۻ;-Of|ȒϯОAzHƇ+?bz ,˔A^r:;={Cwv~y{[+w}{L:cԏ *BM? \8;Aç#ImrM:::h42sZFN0u M gT :3$IBדCFF林-?p***rҶl'8wxkH02$)d|YR7fDfNdDذ18~<޽7|Ʉhh4Mzz:$ahmm(oCl6ƒ45\:3i!JjT!ztM5$K(B>K,[na޼y~c=TVVsy[D>xcvA*$[ z\eO>}=z44XY9t0_y: ^U.&6rR)ٳkI99szh4(=^ymm-6lDhhChjlt9v?W_} *(-;~G; X/69[0>[#V^y:_Hٲ,S]]͆ زeOEQd…̞=' +:@t+n")NRL# QN~uq^2,pȲ@x*A!aZ,9^UͪOWG) uu_MiG7ؾ})KQ$I@@ }>޽{{Y|(31sܕΧv"9pQ_D9lH[(BmH s \uUL*'&2,Ǽy())8q­! l۶2uTbbb،Fg|ֈ(2#?_CDO|y3f2ysP=wNr5x0 \tEL6իWqF\~Tdb,[A(..رcaJvVޕ;kaҤIg|WK/c݋? T` '־yZ.JS:.m-p}yStfA (H; g L@u]zBLtGTcEE6B1 @1RU xq^)4??=\讠׋$Y|]f3\uI(QZ^Le inn&66crJkb&' U6ª^=Q]BĂgLE8h$''ihhpkЈngϞ=:t8ƌøq8sk+Yhq ,Z{k3}Q6mF/]? \vO9t(q q66Vڃ[vI1d;-BII)fY,V,=~Hxp ::kxPݜ])aA dNs++sb6m"##ѣGpJQd(#Z@QOL52w {( /=:&0\HNNfĉSVV 'MMMl۶b`7N4Q7{|E=_AS`6d٩E oYh4ǓfqIDttt1#Ét)|@SD71S"WBXx>$7B[;BL sFDD0{lX0I`2ضm(˰a81cqqqظq#>Nzg;rKI3 !>>Ma[pz];:;1phټ8M0bI_ WɤE%;AzDAt? bvI4~Kff&G>7>VǴl=׷qz?41Z> Y:J- 0**ǓDee%&c\ݻwSXXHDDnCZA/0{z &md>#6XN&P5PSĒw( p 7~@dd$iii =8z(ĠedXi ݾO ¼^{w HJDx ]W2ydƌÑ#G<EQfǁ #22ܩرcyDB4%gicٱvylvbʲ@A41HHHp{{ԅu`0n<0| }uZ[[)-)A%{z@>#6%ZWHE= 䒋Bn2k.xVXaG'o~)F"eVRRRUV۷S__Oll[eIP a)yh"y%c[D $!̇D24BDN%r YK˲V%66v 'C#GhFDVVHX"xl)EcG>94>aj;}؛ܹs&??'~)//'&&S",l6O=Wl7pྺه3}4U݆bq,a ӌ^#.Nb;XT: Q4= T67sοTV R.@8 AAT<{sI ,|״1iҤS@@&{t}̎<+O1@9Zjg\$4"3~gbP : &`(//^bۉx p^0Dx}%%y$WW T d$X>Z#]Ðv͎0Nn!9XU@@III?bHJJRFB|l D+ȯ⿑a[.?8 ] E%KwA --sh8pGزe mmmy7o}קdFcEISRfcY{]u%dzf3:xpUؗ@P<Cn} @VgE#@#:@ibOxMbY> sH$rss9z(&L **.y38iFJ-F=)Xxw/ !8H;>2}s=캲˺(bٵʪ(u]+EVP+ jB۔L;'3sf2L401drg2's=}Ͳ/YHbHj 1h l6~mۆN#--gxVĮa:E[z/x x;F gHmeїdZpl7/'%%zFO"`Xؼy3 yyymrv f3O  Hgiww#dg#3W Tো>;P[II 7of̘1!uV_-^)6-`X0QktxVt%0;'0A(o\RG6>r u# Cv0/|7ݛ}Ta`_ϼR d+5abk%UvRD{!Er2;NM8Ç'//NFm۶qN8m@j=F&k&0zDrHvq˄* |IIIՋ(uuu|455^P猂_B¶H_GJ0>ZpM0q"{HoCx~#/71e!--qƑݻ"pwl_^^)++usȭ NEEte{v;2 @Q`n5RHpkbf5sq({ut:Lj#X,~;vM6a6HLP1x.W%bV.=?KƧZF$f>hcQQQdee1x`Ǝ˰aè'ڵM62j23 >W!> µWF7H/B_Flk@AN(!"zbܸqT*}HĤI0`.̙{CeO\223|N@B'HN_JMzZ[`WCtA;'0 8܃P"558,Q IDATN 48z(vQU/JRFY} (w;vj*v_](1+˄JɓR}f$4WZno/ס7beXLqq1555>YRsN429ViU fZ-)))e?ӷ0JZvk:FĒD^^׏t$N>}8|pF#6m|Wc0z#Skߋ+ ?k",YpJ"\z+#܉0pdft+(..fĈQ^^Nnn.7t ;Rv;wdƌ455:!S#߄y2Z·.ɝqɛ[ͨTjRӈw{v=z4R 9A$bP^ | Ԯ# liGWVQWK ȑO8d_puuu\ 6B~~O܉@Whx&[xpz En=ZPsɸzcٱS/+W$ }#ѣ !"۷SRRBRRO}@b+/_Q f;"+τK{ӫ m즶݃P\S&#BL,`O3g!]vY"5j##8>7Z"ENca yygͮ\˿V3*QMjjȓt&ˁ 9A$tw]I{ @ii)C5lmBQt?OUU55a;} lX,r?=ҥKٽ{7999~;)Q՗3dһ@VZ~sgJ"60DRUlib#9djs?o>`DGG;{:tG7RSSCJJO}@|mjs8sVJJ3-`&D/o休QV=۷/FfQRRСC袢= uGdQj#8A9s|4ÆZ0L8s(?B<1}^222ZmV^c=櫯 I3.EHOOw{]ٌ(@LNԝD HMM%??/I677SVVDTtj hrq&` sng>SӧO'qJ 'KCFڵZ0:RD.>/Ͼ6p等dgjjN'1V >ܩ@ii)7oh4e, Έv#2ij.??byf4,k!%[pLo :j***|Ʈ]زe a@$}´76p5Fa /FkBX6l['! ܥEi())u!R81,#-=l%Y\=S G*[߶  ")))G=cw繫U6*--tQ:9nKHv g@aTSSKuUX*|!3Nj2ظq#_~% 7w|7>hf#iPr؂Zȟ&ųa?ϸ1XR>:t(vUUU>'>`߾}ܹV۩@z;յVheglak∋S?|րD^눢HJJ Ç#GN׳a:Dvv6}pp#=($% @f6?_G:}u嗂wX:({̝;BQل8S-|d 8o;z>R Tv nx͛%pKK+C%Eeh;Mmm-UF-LzV\իIKKW^8`Ix]?> />Jc<6#mհi\7IIIaԨQdggsa_pn}9*`1z}{vؑ~o%ll%Z o/ѣUK q ZMnn.F"..w @f& 臐 *x~X`pZhh@{(prwvVTaD84+#%%٭qX-`6# }pE#6 "FNxNҲ2AV4T"(ʋK8Wm]+*؀uTVVtRvAAAyyy5HKQ3jX4v ]DCHUsx$E|5OMno#<ƎKtt4Kyf?VZrqVo0q[rcEt|-[M$9^|k/#&Zl6sСN5d͚5h4ɛ @a<:->Fjn~w%Ib֬YXa;mOecȓ 3og) Pn, *],77EqK#4 H!sLdSM* c NR!**cQx ߚXP YPKSvҥKtp1\:>~Z^W~RϪw(c6i"Dzs]Ah4ߟ: Y{s-++c  XJ"}{kѨvm鹍<9#m{&N`:jk-)yM+8쑇 gZjO?}vIKKsF5}oCxi6!,Bm!/Eؿv!`aƍw}L>2LhH1%h~lYHNg(ߣlA'(/z}$M$RYD#ЕtG;;*ʝ444PQ^wsBXw{O h2ذa/FVӯ_5r@HJPaje+.̇+ kGNC0$^[@fuo2F~Xoqw7x?yRRRҩ>@vv6Q:χ|g"Ţ38(#!1_r~u@l r eë% XݓD GHII!// uO'@cV 팀VF+ {24;:,5d˳\۟9(llR;v ع `1[#]A0RȊڄp\WPQQE@;@Ks@ + P/ji&>#bcc۷o cwЧӋZyt`ZŽU<~_:cϊo/T3&L :_Sm2|pȱchllp {uV4 A*YpÄ8n:/Cۖ㯪W1X˭'V 44ٸ$ z/+VM>}vwIWŻ~NK̼/L5*$Ƌx\V#=7ϨaZ2\jjj*cƌ!== (L&v={JPF :}Q|wQ#kݩfɿ>gV~{a {i9,5ej<t:g/"pq֭[Gss3ƺ(|\NVz5k|6/>00^ .ٱRN`XILL$))[Hx3'$p:099|8&RI8t6mBRa ,re7|C=K8.B00TjPD\`X'm#0/9ۈ$`ALrsspL---TVV"j<Q-*ioi Ȣ`4$,X@cc# ) =Mŏ Y,fxq,˾jezzkD02=%‚ Z-EEE >Ai&Z[[&*ch.bq2~0΋YKB5OǒL,Fj=@||`׮]޽8RRR|Gqojj;СC{x->00^䮬.|!$&$dN;v," l[ar8b%vpkYRUPHm!,"c"AWb^`Ȑ!̛7/hEt|07'&Պ$ 7Ȼw{ .aP4 y}dgNr/_s=ǚ5k|$ĉWV+4nqJl3j^̼88~9ʷkZ(9qBRQ\\ϔ)Sv]2͛Ǜo,3tRxy[tR֯yL5+wm$yt #,P'V~5 &@8# @Te@^#Gǹ ـ} .f39K.>}to3DV`hZZ|7>jaYZ6o7zG5nرcIII: l۶}Jjjj%zjielieh.~:.瞧zOh!N'18MZ&??QFj;ذaz޽{vU=z[nŧ(r!E^slA.",<E! BO$%%7zY 4@^=GC'MN{ | i{:>CvAQQQN+piьC$bH45ٹ8 \? }BRQXXȘ1c$#GtcӦMTUUE||Ƌ*Q`2RDZ[%(Mbn#}| >AFoyϬ蓧fF.;/$FTTdذaN{dI:$$a49ۧ:>,_|CJ[ӓv' 6 Q (@.V$''w{ 2"i4P'4`Co + WmQp~ jY5p*\w u0oh/\W ;:t571&n6Y>|-I ʏ[kB@ 4CRSSCMMѣGٸq#f٧>@% -2zx }{kf]ﮊ?-lY5__J#6FDT\0ZG~åf'Aw`gqI1gGزe }FZۀݡQc<ELL vEf@ '[@ x B{MWD(Eo HNN&''' @T-P`0p.;O!O ۯ6Xv-s!''}ugf(z)vv;6Zۉaz00hvbb"F#G;(XV@LL >vGY{$roZm;XϬSɒϪ'3SnHd;<8+(11HG|DE9r$iii9rF „ :Ma L6]|$@֧@Bff,!): н G j@i4oؐX:"B[]@0 f 7:?_g}Ƨ~JӧOP2xoH Y r "S?mӯ\va dee1vX9x3 m6KZZiii^ONTqŅqs-?1%VZSSkc &'Zd\Njz>|͆Jc*8aŊ<Ӿ+@u80޽{ݶK=̀Xr@b`"HR߆sIII.t@S]7`&dtQP[[… ٽ{7dffknOGF]*_CN |o/%5Y*anj}2zhv; $ӡ8~8^jnLV_94 (+5Ty|F*jqF4Yj F}aw2Y >sgwrM7Q]smYЧ]2`:*Ŋ$$N!9ݱ IDATȽU;`PIB^Ƃ/约p>/ŋxbfΜwAV_ gZ vlMZʰ,yK<G{O41cưdӡNv;ׯgΝ\|Ō?ާP`iQuSEb^y"}uTwDq+vXF^Brss;:3 8.\Ⱦ}|R <38n 1_9޾1ۉ"J #1`F5`Jr~o28tЧAI%$`GoNӯ_? lXM34y2cz[ ˾h|U,ge ,T[a,3-`Zٳg#++2IJ`h.ͥEIdehX{e*Kň~],Ir2/;˲8¾}4ip/YBO"}A@׊M(B"z`ń9 g~nUο~M1DSzdd[ZZ[y饗x饗7n\)c&}dJADˡ0ʻ<n^l ?6UJ\İa(**bݺuX(2|~j 8{h] ϯO\+ R]igs I j_!I/;!lfQp:ʹZ}޻㤑؁Dvvv"N+` 3;V ;26_D> +++Y`G`l-)zcVr2UdeQ. ،4tZQO蓧bܘXpJ%>NFO>1[ w$tjjjظq#UUU|)0lH4I[#*,eP-;1c Ets `L/گypsD'tD:1 6!("S)H`0Nj Pt.g JXJJuېMxNV#\6,}v̙Ctt4 Z( 6aDrZ4W^CHNȀ>:9#gWBsmqOOWC4WgEQcٝ*KfC퀻@EEE8 1T*yp0B?.a;Sםp#8 @QdwA I<|Ơ 0-EŴ??38*n^YmշO#d2jJldp?56}m_{ŝwԩS88&K,a̙_ާ9NvGϦsȘNA ~)Lh8'+2'6 /đΥ e^BSE%* QڬWweFns*,Dvh4xb{ T5:ļ8^kϑ yn60fc"CO*+o.bc3e}@vv6F"55Rz}? 33ǜq+Q993jP^^W_`;w'p0 Q]]jm&&  'EPE2pr/DVVV@DADV;M~\W "U6we [JhB&5_#<_xQϟOyy90vCEQ#m\5LOxfol+uWsh5V+}:{n v4ҥK9s&6my|W_jO? 'W?%9ADr_VV-?/w'} N Ap@ Roh /Y*/cT}<}hFn2.}-//+`͚5-4݆Jj"Ffx,sӕ 掇jذ+)Gvذu.} =mFjjjD7|tKV|j*,Y*{12'*UKMpx@DŽ+{`'ͨNr}]1@weMk*N*0|]yw}ǹٿ?xz, />ºfo/M1:.:O.]X$j'kji5C^&+1117L0V!qJJJ={66Ş f޿{!vMzB]C KrJ Rsun x8DJ %&&0 @EE=/*%}قFP_4p8 _ؼy3:ݛT 8NV 4YY5LWO|yc,\ȋo5\uYX?nEuŊDGGS\\1L]˻>ȑ#N_FXowwuA` ]H{YBFC}mF@n /N^)`]x;C3Bp8Yȩ?wf@ C@";;)yWOIhoR4#wD5BB6B!^`Yj/&'' iV  DlsjYĜ=ʨQ:!bcDn.K/HXd0Di~!l MvfϭgP_5>ALHTjjN;BlŠ+8~xEz͛ǷuG0O##aFp"7p'Pkk\-!!#ɢp[NRN_I,\Y>uQe-{crˑs~_}{.w}7v Z۴CEa2K:{,lceX$yOa3:h~j?)Ϙ=\|AZ#Ⱦ}5k.AyqF^yg!4fDB>'hc*JA_BpsQ}u^_YBN==W`*rSg_#F/:ߝČ? VDص̮}Yk`#Ugr699 &3vXVkw~{1֮ ]d2vvGȮ=:B>iK P̭a.!mȾ!HwFR"P7_\u]#q:'6$o ^Z}akk+_ XhQPLERTKlul f|.l|uq"3H/d1gV6I".jBBw&O<@QQfsǛhGG@_|R hNI|NPԊޡW*BA`_'#F=w=oLs#!Q ,G֧{r 7p7zjL&S/&.0νǎ3i3oF~ؠ܆F޴|j"MԩSIII I~:jNrCU=h6*]rxJrKdّ28Y X荹f(VD"? FB+W䢋.>wŀ*^}< ωu-58c8?ONvVuu"**ѣGs׶kw 4 W_}uP wLs S'RG=WI;Ib;-HG8'2M$$$2@  8}T*E (l+EZ7\ $d{~CZ6o… t呐31^1\pN,} [|5c1XjX?#O=NvtކE9r$ "_|1g}v߃7/\y啾1x`S6ܚUr HII!6U`'s_* x:p FԂ ^Fng_e]… OUWXek78Ziw*U> dddp-#0d.䒠_s=a=z=|NhT(sّjS#7K`T d?R:8"3tkϞ=zz뭬^1xF`*7;n7gGn;R߿?wuW@Z : x.fz!BV8S )l[;A@6#oZyd~D-H >tIrQgˋ>qg)@z@  $p~X?iӦq3xDtLH ec!'Of#@!rFO$ZqsG_3$ Glaǩp\ n'{'p `09׌$I?9={6d-+Fŋm6_f4 |NɤkbTF]s4AXV`:0Y#8jWȋ uKRTn sP)=C bt.<]566裏2qD{⦆:8O/1&yϪ)3rW @͑r,_rF[%l{7``T% h]\AH=%2D/p!.~'&O̭ʕ+1BȮ?Or$svXQ cNPznw8YéLXdGɉEWyR4.2H3}CNE@\ܜv+V+{e۶m^x ]6o̳>z`&!hڃBPR1Xi:P_iӐn7K/x Cz+$uuu̜9>o=Qt=";|"~uّBn]vg5.#;#Mk x~[Q8тY[~'2w28e6yWs%ILB zIP=Dme5sc=#}@BЧ;5AFȵo &րApPp%$Dd7k쁟8/Y8v&OW_}TO|嗼 #/C3_BDMhL'JDkk#/"O* BX,@6iqYRT|D=;ap+'ϙ0a{/[n >"GeԩَA福R7\Ʉl"7Ba@hf1<"ĥpCee@=A{Z̛7/zCkNx:q***|քU=p @T)7n'y~buto6Fv9*ߘfh /ʿߕǷa"1AghB~ ]UUUOr5oSWW1 V9s;tv!ү!PTn-IGF| Ңoii P@cyf 0tǀG].? mn @waYb?~6B}A )rnuYu҂^#>C놆ƮzKS*R6_؎?ߋ˹+>}:[l)lXnSNE{;Dp] #{@YUVVmB$]e#=;v}hvRno$ 90#^_h6[o1qD~i=1v [nꫯҧxPp(/|*sܾ3*?Qݿ`@k(C:GMݾco VB}t rx jϟ1ի8q"55eD)5Z.ϝsNs*N|nhh 9vJt~nllV%8|wg(˝:[?| Qlhu .nwIꫯ}wvUV1eGe?{Ϻ!@׳pBzl#TZ4BNssEi3K.Z;RmG][[KCCC3мƒ0 'X y+ j= A@a \ljL&ϟ_ĉ3g;vzzСCL>ɓ'wfPcKPՃ T,vL3~`0@]]n`qn6Iy/666)??'pE$}-) XF_@?///@ k9s1b!555|̜9={ZD߽s[Еy~k. F(ZU*6RVZԩSyר뾮E&2_te=8v#7 $''d66 ͊jf|رlH JA$55 TUU٪VO%IDATEz":wTTTv$-}( ]GU}B0x 8'qE}'|'Hff&~:]t "558Nݳg֭cҥ46vɱY۰w{<hu:ʧQͯeJW"f**++KOyb̬}I&v6O(ӅF !\D+>`#PaNf'NEEZ ]A@VV+$uLFI= <@[{馕i'@BKv;5Z,g肿Ɍx~I}}ˡp(jW]zW*4vock@r$|gT~žVl6[wU=da?!躨Ŏk;(t$&$I:S]]2d_z+++ՙnQVv7RB`lEzQC ?qMDЃȩݜ)VPTx9ۣZseez`:Mȧz@נ$kjj,$#(#X9(냋'CH"vg6t5i dyLNQSY_1q:zTx{vn$6d_ z4]G$Iޗ$ ͦKKKP Ib[8KKvҳÎlY#(wwUupNK;M-!n,mM0јE _n1^j4^ ^x%z/2qq]͐YPZ=ӖB7'9iiN=dG'|8UeS?Im{^SOVA@sUYphX_xfEQd||SSSw_%'3332f.,\*jJcB^-S5k'ٚ$MuBHқ MbI^vI+kIV޷ǵ{Tje;UkL5jI*T Z.+Tрk$VRvn}IC}G##'?vС՝_4[`|_/n}`k=d$©kf͚^[>TW/%y<ˏvNr' "7$l7͢hhvujt5wJezM˽oT];p۸?GlJU-H58dh_SLY|S윞,"eQN?tw߻wz#OLxIENDB`klog-1.8.6/img/klog_512x512.png0000644000175000017500000032151414166020407014675 0ustar develdevelPNG  IHDRxiCCPICC profile(}=HPOS";HuP,8J`Zu0y4iHR\ׂ?Ug]\AIEJ/)}Qa5e11[Ajz"wQ}կMD9̦s' #e8xfȤCbf%C%&(FBegRc> ym%uı!2*]#DcOK&W BlԤ/1 vfݶmy+6Om-r lmM.w']2$GS ~Fߔo5wns> pp){ݽsNk~?>rrLbKGD { pHYs  tIME&5` IDATxwx\յ}Ϩf⊻X1C%䦑JMBqhB/RnBBBB(6qU>s?dٖ\5zgI3}^AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA㎒!~ҁ4{!^, Dc@#2Ă @ @J+(((*,LOO ~p8ms`RJ)0,[2Ls2lLӴL$HH$Fp8Ҳ/ mkiifYV `-"A BT`8P;hР rss333]S~_nH$H&*HZ%Iib?ֿ3MdR%Id#CoibzQﵘRV~RaeYV$"D"aEQyWCCꖖu@-> A/~0ri ^RRR>ϑnU<WDD"A"SXLq8 w?f,- GaXa0L0,ÑL$f86Ѩͦ X""!3Qr#G6p4zz#''ǰLSEQljF"DQ0ПZ i: 4 DD86mBh4 xJ IJSL;tA|VpX,"pXb1mM#76[OW=}wJ) t8 e8X,V$577onjj ZXlSOD‰FN2rʔ)e9ҌH$b(pXakӲdn>Cim #)D"H$bB---/X.:@D1fS'ON_VVVTT4 ÈjcO8Vq{eoF;JCva `9C|ίQJY(bH$lmmŞ^C  Y̝;rС%%%.mDaZZ[UD"ߕ}({.#13=|xly`x?,IӲbX,Fcx-˲6Dp&)S(--pX D"qXx$D'L~&U$?>ڛWJ}sO8wv$D"0M\g r "A9g9s].hii! H8|A;A"hX,F<'Lk Fۂ͠`B8N'˅ra~?mڴrw4Q*uyʮ]زy3 2}"H o[ @N>>{_>rȴtGSSjnjR=5Wm-6ubqo^61G x_FG ''pɨQxYgM>|'u6 ث 6}6]G@x s~yKJJ\-Р.n߶_WW]Xz QS,NB)A [Ϟs9:ujazzB*u[E}}=uu]={dt1[$ @!a\hѢOL0!#-puY466 ZM> I: @z@ʹ &; YWWgDmVձw^|!-2‰`Uddph … ?;v,鬯3ba ~ㆆjjjXz5PHFT8YBJ.5A t$ ZEEŗ&Nr uu]+Cq8kPWW')6!ж5 &##; &2mڴ@ ஫utvwm_lٲt("ddBܡC~gcrssuupk:԰a:ZaE!t ѕ < "~8wy 057r[Ecc#;v`]Rg_HuLBĀCmԩ1b?Jnٴf ;@g #quyymSL)v\:g2rŨeRWBnAwBJ3v7uYEEEzw$QWmhv)n~alio37)S)Rpȑ#4d<󄚛FֲJ ߽Q{[2GA*cǞx݉vhzjjj BGo@[k2,nn].E7 v@ Bj ʰ |B!Um^ 0Y[ Bq?.U3 C" K~:F@ v v G5jeTDB(0΀ nA" auNBe`/~| $Ν`v]>>aNj7to{F`z\lQ ?E_ə-ې'`'-mB1эa-o{*qې 7?z[ȃyÝ3Łm>Rd:9\҂F 2*"xo4vp|&\LKIt%Zt6`m[{>[@}lPڷ|tI$eo;cRrNo̤kdHD}I@m<9>j_衏{=N`}ߗ{@90``Pf g a CiKqlZDwlL1Gm@ҫ67|ͶAVd;g NjR J{ <" E2$"i_ 1Gdc$lcko~6±e0̰&;=yH`O1m-{u@[z`9z/^89 fb B[SiO[\'Lh6Թ)ADHW1G7+%kqэDo%u |"IX\Gm {_ f?R[̱"SRG?D)F1o`ԧK)xm{mSϒ.D+*+1A4.cGL ?no;CF?j6=#K{B@oTA$l; rRl6νx^K:Йb@jEw)"@86IړV6;$tH t܀׾yՄKW*i @, _V*Q~ ڽW ).t ǁY芄[d|tV @e\k{2=`AףjId$;}:=wu\[<HX?ۤ ̡qW7v@_vP`30X+]p9xHAv;+g6 t6Ծ?څjt/}F[(EFXRt.w~p8=cʥwX\׀>xm w T{66w~rn:=譒:t@2 SJ~0^Os|>KH=GǧƂ-TT]7吋N :.8J?iAȮϿ6QFhp]> ȑ#-* Q I)~oYlFfK1 Ёmt1/%#G,Q^;UWT~$Sj}{6?Zxg> CTJ=[nkofi[;MrYf/ eJtvqIw蒽}эUDM?1c:EE?6l=޼[Kc=෧(|Ǿپb)ldѱ%?+@8~sSҟ1{ G]u ѵfdĉR{Ov]ŷ;e'QF1` MJ:vƞEZDǁ2[qܢߞ䚀ݾvBUq]N8 b ZZZA] |.]Kq x8 ނ&0)] [k@3T*cAĎoEw+/d-+zT wVRyy@Xi'{{hjJQJ}$Rl߾{(5^F00Rur9sn$D -2< H3"^t+RImEcvPSÇS6g63f((rkɯňBkki޾oIAa!i{;)>}j[<.47~lp)Эts$;' (@8& ']Z.oӄ 8]<7nZ˯ gH\~vF2.#$ ov6ޜrN9ӧz& q} 0ҦM^:thn{!,g*Zpc7R{qc$i;O ɷ+@:ЮnQ~}32`IJw$J&Avn;4-cqXX|[]m⛔ &EJ9`R5eUoK TC-l¤T0J[L 'q5"68tn#AS{^{v0ǂ2 ]yx?%,^gЁ#' #@:׿Q{oo7>E'OAsX_3Pq7~-[$iL9w1Q6t:f̘yş[)ejdAccL|T1Nnшn&u-IhWܽmp&%JmvG}D(C] 1_eOo#RSڛnysxǍ& Sɛ1 LK`byM>z 0kA)E2zsKxw\{[;_gL~ mA&XA8A@qpCGg&j#]?FH7c>Y}[MhMND9yyj_}Cڌ1P vqNgF9, edLܹd L-bѢsz;0B!|}<;O=-$(_lh.tG*** J{PNtIrڞ82)E!pҫ^a-:ü?^tM耷n1|8uJgЫ~DTb7PU, "“{f"+gEQ:}:7>C$[:jYfq|gYa}] {e%;UYymBi&$ WqR <.3W&C IDATB|]W7!b]ktݽ~ _>~,? ĕJλc&qW.НK$2 _`y~Q6/8 q uʁ ׷;~d+#O8rn`ڙD'(ZzsO9D' L|5eoua?06{Z]=T!&~x23O!cĈ>CgeT;E%-2MG`pCx )(?A~tO!E (3ѱ8Xk0vB t" I[U(u>>^9|~_F^q9w#g=~sP| : kPFV22 fΤ`8"?òH$g[͞={6 2 cN2iv@kL3"g-iɓ]ОrxDYB>i$-mCҶO1nQJQ_OR[o]rHX7 -btjRjeY+ ñ[nIyrkp@-)SY),n5;сDkXХgA׫ޢ"&~z.ZUH75هœJ& ~n`ԨQL2"222H& ŋ,YrWeY=6tC7y]}deDg hJ'| .p :R\U2 w.>i ;) K)_|Ommʬ,cYϤI#Gx?B:?0ZZsZ[u8?[20LOфSuDN*R 5\ pj>նnG̸}SPdnق3 u#FPy3ngkk+6m2V\gYV): ;qC{q|˲5kڊ_p;Yv sv12_$ 5Ho[Oot?݃>:ÀGХ|˺ebWsCey'-׊.?dϐE8279itׁo)7бiqAM;[kv i nm,@ ԅ |m%~p7}3|3 i̺N\iirvP؁NӐ!$n,\'R>0_'1 HM>!CgYVW[~xx>΃: j'Ai4O-8dm{IjW+}tL'u׳b\1ʏA~sV $k~ >k<;vRuԨQ̚5< ijx~p8n@yk,c\}e hꁯNu`Qc62/{`Dw֨Q̾n_t1~ rZ3'YJ)KKXYIotM\\r1YYY^$n]׾KoZ33 ˖}9]:=▞~%/@+Nj/iբp_e8}>$.='Ndԩ_+x7xGFK&|>e˂feeeӟj(353Hnvv[ "O[[L=<ܾD.x8[P,Ճj\4DB-\ξں\+DIղͷ>EYXf_v6^s yQ^{XPJ1e^kn.}˲2 J_({;,؋,}@a1  a=->?.=*v01sqzf4Fꐋ5kױkj ur8hݵe-:d͒2 o{>+I (,,7M_"_ ܎31,jzxH~WǼj+C-As304q9 8VZ_|2zb_p>z cI\_vC$A)j['7ieQ0~<<ܟ#>lvAJ)úuV5a]RJyQX ^pاlnKRj왅E!CxwD[iA{cO"C=Ż5y(e0KpuJJM-eYX fH(|B7޴cgA"o|ƍgNdfծ̰eYl޼s<іIЪ+&wuGUjȰ ZPo,^xgǂGf߹9wD/_܅.$Ւ;)Zxfa^A2D)EZz:۶n=p _><.ܭCy睜OJOq+ΦGŗ''ZW/X~I|Qvp# WIֆ8b%I^Z֖nO<w*G(Ԍagt:?x>._?M9~P?=LӀ1Sl/eU+++ M}xڄ>0W׿ #|`W^mn JqKdz%.mSO˚0~B#H$>_l\H~i_]^џ$AAE'Z[xߦ8~^z1e /.= "ڪ[(?St)Stx%-7S׭qIf0(/`3w_@%Kʳ,8tlWJe\xq_.xkD"O6M3A"A7 T?7e LIJ-"+;;wTw;6܈>/ʛa>lhgkBr ]D᷒'MȜ9s5 Fs,YwҥϱlY0TY9 P<#`g}*,6n׻<ی2IJ, TVN< '|Ԉ#<y;Bڌ  .H^|p8ٮZ#:?Stǁ=WݹL[|+x=>ѵO9Ԭ\ɺ_bF)5N5|)`|r|^:P >yfLK:D)E >{!(Eƍ UJqyi0裏~I`nTVΫwo [ɼ.8ԸƎo~m7EEEpƛ1`=/Hs)X9_AntɋY*ƻkY@v&R[,uۂ>|!޼ysgzU+vUiޥϿ B7xjDb e>v^aIqksDAE.tgSx}~ U̾n{.^e;{My/%VVRXts͞elƎX$ԭ^mδ40ͫt}Ǝa8=Se8(0g0!/7><--Ýdz}(ԸqFgK)uebt{w xqιsRU%R90pwzuRt!5^Y4jԩNrϿvSYY袋B_RxfU _ S->fcW;ŠDZI]KHK# >c&Ni;m P -۶VDkZ^ "}oYx{.pO@MΫ`wK %%%%ǣN=xK᪬?⌹gTVVYYY1e޼y3g/_ꩄ-yCuO0~ӹi{CnnjwtmWŬH= >3k?ۿX`/._=>*VAwzH7S gL?dYg8x~D)H}Jo+,_XxL,ěGdAKu5#7nFDeɓH9Oi)i`|]}%nh c˖z'ocܹӿj*G"iipZZ{]wݕ1o^,նGa>`_YY>̊/Le!y'gbg{խoWbD ۳ |bҔI?v^^AAaR4mĪ{+} 4Aϱ,g[TH$*>a*x˴B9J7S8P c hG- 5tgDزesʷں= ?ٸqϻ{sqtϫ2nծuXVTr0b* /@ gto_=''W^kނN5| +"RO p~1"m域ONNN.|VD)k}o gŜJ]Ҷ$EeZnc!(+u njhL ͛#NLBԾU +"DΝ̘<_3nFHrVUUemܸ ۸6ǒ%wSv QJT1bmmYD"040l~wAnn)~7TbfDֱ Pr͵Wϙu\NSE }o7:Ea+[ZRN&&\wݵO)jV_nӤs832H++=vS&wi"Z6o #nњWi6zW1}{KO':l%ӦQ6s& 9F~ P\\(p Gޚ}0Pp.],UÆ s7s8 min@W "F@o3g]x9yy5m`ԩ^tjsξpt㛻1F\}3sŧޫWm2»~x}} v,ƾW^e[o_TAV\ gL'S޹ e#~mػeuJJR~@OpäoA$~B庿@~>eg?q"zBێï/?9ץ9sZ N}þK; LZo )<@O>9K/ 9,,Hy^^J3z+qRݹ>.y?W)5_Y);74q|T:e(-Mamp!|xr?*+9hdFӮ]Djze2xjF@]wus``0;QX.iwX {\zNKRH,l]@W |Z̎ހa}s݇vM',XPeE/z;ЕՂN9s̺FJidKӖ=|[mcM<%PR+=t=jEgaӴ~=V4z-Ծ}O IDAT3=@q\DX >o:F_dI g[ZJ$ZZ*q*v-]/.gl7aӦ0Mׯ?ϩZWL- f|2 ym#866o;|?4qM8SՇp%ѱeY0on-[v5\rTWFφaƣ5:^BD{v__x)ng]mY֭k;7;wϮ)J{fa=V^~g> cFx$.Ҳp|OLDC-n߮S֎g h޽onޱgJK)94oF4^Mիbc8QZ7lj/VfTW#$ Ϝ@c1`!{pw"R\ǜ90`}+(HC>%^ӟBE"v: zcc9'PQQH$]#=#ͷvz Y"N .[1w͵)*,ȑ{ދݽYPdW”F(ֳsr6=o wugv<֤zKݽ663lcg̘C T)5ZHvnqs@Iz+rs}>iDT&e(|D[z #}M" μ_ Lʐ!͝J15hں %5g~~@Mh ,9^rI/#vNӇ xB4ك hBZ]qF HjS0|o,uÇsQCAjrOϾa1h5̟%=o>9Լ"iL ^#Cq+5j_0V L |AkC Ø,Bq3" >eyxڏ.˽_ٸqc,˂tUPǓOW_wuKg+t7n_۬(u{0u].dɒ]_LƔ<} 8nrrz} 'uꚏ9oe%MرVk!ysV|B=B4oD(I8rr,JݭdODZZV &>5kP%)_>NTmlLd ٥䟿ǁ-=twYj<*bJԔƛǭH(T` A.l1~=f͚h?,n]sqF:VlVNþs8A~L >vp)7|sfnN^ ?lް xGlٲi?:!,?3K+J<yS g-2kײ/=!4@1f;N!M1> J2<ӱef\ ͙C?+CU|0DWQr?XRSɜ>sbXLڌ/3{7jclhhGUVVJnYp8X,]?LƧ9=e~sƎ nSQQ؄)G-}"uЧY=˱&'#VAOvh|]vYE3 iiΞEȑ7xA PUE튕}~yXSSd?I"E Q22h۱CU{iټMf`='I<KJJH#Tg@5=NI_@4=Ν;ٻYXlSssN:3₂ѣHUSQ5-bt8{w7SQ=6QB|;'/MGz'oYut/ocj|{, 薥d5W!=Bd#N/Zb dɓɚ9`{;Gz PSCUn\L|V8fzp= 2*!o,ZH}|Y,i3gθNĩ'ض ,e@ȥ34??CYYّE+V, v]T=u4s5:N߶=Kl?}iq&(`JĚ7cҿ)7s1YObE'9kL]},/f]nWr2 o&O& ᯮ%>5kpWVbMgv{f2f4m{{Ch!umV\EE}@Wuug49I$Th!9&Ӳ?果OUxLa$ 7s}Ozu瞻0v‚WvY9^`yIE;MCV=QqdKkk[&cJ2 Ξ>;W/y%ZXz,:UбڬoU/gb* nW`3)C.$|c/"{Cngc=3 kz:9f:j4Fu=n @e99R_ ): ּ<> B4-[ff;t!z^P`wQb'AH**dȲ$Suz##F`&Au(~ןY|GnժFYYY?s #++իT{^~9-j;:~SeBJ˶n/0Sas68k].|w (GR&u{?5b>m5LBn)))L&vEE]tM'<~wcA0G v07gGiiy]q! 6i¾La/>]-1!Zpb8-:&MH;+ 6UO(*_#G2xRdvtv; "CQ{Ͽ~]AR ,㚏T!Bט˖1Q4gR#Yzzv].|iG1;{>R&h;wD(ˤFN'#Gz[iޱjřw)SȚ9k ꚞI$UԮ\IYPt n{!Ctxn6+,:zt`(N'ӦQ`v<Ox ̙34k^VV֭\c 11U2믿Vx<% ]ӝ#F wH\X NVW`cc|L ?g o3ƔARE 2vθAZE9k+.OXl&0̈Tc}un$Sx7֮][iLgbA%-د|Gf'Qw~z?'6%?sjLD 5~V{Av<^{H+-5? v;Ɠ5e28+}HK 㮨q̟?#o\ŋm

c_~uӦ~UU7w/T~ ᰋm)'NJ]NvՂ,˝ lee]wgv(#;H\ɗ m6V+$Al|> mmmz}}wM;w1uw` !߾5;9g8BNNI$, $#`fBEYV$r5P0ցZU5v 'KJ!`/tGe^s 3rƍT/(l]'+v饝~A@E MWSC xl~"-;w|v;wQ\.2FDX>@QHZJ̙HI.S_m4>͆3/> kM%J^*[ϋ̜+> v+ / }SL`4 !)4'&MMl-9jҌYE$u<+mr͘>#YߊV323HKK#-5̌ rsrP4`xOC4 mkqz#'wՖAyH%李&@Y™l˅ƒ%'C*eCH7_R ,1 55ڵT>*}޽QMKK `-++;OW  8d b<\EQ@ nG؏Ԅ=`1&p%<G,3tE}Bx ys?;`VDcA<f%M^z}B6 sXtfc-_cwKzig4.3߽Yа};{|?{ 64NBrq NZ)3u*icr TU.kR_}΂}$;,_KvQW.PMiܺ%- gnyY[9RS,l(fuu@EسS ;wyyySRRNdA@ڻwYf&6A  ĐRG$.V)$^5'rlMc( X6&cǎIV,z!,V h43 `Rιҋ^wm˙XnÇSq;wR[[K8Il*2jhJK0x ˈ <G*sAwbn+X[7g62O8ODEo2cee1/Ѽ{իVuY);˰.#m`RFqУ$@ 8>]ǒɀ/ ->@7py@ϫ @ *RGDOխʅh&O]^D*ImÜKlv[̙36+Æ12ccFBG`Дmc: ND457i&sϼЊ9!p%&K4̙;o3is C(Jow^#%9233ppG#Q<^Mۿϲ 1iDdYƈ`qHw>@L^ayݽ;dȲ(.gzA"^/o~嫴[NC.5 [ZZ Oj!2$%(Jfj^g%ޫQ?Cq W7{əGU$9So ]Hɲ8 ?Ӳ 2o?v 9zbJIKoxe…W^uevvv0tɵ1O'pݻweft ;;EQ0tGcc#)L:#F$N7Ll];ihgl+(R)ٙ299Y IDAT'w,qP ,%6mw 03q'ǎ;hkrsssf"_ 3_x۷ 7n b )e1dm6xMn7yyyf@,</6ݪgŜH81 ~kJJdGo{qcϡtH)$bX@@Q"($MVVf']f;J0T+**b{TJs?һ so)GA]Y{?~GIKcUWrέ2eW9jTDY>lVEʟ7˯кYcADO}0=u '#jk_]gi}?kNÇQޞaZ6oq6d}3ПL?"4Fd mPh|ګF_k,_|7 2PT2Ֆ1@{mW^eر;g98\.Y$I$ Yq8X-VRS7$'7̌Rfz :uEtuδ`)pݒ/g_dq,)'n*}Y-X@fV6A ‹H[Պf'bUdge L@͎?b}=AFTkc0A 6?Alsz3Ȕ Jl4l|?[ș>_  ŋ\Xh{筮fwnO8F(Gp3k&AVWmm찡x~:4MU<GBȑ̞ pmiaZGcƞi">T?OvXPnheh YdÀy6ڎFz/3/b>hi_~ySy$%1̹W_}[@Ff6ݜm͍N01EJRkךc 0OA$))zd]jKN3-_ ;H(Y6K;m<ԓ,\4"FCQDU`F4$YjtrJ JPA0u M  bμQeS +bҐ!L~&l%J[C[]UWcĕW3~<4DE點,GhȘoW^YP@zi''S*I!o4a=C!Znqf$ǧ*N'S1i@uuFc؞`u o 9mQq;h Xl6\N%$'' vGkkϳ 7P-s6gv0~559)ٚj+2l0N'$!J"(!JY%D!Fc ^/H[)kkmC @PUUUᖖz+ڮ aLr2Xv}Z3GP`*_>߻Hv;ٓ&1;/S[Z2>]n5e2o[ZeEJdLDs|@!jk[]F ׀"}ț?[n.JnwUGhټ[Q\8O;| ԿHc-ܹ=S]]C[;i,> IH nm=B&x,&1S8eYdٲb~v>chkogaY\.$INdEIbN?EכX%YbYa='LDL@(DV$! `j9/ȺKfk.e癥|W_a񸒒$ IE Iclax4MMdEA`ML2,q@ 'G:d,ϊc\7gsz3z' Z ?psS9[囘0I+-ŞA&p^[V&C-\$?VRSЃ$G%̚IR|5D[Zz74 Oy9uk֢i*P gL(TB=P#سge6AWVۻ`(i0Jar;\d9z4EsfFhݽTws->y9/O0aiS]oENnf' cdz.[ƅ/#oҤܹi%\G"#][A`M75fi(ϟϴ߸9)ǎPErtjAPjh,F~kLߐhi"-˦o~ݿ=j=w.b-BFuL.-$XK{NVVr 6Si*ƶiCa¡P,B@g1 f7% JJb@q1VB iagJ`8pݼsƟpArjCu(5FUTUň) $5%& hs'('̨4 )))IHTvZZZm+,4xSK01⪫&J"N`MM8 Z`̞-/oeHMhܲ%) g~>b?JI< 9# %3ѣ( D_GT\LVM  ϙ;;P1^z v{̹4ZDI<6K5 h$ޛf$ yN DGqG~Xʀ˜p:]蚎!Hv $&)#=lIR]$8jLTv"gHE 0d/cⷾ#3](Y:>^%zuY]:6K~ܮh" W-1äR6mO;p05Fúu\q,BC!\t!ӦRשzTG*HGqO3!W^IﮯJI<=c$=.;@Uթ->>LEQD&HT&F(UFɭec n,'2{=u#1͖oBҭ8ĉ0b,h}:GU&HUi}=6mxK/a%0 u6 #l}vu f`/A6taX=jjnG*n$^[MŚ I؈`0Dc'R:U, p\8rvJ:) @ @Oc|_y;TD"c7D"4)X Iup(D$1ѳbu"og7aNg#;|q5]n7s v hq%uO]W5, R2G\%%A^?+b^zlZw4R a]?d%dA_❯ʁ>CF?9ad?SR[uMӌ8Zg|~M_$L8&   CD뺉ttUC4~{]UMT]Eќ5tC S$NO<E L4$FD,2pM7+("*,!QM# 2rTFVdIJz ݭa~ t9~Ħ(L^tQ@NϲLʕzѮ46cn ?GX/]OޜٟkNņTɗ0d.PZh1!!>޵XXX' jU}cUX*tЃF(qfAt Aẞ)n@߶ukʫ.#8݃E X K2$$PV3PUF@Ldefurab7#rS!KV=`k+~/YLI>d2v=p A}$|nzu i#G0{h:o C|L1PhZhb}PU$ =u G^y^F{e`EGϘ뭫*,+n;W7t՚͚JSYM aZork@ؚRb [J8Xd5P0HJjjb=(VC%᚞)@?x"?HXs}|>bd@9Pdˊ1(ȪX0 p6+SpG}}C<.iW]I(Vefkr2?8o8.¨nǖ=QPW+DQ+'*Κ<%(@@%rg 1Ԯ.mk7SNT+5/7|ܙ3Nqb(LF|f/a,99~q& IX\S/1{k:jEӴDU5)) Q @HS캦55i457j? z)@Dq8lzoSOy&1Κ=pE 2=wvZ񿨪FUUEObsW'e~6tÇ2e2II>#hlxcJmײNe%90df,}Cwh[='{vvf;-3H9Sں3I9ape;gJ\}Q.ZYnjr$'eYwswb#q-wqAu< =豣IKKCuܞ6"ш3/ł _ca&M vV+Gkk Cx=DH9x5vD"ZZZp|>"p3;A4p$̜9;![ۚygû>T:̚ LrQ0}:kjwQM͂Sh @O+fc%0ҴukQҥ~KYE֤IdNf TUũ2O9RrfXS@/*.&oLxOz=S&c 7"Hg:VhIљ謧aÇ:Dq%6mDrr1&$}LjhڣG?c3 OGYh!$ 0Щ^6.NL@+/E-KFU)EOE%&NH]m`,z=J(l6)--%++ EPc#"+  Z[Z-[y '$/ɝ9O,¢E `HV I(/èQ.@sK f6F$ łj%))ڣGIMK3Gb7K$&˄eۉ IDATZ b G 'n -2KÖ&~;]}|9QMPfC/ KRR?R%{.)up|{(NY͊( FޢV }O1P>׭mo9>6# A@XaKO>6ʟ{NͪhI _?0Hu֝h4x{7 .TR:ttҽr!Q%1mC0`?;wD7t~?p8a(% Xӽn7MM,\EEp<͇ Ӣ=[Z"fH8NdY#(Hk+pdS"81xbA7 ¡ PP85˯&-=-.BMTRPK/9pxabgQolx7ʾHNKgdt3CmNHIwI gAd͘N@UukV[KʕZZpcMIC|rf^H%E^BܿԬ];G믟Q3g<OhX_W4hp#-=CKDii)k֬EUUs[0e ۷op$p\q^EQPIkk+I.VCkØ9k F8wDzVkΩ9Zt:ՑF8 6RX,444p:EgZeYb$8O$¡ n`ZX233=`NKk3+V x{eaIJ zgTm 7r٥8G-*2TvϞ͸[nAנ֚F!"--=`x LU>\N}R.$|GOW"]h>(ÇQ'x#!G x/ <^tF]II)veݺu昶|,hwz$)!EI벢#:nAXr$QD4ݭh7D"(&kj`;mY XbD#X6,V ÇG7t4 A ` ItQ4M# Idر\|E3Ak[ eW_M519 fst]rqX>&? .z]DX}wK3d=2#sPx1\>crCUi>7 Pgc٧ҟEhwCݮh -RRrYl]NX`2gT(,9NdIF@r1y$:Duu5J,`|>dYNTuDe7 Q$Spy!2aڌlWO{L*̾[ YFqI=`ؐeV+@<X, Ǐ炥0q,@iFskWz&M<5@ulјdOrC!\rIoD,*x_u )7[JA_Ѳsg R_yYTI"u .x;k۟b |ɛ;sI,˴:Ħݏ-**=wq:g }ǕVUUiX\2jvɓ'{# q1 1$)l&6,-#+ƛN[{ "Oկ^&%w\< \ <BkKkte&&'"I26 F$AQDc 2vK.s9c$ r[+~u@yvh'Ug*>wjzo!zG,(bUW򮫫kYt#lXP,t"b%@ $$'S2sǝ >{}>9w on<6F#cjOTZ)T"'mʕ^˵{w_3'yƓǔdI&j4t>>N5TDE,&#]of+Gqss駟fƌѣBBBZLw%+p,_^6h4YM ^i&D B}ؿ׭|d۶ M{*@.|=z*jQQYUJ _X巭&`Ѕ. ~ꏾ^mr/?Qk·/{p|iԧ=~l %4-^,7'ih6Jfk7As.QFP:HmvHfŎxGd)ϖHf3 ~eNwv> &^~ACv)Fy١C|u 6mvvλQ{ B|PY{'nnn N_ϼ" x%{AJW`YY<>ս7룮R?VPoP.ظX1To޺_V٧_աćk] LDaj%u)ꪫ)ڱC~~6OjCKnaMJb㏷K:pz% zP2: t$>nݻwf6o1b6oT:}޵^_|wIppplM=ʧ~ښ.PYkc{Enܰ[F (|ٻwj~_w h4u NyEfSs_}TuuX<Ҹ`8(7$ ؖi?*;㓝1Vj$ ?/+ʬRSrrr(*>nX f?44`@׆h 4qc-/ki(7K'OOSW~$ LN:w/JwI,\*A'lD$A@V$vd¯YGq^_kѫ(}]}YImd,ZVwmWGXey}jjZA().aH}_{Y:TOfnj7#:.]j~#?cbbT`2dڡNGii))))ekI.+gK^" Y^~#4kcknެVo9Rަukjv̝ޏ>jaqsj2V#IVj NPyE'1c5q 3, @\v Ԯz*9m9:ns"T wߑλX[liϨT<{$$$wo5kPZ!C鰪A?5n{3z}=[R+F[J&͉{0]4Ku+~d2=Cs<8GjZ`ٌbhZٲe`-J\h J]{ VѷgqE4j\Η^FX5nO޽VhsVxAj6slod,ZDٞ=HKF[d$Ӧm0z$  ߡpJl_K7/1B;RgӧFEE1o<&LO;Nmq+bҳ4"= ||}}1 RX,'UTT|4iҤ~itiEk6n8^hFb|D"ZMMMѣsvsf-f4ҼۇkpI]h--hDzN *5iiD]{M6@je3RbO':$ wbM1:ϲ$a.-onJ&&fC~~~Ųf.y*3Y.]zw}o???Ph4*m~m=[TR5 ;lhv9w.}e<0'9aS J({;&DE/#в4.'_OҬYpW׋[d s IMKޮwJ~*vyoV=MG[\a+TVh4*G7{X׾_*81$$dȞ={R'Lp۪U_F%$DY{Ο?5kּ/4LF/v^-@/̦ OL d_)( dr{ z>NPdV+m?FQs| j/~Aj2ķwKN HMa!)/wZj{9nʤI:LՑ!YsvΞȭqmDh cƌquu]6dȐ,_%eYwС+,XiiiP mY򢪫Gn@ar %u-hNRO#/Y7jR^z:!rVψH>>ȲW_cGw}DZF G5#K+VxNgS5#AīZc֑:>Et.W焫>s,55Y!_Kmme9Y_}.Y4#-`LWϰnɫʕ+=zt Zyyy"O?ShHo&$ \qi~.W"ry)))g6; RSSfi:TJ2T7LdE!u"qqD\q}P~(ƓMc7R77aaj eew ߟO=I;VBG_@-B5Gb$^x(~HUlxIJi7yd,XiӚ@Dz`RRRZ.QBx$NkՒ#vj`ǿU*Bdd[iinݺeeem{.M"˲|W⽽łdj2 [j-))nj4:ann>`"jn 2V¦J_W_kWCA~2 ߎo|/00_|iӦթl63tPv![+8wIvEq_\ޗ}/NNk([?}٥ʺY]bϝ:u*~!'N,Ј0w&b dY^7BKƒL9r腰.Z@eq[l???^$IM}[!G1eee-tm;^@RkJ&'Sw-Q3"B)2+!1qʳ:O2)ܱc۶i G[MfRo&VoEÝlyxLe͔,Z/6k/ p.6?OI6?>yBCCJ$I|lܸCt\IӢ???Ucc"22һКEiȲbŊKJJF(6PvEoZk KiiaciiSJH XB& WZʱ )ٿݻ+́]aDCc4SY18u)ׯLx*vqJ#m޼V$dY-0]=qӦv繈j5*2>m=Gmu n>c̘1Ч=RXXOuuuKq H^^8kdWU-)Kruu`~3g\v:3dYy`ݺuUȲ$IءZ HÇzY-3܆8E]}4+>Y{tz^Gh(N4U7dȪUfg{H8d42?ⴴׯCtzYyzro7RJK2M'%uI>oʺG!`>p%KdɒytV1ZGplXR$fddL9r۷7~єJv͛kqm\Ѹ̯],w8GX < w:X;Vs/~ԩp;DB 70e yj%}x|Ϳz~[pmD]4Kf3'&|T]oźsEFO^`pzzvYg4ۥ7ITnݺ1a„Nwq,]EaȲZ×-[j <I$ ٌhD^n1//}J1Jwg-JSq1iڇ/˱Lme͵kP yk_Jc7(ܼܲzހړ'1hMMĕWb5YJmJNy9a?N8]M7|Ü9s[?]Χീ,999O WOxr`Duu5dggK[lɷX,ߝG\RNpEp#kPk@ n*+?IqqCўL"#9{2Ƃ@١Cd-0kaB,No,+c_8Q']Yn@uA 9N2{ly ЙmJNNO>$-S_/.iVuENNKjCE{@b 00PIZzuÆ ۘZr> m۶=?˫%֚؂3LTTTP\\Ljj%55u90sO[ْ@DXG;YÚ{aǼyT9҅gV2&5gGT6_խ\}y P *F ]':j }dZV}?9y'IQ, |I[4Cw]JJɓL6h] W]uU,;g͚5 8s/_;խ[7վI5 ;X,ꨬcǎɛ6m2<\u>ˀ(}dtlڌxFusu胣Dqjj- 7~ PZJ[й w٤uּZ͞O?T+=okppߏ,Suk[K8cJ!#/pʿ! G]ySi4̙üyHLL<'Ʋc|Ij[fgQJ/D1ߕT ...&; `t:ʛ<==,Yv…,3eYdee]jժVwHH9+{l6S[[KQQV^S8 |С=  ^MYq Mbl6%o߾7zի qȲߺu-| 7j;F~~>u@HZ 8_[P@ފT<[p0]sQ?7a%zRE*EOzFRqeYc!~ڴIFSNvSݦg5(NKA+2uWia̩9XkjۜU*^u^}UzyNc_~ame?cǎ%VUUtuutMMw5 G{yy ǎ9>>~{VVV~вw[|=}[aaa^-z=L.@]]qa_58qbpJ O(ٷ=ΞX?9W!xUtISy{sA6۵OE|5u|OLlwYy([V u!j wd(h=[nƱ|cwq&|槞:/SYlSNE{>qO>$yϗ{_?VjJJJ999\]]777ju]tXϿM՞(**}Vu/ڵ_>jzȠAwu` /7#G`0PPP@nn.o^,I~:& %IYS\э(Boxh!qDӳkswThQfe4_߾L#Tz_)ձWۖt?wȲ /9nM4^^\0x/A8#JI+OMQaDGGɓIJJ:_'|CcC@?Ф{#owZ`Rݴi^z}RAj~a#E!>9. 1b{1`wH'axxzRgaW2N+~jKvבÇ#jNZd4Q|tVkbn9p6bŊhPw={&!ˁ |^9^,...Vt*wwwݽI@eT*MJa*QERBxQ{]×`6|'U6hjQZgRUU{qOzzaÆS76c ׸ޱKV3n/Ul$xg{@CpZ@)$wzQ3,L)h*>zvY&:JWlquAi2[+ώ(rxr}4>$uC}Ļ"a,&OƳW9UV5}^:N١l̵xa5/Z@Ej'lsTE[nآwV5k~޸q#< f3.3ꉗG jX-u&L&#]CSw/f; ̱$ (eY&wo<=Z,(IjQjbXdՏ?8`0uI, |7|󈤤$AZO6@DEQNQSSCNNcǎY'tl\b \ji7% "[zF ޭ;j Ղbbk҉h0 EwĞ$ې 55lBantwJ2ڷq DZ Pq/(=OR?EʳR{wˈٳڼSl|IꪪZ=/``̛GԤIzxqsϏ>}7:ҽ{*,Z֧AUq1!F2/C7nd3*{̓aѢE{ 48(--m`XV FqN2z)י_7|0!::%Jٌld2c20(@͛7;~ݾz~~=?3gN8qƼD orrrt:z= X-mal-_, .,>G^:A| #feeݻP_gcѪʄNÇ-ҾqO\wu˫{jN'iii?VNQ~׷V`25A!ZiNZiy2%S*iT=שt6>W_M3HJBl%K$?V yV(xfß}nݐ,+0L @ر;y>Yp b?Ee!T|$|>)_r/+8yU*#}^JQyyG ?66o޽+8?VSЉ"%&2&4?JKt>W6nڴ!(K( (ԩnۯf93f EQh4ݺuGs?ÿRSSu0OAA߮M`s$UhB}EfϞ-;?..HVlQBP<:k=Uٵk~򚚚((;Euwwtڴi#z |||.n ??߷5^^^ 1#G:/bx DT8nT:D/?Sg4ѽ;zo.4}pL&J;tT:+jlM:IJʷDڦ1'"݆ &g&<23OK7:h؜իQy>3^<<)={r-rrsYkvN///TjUd6a4*aQyL&$I3zפIW_9vXnݺワ+w~oyfffj':cϞ=$Irqssz/:mږ0X,LaK(唗,@]]\gFt?=FFY-[dQ`Ngʔ)S{NPPP}&JBer?QTp* 0*9x6 vb Ei0<D9sdfj5IwI t :!ʀG=8Թa5pϏ/HѧKʣG)kN5>w$GѺ{0c=嬚1oW`5.WOm'5P3f駟&..===k2drjq<Cx$9kffMb/?9鼲};zXzMtL/7x{{ z~(/^|GFWĉnj?4S%+, Q}NFTw@$xwĀFP*rrr$ȿϐ!CO뮻Fmt;55? L DR5PEn55l=~= +*a#5 ʲl6WB݉@i5-F1`ҥ7ypGK 7 i:7Z5Yd A؂Ǐӯ_&tJӖS:;{ꫯ W'$$te Ih4HgەݪmM u<R J(Iϡ蜹P =m܂OLtS8K[2f\ NSwo dww>17NAT mӦo{yѳ'9P3p r`8{(REoRa繹qm1qD ਵkjj?SпJ11̊'J>KKB xj4 f%&fz:ϥRUYY,5ѩro'j,`飮+Wވ-93meQo;b#Ӟ=MFG.i9QxBAhr\p@i',MLL̇W^y嘰0u\\zOO&:vt] ˲R!HVvZ`MM*|T4L$$ԡ&w ^][PP:62 Lqf&ii\E#XM/)^#d\maSڢ8-NwLz= [].ر̜9PѣWc͚5|פ$EGӳ\&ʶ'eg u;7*MsbEQ$((0urrE۶mNjAh>ݮZZ$u]Q^V.Bc>P ѣ'iqssۻ;ԶEAljrڨV7cP oC 9sAKU/=w6z4ZVQ%x Jxbd$Q50W-΃@]+Mhzc5;t>?5?w7)ںSxxxנBBΝb/wwߟIm:8,/(@c"gڼZ]2tPQkF@TTG&''_SZZ j4H@\#+r7:Wd2UTV(֝("< ؉'MCyfnJuѣgEFF&%%٪? OIL&T*D$Ijyjk:lhɒ^B)M p•YY:v, 3gؿ.Zw7u"Bl93P\LM -e|*A1/*U;v,wu!!!X,۷/\{/f۶mM128w(Rd0q^IM及 \PJE1EN.1Q(RWWtV%99*{ wUTT| jц`DQe ŝT7$I2L}-(c'nN{'%o߾/FGG__c8JeL& O;k8V8o B)Qy8[Jm3ӰsW~@J%(E cyu`*)i#3漝gQpN~5Jp>ϏGyCVZxxxЧO Vٳ^{DF>}HGk vϭfu^Iٌ1J7fNѠt6Bؓ#ڜ3qmEz=};??՝;wxtU@2VkMYYX}9$O8NdY $i߿Hbb"AAA4Iؕ~s O$&#Za_}N@}YƐO0@[֡4)V8XIĉJ`y N&h@*4 FTTZBEm}yg?~ȁ/h׹C '((Cד)//O>ᥗ^ G5&x0럜CA@TTݡCIGMoG (++Q¬4k4ޗ$&& ݎ=:zZTxjfT62 G ,a69ydm 4 NWBzXwP4hР^ziz쉯o|r$Il2+m=Y_hX-Kg8JT;  4(r:T\/ĺ诿b5K:A ^vY;-[D6Rq13nU 3/۶b֝R?d(++S:7"Gg%..'xOÇ1u*/Ji'נEI---[NKc$HntB717s_}=dl#1"##gZkG;ZW9lho'}F)5 IN'N]HQGIrϞ=իgrr2~~~r7lFQ#: mIǚ&QH#gr As )Iͯisdzϸ޽;uILjd}p[5q nZCT(&Z-UT?}y'"5G\U{HNNY9r2yd|||. Idddxbjjj˛W^ݺ :@Vv=| (C\6CAT073m{v>}8~סCu$@$J! ZKJ3d@F:G]R=׷o_{ysmW_Q70KfWPqcHsYC]wؿW`Ã!O?Mɾ}o~eNj/W^!Pyه.}}ϩDHΪUz-mtBtAq}ѫW/F#{X,f}eggo0h jW_Z͋0%*XooTgS 0gnjk  Dt=|(ΡzxuJq~q$i9_Ww+ٔRobPa2,&I^A&SuW3lذ BhhhC!Wc-߬!]׻W:Ol#v oWTTmXꌭf3TYTWl5 ݻ1f\6>jirjN:v,G8$j48_`v >^2dHm۶݉%$$$ЮBg%Ij`7,D` I$htC%,y#NJJj@dLfjU@phd7 5FڑϬg.x1-C!kqB.46iNۇKerW%q|LCVa[lԡc)"܍w }_ciùlҎbŘ1cd׮]?~ń`Q1L,[[r3`NZl߾,_8+BCw령i|ɢZܦqIXȝ\Yf۶m9斌:k׮fW?Anh8V 8+.@$`4}dIF&9&֣<0dȐD\4)aZP r{p9M:Y* 3KM ? 2Ԯ]}TK?6yMbY76+3:#.ω5JqNsqqdرt&ybĈ;VZEYYY> @II }6m'&& ֭[ǜ9sرc5&!!72)||,\>~ ѹ5_uHKlP${Ƿh[o 5MF#]˗SB2gzhzi®(J| otEA=z4wy'mȲ7IIIhZZ-ƍo߾Y[b2ZlG p!x ”)S>`ɒ%~'y{Od~ˀ=,Aɾ};{zb̙ :FӢo7772/ `ƌ 2+VY6gHDZZSL9{-((`,\"Bt:6k{>@̚|`kq16H 3c xn>6nȕW^@WE*L>:#[o7!GfTv#TVT6-k\ ^6 *QnݺyEGG@aXɌ LF݌4L\`3f p̙CJJ o%ʲL…\>J<=.Y4@TGYu*,ij{(17$_e޸ ؉lk=>iU$&c„7"K-EQdҤIL>t:Zի> 9rjr7߿?so1f #">ȉZvF4癆R{>2tL^$̙_bXGEEѽ{w/Afɲ|fF$I49ɂlׅҧReYh. б,˨5j\]]EDJ)#)22RpիF@oX$J 6 Qt/7|sj/}>|8fѢE8e>um?e t YOMiZBs\YA5R,n,H |]i~wF޿ K));?$'';6)DЯ_?ٶmk֬QX P X,lٲs~z&ׄqȑ ;wQcRqrsy?8j4?L^ٵ3~"""B>p@SUo )z8, +**ά'KMPzַfh;AzjϏKt@(WR'SM7Dddd l6R>}:GfѢE^Mx.Xw}Fg'&7{JC83̦FUbW)>Lm3KƜ'd/]_w݆t/Tpoەz7s7oWwoFV+7|s͂jkkYlo&Ǩv,/$QR7޽TY\\A'V$ 0oXp~hBӜ[u~~~wQޙɾ}_ !aEPEqVKV[ZmVۢREEU-(Ze5@BJ/s'LH|Lf.ys󜚚v u  f^y6]O˲lCw6@{~w0%UpBpoo/\ve<Pv-Ϥn#Vpx㍘[[>l{wH:lP VQhD'chfHv?~<~;yyy}Cddvdd$>}:6l@&L&V^ͪU8r^^vd~INXG0ǎ^V$\ȏT=+xtN6mrq7 O6튪+t-0OP>ITEhAv544~ֆ8 TVP[k˄_bX0߾ Pe`JZ8w3`E3HXX[ VX֭[yghjjr/E=%k0;I^p>Sԛ~,˄OO?W#':%Wh(x]WOSD; լ]O=y:_=_~9AAAiedd qM7a6֥>̊+x뭷hjjbbp03Ə'OTzhhݻ_}=z{jS:02dG7UvL `Elj0a„h4j0F598P8g:,6c͟?ӧo0X[˶{sȿF"Nt6XޕS6onk3sy$|G> ɬY:u*a&%%8Em_?===m\y Xg0hdkC6Y(cvڒBk~~ވn쬻{jܸqƂ /))>h4nBW (m]b^,wF@vY`gfqT)`gIjjs  e.GމGf:nP0 kubt 72e5\0y}}}xyyl2;sdQܔ(|Up:RTOkkΝvu< ,FiˌRD]ꫯ&..~?d޴hBBBΦb]=zkTQ ٚY^*o-zڊh6'900P/.((D9- , At-NgICiּ/^Lff  Hll,>(w駟[+6S﹇/'4gޤ])?oIFPz:$bOOHJJbԩ^Ogg'_~%L4(622,&2]ݬ^+WR\\NǯsrAVBB0c5WttJg5F#y+@@0#`! `e[-[f]ڣh}o0HHH`ܸqTWWطoߖcǎzAEtjXD%V}֎@o6dϰ%kzbCCC9  0f 7E'~x/MƏŋG42LL<O>v/H;0;5 ϙ2LH:\>ohܘ"fŹn=ϭRx8 !??4 _ٴi)))L0XXC{xYbDy{̙\JR@5#/ mmUZf0XSۯ&=~F 5?9iiiNUm6 <<3gRZZ`(^QRh[w"@u4F]Z @@@fD4Ǔ Isł9E{{ \#qW=S EQD.f͚ſ/֭[v٤MJҢEL2"&N<-׏&@{!󪫨C*?:J##ɻ&2.  NG_[o#zyql2ٳgGu9Oeʨ!++ |}} &''gD޽{y饗x1d9/>H{1Y%<?9I 5Hkxx̚gQH֌7wyjhらСCFo듭x;SSRR"Fvڍ p'wq6eB :ɦ*I5t͜9>{T?d"((oErJ_GqtF&v+W] ~ t1ۙxutU_OS~ގd$㲳GTA>AAHMp$`ٵ)vw̙3mA{޼y;v;wҢyt:f3TVVRPP_>do?_dUtyNTϘ( >QFgjkeQrڒ(?b?jLFl߻޻ՖoWC1Z b?P@?Gd7o6FYQ0dB W@@T h\S0Γ~kZ dҥNHRR?8_~%+Vnwcf3+(z f>R?% |CC 8G$^$m;d20?ξ_ ,`ٲe x-ZDEE%b˖-466r%e͚5\//s[^9#اi2wes3o$Np^KEmkZWkL {8] | b!p $b̓:DQ7& XkD9^ \H* J Eqh?6袋9AE޳g&??/㦠CS0;2Enw/!3Ey^mlc_VY1}}}wAi!K_ft: IrNO ;/(wvRRRK#zzz&""e9ۛkyk6x|n6^.e?&$5 67g)}MO.:"##2RUٓ'O&55}Q]]9O!I[ne޽,Xyi:t^zիWBf` /͝$D>kRGm_(%(/f"CE6`C\|s^gۃHdОu,?I0[Hzi@ پi:Y0g4Ͼо 85wh"w}ÝIlmBg<QB)3j/OYYǏ'''@ǛL&ù{y8pw)_Iƒw?'fvv67|3Y̝;cǎg53?^Oww7֭/dɒ%L2oooDQdǎpnQlX[PhrPD~9(~MJ ,23*eAPq rdU12i6w~0-tp/t N;"(9s&sΨPTTT(//\<&l/_֭[ygݶEO>>L&Ԛv\A~:T D~\ K/// BBBF\/2{%Ib߾}GbbfA}?gڴi[7|}[z6~n%<'绒Kc6)_]˟tϝ4i7|3&LXo2$RRR?~7pm[{SY2B@-P@q#qe"X,B9pꜮ,Yv''|BJJ 999ߜey px_3AJ eg3?>ѨtTuuJ74LĠ/C(S@ F3^`\8uqZ }9b笯8,^ɒ$IdRpp0& oo!+&`(!3v(b [@n3 E;Q˜9s&߿ @E 77$͉p$ŋ1ck֬VwM$^NXf:`SOydļy(((k&((Acw^dI Af&gEEa~5?كQ7~?(wPC_Sa 2+Û7!Ԥ#VG%{1vdnΞ> OZpp0f sϵ(>f -M}}9,.r_uU,t:∈ѣ8p`ggﭻrD8W0~_`VZ呭pQc&z+K?"ȲLl1ZtyuYOIHH 770(Yw_'77w@ommW_eTVV|NOgT46#,?pIeV ƦG75{|:5@: 'Lw_Yّ:랾pL&L"`fL}A  8NLj<_ a}LL̟8pl0bdm*hii%]Vpd(a @N(q>⋙2eI{,Ezz:qqqpa&?:&>3Ҙ0ab}v{9$ y^K|Ƣ)B_[6>v/ێ kkk#336 @MM O?4/---r.MK#o}$|s/Zy9,s#ʸiVJmSw(=!( P'ZW #(SqbbbaBNb֖׈ (;n\ <PVQo=ýhkofl7X-8; O;{Azg-'Y @+.sك?dpedsɓ,Orr2EEE <8zm"KpΜ9L<>W^ynmGQ~>ロ)u0Flаs'}9h&OLbbf_e:duHNNV7NCٳtwwsvd$w.XIIF8w";]l:v *` cSWŤ>  ,Ⱥo&`_ O^͹KֶVZ[{.Q&ױP N4 g6]dd111L&F#}}} T;t+00<$tFR=o]'mng^ DkIMM=_ q7ngϦBZ[[]fNbb"^^^N?(tR̙[oŇ~6@kٻ?1^MO~BpJʘz= :|M]N>^z)===$۶mcʕ467SEv V!q5ÿҺč@W_"Z}F#,Y0M[\w)b#tأ (4zDQWɖgtjd;E ѡߞ-k/ a [iQ@`Bi}A"ڡC<} }ĥ/sǬ9 ^nFi CDCX2`gݓa @'f;;x O( bp[^c>89aɤN >\u-vc@#뭥"T_pWYV@AFA b?k+ @̙3G[[ˬl6999$''k֡~_V_g o o#x w;VVƶGu;r 7xb|}}`QQQ̛7j%y'~'k۝R:oēl J 4..NQ`0$IsU'3΀(tuudCYA$-ςeY:aOM&8e^ӕ… Oغu/ x"vdPe^1ߌPׇA> >>RJKKC755yfu:u*˗/gӦMZm[aȎG7_7kIf*>/x-0nFϟo5k8q"SYYIoo/%%%E^ *=̐t'tL|V[;vp o[3屶`O^(¾tz4e:vYN5d6Y N=T"4W߹XF sP 2d6!"XV ("@ @l62 kQ_ϝ1٥fX-} AFKAZbS 7IDFF{Sk9 nWRr͠ӑr5n6PSKΟ/ك@Baa!.?,TVVR__Off?@K%\Œ3xXv۶n&qB&gecj,^UVSv[Yŋ+IJJ}ޑZ$&&W_qFL&1>>7 4hd}EEEO)(-pW1c0L[b\ ,(^G_2B?=SV'yеiXZ 83/t}طS3g;^hT6YHccf&k &>SA6V9s0k֬{_Oi:NљLxQs4ϜNoОD7rt^i7dY&,,sR__Oaa4`Pnfϟ/_ƍToHBbgw8\\C}@4h)>Dɚ5Tnsw2|{=Y/7nDerCBy13:`u"H y`21՚_o>A[(N|/(= (h$bQɎu(Zew:0gޱ^.IfM}[#oehh]U$ٟ\{o5^9R_f9x{{s5׸w/2=?BAW9;nFeFRxp9H@U5; N||<єf픕GttSЦ^<#ر^xcj>A'9Ğ5 ل$'ޠwAٺiYY_ϱ](_^sQp*2_5;wD'\oLard$j}a pXQ\Q96? GoRO(mBPZq*샵]Gb1nMu3 >e0WwM wvv,;^[,[ ]/+X4m); 煥K=*#[%2=qyD|5˟cII"VxE (fEE 9ꩫ*HS8r[M6Hnn.^&//?W^yEv uPy" /: NK୴ .z讫a|}}~ܹsGX,˼&L&c 65>| n,zBi{>E0eHn`/mv>_[FS#< 00rǾf  Fƍd2AM]y2:\DQc`"##YxlСCa&f$ϗw܋YpILPii]AKddYחS6>@TUUQ__OFFٚ-*=xW3sL}]6lz^}.:ws̓>ȤIF4KĺuXv-IebXX9K(QP(տp (LV>=`/e*XP١ @ a@(pUu8Fq({|?Xjt0;88G @$'OA蠺ڣ v(J;>l6ۀz1trKvt:~=_ommO>!--\ۛMKocB&?p {/A#+"U_WdfE&D_ϦɲLhh(ͣ{co69x G%''TM[aI箻b^jtpJJ wu'NT,Gk\GiZ{K$Yּ<#Oy>mh J__+EeV OlȌko5ݍl- =SvjMxb8~? BC=Stwwum=-#V ;|///ٿ:::l-slTWWc4t'{ǹ*Hdv@TŻOcie0yd͛7*6+++ Y鍍aߣT_Z^#qFd?fƯgL&Y38zeÚGtt4eee8p`H{?477?| 455R YgEZZEEEL& H$ IDAT;wK/_̄H}g>,1yrľa^6TUԾ}io' 5RX[u(*_CPLCQjo@i|P'muww[E UPÎ}Nq5 @dbxpc¨řyH tU_:::<줺ڣ9k)("`e l}kYZ%)fFECQQѠXEˑ#G((( >>^9v,L^fy9|$:뾇d0&B34i!!!@ˋ;SuVyjkkO#??4mxII UUUL8TD#G'_n"3!d`_o biA?4Ld_D/}܋_HF˛[HL Z[PJ V3d~nжJ2mUvТc?S WCV h\Zj1555 @QGzW[\dYsdNq/~ fΜI{{Rljbz{{2= NLL yyy8^OS3ɉ|* }i܃Wg'?]Sml"孵tLعgTVATNc?}qر!&L4Α$ *?|ٳgϐDMBB$%%قg>vMee`0xOoOV?D}w^Gz^;ޥP(ni#G޽T`7 cloOY*D(ޑꕁJkT7Zև>xAWw` N;eWoSt4aW}L>>>ZG@p3ʸ<CKDgg"Qߣz:_"iם,rwF}}=%%%X,PVuru>Aرc|nj?~>4.G~ @_8v>x&B!"ǯ)a| tƐ?/sPXXϧݻwcoX8x UUUL4M}hח$nv)++m۶Q[[hֵ-0k,DA[ONNbn~ax1z`o zxr f3Ϟ{.㼼A,ljb+)A"{!3V7Yk@֡ E8*,(DXzߠϜ'Xtw+"@6@Y ܒ&p1Z]Z>=a$.tĘfvYt1e{@dd]?Qᕇyl` 22rN tLaa!]{AGpkj ).;鍉&q~8 5uT_q K.72J5>́\*}vJJJ'66efo2cҤI.tuuپmJ1n8&**pQz ҈Bhhh ==,5Ix衇(++/^˵W΃>VRd|]e7(X yo?2䱴ZPO_XˏPR #W7[A[V)x-J^-dޞ^Ehߍe1 EQ˳ͽ^o%i ұϱ;]zs$_X, ===`+ 8Ub?r) L6KX 1u g5gח<ٿfE>lIӟľ}mK-K\uxy+;"7&ؽ/ C_0V-J}qXN,֯]8m; gjd^$Yq8XJ<;2Cz|zPޛsA.Ѫ[a6ݭqF+{w*ڕ`œ~._E?~8EEEa3qJHH :: G__> ??q)uHml"K6i"Պn.k/In,>3f ==ݻw2ejtZRY!!!̙3cǎQXXʢTk^G$^y6o̍?j0d@-'}D /m}(ݙTB/Rn܍O'8)v{4p%=q3O}<ruXg\ @e3a dp6h43{k".Kx3{!gѣG)--u*.| s!*lܸq>+D:?B0ko$z^y[o%3}؟%44 PSSݻ]|***#%%eTL<bbbOvU}mlM6[odAyz zϝD^{^6p e*5z\>HxS*PZGt@7},k;82Zɜ3@*Im d;%(ƕg ]6?w'BhoowI#V6YX%!qdbcc9|0555n$I@snǔ)Sl**Sʨ$//t؉dJYCg23Njf`#,HJw,~xbcc)))Cz{{ٱc&??T̗<]z )))C2 lڴ۷sYM Wg'RA &`Xo L˴cF,Yg(vֳtJ O"@8P΀7ǽرX,{8݇&X}# ՃKfҞsHq~Յl  $suq&MNNfBj${uܹsY`C$Ib|G6st'&p[0 B:A5̺^B_gQrCYwg,y ĉKHKKs\rq6mĶmG\@Bk+jk&gaA'M?5(Nn([3_ZH~=pĚ_8c2p 4&iOr%lZ.gY3!xϜG=z3H_eTJ}u::: qDZ F@֓lS톳9s& 鬮G9c Qw~Gdd$Ge׮]L&̀bQPPq`~8aU[^\ǟ7%߄q\ؠ _g2"~z~I+h1MBF`$ fϞMVV;wyHGR__oHP̙9>[)#>"W\|:6J2i?F`J|FQn`WBq땿kAi(xr3~ *cj?F]VCZӊw<("yL~*jR$3cO}ڿ=b.~%YVJ0ZL SYY9@/ H!&6/y-p5[P֢Pf Xfyv^@М 8fkG;[#qO0>jeww|ԁ@٩);$"謀Pl.{O6Ԅ^[Oy/Bqo^ZC[:z~:|A-,mݷo.zÇSVVƤI}O/55Tr#.PZH|_^tta O#b;|D#: FIII$$$PZZ1L.@oom0 Ν;?AOOm;%cH,oۖ-mo% 'ylg@v _zQt+P\GR tֽLײ8"iز^vdltnRڞEuuu2S穠@b XVZS OU `$엿?477SRR‘"=zLrUbN"3.=bo/e`ΝKVV_5mmmz3`@,4Jd `hm|-ۨRr5ه_]5vY`„ o>***4&gQrʁk׮=x-K(xXH2gdkm,;P~SOH$,^o,fvJF p8S] q  xxJhm(f(Z X :Na4EN7޼<(B|#A\yA3>CwHj}l>(zzMzs#!=\/<_{R^^N^^,;*=7LsxqkCE?{Uϙ>e+ @ HRlXWaZWUku]ֺb׵`GEY"H%@$ާSdfH.̜ss}݌zuԇaChkǿ Ѩ-(^ &D V둑}JKK#>>_]7Fg}Q@O?{K:'A@!xӸ`k9gXohPVݳcl@sYl--N6nugwVW~3\{[]ut1lSuHw87w=; 3oQ=wvstDOY-2#NdԉZ%pM̽,/?OM|Tss0c|#* 2m dΜ9uVme2lڴpFNs j'TVȣ:%1* 0Y0+Utu[DGز|5q-_+> ''DKeeK6P^^NJJ g?`׮]曌KODXYW[Bw[LgXzc]Uw#hǀzf}!`4PU e{fO΀ag?~~`χ<s~Aw @.v{ FL$B&&Tŕ&g!o J4##kH)(($77$a1!XH!t$% 3~_$L^wȺ)V ~>/`fزϧH.bƌJr l[f]U>x0xeh|V\vgjf} = %.(X~g9vy%-첐⳥ -wc'o/%2DT!9Vl z:F#}m\O>`瓑AHHctPw>K{ӽf#߃$Dn߉?tF{mێ\I}Zu<4j1c8޿bHMMej@@#G[Y~pU?ʔ)K ZPkxE]?6=} J;?br:膜n %(.._'##.hȗo%RZiTDo-ť\96/MDc+7zDdggĮ]())[aa!$''Z>%FmۆYaߋDJCiOOBT0֋|o/Ihh( 瓙٭>>SVZ;s7XCLJ)v Nu SȼaYӤ6"ldOeۿݥwKO_dd&vzoKoՄL4Q-A0Hdd-W\ŋ]}tֲ2n&@7.tޗ8<۱g҄)N;99S͙^ܖ2ddvߩT^!wLҩυ/ɞAgw2@(lZmd _j99>JرcINNv쎛\R^}U\PoZ9ehbDX9)51!ұl}JoS Egggݻ)//sv}@RR}х`ji38 Ds\,ʶv[DՔv3y_qu@_ ]PTTā444nݺ~z6Y){4avi-F!X[t:~nvJKKyWܝc0UDvU =D8}GDmPh~NׇQطwopmZODH[{ݘOSO %$jHE\,mo'Xχ}N1k,222Xn۶meݽ{7 /dƌ{ΏDwtp>o7%!zIin!g`\<=m2jL6*v#G{҅O(?_9KoUpFտP{)p} n4DFFG^^^ 6nx:ɺ3Mdߢ`tS"V7(|t qqqW)>tΛ71葎7vTWtwDD8'N}=voZ]Ugw%髌w aڐmB2L&C LKdN.ϗڲ\&̝w-BTT\^[[-b_(b?~_1b[}Aclڴ6 2wGgjԈ^1sϏ &0ydmFeeYv3M %Y&0J @!^Mc׮]̛7ozbCa bd1Ux ș5'@o־=ggnB~:m}023^ Ca8pۿ323Xt9ƍ;5;G$I=rov¹ل. l \%B B7]ÆSp_iͷCf3<5?_`YPBG7hY(5*Sac 5 .RSeXdee={(++s|~$IQYYIRR)))ݼv AS&30_/56:oxҥK  Pʫl?"J?*v޽ӧV𯭭W_uWA5&Ce P81Ux`.FɉJW?H.y{N8Tf'B_JLCCbz-RS=+')OM&,dAc|< xZ%IfS'A"O\SDIOR.?Q)E>C{!>Fу-[iPUc&.Zs) +M";W>dn?Jx٥̜9qyԥm۶fjjjH=$~ws]Hň7Ƨ5S\/OE|R=P2+~?0({رcdggo9'Va5*c@Jvtҭ6ʅ+S7;hmm;%=lmC$6o 8QD]] ';Ep8,ƍXb#0FZZZ())aժU|;FHe%wxoO9͏~bu\bAET*%!HKK=/{:;\w7]G@qզ,8l+{=i{>3.{)4QRafՆvjͼ\^Z^GIX%Oxu:G*0PthnnvYrWRRs=رc+\Vlrs~̿EIT 6*زןV|f B ++ѥԭ@II B8EF295c½ mu ?LWP- 55`\.g̙̜9^Okk+yyy߿.9Buu5]]]SrT0 BdzZLrz ꀄvsO t`>îۇGP;=4nS_힬-+.1蘓=M3ٷw?7n$''W[Z~ Y# s*E?9gW>f/"2*[.?<"oz0M/a ?[MkȹAƷ#Fł,Lp)8ٺu+\pb\R)V ӥ3' Sp# ϒm~L >6a z B#XOu~:xg&N{{;|}}Qk}jkݞƆ)̙3BՈb}F7~lGdT%+۸2~gK[y@)>>>LSS;jGe ub3L''2LJeP_+߻Zo1jO.@oi|Ifذa؈^w0LQ^^DOw8Wޥ쮛w eu=QK!hh8RɨQjĸq;w.z+s,F'ZUb >[YV0JXY/K&錊vE\d*<־9&K/K/1vXb---<޽aKm_iX;ӑBHX& фhh4p~6:::#::RyHRg61.7|---8qOrFvhbA (rBCu5ȈnlO#~n.3KƆF-]v<\9C93HX\9Iw7o̢Ex<~σslom%⑻xF5=BŌZL& Qlx'INN&&&b \V>~gqy U2J'ܫo~Ң 41&K5ٰۏ?̩"2@[>iu%t6lqQFȚ5k&33wޝ] k)2 : F8.5&_WEKLTs;;;/{h4RRRx79q/&//Nz=444P̛*jQąk&1P 2D0y |`S4= |lD3f3eʔ~UXr%K,quᅮ98Z+z2X%zu o,s])ž* IDATepWf_+>o|ǝwAZZ QI(-)%70o.]]]+DL+' OD- fW_k#0qDrrr<~OL)5uU9Qj7T|Cf4[ߚvdZ_2T}Z#h4nV^ݭumoi"y&L_LDDҮD%W]kuLMg_7ej&e;_iYK}̔6jMTI||<u!+))@즭xoM޿ `XuxI.vD*E&cuv!Ljd* =G||<>({aѢE9O& Dmm-TWWs#e|c$E4*x2 VO%`*╯Ko'؎UCre裏qF<,\]yFH 10g `KuVϵ"Y <1n;o,ǻ ==э $I9ǻCG `b( ёIPU[[[9EJJ ӧO'""MLx弐԰vZ::ۉ\>DƆ^'ٮ9QX47'33~kL__5nb/^rT֋(?%*/VgsnjyCp-Og裏:,8u\K/!#+AOWWtt;u tbXm!Аp&No{-``0o[<\}͕DD *bF0`oLld@ErYpp" "" ֫nܱE~=͛ǻ{Z];,t%dzVwù5dX`&kMM O& Xr%n~B@@W_}5X5(+RPҊxi?+|$J+M^"M㺻ˉГDŔ1MlG߇rr4* Fd>66C9\1NZZ2:,Ӧ7!}b4шE-n0tBS;Bs+ÆHu0<!; 4~xz)v|RP(d…deeqWCDDCbXĉy7nt<8a }>:mOX,% 3{>gY$@g`[.l1RR67@ins.w>BA1o#uv"L .@.slL& 6txyy9@7bCq1Wg{Y#\4>>Pf&Tg\I6deĻ:;Q5DDD8\56Ln@kk+'N8-=9Q@12NXlMcJh;޶-Z? *0\PF}Ɵ&YLW&&0u5gmZA0%J^x~%;H^Wv^.UΎ~LӌL?Ell,466X,JJJ(--%88///+*cUXd2n'Qq$~BDG!>4i<=c!!B %%?Fis϶mېd6PO>W_uuH5pocdsIj(10<Nm JMxX8ZJhkkh0#! ԃm(:bKBagU F#<*+ij\BF#˗/Ϗ8\ (@zM 8')^:Vn֏/oBV]vfO)}"22r\tuug  OAZ%2!+VcĈ=zԥQEL&СCxsLG~~>wgJ8V8'%4, Ɍf6@&Q)Մ;={VЅĐ>ypvR\TEj378TT 8ĺO?AZZYuVJW뀞EKZؾճ 鷭k7J_766ӧ#8tG>`ӦM=c֭<#tvi'`5&-1e11b21ke׺mzr%aaaћ2jW:;O;ll6޽{QTY ! $Z=~ÑJ oܹ &3m@[[<{qoC7(@Xh(f`4mZBmur%Ua)(`40v(2 R_6!!j+0v:  ??cu0 uup^^֭#>>˸oCyzěgxsg_oW" jٲm̸*v}ѣԭ>{RXXV`T-bپby*1ɘXµ3kQ'EbccQذa---DGGwzI9Hᅤp`0 -p?!y>ÖMH)QގR΂̆ \pdeebҥ,XUθն<FGGjmd2ٚN-- P#) ۻ]ApLL7`OM@[[%ŀZB.?0HHz*+h؅}r@\Tm-K,!&&*Ԓl!qύ~("O\$(PeYf#Lϧ{ٹ_dcrdd$w^^^Ԡ3`.> ۍ\1ӏ{n R÷e̛]Ch\N#..///JKKEiqq1ׯw,.a\k w7l7wWG ?'H𷇐K^̛ k̔)S ØLS~Vo?g ?SVVom%D,f  *ހL.'Dqf k:86], `=/ *+*Uh50v&ҥK)++#%%+jDӠՈ;gML5a ERȘ1c0c !!!.*i^Dʉ3.KVFkJB!G$Gk]y\ wTՄ1b&NHVVc\vAPPs*! 5H= |o-Dz(}'u?+ n 4W !"jAEXG'Ǐ;$Ip $%%7pgskoI7 *:di'$\&G,wv k6 1[ JYPRRZ\.Xݮa@ʈW`mx@ 0ݛիX,S3J9J+Lɇ/0.[5("w-|ֵc2Kx/S#F 55:Yp ׇM&`T@/O׻UHdd$ՍA41,NB!sBEj5^^^E\\t:j5 ѣ6lEEE.;vOttIrZQo!Lq2"8~`?7#|; f^- 4_YRʘ1chhhHΝp?( > @;KZ3;yހL&'8(n=%%%2@*P^r6';4;L~֜-dҭLw7󦆆VZŶm $::-{&G.u@ϗ8^ddHUSF-\&`fC f䈢3(JJJp[`߾}V%2>[Ģg:xZ}8|41DEEMLL 0>[ BkQLFxx8ƍחGձaۉB#Es{^}n7#7!DE 馹 ? ]|Y!''Qao9k^ϓO>Ɇ .7Z ZسQ; *: ]IJ D9AAA:ޜ8Xl@tU/ @ii)Vˬj` 8}R_7 y^nb9]%%%|>|"##zR!pd-2@WDzn7?iQ='Z$鷭Fn'3]El[dܸqh4 ۩#00Х> (@FVc4&*Y(%I `4OOղ?π,Z҂(Q}{i)Jl68q6RߏShM-'Kd"(ƛ߬Dz ː""dCv‹oB|„q}CBBjvZx Gn/ \nu7Tbk%sX<8 ppz௃=B"!֨dfC+Y spn .>>` 0<, GᆪaÆE\bx qnhkÜ*?7¾ȢlVq(J[VJ-?VѺ/U nťhQ"3̾$3Ir$d2 dy<L2ogoصALN˕wW%Jf Ƙ1cp8-ޠgƍ֒*EALL=#(Q<&O'Q^%8o=b Ŏ;شi{W^.CU <<(3/sy6ZYo`F2Guswp= Lgp^G^|˥wt#U(+T &?8p ::QGT @\]ֿPNN.(`Z\@`TRRJqQT^yD A-:֯_ʕ+G\+k[KS㾧˨k̿9^a53iC.K}3W.3zh9N={}vfsXPX-j/v?9XRf&[ u*p/ˈʘ1c0`&lfcݺudggERR>cbP<fLϰ U IDAToG2;!9eByY㎅nBx'a5}XpaԳ`bG T @5"pZGf`Gxd$ȭ|3&iX-T~^ITн"SZZJQa HΖJ=}QMVyy9V>W^ 80TUkk.M$+s+ٵAI֋WTq.8+{YGQ 01乺חdeepp{ٷ6M`>ϿQɓ*Xvﬨ]JQO;X̡VH߾}?~wlRV.<'Y3$Un{ Yx:McUƨMr ?7Avvv9c͚5L&233ś {T6JQ-3?`BV:4i> ˗/wvtϤt znzk0XM*Z#rrr:@?`8S %%%#Ԥ8taXP T }# ])(((mkL/z~H +'nòe,?*-@Vk/M *@ $$_^q$ݹwմxvԀVkR2d21l0ƍGmm^lܸq~RG\e&085g9T{{3tީY_IJ/ޫf`31Qx?xFEQQEEEaN'=[n%%%^z!(nAy9(BC(ÆyB^~a&?X~=r uuu. GapN{heuc@BAE "fuFxqt"3 o5jjj8t'` 7x@EEy| =9; aǺ:֭[ǒ%K0uQQk0lR5Bbʊl7r=TոSY^5k61lKK`=EGZb*UnZblj'GM~~~»ٳm۶a2鶥*>gœWŷ*򃃾F *ϋczjӎz]Qï%pp3? W<Ġ~fn=l_ILLw4σ+~vˍ( ,{fp$:@vn&m]z~-'991j\^@7N #P֜wkBML8wnxE'8'/*+*πouIF8"(~V^ͪUdРAQm7帑ΛKB«K9m| 7>E1myoU >{l\_ŕ{Z\T&NHff&yc8UUe֭O$&&6ɴ'>VɱLYFlvScss5$ƫ4s8~V\Ɏ&L ..{PTT_n'++%_[RAY׏Ĥ gc+TEp@'| .vkuzwA;tEQ0M(EoСn G.^ Yt)۶mc?d\ɤ0h |j㿟tM-%p%9ssYqd6և5|Q#L=#.d~je޽a z6nH~~>;ye³:٤#L5 >]SǟNfX݋+jj<685 XZ, رc-,۷oLzzv7.. Pq5PP6G}ILJX5?}%I t7PG#rss;7; $? //T0-^Az$@U}I`UU5ruG-o@zԛnv͛oIaa!Ç'555lV΍g`3q ,]YMu,/^TfazJT׸L70lP fÇs'B0/E/P[[Kfff`5Ū0jx̚$b4(kt9.}c q*k6re~5e.nl 0rH)))  hhh`|$&&;=]x:h(pBx#lsFNUn@\\cƌaĈ:tʰBr{n6oތd"###1ȰfēbbFML,7[ÍW'1-p6p}2Lҕ6rLW^7>}MmmmX!PSSÆ uMصk]w555.KS$h0? MZy!iIɾ)v2P01I F4 \/qo0 9s:#7?Q`ʕ+Y|9YYY 2$mAO4~9%IcX{Qиrb*1nrPߠ? 'i|_ qƤDƴ4&MD޽ٻw/G^UUضmve7Ū2+kTT,cp?7^٤P^bߊL7pd:%Px~{aB(?WNvZ ..B@7֬ Zi!@B|n͍nr ($%%|DN*/DeӉXngy# ӱ|^zvt5g/=dߛ~3grEqcldJ6nKΌb7?/U0ٗ%q 3KV X85:yd>Nڢ!߿gy{y:}Y"{jjjܘM .eŜ99Ljm|Z}  8qb?O>jqo⋖B(|n~&s/Zky8TWHNhpv7B߾}(xPPPl PT=?T:$yF&*K["BC(Mػw/ >!ޛg*jln~559(.uq%j?=ѣ1bcvI||<8mbdgg?LJԻwCBRbRTơC:S]tՙ@.pggJЯ_#C_xqUUՅ?04( vО.7BO"n7~-/)))m3}sןS6lGQ%;ȡ-'$$0n8 'N'?#[njj(b4]G 5sƤ4࿟HW9,Fyj`\J5\UUwތ?L=r8!PUUw}GnniKFk7| U5=\Q ..{5DSMwΆb;g\v+䀎~@4h|Ud2~ Л'Pcq ԡ8VXe4hC i~K YFe1u?7NQn{G[53!d/HOOgɤ?k?/eCZZiii-)  /[š||jcn2MMK3rӽ%&n^fo9]o2tE z] f.eݖ:)K/gG521|j2bNy<2rKha1+m嗧Qess E0rΩ˱Z2!1U.F`X8c=z4%%%qA֯_ zFO>F~۸i\~^ /S-H eb7$rjUZTB&(;6l7+jnkӦM if;ev& {q:5N"^lڻ7&RRRӧOT(@Q޺E 6xns`*ENUt1@ć| ,O> :Ĺ6s1Ro5/SEn'Y1src< >N|ЁfT?~< lf߃8N@llli |;yb\ |'ʈ j7/YЁ&gC,|f``?SO>^zqϴiڭ꥾scGX#UDZD"&ƪ/.;`8 Q>,Ztըv@s%~Vfw0wJ'5cB"}ke|ǭjVaIV 4e2xt^/*h^ts0 ;+l;N8_Ą=PU^z%x v _kOfpƶU5n~>٧|>FnsO톪jfnG 휇jSO宻bڴiL&4MCUU.7: V\Ɋ+jY;~NP&M?~[97sy'ԳI޼ Z*pAG#.W1hhPZ{-;$' Vxvh(--eܹ>vyê0d3&8J508Θ/N6J]L=#pFʄ p4`/$?@P4ISX0$+_o*8iL_ Ό㔱1=ÿ8~@MM Fbĉ7rS\\Q 2Ղx6X4:(@bbr:I`!zoakTJO~F@*NhE/z8*'/Y%K0|fϞMfffi^J]:ٽo7r0ů&䩗+8dp3.)))\veL4Kv o9쳙2eJMO2<+ bSZ6d\_KMQ(B߾}={6.W-^={|:Y3A6FN ܍Du$|#n`,0##Q&Ef":eK w<&?矧uQ%hmLE284~{QϬ[ ٻ ǘY[8oJF<–9Nvw}G||ɓO>iof- Vf_D,# *FRJ+\~6ZYΟxJ7IH<9r$k׮eTWW7+TUEW_1c ~zlBj\uI"3΍#Ebn颣ub=ˏ?xqS6/שm}-ֽsf`^ͣpx-~hg1/IEYFs`o6kt/IG%O l”)Sٽ{wIY X٬`(=_ڹD_b^MOTpʹ|P߬'@)T}%Pm<hp4wlA7yDenʂ aQI 5n_cXvig+eg׋Xzƿ^i̾4BL#~fcvL5-eԨQ5Jx֭[@>}=1iay;yJ6lSc0N7l̚5zj<-|\k=ꨡMF\.п%p(+`˅$>9~6y q*:e/dq)ӰX >n:.>/DEjr7^ϐ&?w\̙3-{,]߆5IIRT|&.biy״m{vmcR.Y;ߜj@T-Vm;s(ͦ; o@UÖ TErӞ&_NF*|kkkYd _~%G}4kx'YzYQ {;غT2D+7_ŢPиr.sn *n >;˫sr 3fJVVǏ'--l6[kZђr)zoveP16r7m$&%u@p irhH[ &/v ,p*5O\f &Mk9j7kzFы},|u\53t=q:n5Ί."}aʔ)~* IDATs9ݻ{_~9lb}8 r/T i (JP%Dy mnn?K_GDVn{FSA5 W;'g h?5dG߁Qׁ6hH&p 4-T wa'Lj _E/,//3g2uT֬Y&qLcmQq0gı*ṴftecCS'Jyr\.V5kiii- R^x{1,/%ܮ>KTYz5K. wIpؕ2@XM pvhFe"SCĨ%zGFwΪj@#vw ,A[N}"}y)))aal'p)>KհyG=o=ɴ3j he.n{̚ȀFn}25M 4N: }CokRVVF~ZD̜9p3kHo4 9k t% P!%%%*G$o"o =_0Uj,=tn&ߪo…s1<緉hS M٬Ք(-wQ[Q^2~>7bk,7Fy2~yU1U_4HMM/ncIhi|}|G'5g ~햒5;K xN0 ;{zhLs\`5ԊЅ뀸~$2330E /ޟ=}>C':#8y)իYd }aРAm_ +~&^~WTZNe%~ks*<2YFzs/bINTyJ;L,=9599ѣG3bJJJ(,,l֫hhΝlذd233[\i˝?@vv6~#7Њ٨(G E\. ͱj\.7(bX/dBG[ z?G3oϯ>GQEf Bx`>p^z){.wy'Ǐd2E * sj,ZYz'XSOX%kZ>_ٹ$f_ w6&q2r10h 6m),,lJyy9=#F`̙ 2$bmzꩰFF Vcj4M*M֕ .6a.060x=s̉. u2![ -a?/?`٤0AL,O%ު/%˓0uyǣ$'/i U.^]RñG>+KdA!;v,dggp8 f***Z ֯_ٳ[lF?Zs%@||<k4rBtXYBjj" #+6?d.hDS Vd?쳌;'xW6cn7|%9 n7}~mŤ18dr8{LIIaڴi̛7ɓ't:x箻o/^WWeo&QBㆼ'!qO_jn%0:x;0 ޘ"+@%N/^x:d-6|yǁHX__mg&"f3<60re4(hnJ78 XcE}x 1߯fG޷o_*׿2rHGCQNgTv__$xPpיcP-`l<|M+"Y.:Z3v \5\7:(  <%Cؽ{7oKϨk9XyyŸ\0O)X- {H)ճak=.Fwh42rHΝ˜9sHMM iw>̙3'%.*J3i~{ګQu9k/) M9]Y'RNL<FBV⬳/ ;v[ ܖwrfߛY]ElVA߇ZL0yq%`4M&3fhIxW^o]Lѐ@%D ֱ=F\3ˣ$&&$: Q_7@EQ0JU2@O)R\\ޟn+Dk@0H D7xb, #11MNQa V.<;sOMW9K9sr,nIyVrF=oj2l0N>dQU>'?r.􈸻׋ RRqyL|@nPp/ 0.ȫv;EEEmTuMUmp3'PPBF419 B{XQ]]ͭyŋ)//o;o ( \Dsx `{76i4QHOO+;sii<-]؜`2?oGxjl&f<<\k5DB8| =~ hk.JJ>6/x[$Ip>p/@D߷˗b ΝW_ͨQHhIVIqJRRdN~  9FnT7#.h ꘪjv>ehQã[oѫzkcjs?rɁ,QPhB|܄~E:yN?tyf$&~4!h,Y–-[Th!ݜvӺl#slkZ1eeV#GP(Ut + =/#>;dkmRk״o ׇrs4iM6iȀ拶FTه%3?E!+t ,=W]uW^y%V_4hwf…-G|,͉4ỲjabCo4t=`dD>ӭy>O *Z@7dz~ЛDqL:o-[4i@㫠mƍy衇]Ro:{ Zh#yq/CC;3ڃ tfon2ZgE2\TE{F/O;ny=\}Q8o6 p"GJYYo72Pf\CϱuѻDo]_?㞸6^B0u544-tW nN zn!bקb͛YhQKnxQ;@[O?4+V-;w⤨!F&!A@#|x׃0nki>"os@_:g䩙҂,X54TU\y{ DO۷srUW{hE+WoiORAԀ?~`!@tCC/Y~̿K!e|f! ylMfX ]| |@XbӦMofo3g55a{}n,t97J8jA^~-p8Ni?ųi;+T!U[[1@Pw+2VЩpc$t:y/Ovv7ksロpU{WF@5oO *"~#y8jkkq_7Wt* 4s8ڨ,z-׬]@ O"{w/_~N,Xҥ_piSڽ`0gD*<A7xSEfkMM&Js,- '2:;].n@ۺu+5kV n˗Gg+䶻0pE#qn]SSfC!Zm- /odtNakώ7E? /n`ӦM5uk׮eΜ9soTߒ|1o@PZt+4MRUV@vWֺm6[rCYM@psFվDpK/1}tpN n޼3fPP <|(~?~=n۽ гx<*e>A |H@7۽#r;=j.8//{3fhѢNvϘ>}:%%-: ջ1z,h2|sjKt|***B?v떈h~HK>#:8޿{r ViE~͛={6]v1,}=\s5:ԢO5r` z;Y:*++ډ[B@(FB4svzWCCOR=? ëW梋.bܹl޼l6/WU$?TNKkaX\QC' ~G(--x;TYZVVCEEvzY4fs{ίm8O M~j͎gѢE}L> m۶6?nફj&B f%~S Ρ}v***(++ ,7(c:,.MQRRZ\\\r[5EJ`J #wy*9@HXVVG}G}( 0K.SN9cǒAZRR§~ٵ+N垝F}1{_Й?ZTR\\Liiii 'ήͷ̞hŢZmkTUEU?   GE]& ݃*』 o诬ow_dǎvjkkZ戫T\.999^9suG|$Cىw$}dtr9q:]\7n MsdZQTh|]QQAQQh9pw{ &X,VU;rM#/ Y7?]/ZCeQqYgűKZZXVbbbSwڵkYlr-FmXXTwyb ]OJqۚZQQ9SCC'fsr߾}[]ƲOs-tO֣' Cdvx&??|V^u)(ɤ:N_?GRIB%௴qc&/(Px.((Zѕ$y|iyyymqqq˿)`$!oh; @'p:z3jY~žz\.ב,=dd!ڡAU;gXКq[\\LYYY]YY=!XPPQ\\uMeM7~y Cnq"83W9kzx=w^43og  pSRRҐEӴY=h=]i'\.K^ 4  hmn[]v"Ѝu><‑8`0ld2\'ߙ5j4զ vSRRByyСC5MpDn{fnnD׫W%'NŬg qza3z$+ɮl'{v@,GA,GX}\. lyZ8@i[`ՓrB z]Mpd999t:cccD_&66ѩ(iRI7IԀtLWZ$UF9Ok~ hEU#&&&S]]nת nC鑈82jEEE+KJJ8pQn;YUUUQwف?Z˳oYU S ze`* J=&v+VWWDoa2OAKUEAU a0 UUUfUn۷7uui`3?<a-jBpx ;D)d2v- Ojn/?sݺuSaar'z-6 i-}렕1xmCCÈ#Z ]DǶy.BY  :B`t׻d6&8!>grn}}}pMNNN? =U-))l;1[l)ݫ5-z^(l>E[/B[īGsSTgH̵G5g*/cٲeKH}FQՠ5;Mݠ-<Ah+l'ypH>5 )1Qy:''w7|S& r`PRRrまNW@AS}gWڵ xwAvX)haӹ[`v:cF$ӉI'~|cr(t,&vƳ&Sdrƃ&ٴ%*u=B. `,^-bD [/ե\rlhhpkn4Vb,eᄏl|                                                                                            S6IDAT                                                       , MncyIENDB`klog-1.8.6/README-DEVEL0000644000175000017500000002077014166020407013165 0ustar develdevelThis is a file to read if you want to join the KLog development team. This document will explain the KLog architecture, requirements, tips and important to know things to take into account when joining the KLog development team. CONTENT: 1 - BEFORE CODING 2 - KLOG ARCHITECTURE 3 - BEFORE CODING 4 - CODING 5 - AFTER CODING 6 - GUI 7 - DOCUMENTATION 8 - TRANSLATIONS 9 - DEPLOYING 0 - MISSION AND OBJECTIVE The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. 0.1 - REQUIREMENTS - Able to run in Linux, macOS and Windows. - Easy to use. - Able to localize to any language. - Any data can be exportable into ADIF (http://www.adif.org). - Can import standard ADIF. - Can export to Cabrillo (http://www.kkn.net/~trey/cabrillo/). - Provides a user manual / documentation. 1 - BEFORE CODING: Read this document. Join the KLog mailing list and send a "Hello that's me and I am here" message: http//MAILINGLIST Interesting links: http://www.qtcentre.org/wiki/index.php?title=Keeping_the_GUI_Responsive Packer: http://upx.sourceforge.net/ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 2 - KLOG ARCHITECTURE KLog is intended to be a MODULAR software with the requirement to be modular ;-) so it is easy to add new features (mainly contests and awards support). 2.1 IMPORTANT THINGS TO HAVE IN MIND DEPRECATED - KLog version number is using the following system: Release versions: The Decimal part of the version number will always use even numbers like 0, 1.2, 2.20, ... while the decimal part of the development or Release Candidate versions will always be an odd number ie 0.1, 1.3, ... The release number is defined in the "main.cpp" file. - KLog should manage several logs. The "log" table of the DB has a column called "lognumber". ALL QSO has a lognumber id that identifies the log it belongs to. Each lognumber will have associated a Name and/or ID (TBD) so the user is able to "open" just that log. It is important that all the QSO operations are aware of this lognumber id. - The log table has a "marked" column. This column is to allow mass operations. Changing this column has to be done with care and leave it "unmarked" once the desired operation is finished. KLog should unmark(N) all QSO when starts and exits. Mark = 'X', unmark='N' or other. Marked column should not be saved. - Any change to the DB architecture must be communicated and agreed with the development team before commiting to the SVN and following the 2.4 DB UPDATES area in this document. 2.2 CONTEST SUPPORT The "Contest" class (in contest.h) is a base class and all the contest should inherit it. The "Contest" class has several virtual functions that should re-implemented in all derived classes. 2.2.1 ADDING A NEW CONTEST To add a new contest, a new class, inheriting the "Contest" class should be created. The new contest file should be named: "contest_nameofthecontest.h" and "contest_nameofthecontest.cpp" and should be included in the mainwindow.h All the calls to the contest class should be implemented in the virtual class. A new contest must include the implementation of all the functions of the virtual class. 2.3 AWARD SUPPORT 2.4 DB UPDATES A DB update consist on: - All the intended changes. - Update the softwarecontrol TABLE on the DB To update the DB structure there are several things to have in mind: - The current version of the DB is defined in database.h const float DBVersionf = 0.003; - All the actions to update the DB to the new structure are done here: DataBase::updateIfNeeded - After making any update = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 3 - BEFORE CODING Update your sources from the SVN: Remember that other developer may has done a commit. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 4 - CODING - The development language is English. - All Strings to be shown to the user must be translatable. i.e. tr("String") 4.1 - STYLE 4.2 - ADIF SUPPORT KLog is using some application defined ADIF fields: APP_{PROGRAMID}_{FIELDNAME} Header fields: APP_KLOG_LOG_DATE_EXPORT: The date and time (in UTC) when the log was exported. APP_KLOG_QSOS: The number of QSOs in the log. DEPRECATED: APP_KLOG_RELEASE: Release of KLog used to export the log file. CHANGED TO PROGRAMVERSION (ADIF standard) QSO fields: APP_KLOG_POINTS: Points given by the QSO. APP_KLOG_MULTIPLIER: Information about the multiplier status of the QSO. APP_KLOG_LOGN: Lognumber if the ADIF file contains several logs. KLog is also importing other application defined ADIF fields: APP_N1MM_POINTS: That is imported into the points column in the log table. KLog should not export any ADIF header that comming from other application without renaming it to APP_KLOG_ 4.3 SHORTCUTS Before adding or modifying any shortcut: - It should be agreed in the devel mailing list. - It should be as standard as possible, reuse the same shortcuts of main/popular contest software. - It should be checked and added to a list below. 4.4 DATA BASE - The DB version has to be checked and modified after a DB schema modification. - Any modification to the DB has to be provided with the code to update from any previous version. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 5 - AFTER CODING Test that your code compiles and does not break the previous code. Document your changes and close/update the tasks/bugs you have worked on. Remember to commit your code to the SVN. Try to do "atomic" commits. That is to commit updates that may be disabled as a block. i.e. A new function or a modification to a function. Don't commit several things at once if you can avoid it. This is just a recommendation to avoid big commits that, in case of a problem are difficult to trace. Document your commits: ALWAYS add a clear comment to the commits so it is easy to know what is it about. 5.1 TEST CHECKLIST Here is the list of tests to be done before releasing new software: - Install in a new installation of Windows/macOS - Upgrade from a previous version - Create a new log - Add a new QSO - Check that the DXCC & IOTA continent make sense - Check if QSO/worked DXCC, ... count changes - Edit a QSO from log - Modify at least one field in each tab - Edit a QSO from the search box - Remove a QSO - Update the DXCC status tab - Connect to the DXCluster - Click on a spot on the DXCluster - Export an ADIF file - Import an ADIF file - Remove KLog in Windows = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 6 - GUI 6.1 CONTEST GUI - The GUI should only have the data fields that are needed for that contest, keeping the GUI simple and easy to use. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 7 - DOCUMENTATION - One feature will not be considered completed until it is not added to the user manual. Please document in the klog-handbook.xml your feature so the user knows how to use it. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - TRANSLATIONS 9.1 ADDING TRANSLATIONS To add a new translation add the new language file to the klog.pro file following the sintax: TRANSLATIONS = KLog_es.ts \ klog_fr.ts Being es, fr, the ISO codes naming the language. After a translation is added, you also need to update the aboutdialog.cpp to include a new Translator line. 9.2 TRANSLATING Translators should work in the *.ts files. 9.2 UPDATING TRANSLATIONS Update translations: Run: lupdate -verbose klog.pro in the klog directory to update the language files = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - DEPLOYING Before deploying, translations should be updated. 9.1 DEPLOYING ON LINUX 9.2 DEPLOYING ON macOS Build KLog with QTCreator Run the following command from the build directory: mv klog.app KLog.app create new folder in KLog.app/Contents/PlugIns/sqldrivers copy $QT_DIR/plugins/sqldrivers/libqsqlite.dylib to the new folder (/Developer/Applications/Qt/plugins/) create new folder: KLog.app/Contents/MacOs/translations copy the *.qm (translation) files into KLog.app/Contents/MacOS/translations macdeployqt KLog.app/ -dmg mv KLog.dmg KLog-[VERSION].dmg 9.3 DEPLOYING ON WINDOWS Currently using an Open Source Licence of: BitRock InstallBuilder 9.4 ICON Follow this link for all the OS: http://doc.qt.io/qt-5/appicon.html Installer: http://en.wikipedia.org/wiki/List_of_installation_software klog-1.8.6/translations/0000755000175000017500000000000014166020421014157 5ustar develdevelklog-1.8.6/translations/klog_de.ts0000644000175000017500000134563314166020421016152 0ustar develdevel AboutDialog About KLog Über KLog By von KLog is a free logbook for hamradio operators. KLog ist ein freies Programm für Amateurradio-Operatoren. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Bitte geben Sie Ihre Bewertung auf der eHam-Seite für KLog an: Find more information and the latest release at Weitere Informationen und die neueste Version auf Author Autor today 2018 Main developer Hauptentwickler KLog is developed by a very small team and you are invited to join! KLog wird von einer kleinen Gruppe entwickelt, machen Sie mit. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. .Senden Sie Fehlerberichte oder kleine Korrekturen des Quelltextes, Ideen oder alles, was KLog verbessern könnte. Authors Autoren Translators bring KLog into your language. They are really an important part of the KLog development team. Übersetzer bringen KLog in Ihre Sprache. Sie sind wirklich ein wichtiger Bestandteil. des KLog-Entwicklungsteams. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Übersetzer Privacy advisory Hinweis zur Privatsphäre KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Zurzeit werden folgende Daten übertragen: Callsign Rufzeichen KLog version KLog-Version Operating system Betriebssystem KLog KLog Privacy Privatsphäre AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok OK Cancel Abbrechen DX Date/Time Datum/Zeit Band Band Mode Modus Not defined All Alle QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Neu berechnen Click to recalculate the award status. Klicken Sie, um den Diplom-Status neu zu berechnen. Select the year you want to check. Wählen Sie das Jahr, das Sie überprüfen möchten. QSOs QSOs DXCC DXCC CQ CQ Award Diplom Confirmed Bestätigt Worked Bearbeitet WAZ WAZ Score Bewertung Annual Number of confirmed DXCC entities. Anzahl der bestätigten DXCC-Einträge. Number of worked DXCC entities. Anzahl der bearbeiteten DXCC-Einträge. Number of confirmed WAZ zones. Anzahl der bestätigten WAZ-Zonen. Number of worked WAZ zones. Anzahl der bearbeiteten WAZ-Zonen. Number of confirmed QSOs. Anzahl der bestätigten QSOs. Number of worked QSOs. Anzahl der bearbeiteten QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Länderdaten herunterladen KLog needs country data... KLog benötigt Länderdaten ... &Download &Herunterladen &Ignore &Ignorieren Country data needed Länderdaten erforderlich KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Klicken Sie zum Starten auf Herunterladen. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Der Rechner wurde nicht gefunden. Bitte überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut Möchten Sie es erneut versuchen? DXCCStatusWidget Update Aktualisieren It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Eintrag Prefix Präfix Pref: CQ: ITU: Beam: Entity not worked in this band. Eintrag in diesem Band nicht bearbeitet. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Connect Verbinden Clear Löschen Click on connect to connect to the DX-Cluster Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Trying to connect to the server Es wird versucht, mit dem Server zu verbinden KLog DXCluster KLog-DX-Cluster The host was not found. Please check: Der Rechner wurde nicht gefunden, bitte überprüfen Sie: - your network connection; - the host name and port settings. - ihre Netzwerkverbindung - den Rechnernamen und Port-Einstellungen. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Die Verbindung ist von der Gegenstelle abgelehnt worden. Überprüfen Sie, dass der DX-Clusterserver erreichbar ist und dass der Rechnername und Port korrekt sind. The following error occurred: %1. Der folgende Fehler ist aufgetreten: %1. Connected to server Mit Server verbunden KLog message KLog-Nachricht Enter your callsign to connect to the cluster: Geben Sie Ihr Rufzeichen für die Verbindung zum DX-Cluster ein: Enter your password to connect to the cluster: (Just hit enter for no password) Geben Sie Ihr Passwort für die Verbindung zum Cluster ein: Oder drücken Sie die Eingabetaste für ein leeres Passwort Disconnect Verbindung trennen Not logged on, you may need to enter your callsign again. Sie sind nicht angemeldet, bitte geben Sie Ihr Rufzeichen nochmal ein. Enter here the commands to be sent to the DX-Cluster server. Geben Sie hier die Befehle ein, die an den DX-Cluster-Server gesendet werden. Connection closed by the server Verbindung durch den Server beendet Click on Connect to connect to the DX-Cluster server. Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen. Send Senden It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Keine Softwareversion für die Datenbank vorhanden Aircraft Scatter Common term in hamradio, do not translate if not sure Reflexion an Flugzeugen Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Erde-Mond-Erde Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Streuung durch Meteore Terrestrial or atmospheric repeater or transponder Terrestrische oder atmosphärische Reklektion oder Transponder Rain scatter Common term in hamradio, do not translate if not sure Streuung durch Regen Satellite Satellit Bureau Common term in hamradio, do not translate if not sure Büro Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure F2-Reflexion Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes Ja No Nein Requested Angefordert Ignore/Invalid Ignoriert/Ungültig Validated Geprüft Queued Eingereiht Uploaded Hochgeladen Do not upload Nicht hochladen Modified Geändert Direct Direkt Electronic Elektronik KLog DXCC KLog-DXCC KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Das Herunterladen von cty.csv ist mit folgendem Fehler fehlgeschlagen: Download of cty.csv done. Das Herunterladen von cty.csv ist abgeschlossen. There is already a cty.csv file in the folder but it will be replaced with the new one. Es gibt bereits eine Datei cty.file im Ordner, sie wird durch die neue Datei ersetzt. Could not open %1 for writing %1 lässt sich nicht zum Schreiben öffnen FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... ADIF-Datei wird geschrieben ... Abort writing Schreiben abbrechen QSO: QSO: Writing ADIF file... QSO: ADIF-Datei wird geschrieben ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Sie haben der Export der Datei abgebrochen. Die Datei wird entfernt und es werden keine Daten exportiert. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Möchten Sie immer noch abbrechen? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... LoTW-Datei wird gelesen ... Abort reading Lesen abbrechen Importing LoTW ADIF file... KLog - Log selection There is more than one log in this logfile. Es gibt mehrere Protokolle in dieser Protokolldatei. All logs will be imported into the current log. Alle Protokolle werden in die aktuelle Protokolldatei importiert. Do you want to continue? Möchten Sie fortfahren? Reading ADIF file... ADIF-Datei wird gelesen ... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... ADIF-Datei wird importiert ... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Offensichtlich gibt es einige doppelte QSOs in der ADIF-Datei, die Sie importieren möchten. Möchten Sie fortfahren? (Duplikate von QSOs werden nicht importiert) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? Please edit the ADIF file and make sure that it include at least: Bearbeiten Sie die ADIF-Datei und überprüfen Sie, ob sie mindesten Folgendes enthält: and und This QSO had: In diesem QSO-Eintrag: This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - Das Band fehlt bei dem folgenden Rufzeichen: - The mode missing and the following call: - Der Modus fehlt bei dem folgenden Rufzeichen: - The date missing and the following call: - Das Datum fehlt bei dem folgenden Rufzeichen: - The time missing and the following call: - Die Zeit fehlt bei dem folgenden Rufzeichen: Do you want to continue with the current file? Möchten Sie mit der aktuellen Datei fortfahren? KLog: Not all required data found! KLog: Es wurden nicht alle benötigten Daten gefunden KLog - No Station callsign entered. KLog - QSO without Station Callsign KLog: No RST TX found! KLog: Es wurden keine RST-TX-Daten gefunden KLog: No RST RX found! KLog: Es wurden keine RST-RX-Daten gefunden HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Select the serial port speed. Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. Default Standard 1 bit 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10 m 15M 15 m 20M 20 m 40M 40 m 80M 80 m 160M 160 m 2M 2 m 6M 6 m 12M 12 m 17M 17 m 30M 30 m 70CM 70 cm Continent Kontinent Prefix Präfix CQ CQ ITU ITU Short Path Kurzer Weg Long Path Langer Weg Deg Grad Miles Meilen Km km IntroPage Welcome to KLog! Willkommen bei KLog Welcome to KLog! - brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Welcome to KLog Willkommen bei KLog This looks like it's the first time you've run KLog on this computer. Anscheinend führen Sie KLog zum ersten Mal auf diesem Rechner aus. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Es unterstützt die Verwaltung von QSLs und Import sowie Export von ADIF-Dateien and Cabrillo file formats and many other features... Export in das Cabrillo-Dateiformat und viele weitere Funktionen ... Before you can start using KLog, you will be asked to: Ehe Sie KLog verwenden können, müssen Sie folgendes eingeben: Acknowledge to the terms of the license. Den Lizenzbedingungen zustimmen. Download the DX entities information. Informationen über DX-Einträge herunterladen. Enter your callsign, CQ zone, etc. and main configuration. Rufzeichen, CQ-Zone usw. eingeben und die wichtigsten Einstellungen vornehmen. Enjoy KLog and contact the development team if you have any suggestions! Viel Spaß mit KLog und kontaktieren Sie das Entwicklungsteam, wenn Sie Vorschläge zur Verbesserung haben. LicPage KLog License information Lizenz-Information für KLog Welcome to KLog!- brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Acknowledge Zustimmen Be aware that KLog is free software. KLog ist freie Software. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL gesendet QSL Rcvd QSL empfangen &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden Via bureau Über Büro QSL &received via bureau Empfangene QSL über Büro Direct Direkt QSL received via direc&t Direk&t empfangene QSL Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Hinzufügen &Clear &Löschen Callsign of the QSO. Band of the QSO. Band des QSO-Eintrags. Mode of the QSO. Modus des QSO-Eintrags. Date of the QSO. Datum des QSO-Eintrags. Time of the QSO. Zeit des QSO-Eintrags. Add the QSO to the log. QSO zum Protokoll hinzufügen Clears the QSO entry. Löscht den QSO-Eintrag. KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Rufzeichen DUPE Translator: DUPE is a common world for hams. Do not translate of not sure Duplikat &Modify &Bearbeiten MainWindow Starting KLog KLog wird gestartet DX Entity DX-Eintrag &Log Window &Protokollfenster KLog KLog KLog - File not open Status bar ... It seems that you have never done a backup or exported your log to ADIF. It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. It seems that you are running this version of KLog for the first time. The setup will be open to allow you to do any new setup you may need. Ready Bereit KLog - Unexpected error An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Es ist ein unerwarteter Fehler beim Hinzufügen der QSO-Daten zu Ihrer Protokolldatei aufgetreten. Bitte senden Sie einen Fehlerbericht an die Entwickler zur Analyse, falls das Problem weiterhin besteht. KLog - Select correct entity You have selected an entity: Sie haben folgenden Eintrag ausgewählt: that is different from the KLog proposed entity: Dieser Eintrag unterscheidet sich von dem durch KLog vorgeschlagenen Eintrag: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klicken Sie auf das Präfix, um den Eintrag zu korrigieren oder drücken Sie Abbrechen, um den QSO-Eintrag erneut zu bearbeiten. Click on the prefix of the right entity or Cancel to correct. Klicken Sie auf das Präfix rechts vom Eintrag oder drücken Sie „Abbrechen“ zur Korrektur. RSTrx RSTtx KLog - Select the Station Callsign. Do you really want to exit KLog? &File &Datei Import an ADIF file into the current log. Importiert eine ADIF-Datei in das aktuelle Protokoll. Export the current log to an ADIF logfile. Exportiert das aktuelle Protokoll in eine ADIF-Protokolldatei. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportiert alle QSOs in eine ADIF-Datei, dabei werden QSOs aus allen Protokollen zusammengeführt. Print your log. Druckt ein Protokoll. KLog folder KLog-Ordner Opens the data folder of KLog. Öffnen den Datenordner von KLog. E&xit &Beenden &Tools E&xtras Fill in QSO data QSO-Daten ausfüllen Go through the log reusing previous QSOs to fill missing information in other QSOs. Im Protokoll Daten früherer QSO-Einträge zum Ausfüllen fehlender Informationen in anderen QSO-Einträgen verwenden. Shows QSOs for which you should send your QSL and request the DX QSL. Anzeige von QSO-Einträgen, für die Sie Ihre QSLs versenden und die DX-QSL anfordern sollten. Find My-QSLs pending to send Ausstehende DX-QSLs zum Senden suchen Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Zeigt die QSL-Einträge mit ausstehenden Anforderungen zum Senden von QSLs. Diese Warteschlange sollten Sie bearbeiten. Mark all queued QSOs in this log as sent to LoTW. Alle eingereihten QSO-Einträge in diesem Protokoll als versendet zu LoTW markieren. Mark all queued QSOs as sent to LoTW. Alle eingereihten QSO-Einträge als versendet zu LoTW markieren. Sends the log to LoTW calling TQSL. It was not possible to open the debug file for writing. No debug log will be saved! KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. No DXCC None You have requested to delete the QSO with: %1 Sie haben das Löschen dieser QSO mit %1angefordert Are you sure? Sind Sie sicher? KLog needs to update the Entities database. The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - Club Log There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com For updated DX-Entity data, update cty.csv. Zur Aktualisierung der DX-Einträge laden Sie bitte die Datei „cty.csv“ erneut herunter. Stats Statistik Show the statistics of your radio activity. Zeigt eine Statistik Ihrer Funkaktivitäten. &Help &Hilfe &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Das ausgewählte Protokoll enthält mehrere Stations-Rufzeichen. Please select the station callsign you want to mark as sent to LoTW: Bitte wählen Sie das Stations-Rufzeichen, dass Sie als versendet zu LoTW markieren möchten: Station Callsign: Stations-Rufzeichen: Define Station Callsign Stations-Rufzeichen eingeben Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Geben Sie das Stations-Rufzeichen für dieses Protokoll ein oder lassen das Rufzeichen weg für QSOs ohne Stations-Rufzeichen: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Es wurde kein Stations-Rufzeichen ausgewählt, daher wird kein Protokoll markiert Congratulations! Glückwunsch You already have the latest version. Sie haben bereits die neueste Version. This function is disabled. Go to the Setup->LoTW tab to enable it. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? There was an error while updating to Yes the LoTW QSL sent information. You can find the KLog data folder here: Hier finden Sie den KLog-Datenordner: start Starten stop Anhalten If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Enthält die Datenbank tatsächlich QSOs, sie werden aber nicht gefunden, nehmen Sie mit den KLog.Entwicklern Kontakt auf, siehe Über KLog. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. KLog - Exit Check always the current callsign in QRZ.com KLog - CTY.dat update You can update the entities database in Tools->Update cty.csv Do you want to do it now? KLog - Backup KLog - New version detected! The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? KLog - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &About ... About Qt ... Check updates ... All pending QSOs of this log has been marked as queued for LoTW! Now you can upload them to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog - Update checking result It seems that there are no QSOs in the database. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL Upload the queued QSOs to LoTW This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - QRZ.com error KLog has received an error from QRZ.com. Queue all the QSOs to be uploaded Queue all the QSO to be uploaded You need to select one station callsign to be able to send your log to eQSL.cc. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Datum/Zeit Callsign Rufzeichen Printing the log ... KLog - QSO received Station Callsign Stations-Rufzeichen Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? QSO logged from WSJT-X: Protokollierte QSO von WSJT-X: The logfile has been modified. Die Protokolldatei wurde verändert. Do you want to save your changes? Möchten Sie Ihre Änderungen speichern? Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. UDP Server error The UDP server failed to %1. start or stop UDP-Serverfehler Der UDP-Server kann %1 nicht ausführen. Status of the DX entity. Status des DX-Eintrags. Name of the DX entity. Name des DX-Eintrags. QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Sonstige My Data Meine Daten Satellite Satellit DXCC DXCC Info Information Awards Diplome Search Suchen Log Protokoll DX-Cluster DX-Cluster No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 Save ADIF File ADIF-Datei speichern You need to select one station callsign to be able to send your log to LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog Club Log KLog - QRZ.COM QRZ.COM Open File Datei öffnen - Needed for DXMarathon - Erforderlich für den DX-Marathon Abort filling Ausfüllen abbrechen Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Anzahl Band Band Mode Modus Print Log Protokoll drucken Abort printing Drucken abbrechen Printing the log... QSO: Das Protokoll wird gedruckt ... QSO: The following QSO data has been received from WSJT-X to be logged: Die folgenden QSO-Daten wurden von WSJT-X zum protokollieren empfangen: Freq Frequenz Time On Time Off RST TX RST RX DX-Grid Local-Grid Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. If the received mode is correct, please contact KLog development team and request support for that mode Wenn der Empfangsmodus korrekt ist, nehmen Sie bitte Kontakt mit den KLog-Entwicklern auf und bitten Sie um Unterstützung für diesen Modus. KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. In der Datei wurde ein doppelter Satellit gefunden, er wird nicht importiert. Please check the satellite information file and ensure it is properly populated. Bitte überprüfen Sie die Datei mit den Informationen über Satelliten. Now you will see a more detailed error that can be used for debugging... Jetzt wird eine ausführlichere Fehlermeldung angezeigt, die für die Fehlersuche verwendet werden kann .. An unexpected error ocurred!! Es ist ein unerwarteter Fehler aufgetreten. If the problem persists, please contact the developers Bitte senden Sie einen Fehlerbericht, falls das Problem weiterhin besteht for analysis: für die Analyse: Error in function Fehler in Funktion Error text Fehlertext Failed query Abfrage fehlgeschlagen KLog - Show errors Do you want to keep showing errors? Möchten Sie Fehler weiter anzeigen? MainWindowInputComment Comment Kommentar Add a comment for this QSO. Fügen Sie einen Kommentar für diesen QSO-Eintrag hinzu Keep this data Diese Daten behalten Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. MainWindowInputEQSL Date of the ClubLog upload. Datum des Hochladens zu Club Log. Date of the QRZ.com upload. Date of the eQSL sending. eQSL-Sendedatum Date of the eQSL reception. eQSL-Empfangsdatum Date of the LoTW sending. LoTW-Sendedatum Date of the LoTW reception. LoTW-Empfangsdatum Status on ClubLog. Status auf Club Log. Status on QRZ.com. Status of the eQSL sending. Status des eQSL-Versands. Status of the eQSL reception. Status des eQSL-Empfangs. Status of the LoTW sending. Status des LoTW-Versands. Status of the LoTW reception. Status des LoTW-Empfangs. ClubLog Club Log QRZ.com eQSL Sent eQSL gesendet eQSL Rec eQSL empfangen LoTW Sent LoTW versendet LoTW Rec LoTW empfangen MainWindowInputOthers Primary Div Secondary Div IOTA IOTA Entity Eintrag Propagation mode Others Sonstige Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Wählen Sie den Eintrag für diese QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Wählen Sie den IOTA-Kontinent für diese QSO. Select the IOTA reference number for this QSO. Wählen Sie den IOTA-Referenznummer für diese QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nicht identifiziert Not - Not Identified Nicht - Nicht identifiziert SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL gesendet QSL Rec QSL empfangen QSL Via QSL über QSL Msg QSL-Nachricht Status of the QSL sending. Status des QSL-Versands. Status of the QSL reception. Status des QSL-Empfangs. QSL sending information. QSL-Sendeinformation QSL reception information. QSL-Empfangsinformation Date of the QSL sending. QSL-Sendedatum Date of the QSL reception. QSL-Empfangsdatum Message of the QSL. QSL-Nachricht QSL via information. QSL-Information über den Versand. MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. TX-Frequenz in MHz. RX Frequency in MHz. RX-Frequenz in MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watt MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Name QTH QTH DX Locator DX-Locator Power(rx) Leistung (RX) RST(tx) RST(rx) Freq TX TX-Frequenz Freq RX RX-Frequenz DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Watt Keep this data Diese Daten behalten My QTH locator. Mein QTH-Locator Power Leistung Operator callsign Station Callsign Stations-Rufzeichen My Locator Mein Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Diese Daten behalten Other - Sat not in the list Sonstige - Satellit nicht in der Liste Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Name des Satelliten, der nicht in der Liste vorhanden ist. Wählen Sie „%1“, um dieses Feld zu aktivieren. Verwenden Sie ein Format wie AO-51. Satellite mode used. Der Satellitenmodus wird verwendet. Select the satellite you are using. Wählen Sie einen Satelliten aus. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink DownLink Satellite Satellit Mode Modus DX Locator DX-Locator Other Sonstige MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO Kein Satellit zum QSO-Eintrag KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog hat einen unbekannten Satellitennamen gefunden. Wenn stattdessen ein bekannter Satellitenname verwendet werden soll, wählen Sie ihn aus der Liste. Nehmen Sie alternativ Kontakt mit den Entwicklern auf, damit der neue Satellitenname in KLog aufgenommen werden kann. The satellite you have in your QSO is: Der Satellit in Ihren QSO-Daten: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. RX-Frequenz in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frequency in MHz. TX-Frequenz in MHz. OnlineMessageWidget The server returned the following error: %1 Not identified Nicht identifiziert QObject New One, work it! Neu, wird bearbeitet. Needed, work it! Benötigt, wird bearbeitet. Worked but not confirmed Bearbeitet aber nicht bestätigt Confirmed Bestätigt Not identified Nicht identifiziert Database Error Datenbankfehler KLog DB needs to be upgraded. Die KLog-Datenbank muss aktualisiert werden. Do you want to upgrade it now? Möchten Sie sie jetzt aktualisieren? If DB is not upgraded KLog may not work properly. Wenn die Datenbank nicht aktualisiert wird, kann KLog nicht richtig funktionieren. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. Es wurden vorherige Protokolle in der Datenbank gefunden. Alle Daten werden in den neu erstellten DX-Protokolltyp migriert. KLog: Enter Station callsign KLog: Stations-Rufzeichen eingeben Enter the station callsign used in this log Geben Sie das Stations-Rufzeichen ein, das in diesem Protokoll verwendet wird Station Callsign Stations-Rufzeichen Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Modusinformation wird aktualisiert ... Abort updating Aktualisierung abbrechen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Das Abbrechen dieser Aktualisierung führt zu inkonsistenten Daten und möglicherweise zu Datenverlust. Möchten Sie immer noch abbrechen? Updating bands information... Bandinformation wird aktualisiert ... Updating bands information in %1 status... Band-Information im Status %1 wird aktualisiert ... Progress: Fortschritt: Updating mode information in %1 status... Modus-Information im Status %1 wird aktualisiert ... Updating information... Updating DXCC and Continent information... DXCC- und Kontinent-Informationen werden aktualisiert ... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Der Installationsassistent wurde abgebrochen, bevor die Installation abgeschlossen wurde ... Do you want to remove the KLog dir from your disk? Möchten Sie den KLog-Ordner von Ihrer Festplatte löschen? Your KLog dir has been removed Ihr KLog-Ordner wurde gelöscht Thank you for running KLog! Vielen Dank für die Nutzung von KLog. I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Remember that your KLog dir is on your system... Ihr KLog-Ordner ist immer noch auf Ihren System vorhanden ... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Datum Call Ruf RSTtx RSTrx Band Band Comment Kommentar Mode Modus CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL gesendet Force Init Freq Frequenz Freq RX RX-Frequenz Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW versendet Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Name Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL empfangen QSL Sent QSL gesendet QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Satellitenname SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear &Löschen &Export Highlighted Hervorgehobene &Exportieren &Select All &Alles auswählen &Search &Suchen Clear the searches. Suchen löschen Export the search result to an ADIF file. Exportiert alle Suchergebnisse in eine ADIF-Datei. Select/Unselect all the QSOs shown. Alle angezeigten QSO-Daten aus- oder abwählen.- Search in the log. Suchen im Protokoll. Search in all logs. Suchen in allen Protokollen. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection &Auswahl aufheben Save File Datei speichern You have requested to delete the QSO with: %1 Sie haben das Löschen dieser QSO mit %1angefordert Are you sure? Sind Sie sicher? SearchWindow Date/Time Datum/Zeit Band Band Mode Modus QSL Sent QSL gesendet QSL Rcvd QSL empfangen Station Callsign Stations-Rufzeichen ID Kennung Call Ruf Date/time Station callsign QSL Send QSL gesendet &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden Via bureau Über Büro QSL &received via bureau Empfangene QSL über Büro Direct Direkt QSL received via direc&t Direk&t empfangene QSL Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Meine QSL anfo&rdern Mark my QSL as requested Meine QSL als angefordert markieren Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL QSL anfo&rdern Mark the QSL as requested QSL als angefordert markieren Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL Um die QSL zu senden, sind die QSO-Daten nötig. My QSL requested to be sent Meine QSL, die gesendet werden sollen DX QSL pending to be received Zum Empfang ausstehende DX-QSL SetupDialog Bands/Modes Bänder/Modi DX-Cluster DX-Cluster Colors Farben Log widget Misc Verschiedenes World Editor World-Editor Logs Protokolle Satellites Satelliten HamLib Cancel Abbrechen OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Benutzerdaten D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Sie müssen mindestens ein Protokoll auf der Karteikarte Protokolle eingeben. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) World Welt Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Wählen Sie auf der Karteikarte Verschiedenes „Datenbank verschieben„ oder die Datenbank wird nicht an den neuen Ort verschoben. eLog DB has not been moved to new path. You have not selected the kind of log you want. Sie haben die Art des Protokolls nicht ausgewählt. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sie werden zur Karteikarte Protokolle weitergeleitet. Geben Sie die Art des Protokolls an oder wählen Sie ein Protokoll aus. SetupEntityDialog Entity Eintrag CQ CQ ITU ITU Latitude Breitengrad Longitude Längengrad UTC UTC Main prefix Haupt-Präfix ARRL ID ARRL-Kennung Prefixes Präfixe Comma separated possible prefixes, e.g. EA1, EA2, ... Durch Komma getrennte mögliche Präfixe wie zum Beispiel EA1, EA2, ... Ok OK Name of the Entity. Name des Eintrags. CQ zone. CQ-Zone ITU zone. ITU-Zone Longitude of the Entity. Längengrad des Eintrags. Local time difference to UTC. Lokale Zeitdifferenz zu UTC. Main prefix of the entity. Haupt-Präfix des Eintrags. ARRL ID. ARRL-Kennung. Date of the deletion. Datum der Löschung. Deleted Gelöscht Cancel Abbrechen Entity Dialog Eintragsdialog SetupPageBandMode Bands Bänder Modes Modi SetupPageColors New One Neu Needed in this band In diesem Band erforderlich Worked in this band In diesem Band bearbeitet Confirmed in this band In diesem Band bestätigt Default Standard WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Wählen Sie eine Farbe SetupPageDxCluster Add Hinzufügen Delete Löschen Show &HF spots &HF-Spots anzeigen Show V/&UHF spots V/&UHF-Spots anzeigen Show W&ARC spots W&ARC-Spots anzeigen Show &worked spots &Bearbeitete Spots anzeigen Show &confirmed spots Bestätigte &Spots anzeigen Show ANN/&FULL messages Show WW&V messages WW&V-Meldungen anzeigen Show WC&Y messages WC&Y-Meldungen anzeigen Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots DX-Spots Others Sonstige Messages Meldungen KLog: Add a DXCluster server KLog: DX-Clusterserver hinzufügen Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Geben Sie URL und Port an Beispiel: dxfun.com:8000 Ist kein Port angegeben, wird der Vorgabewert 41112 benutzt: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Geben Sie Ihr Passwort ein, das Sie für die Registrierung bei Club Log verwendet haben. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Sendet jeden QSO-Eintrag direkt zu Club Log, wenn sie in KLog hinzugefügt oder geändert werden. Starts the ClubLog support in KLog. Startet die Unterstützung für Club Log in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog Club Log eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Neu &Edit &Bearbeiten &Remove &Entfernen Add a new log. Fügt ein neues Protokoll hinzu. Edit the selected log. Bearbeitet das ausgewählte Protokoll. Remove the selected log. Entfernt das ausgewählte Protokoll. KLog KLog Do you really want to remove this log? Möchten Sie dieses Protokoll wirklich entfernen? All the QSOs from this log will also be deleted... QSOs QSOs The new log could not be created. Log has not been removed. (#3) Das Protokoll wurde nicht entfernt. (#3) Log has not been removed. (#2) Das Protokoll wurde nicht entfernt. (#2) Log has not been removed. (#1) Das Protokoll wurde nicht entfernt. (#1) ID Kennung Date Datum Station Callsign Stations-Rufzeichen Operators Operatoren Comments Kommentare An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageLogs KLog - Einrichtung der Protokolle SetupPageLogsNew &Date &Datum &Station Callsign &Stations-Rufzeichen &Operators &Operatoren Comm&ent Komm&entar &Ok &OK &Cancel &Abbrechen Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Rufzeichen für dieses Protokoll. Comma separated list of operators: callsign1, callsign2. Durch Komma getrennte Liste von Operatoren: rufzeichen1, rufzeichen2. Start date of this log. Anfangsdatum dieses Protokolls. SetupPageMisc &Imperial system &Imperiales System &Log in real time Sofort protoko&llieren &Time in UTC &Zeit in UTC &Save ADIF on exit ADIF-Datei beim Beenden &speichern Use this &default filename &Standard-Dateinamen verwenden Mark &QSO to send QSL when QSL is received &QSO zum Senden der QSL markieren, wenn die QSL empfangen wird Complete QSO with previous data QSO mit vorherigen Daten vervollständigen Show the Station &Callsign used in the search box Stations-Rufzeichen für das Suchfeld anzeigen &Check for new versions automatically Automatisch nach neuen Versionen su&chen &Provide Info for statistics &Statistik-Informationen bereitstellen Manage DX-Marathon Activate the application debug log Mark sent eQSL && LoTW in new QSO as queued Browse Durchsuchen Move DB Datenbank verschieben QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Die QSO-Einträge werden markiert, um eine QSL zu senden, wenn Sie eine DX-QSL empfangen und Ihre Daten nicht gesendet haben. The search box will also show the callsign on the air to do the QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Überprüft beim Programmstart, ob eine neue Version von KLog veröffentlicht wurde. Check non-valid calls &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Aktivieren Sie diese Einstellung, um das imperiale Maßsystem (Meilen statt Kilometer) zu verwenden. Select to use real time. Aktivieren Sie diese Einstellung, um die lokale Zeit zu benutzen. Select to use UTC time. Aktivieren Sie diese Einstellung, um die UTC-Zeit zu benutzen. Select if you want to save to ADIF on exit. Wählen Sie dies aus, wenn Sie die ADIF-Datei beim Beenden speichern möchten. Select to use the following name for the logfile without being asked for it again. Ist dies aktiviert, wird der Standard-Dateiname ohne weitere Nachfrage für die Protokolldatei verwendet. Complete the current QSO with previous QSO data. Der aktuelle QSO-Eintrag wird mit vorherigen QSO-Daten vervollständigt Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. Dies ist die Standarddatei, in der ADIF-Daten gespeichert werden. This is the directory where the database (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Click to change the default ADIF file. Klicken Sie, um die Standard-ADIF-Datei zu ändern. Click to change the path of the database. Klicken Sie, um den Pfad zur Datenbank zu ändern. Click to move the DB to the new directory. Klicken Sie, um die Datenbank in den neuen Ordner zu verschieben. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Datei öffnen Select Directory Ordner auswählen This is the directory where DB (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Please specify an existing directory where the database (logbook.dat) will be saved. Geben Sie bitte einen existierenden Ordner an, in dem die Datenbank „logbook.dat“ gespeichert wird. KLog - Move DB File moved Datei verschoben File copied Datei kopiert File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Datei nicht kopiert The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Der Zielordner existiert nicht, bitte wählen Sie einen existierenden Ordner. SetupPageSats &New &Neu &Edit &Bearbeiten &Remove &Entfernen &Import &Importieren E&xport E&xportieren Add a new satellite. Fügt einen neuen Satelliten hinzu. Edit the selected satellite. Bearbeitet den ausgewählten Satelliten. Remove the selected satellite. Entfernt den ausgewählten Satelliten. Export your current satellites to a file. Exportiert die aktuellen Satellitendaten in eine Datei. Select the sat you want to open. Wählen Sie die Satellitendaten, den Sie öffnen möchten. KLog KLog Do you really want to remove this satellite? Möchten Sie diese Satellitendaten wirklich entfernen? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Die Satellitendaten wurde nicht entfernt. (#3) Sat has not been removed. (#2) Die Satellitendaten wurde nicht entfernt. (#2) Sat has not been removed. (#1) Die Satellitendaten wurde nicht entfernt. (#1) ID Kennung Short Kurz Name Name Uplink Downlink Modes Modi An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageSats KLog - Einrichtungsseite Satelliten Open Satellites File Satellitendatei öffnen KLog warning KLog-Warnung An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File Satellitendatei speichern SetupPageSatsNew Short name Kurzname Sat name Satellitenname UpLink DownLink Modes Modi &Ok &OK &Cancel &Abbrechen Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Geben Sie den Namen des Satelliten ein. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Geben Sie die Modi in diesem Format ein: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Datum &Station Callsign &Stations-Rufzeichen &Operators &Operatoren Comm&ent Komm&entar &Ok &OK &Cancel &Abbrechen Callsign used for this log. Rufzeichen für dieses Protokoll. Comma separated list of operators: callsign1, callsign2. Durch Komma getrennte Liste von Operatoren: rufzeichen1, rufzeichen2. Start date of this log. Anfangsdatum dieses Protokolls. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Entfernen Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Das Protokoll wurde nicht entfernt. (#3) Log has not been removed. (#2) Das Protokoll wurde nicht entfernt. (#2) Log has not been removed. (#1) Das Protokoll wurde nicht entfernt. (#1) ID Kennung Name Name Short Name CQ Zone CQ-Zone ITU Zone ITU-Zone Deleted Gelöscht Start Date End Date DXCC DXCC An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server UDP-Server starten Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-Portnummer, auf der der UDP-Server auf Pakete lauscht. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Der UDP-Server empfängt QSOs, die von anderen Programmen wie WSJT-X, die in KLog automatisch protokolliert werden können. UDP Port UDP-Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Persönliche Daten Station &data Stations&daten Enter your name. Geben Sie ihren Namen ein. Enter your address - 1st line. Geben Sie ihre Adresse ein - 1. Zeile. Enter your address - 2nd line. Geben Sie ihre Adresse ein - 2. Zeile. Enter your address - 3rd line. Geben Sie ihre Adresse ein - 3. Zeile. Enter your address - 4th line. Geben Sie ihre Adresse ein - 4. Zeile. Enter your city. Geben Sie ihre Stadt ein. Enter your zip code. Geben Sie ihre Postleitzahl ein. Enter your province or state. Geben Sie das Bundesland oder den Staat ein. Enter your country. Geben Sie ihr Land ein. &Name &Name &Address &Adresse Cit&y &Stadt &Zip Code &Postleitzahl Pro&v/State &Bundesland/Staat Countr&y &Land Enter your information for rig Geben Sie Ihre Informationen über die Anlage (Rig) ein Enter your information for antenna Geben Sie Ihre Informationen über die Antenne ein Enter your power information. Geben Informationen über die Leistung ein. Enter the station callsign that will be used for logging. Geben Sie das Stations-Rufzeichen ein, das in den Protokollen verwendet wird. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Leistung Enter the operators (comma separated if more than one). Geben Sie die Operatoren ein und verwenden Sie das Komma als Trennzeichen bei mehreren Operatoren. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Geben Sie den Locator für Ihre Station ein. Alternativ kann in KLog ein geschätzter Locator auf der Basis Ihres Rufzeichens verwendet werden. &Callsign &Operators &Operatoren &CQ Zone &CQ-Zone &ITU Zone &ITU-Zone &Locator &Locator &Locator (not valid) &Locator (ungültig) SetupPageWorldEditor Add Hinzufügen Delete Löschen Edit Bearbeiten Export World Import World Still not implemented. Noch nicht implementiert. Import a new cty.csv file Eine neue datei cty.csv importieren An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Eine Datei „cty.csv“ mit Einträgen wurde in Ihrem KLog-Ordner gefunden. No entities information file (cty.csv) has been detected in your KLog folder. Es wurde keine Datei „cty.csv“ mit Einträgen in Ihrem KLog-Ordner gefunden. KLog will not be able to show entities information. KLog kann keine Informationen über Einträge anzeigen. Prefix Präfix Entity Eintrag ARRL ID ARRL-Kennung Continent Kontinent CQ Zone CQ-Zone ITU Zone ITU-Zone UTC UTC Latitude Breitengrad Longitude Längengrad Deleted Gelöscht Since Date Seit Datum To Date Bis Datum Open File Datei öffnen BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Die Informationen über Einträge wurden aktualisiert. Entities information has not been updated. Die Informationen über Einträge wurden nicht aktualisiert. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok OK DX Date/Time Datum/Zeit Band Band Mode Modus ShowErrorDialog KLog Message KLog-Nachricht SoftwareUpdateDialog Ok OK KLog update KLog-Aktualisierung <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Glückwunsch Your KLog has been updated. Ihr KLog ist aktualisiert worden. You already have the latest version. Sie haben bereits die neueste Version. StartWizard KLog - The free hamradio logging program KLog - das freie Programm für Amateurradio-Protokolle Quit Setup Einstellungen beenden Setup is not complete yet. Are you sure you want to quit setup? Die Einrichtung ist nicht vollständig. Möchten Sie wirklich abbrechen? StatisticsWidget QSO per year QSO pro Jahr DXCC per year DXCC pro Jahr CQ zones per year CQ-Zonen pro Jahr QSO per band QSO pro Band QSO per mode QSO pro Modus QSO per DXCC QSO pro DXCC QSO per Continent QSOs je Kontinent QSO per hour QSO pro Stunde QSO per month QSO pro Monat Worked / Confirmed status Status Bearbeitet / Bestätigt Worked / Sent status Status Bearbeitet / Bestätigt Sent / Confirmed status Status Versendet / Bestätigt Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen CQ zones CQ-Zonen CQ zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Years: %1/%2 Jahre: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Anzahl Callsign Rufzeichen Date Datum Band Band Mode Modus DXCC DXCC Satellite Satellit Confirmed Bestätigt No Nein StatsEntitiesPerYearBarChartWidget Chart title Diagrammtitel Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen DXCC Entities DXCC-Einträge DXCC Entities per year DXCC-Einträge pro Jahr Reading data ... Daten werden gelesen ... Entities: Einträge: StatsFieldPerBandWidget All Alle Mode: Band Band Worked Bearbeitet Confirmed Bestätigt StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Anzahl Callsign Rufzeichen Date Datum Band Band Mode Modus Grid Satellite Satellit Confirmed Bestätigt No Nein StatsQSOsPerBandBarChartWidget QSOs per band QSOs pro Band Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Bands Bänder QSOs per band distribution Reading data ... Daten werden gelesen ... Bands: Bänder: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs je Kontinent Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Continents Kontinente Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs pro DXCC Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Reading data... Daten werden gelesen ... DXCC DXCC Top ten DXCC per QSO Erste zehn DXCC pro QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs pro Stunde Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Hours Stunden QSOs at hour QSOs je Stunde Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs pro Modus Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Modes Modi QSOs per mode distribution Reading data ... Daten werden gelesen ... Modes: Modi: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs je Monat Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Jan Jan. Feb Feb. Mar März Apr Apr. May Mai Jun Jun. Jul Jul. Sep Sep. Oct Okt. Nov Nov. Dec Dez. Aug Aug. Months Monate QSOs at Month QSOs je Monat Reading data ... Daten werden gelesen ... Months: Monate: StatsQSOsPerYearBarChartWidget Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen QSOs QSOs QSOs per year QSOs pro Jahr Reading data ... Daten werden gelesen ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Versendet - %1 Confirmed - %2 Bestätigt - %2 Sent / Confirmed status Status Versendet / Bestätigt StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbeitet, nicht bestätigt - %1 Confirmed - %2 Bestätigt - %2 Worked / Confirmed status Status Bearbeitet / Bestätigt StatsWorkedSentPieChartWidget Worked - %1 Bearbeitet - %1 Sent - %2 Versendet - %2 Worked / Sent status Status Bearbeitet / Bestätigt TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Datei mit Satellitendaten wird gelesen ... Abort reading Lesen abbrechen The Satellites information has been updated. Die Informationen über Satelliten wurden aktualisiert. Open File Datei öffnen Sat Data Satellitendaten World Entity Eintrag Continent Kontinent Reading cty.csv... Die Datei „“cty.csv wird gelesen ... Abort reading Lesen abbrechen WorldMapWidget World map View Zoom In(25%) Zoom Out(25%) Normal Size Fit to window eLogClubLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung KLog - ClubLog KLog - Club Log Undefined error... Undefinierter Fehler ... Undefined error number (#%1)... QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Rufzeichen fehlt Invalid callsign Ungültiges Rufzeichen Skipping SWL callsign SWL-Rufzeichen wird übersprungen Callsign is your own call Dies ist Ihr eigenes Rufzeichen Invalid callsign with no DXCC mapping Ungültiges Rufzeichen, Zuordnung zu DXCC fehlt Updated QSO QSO aktualisiert Invalid ADIF record Ungültiger ADIF-Eintrag Missing ADIF record Fehlender ADIF-Eintrag Test mode - parameters ok, no action taken Testmodus - Parameter sind korrekt, es wird keine Aktion ausgeführt Excessive API Usage Excessive API-Benutzung Internal Error Interner Fehler Rejected Abgelehnt QSO Duplicate QSO-Duplikat QSO Modified QSO geändert Missing Login Anmeldung fehlt QSO OK QSO in Ordnung Upload denied Hochladen abgelehnt No callsign selected Kein Rufzeichen ausgewählt No match found Keine Übereinstimmungen gefunden Dropped QSO QSO verworfenen OK OK Login rejected Anmeldung abgelehnt Rejected: Callsign is your own call Abgelehnt: Dies ist Ihr eigenes Rufzeichen eLogQrzLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Rufzeichen fehlt eQSLUtilities Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/translations/klog.pot0000644000175000017500000033704314166020407015655 0ustar develdevelmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" #: ../aboutdialog.cpp:28 msgctxt "AboutDialog|" msgid "About KLog" msgstr "" #: ../aboutdialog.cpp:35 msgctxt "AboutDialog|" msgid "By" msgstr "" #: ../aboutdialog.cpp:37 msgctxt "AboutDialog|" msgid "KLog is a free logbook for hamradio operators." msgstr "" #: ../aboutdialog.cpp:38 msgctxt "AboutDialog|" msgid "" "Please know that this is an BETA release and it may contain many " "bugs.
Backup your data before using this software!" msgstr "" #: ../aboutdialog.cpp:40 msgctxt "AboutDialog|" msgid "" "KLog has been fully rewritten from the 0.6.2 to be able to provide a " "cross-platform application that runs in the main operating systems (Linux, " "macOS & Windows) and provide new functionalities that KLog was not providing." msgstr "" #: ../aboutdialog.cpp:42 msgctxt "AboutDialog|" msgid "Please provide your review in KLog's eHam review page:" msgstr "" #: ../aboutdialog.cpp:45 msgctxt "AboutDialog|" msgid "Find more information and the latest release at" msgstr "" #: ../aboutdialog.cpp:46 msgctxt "AboutDialog|" msgid "Author" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "today" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "Main developer" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "KLog is developed by a very small team and you are invited to join!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "If you want to provide support you are welcome to join the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "You can also help us by sending bug reports or small code contributions, " "ideas or whatever you think may improve KLog." msgstr "" #: ../aboutdialog.cpp:74 ../aboutdialog.cpp:145 msgctxt "AboutDialog|" msgid "Authors" msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "Translators bring KLog into your language. They are really an important part " "of the KLog development team." msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "If KLog is still not in your language and you want to help us, you are " "welcome to contact us through the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:90 ../aboutdialog.cpp:146 msgctxt "AboutDialog|" msgid "Translators" msgstr "" #: ../aboutdialog.cpp:102 msgctxt "AboutDialog|" msgid "Privacy advisory" msgstr "" #: ../aboutdialog.cpp:103 msgctxt "AboutDialog|" msgid "" "KLog developers have included a feature that reports some user data to the " "KLog server with the sole purpose of identifying the number of installed " "versions, to focus development in one direction or another taking into " "account user's needs" msgstr "" #: ../aboutdialog.cpp:104 msgctxt "AboutDialog|" msgid "At present, the data that is provided is the following:" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Callsign" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "KLog version" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Operating system" msgstr "" #: ../aboutdialog.cpp:106 msgctxt "AboutDialog|" msgid "" "Be aware that you can enable/disable this feature from the Misc tab in the " "Setup page" msgstr "" #: ../aboutdialog.cpp:144 msgctxt "AboutDialog|" msgid "KLog" msgstr "" #: ../aboutdialog.cpp:147 msgctxt "AboutDialog|" msgid "Privacy" msgstr "" #: ../startwizard.cpp:914 msgctxt "CTYPage|" msgid "Country data download" msgstr "" #: ../startwizard.cpp:917 msgctxt "CTYPage|" msgid "KLog needs country data..." msgstr "" #: ../startwizard.cpp:922 msgctxt "CTYPage|" msgid "&Download" msgstr "" #: ../startwizard.cpp:923 msgctxt "CTYPage|" msgid "&Ignore" msgstr "" #: ../startwizard.cpp:942 msgctxt "CTYPage|" msgid "Country data needed" msgstr "" #: ../startwizard.cpp:945 msgctxt "CTYPage|" msgid "" "KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC " "information." msgstr "" #: ../startwizard.cpp:947 msgctxt "CTYPage|" msgid "" "You need to download the cty.csv file if you want KLog to show you the " "countries, locator, ... of the QSOs you do." msgstr "" #: ../startwizard.cpp:949 msgctxt "CTYPage|" msgid "Click on Download to download now." msgstr "" #: ../startwizard.cpp:1025 msgctxt "CTYPage|" msgid "KLog" msgstr "" #: ../startwizard.cpp:1026 msgctxt "CTYPage|" msgid "" "I can't find the host. Please check your network and try again\n" "Do you want to try again?" msgstr "" #: ../dxccstatuswidget.cpp:48 msgctxt "DXCCStatusWidget|" msgid "Update" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "ID" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "Entity" msgstr "" #: ../dxccstatuswidget.cpp:372 msgctxt "DXCCStatusWidget|" msgid "Entity not worked in this band." msgstr "" #: ../dxcluster.cpp:70 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server" msgstr "" #: ../dxcluster.cpp:74 ../dxcluster.cpp:533 msgctxt "DXClusterWidget|" msgid "Connect" msgstr "" #: ../dxcluster.cpp:75 ../dxcluster.cpp:512 ../dxcluster.cpp:591 #: ../dxcluster.cpp:596 msgctxt "DXClusterWidget|" msgid "Clear" msgstr "" #: ../dxcluster.cpp:151 msgctxt "DXClusterWidget|" msgid "Click on connect to connect to the DX-Cluster" msgstr "" #: ../dxcluster.cpp:210 msgctxt "DXClusterWidget|" msgid "Trying to connect to the server" msgstr "" #: ../dxcluster.cpp:221 ../dxcluster.cpp:227 ../dxcluster.cpp:234 msgctxt "DXClusterWidget|" msgid "KLog DXCluster" msgstr "" #: ../dxcluster.cpp:222 msgctxt "DXClusterWidget|" msgid "The host was not found. Please check:" msgstr "" #: ../dxcluster.cpp:223 msgctxt "DXClusterWidget|" msgid "" "- your network connection;\n" "- the host name and port settings." msgstr "" #: ../dxcluster.cpp:228 msgctxt "DXClusterWidget|" msgid "" "The connection was refused by the peer. Make sure the DXCluster server is " "running, and check that the host name and port settings are correct." msgstr "" #: ../dxcluster.cpp:235 #, qt-format msgctxt "DXClusterWidget|" msgid "The following error occurred: %1." msgstr "" #: ../dxcluster.cpp:485 msgctxt "DXClusterWidget|" msgid "Connected to server" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "KLog message" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 msgctxt "DXClusterWidget|" msgid "Enter your callsign to connect to the cluster:" msgstr "" #: ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "" "Enter your password to connect to the cluster:\n" "(Just hit enter for no password)" msgstr "" #: ../dxcluster.cpp:511 ../dxcluster.cpp:590 msgctxt "DXClusterWidget|" msgid "Disconnect" msgstr "" #: ../dxcluster.cpp:515 msgctxt "DXClusterWidget|" msgid "Not logged on, you may need to enter your callsign again." msgstr "" #: ../dxcluster.cpp:519 msgctxt "DXClusterWidget|" msgid "Enter here the commands to be sent to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:529 msgctxt "DXClusterWidget|" msgid "Connection closed by the server" msgstr "" #: ../dxcluster.cpp:535 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:595 msgctxt "DXClusterWidget|" msgid "Send" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "Software version in DB is null" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "No query failed" msgstr "" #: ../dataproxy_sqlite.cpp:3027 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Aircraft Scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3031 msgctxt "DataProxy_SQLite|" msgid "Aurora" msgstr "" #: ../dataproxy_sqlite.cpp:3035 msgctxt "DataProxy_SQLite|" msgid "Aurora-E" msgstr "" #: ../dataproxy_sqlite.cpp:3039 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Back scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3043 msgctxt "DataProxy_SQLite|" msgid "Earth-Moon-Earth" msgstr "" #: ../dataproxy_sqlite.cpp:3047 msgctxt "DataProxy_SQLite|" msgid "Sporadic E" msgstr "" #: ../dataproxy_sqlite.cpp:3051 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Field Aligned Irregularities" msgstr "" #: ../dataproxy_sqlite.cpp:3055 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "F2 Reflection" msgstr "" #: ../dataproxy_sqlite.cpp:3059 msgctxt "DataProxy_SQLite|" msgid "Internet-assisted" msgstr "" #: ../dataproxy_sqlite.cpp:3063 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Ionoscatter" msgstr "" #: ../dataproxy_sqlite.cpp:3067 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Meteor scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3071 msgctxt "DataProxy_SQLite|" msgid "Terrestrial or atmospheric repeater or transponder" msgstr "" #: ../dataproxy_sqlite.cpp:3075 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Rain scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3079 msgctxt "DataProxy_SQLite|" msgid "Satellite" msgstr "" #: ../dataproxy_sqlite.cpp:3083 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Trans-equatorial" msgstr "" #: ../dataproxy_sqlite.cpp:3087 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Tropospheric ducting" msgstr "" #: ../dataproxy_sqlite.cpp:3639 ../dataproxy_sqlite.cpp:3706 msgctxt "DataProxy_SQLite|" msgid "Yes" msgstr "" #: ../dataproxy_sqlite.cpp:3643 ../dataproxy_sqlite.cpp:3710 msgctxt "DataProxy_SQLite|" msgid "No" msgstr "" #: ../dataproxy_sqlite.cpp:3647 ../dataproxy_sqlite.cpp:3714 msgctxt "DataProxy_SQLite|" msgid "Requested" msgstr "" #: ../dataproxy_sqlite.cpp:3651 ../dataproxy_sqlite.cpp:3722 msgctxt "DataProxy_SQLite|" msgid "Ignore/Invalid" msgstr "" #: ../dataproxy_sqlite.cpp:3655 msgctxt "DataProxy_SQLite|" msgid "Validated" msgstr "" #: ../dataproxy_sqlite.cpp:3718 msgctxt "DataProxy_SQLite|" msgid "Queued" msgstr "" #: ../dataproxy_sqlite.cpp:3770 msgctxt "DataProxy_SQLite|" msgid "Uploaded" msgstr "" #: ../dataproxy_sqlite.cpp:3774 msgctxt "DataProxy_SQLite|" msgid "Do not upload" msgstr "" #: ../dataproxy_sqlite.cpp:3778 msgctxt "DataProxy_SQLite|" msgid "Modified" msgstr "" #: ../dataproxy_sqlite.cpp:3828 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Bureau" msgstr "" #: ../dataproxy_sqlite.cpp:3832 msgctxt "DataProxy_SQLite|" msgid "Direct" msgstr "" #: ../dataproxy_sqlite.cpp:3836 msgctxt "DataProxy_SQLite|" msgid "Electronic" msgstr "" #: ../dataproxy_sqlite.cpp:3840 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Manager" msgstr "" #: ../dataproxy_sqlite.cpp:4862 msgctxt "DataProxy_SQLite|" msgid "KLog DXCC" msgstr "" #: ../dataproxy_sqlite.cpp:4863 msgctxt "DataProxy_SQLite|" msgid "All QSOs have been updated with a DXCC and the Continent." msgstr "" #: ../downloadcty.cpp:64 msgctxt "DownLoadCTY|" msgid "Download of cty.csv failed with the following error code: " msgstr "" #: ../downloadcty.cpp:76 msgctxt "DownLoadCTY|" msgid "Download of cty.csv done." msgstr "" #: ../downloadcty.cpp:147 msgctxt "DownLoadCTY|" msgid "" "There is already a cty.csv file in the folder but it will be replaced with " "the new one." msgstr "" #: ../downloadcty.cpp:177 #, qt-format msgctxt "DownLoadCTY|" msgid "Could not open %1 for writing" msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "Please select the station callsign you want to export the log from:" msgstr "" #: ../filemanager.cpp:202 msgctxt "FileManager|" msgid "Station Callsign:" msgstr "" #: ../filemanager.cpp:211 msgctxt "FileManager|" msgid "Define Station Callsign" msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "You have selected no callsign. KLog will export QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../filemanager.cpp:224 msgctxt "FileManager|" msgid "" "No station callsign has been selected and therefore no log will be exported" msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 msgctxt "FileManager|" msgid "Writing ADIF file..." msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Abort writing" msgstr "" #: ../filemanager.cpp:441 msgctxt "FileManager|" msgid "Exporting LoTW ADIF file..." msgstr "" #: ../filemanager.cpp:441 ../filemanager.cpp:3589 msgctxt "FileManager|" msgid " QSO: " msgstr "" #: ../filemanager.cpp:2626 msgctxt "FileManager|" msgid "" "Writing ADIF file...\n" " QSO: " msgstr "" #: ../filemanager.cpp:2634 msgctxt "FileManager|" msgid "" "You have canceled the file export. The file will be removed and no data will " "be exported." msgstr "" #: ../filemanager.cpp:2634 ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "Do you still want to cancel?" msgstr "" #: ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Writing Cabrillo file..." msgstr "" #: ../filemanager.cpp:2967 msgctxt "FileManager|" msgid "KLog: Cabrillo Log Export not implemented" msgstr "" #: ../filemanager.cpp:2968 msgctxt "FileManager|" msgid "" "I am sorry but the Cabrillo Export To File feature has still not been " "implemented." msgstr "" #: ../filemanager.cpp:3100 msgctxt "FileManager|" msgid "Reading LoTW file..." msgstr "" #: ../filemanager.cpp:3100 ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Abort reading" msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "There is more than one log in this logfile." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "All logs will be imported into the current log." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "Do you want to continue?" msgstr "" #: ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Reading ADIF file..." msgstr "" #: ../filemanager.cpp:3589 msgctxt "FileManager|" msgid "Importing ADIF file..." msgstr "" #: ../filemanager.cpp:3616 msgctxt "FileManager|" msgid "" "It seems that there are some duplicated QSOs in the ADIF file you are " "importing. Do you want to continue? (Duped QSOs will not be imported)" msgstr "" #: ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "" "You have cancelled the file import. The file will be removed and no data " "will be imported." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO is not including the minimum data to consider a QSO as valid!." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "Please edit the ADIF file and make sure that it include at least:" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "and" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO had:" msgstr "" #: ../filemanager.cpp:4777 msgctxt "FileManager|" msgid " - The band missing and the following call: " msgstr "" #: ../filemanager.cpp:4782 msgctxt "FileManager|" msgid " - The call missing but was done at this time: " msgstr "" #: ../filemanager.cpp:4787 msgctxt "FileManager|" msgid " - The mode missing and the following call: " msgstr "" #: ../filemanager.cpp:4792 msgctxt "FileManager|" msgid " - The date missing and the following call: " msgstr "" #: ../filemanager.cpp:4797 msgctxt "FileManager|" msgid " - The time missing and the following call: " msgstr "" #: ../filemanager.cpp:4802 msgctxt "FileManager|" msgid "Do you want to continue with the current file?" msgstr "" #: ../filemanager.cpp:4806 msgctxt "FileManager|" msgid "KLog: Not all required data found!" msgstr "" #: ../filemanager.cpp:4830 msgctxt "FileManager|" msgid "This log seems to lack of RST-TX information." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "Click on Yes to add a default 59 to all QSO with a similar problem." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "If you select NO, the QSO may not be imported." msgstr "" #: ../filemanager.cpp:4831 msgctxt "FileManager|" msgid "KLog: No RST TX found!" msgstr "" #: ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "This log seems to lack of RST-RX information." msgstr "" #: ../filemanager.cpp:4854 msgctxt "FileManager|" msgid "KLog: No RST RX found!" msgstr "" #: ../infowidget.cpp:48 msgctxt "InfoWidget|" msgid "10M" msgstr "" #: ../infowidget.cpp:49 msgctxt "InfoWidget|" msgid "15M" msgstr "" #: ../infowidget.cpp:50 msgctxt "InfoWidget|" msgid "20M" msgstr "" #: ../infowidget.cpp:51 msgctxt "InfoWidget|" msgid "40M" msgstr "" #: ../infowidget.cpp:52 msgctxt "InfoWidget|" msgid "80M" msgstr "" #: ../infowidget.cpp:53 msgctxt "InfoWidget|" msgid "160M" msgstr "" #: ../infowidget.cpp:54 msgctxt "InfoWidget|" msgid "2M" msgstr "" #: ../infowidget.cpp:55 msgctxt "InfoWidget|" msgid "6M" msgstr "" #: ../infowidget.cpp:56 msgctxt "InfoWidget|" msgid "12M" msgstr "" #: ../infowidget.cpp:57 msgctxt "InfoWidget|" msgid "17M" msgstr "" #: ../infowidget.cpp:58 msgctxt "InfoWidget|" msgid "30M" msgstr "" #: ../infowidget.cpp:59 msgctxt "InfoWidget|" msgid "70CM" msgstr "" #: ../infowidget.cpp:74 msgctxt "InfoWidget|" msgid "Continent" msgstr "" #: ../infowidget.cpp:78 msgctxt "InfoWidget|" msgid "Prefix" msgstr "" #: ../infowidget.cpp:82 msgctxt "InfoWidget|" msgid "CQ" msgstr "" #: ../infowidget.cpp:86 msgctxt "InfoWidget|" msgid "ITU" msgstr "" #: ../infowidget.cpp:90 msgctxt "InfoWidget|" msgid "Short Path" msgstr "" #: ../infowidget.cpp:93 msgctxt "InfoWidget|" msgid "Long Path" msgstr "" #: ../infowidget.cpp:96 ../infowidget.cpp:101 msgctxt "InfoWidget|" msgid "Deg" msgstr "" #: ../infowidget.cpp:314 ../infowidget.cpp:315 msgctxt "InfoWidget|" msgid "Miles" msgstr "" #: ../infowidget.cpp:321 ../infowidget.cpp:322 msgctxt "InfoWidget|" msgid "Km" msgstr "" #: ../startwizard.cpp:141 msgctxt "IntroPage|" msgid "Welcome to KLog!" msgstr "" #: ../startwizard.cpp:143 msgctxt "IntroPage|" msgid "Welcome to KLog! - brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:151 msgctxt "IntroPage|" msgid "Welcome to KLog" msgstr "" #: ../startwizard.cpp:152 msgctxt "IntroPage|" msgid "This looks like it's the first time you've run KLog on this computer." msgstr "" #: ../startwizard.cpp:153 msgctxt "IntroPage|" msgid "" "KLog is a free hamradio logging program that can run on Linux macOS and " "Windows." msgstr "" #: ../startwizard.cpp:154 msgctxt "IntroPage|" msgid "It is designed to provide general purpose, DX and contest logging." msgstr "" #: ../startwizard.cpp:155 msgctxt "IntroPage|" msgid "It supports QSL management, import and export of ADIF " msgstr "" #: ../startwizard.cpp:156 msgctxt "IntroPage|" msgid "and Cabrillo file formats and many other features..." msgstr "" #: ../startwizard.cpp:157 msgctxt "IntroPage|" msgid "Before you can start using KLog, you will be asked to:" msgstr "" #: ../startwizard.cpp:158 msgctxt "IntroPage|" msgid "Acknowledge to the terms of the license." msgstr "" #: ../startwizard.cpp:159 msgctxt "IntroPage|" msgid "Download the DX entities information." msgstr "" #: ../startwizard.cpp:160 msgctxt "IntroPage|" msgid "Enter your callsign, CQ zone, etc. and main configuration." msgstr "" #: ../startwizard.cpp:161 msgctxt "IntroPage|" msgid "" "Enjoy KLog and contact the development team if you have any suggestions!" msgstr "" #: ../startwizard.cpp:182 msgctxt "LicPage|" msgid "KLog License information" msgstr "" #: ../startwizard.cpp:185 msgctxt "LicPage|" msgid "Welcome to KLog!- brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:826 msgctxt "LicPage|" msgid "Acknowledge" msgstr "" #: ../startwizard.cpp:827 msgctxt "LicPage|" msgid "Be aware that KLog is free software." msgstr "" #: ../logmodel.cpp:105 msgctxt "LogModel|" msgid "Date" msgstr "" #: ../logmodel.cpp:108 msgctxt "LogModel|" msgid "Time" msgstr "" #: ../logmodel.cpp:111 msgctxt "LogModel|" msgid "QRZ" msgstr "" #: ../logmodel.cpp:114 msgctxt "LogModel|" msgid "Band" msgstr "" #: ../logmodel.cpp:117 msgctxt "LogModel|" msgid "Mode" msgstr "" #: ../logmodel.cpp:120 msgctxt "LogModel|" msgid "RSTtx" msgstr "" #: ../logmodel.cpp:123 msgctxt "LogModel|" msgid "RSTrx" msgstr "" #: ../logmodel.cpp:126 msgctxt "LogModel|" msgid "Comment" msgstr "" #: ../logwindow.cpp:209 msgctxt "LogWindow|" msgid "QSL Send" msgstr "" #: ../logwindow.cpp:221 msgctxt "LogWindow|" msgid "QSL Rcvd" msgstr "" #: ../logwindow.cpp:278 msgctxt "LogWindow|" msgid "&Delete" msgstr "" #: ../logwindow.cpp:280 msgctxt "LogWindow|" msgid "Delete a QSO" msgstr "" #: ../logwindow.cpp:283 msgctxt "LogWindow|" msgid "&Edit QSO" msgstr "" #: ../logwindow.cpp:285 msgctxt "LogWindow|" msgid "Edit this QSO" msgstr "" #: ../logwindow.cpp:288 msgctxt "LogWindow|" msgid "Via &bureau" msgstr "" #: ../logwindow.cpp:290 msgctxt "LogWindow|" msgid "Send this QSL via bureau" msgstr "" #: ../logwindow.cpp:293 msgctxt "LogWindow|" msgid "D&irect" msgstr "" #: ../logwindow.cpp:295 msgctxt "LogWindow|" msgid "Send this QSL via direct" msgstr "" #: ../logwindow.cpp:298 msgctxt "LogWindow|" msgid "Via bureau" msgstr "" #: ../logwindow.cpp:300 msgctxt "LogWindow|" msgid "QSL &received via bureau" msgstr "" #: ../logwindow.cpp:303 msgctxt "LogWindow|" msgid "Direct" msgstr "" #: ../logwindow.cpp:305 msgctxt "LogWindow|" msgid "QSL received via direc&t" msgstr "" #: ../logwindow.cpp:386 msgctxt "LogWindow|" msgid "You have requested to delete this QSO." msgstr "" #: ../logwindow.cpp:387 msgctxt "LogWindow|" msgid "Are you sure?" msgstr "" #: ../mainwindow.cpp:183 msgctxt "MainWindow|" msgid "Recalculate" msgstr "" #: ../mainwindow.cpp:184 msgctxt "MainWindow|" msgid "Click to recalculate the award status." msgstr "" #: ../mainwindow.cpp:210 msgctxt "MainWindow|" msgid "Starting KLog" msgstr "" #: ../mainwindow.cpp:314 ../mainwindow.cpp:909 ../mainwindow.cpp:3171 #: ../mainwindow.cpp:3234 msgctxt "MainWindow|" msgid "&Add" msgstr "" #: ../mainwindow.cpp:317 msgctxt "MainWindow|" msgid "&Clear" msgstr "" #: ../mainwindow.cpp:320 msgctxt "MainWindow|" msgid "Status bar..." msgstr "" #: ../mainwindow.cpp:321 msgctxt "MainWindow|" msgid "DX Entity" msgstr "" #: ../mainwindow.cpp:323 msgctxt "MainWindow|" msgid "&Log Window" msgstr "" #: ../mainwindow.cpp:324 msgctxt "MainWindow|" msgid "&Score Window" msgstr "" #: ../mainwindow.cpp:334 msgctxt "MainWindow|" msgid "Watts" msgstr "" #: ../mainwindow.cpp:339 ../mainwindow.cpp:344 msgctxt "MainWindow|" msgid "MHz" msgstr "" #: ../mainwindow.cpp:428 ../mainwindow.cpp:4135 msgctxt "MainWindow|" msgid "KLog" msgstr "" #: ../mainwindow.cpp:480 ../mainwindow.cpp:4476 ../mainwindow.cpp:7813 msgctxt "MainWindow|" msgid "DX-Marathon" msgstr "" #: ../mainwindow.cpp:487 ../mainwindow.cpp:4482 ../mainwindow.cpp:7822 msgctxt "MainWindow|" msgid "Annual" msgstr "" #: ../mainwindow.cpp:663 msgctxt "MainWindow|" msgid "Ready" msgstr "" #: ../mainwindow.cpp:875 msgctxt "MainWindow|" msgid "" "An unexpected error ocurred when trying to add the QSO to your log. If the " "problem persists, please contact the developer for analysis: " msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "You have selected an entity:" msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "that is different from the KLog proposed entity:" msgstr "" #: ../mainwindow.cpp:1068 msgctxt "MainWindow|" msgid "" "Click on the prefix of the correct entity or Cancel to edit the QSO again." msgstr "" #: ../mainwindow.cpp:1771 msgctxt "MainWindow|" msgid "Click on the prefix of the right entity or Cancel to correct." msgstr "" #: ../mainwindow.cpp:2438 ../mainwindow.cpp:5087 msgctxt "MainWindow|" msgid "QRZ of the QSO." msgstr "" #: ../mainwindow.cpp:2439 ../mainwindow.cpp:5088 msgctxt "MainWindow|" msgid "TX RST." msgstr "" #: ../mainwindow.cpp:2440 ../mainwindow.cpp:5089 msgctxt "MainWindow|" msgid "RX RST." msgstr "" #: ../mainwindow.cpp:2441 ../mainwindow.cpp:5090 msgctxt "MainWindow|" msgid "TX Exchange." msgstr "" #: ../mainwindow.cpp:2442 ../mainwindow.cpp:5091 msgctxt "MainWindow|" msgid "RX Exchange." msgstr "" #: ../mainwindow.cpp:2443 ../mainwindow.cpp:5092 msgctxt "MainWindow|" msgid "Band of the QSO." msgstr "" #: ../mainwindow.cpp:2444 ../mainwindow.cpp:5093 msgctxt "MainWindow|" msgid "Mode of the QSO." msgstr "" #: ../mainwindow.cpp:2445 ../mainwindow.cpp:5094 msgctxt "MainWindow|" msgid "Date of the QSO." msgstr "" #: ../mainwindow.cpp:2446 ../mainwindow.cpp:5095 msgctxt "MainWindow|" msgid "Time of the QSO." msgstr "" #: ../mainwindow.cpp:2449 ../mainwindow.cpp:5098 msgctxt "MainWindow|" msgid "Add the QSO to the log." msgstr "" #: ../mainwindow.cpp:2451 msgctxt "MainWindow|" msgid "Clear the box." msgstr "" #: ../mainwindow.cpp:2453 msgctxt "MainWindow|" msgid "Input" msgstr "" #: ../mainwindow.cpp:2466 ../mainwindow.cpp:6664 msgctxt "MainWindow|" msgid "RSTrx" msgstr "" #: ../mainwindow.cpp:2473 ../mainwindow.cpp:6662 msgctxt "MainWindow|" msgid "RSTtx" msgstr "" #: ../mainwindow.cpp:2482 ../mainwindow.cpp:3291 ../mainwindow.cpp:3297 #: ../mainwindow.cpp:4215 ../mainwindow.cpp:5287 ../mainwindow.cpp:6660 msgctxt "MainWindow|" msgid "QRZ" msgstr "" #: ../mainwindow.cpp:2489 msgctxt "MainWindow|" msgid "STX" msgstr "" #: ../mainwindow.cpp:2496 msgctxt "MainWindow|" msgid "SRX" msgstr "" #: ../mainwindow.cpp:2803 msgctxt "MainWindow|" msgid "NEW MULT" msgstr "" #: ../mainwindow.cpp:2909 msgctxt "MainWindow|" msgid "Invalid characters used in the QRZ" msgstr "" #: ../mainwindow.cpp:3061 msgctxt "MainWindow|" msgid "Ready..." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "The logfile has been modified." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "Do you want to save your changes?" msgstr "" #: ../mainwindow.cpp:3435 msgctxt "MainWindow|" msgid "&File" msgstr "" #: ../mainwindow.cpp:3437 msgctxt "MainWindow|" msgid "&New..." msgstr "" #: ../mainwindow.cpp:3442 msgctxt "MainWindow|" msgid "&Open..." msgstr "" #: ../mainwindow.cpp:3447 msgctxt "MainWindow|" msgid "&Import from ADIF..." msgstr "" #: ../mainwindow.cpp:3450 msgctxt "MainWindow|" msgid "Import an ADIF file into the current log." msgstr "" #: ../mainwindow.cpp:3459 msgctxt "MainWindow|" msgid "&Save As..." msgstr "" #: ../mainwindow.cpp:3466 msgctxt "MainWindow|" msgid "Export to ADIF..." msgstr "" #: ../mainwindow.cpp:3470 msgctxt "MainWindow|" msgid "Export the current log to an ADIF logfile." msgstr "" #: ../mainwindow.cpp:3472 msgctxt "MainWindow|" msgid "Export all logs to ADIF..." msgstr "" #: ../mainwindow.cpp:3476 msgctxt "MainWindow|" msgid "Export ALL the QSOs into one ADIF file, merging QSOs from all the logs." msgstr "" #: ../mainwindow.cpp:3478 msgctxt "MainWindow|" msgid "Export Requested QSL to ADIF..." msgstr "" #: ../mainwindow.cpp:3481 msgctxt "MainWindow|" msgid "" "Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a " "QSL tag printing program)." msgstr "" #: ../mainwindow.cpp:3483 msgctxt "MainWindow|" msgid "Export ADIF for LoTW..." msgstr "" #: ../mainwindow.cpp:3486 msgctxt "MainWindow|" msgid "" "Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before " "uploading to LoTW!" msgstr "" #: ../mainwindow.cpp:3490 msgctxt "MainWindow|" msgid "&Print Log..." msgstr "" #: ../mainwindow.cpp:3493 msgctxt "MainWindow|" msgid "Print your log." msgstr "" #: ../mainwindow.cpp:3498 msgctxt "MainWindow|" msgid "KLog folder" msgstr "" #: ../mainwindow.cpp:3500 msgctxt "MainWindow|" msgid "Opens the data folder of KLog." msgstr "" #: ../mainwindow.cpp:3505 msgctxt "MainWindow|" msgid "E&xit" msgstr "" #: ../mainwindow.cpp:3511 msgctxt "MainWindow|" msgid "&Tools" msgstr "" #: ../mainwindow.cpp:3513 msgctxt "MainWindow|" msgid "Fill in QSO data" msgstr "" #: ../mainwindow.cpp:3517 msgctxt "MainWindow|" msgid "" "Go through the log reusing previous QSOs to fill missing information in " "other QSOs." msgstr "" #: ../mainwindow.cpp:3519 msgctxt "MainWindow|" msgid "Fill in DXCC data" msgstr "" #: ../mainwindow.cpp:3522 msgctxt "MainWindow|" msgid "Go through the log filling QSOs without a DXCC defined." msgstr "" #: ../mainwindow.cpp:3525 msgctxt "MainWindow|" msgid "QSL tools..." msgstr "" #: ../mainwindow.cpp:3532 msgctxt "MainWindow|" msgid "&Find QSO to QSL" msgstr "" #: ../mainwindow.cpp:3535 msgctxt "MainWindow|" msgid "Shows QSOs for which you should send your QSL and request the DX QSL." msgstr "" #: ../mainwindow.cpp:3537 msgctxt "MainWindow|" msgid "Find My-QSLs pending to send" msgstr "" #: ../mainwindow.cpp:3541 msgctxt "MainWindow|" msgid "" "Shows the QSOs with pending requests to send QSLs. You should keep this " "queue empty!" msgstr "" #: ../mainwindow.cpp:3543 msgctxt "MainWindow|" msgid "&Find DX-QSLs pending to receive" msgstr "" #: ../mainwindow.cpp:3546 msgctxt "MainWindow|" msgid "" "Shows the DX-QSL that has been requested or QSLs has been sent with no " "answer." msgstr "" #: ../mainwindow.cpp:3548 msgctxt "MainWindow|" msgid "&Find requested pending to receive" msgstr "" #: ../mainwindow.cpp:3551 msgctxt "MainWindow|" msgid "Shows the DX-QSL that has been requested." msgstr "" #: ../mainwindow.cpp:3554 msgctxt "MainWindow|" msgid "LoTW tools..." msgstr "" #: ../mainwindow.cpp:3556 msgctxt "MainWindow|" msgid "Queue all QSL to be sent of this log" msgstr "" #: ../mainwindow.cpp:3559 msgctxt "MainWindow|" msgid "Mark all non sent QSOs in this log as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3561 msgctxt "MainWindow|" msgid "Queue all QSL to be sent" msgstr "" #: ../mainwindow.cpp:3564 msgctxt "MainWindow|" msgid "Mark all non sent QSOs as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3568 msgctxt "MainWindow|" msgid "Mark as sent all queued QSO of this log" msgstr "" #: ../mainwindow.cpp:3571 msgctxt "MainWindow|" msgid "Mark all queued QSOs in this log as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3573 msgctxt "MainWindow|" msgid "Mark all queued QSO as sent" msgstr "" #: ../mainwindow.cpp:3576 msgctxt "MainWindow|" msgid "Mark all queued QSOs as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3581 msgctxt "MainWindow|" msgid "&Update cty.csv" msgstr "" #: ../mainwindow.cpp:3585 ../mainwindow.cpp:3590 msgctxt "MainWindow|" msgid "For updated DX-Entity data, update cty.csv." msgstr "" #: ../mainwindow.cpp:3587 msgctxt "MainWindow|" msgid "&Update Satellite Data" msgstr "" #: ../mainwindow.cpp:3594 msgctxt "MainWindow|" msgid "Stats" msgstr "" #: ../mainwindow.cpp:3598 msgctxt "MainWindow|" msgid "Show the statistics of your radio activity." msgstr "" #: ../mainwindow.cpp:3602 msgctxt "MainWindow|" msgid "&Setup" msgstr "" #: ../mainwindow.cpp:3604 msgctxt "MainWindow|" msgid "&Setup..." msgstr "" #: ../mainwindow.cpp:3610 msgctxt "MainWindow|" msgid "&Help" msgstr "" #: ../mainwindow.cpp:3612 msgctxt "MainWindow|" msgid "Check updates..." msgstr "" #: ../mainwindow.cpp:3617 msgctxt "MainWindow|" msgid "&About..." msgstr "" #: ../mainwindow.cpp:3622 msgctxt "MainWindow|" msgid "About Qt..." msgstr "" #: ../mainwindow.cpp:3665 ../mainwindow.cpp:3674 ../mainwindow.cpp:3688 #: ../mainwindow.cpp:3696 ../mainwindow.cpp:3770 ../mainwindow.cpp:3778 #: ../mainwindow.cpp:3796 ../mainwindow.cpp:3804 msgctxt "MainWindow|" msgid "KLog LoTW" msgstr "" #: ../mainwindow.cpp:3666 msgctxt "MainWindow|" msgid "All pending QSO of this log has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3666 ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "" "Now you can go to the File menu to export the LoTW ADIF file and upload it " "to LoTW." msgstr "" #: ../mainwindow.cpp:3675 ../mainwindow.cpp:3697 msgctxt "MainWindow|" msgid "" "There was a problem to mark all pending QSO of this log as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "All pending QSO has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "Please select the station callsign you want to mark as sent to LoTW:" msgstr "" #: ../mainwindow.cpp:3719 msgctxt "MainWindow|" msgid "Station Callsign:" msgstr "" #: ../mainwindow.cpp:3728 msgctxt "MainWindow|" msgid "Define Station Callsign" msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "You have selected no callsign. KLog will mark QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../mainwindow.cpp:3742 msgctxt "MainWindow|" msgid "" "No station callsign has been selected and therefore no log will be marked" msgstr "" #: ../mainwindow.cpp:3771 msgctxt "MainWindow|" msgid "All queued QSO of this log has been marked as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3779 msgctxt "MainWindow|" msgid "" "There was a problem to mark all queued QSO of this log as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3797 msgctxt "MainWindow|" msgid "All queued QSO has been marked as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3805 msgctxt "MainWindow|" msgid "There was a problem to mark all queued QSO of this log as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3814 msgctxt "MainWindow|" msgid "About..." msgstr "" #: ../mainwindow.cpp:3870 msgctxt "MainWindow|" msgid "KLog update checking result" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "Congratulations!" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "You already have the latest version." msgstr "" #: ../mainwindow.cpp:4021 ../mainwindow.cpp:4071 msgctxt "MainWindow|" msgid "Nothing has been saved. You have to select a valid file type." msgstr "" #: ../mainwindow.cpp:4049 msgctxt "MainWindow|" msgid "Save File" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "ADIF file" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Cabrillo files" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Any file" msgstr "" #: ../mainwindow.cpp:4128 msgctxt "MainWindow|" msgid "You can find the KLog data folder here: " msgstr "" #: ../mainwindow.cpp:4211 msgctxt "MainWindow|" msgid "DUPE" msgstr "" #: ../mainwindow.cpp:4328 msgctxt "MainWindow|" msgid "start" msgstr "" #: ../mainwindow.cpp:4329 ../mainwindow.cpp:4351 #, qt-format msgctxt "MainWindow|start or stop" msgid "" "UDP Server error\n" "The UDP server failed to %1." msgstr "" #: ../mainwindow.cpp:4350 msgctxt "MainWindow|" msgid "stop" msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "It seems that there are no QSO in the database." msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "" "If you are sure that the database contains QSOs and KLog is not able to find " "them, please contact the developers (see About KLog) for help." msgstr "" #: ../mainwindow.cpp:5076 ../mainwindow.cpp:7261 msgctxt "MainWindow|" msgid "TX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5077 ../mainwindow.cpp:7339 msgctxt "MainWindow|" msgid "RX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5079 msgctxt "MainWindow|" msgid "Power used by the DX." msgstr "" #: ../mainwindow.cpp:5080 msgctxt "MainWindow|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindow.cpp:5081 msgctxt "MainWindow|" msgid "Callsign used over the air." msgstr "" #: ../mainwindow.cpp:5082 msgctxt "MainWindow|" msgid "My QTH locator." msgstr "" #: ../mainwindow.cpp:5083 msgctxt "MainWindow|" msgid "Name of the DX." msgstr "" #: ../mainwindow.cpp:5084 msgctxt "MainWindow|" msgid "QTH of the DX." msgstr "" #: ../mainwindow.cpp:5085 msgctxt "MainWindow|" msgid "Locator of the DX." msgstr "" #: ../mainwindow.cpp:5100 msgctxt "MainWindow|" msgid "Clears the QSO entry." msgstr "" #: ../mainwindow.cpp:5102 msgctxt "MainWindow|" msgid "Number of confirmed DXCC entities." msgstr "" #: ../mainwindow.cpp:5103 msgctxt "MainWindow|" msgid "Number of worked DXCC entities." msgstr "" #: ../mainwindow.cpp:5104 msgctxt "MainWindow|" msgid "Number of confirmed WAZ zones." msgstr "" #: ../mainwindow.cpp:5105 msgctxt "MainWindow|" msgid "Number of worked WAZ zones." msgstr "" #: ../mainwindow.cpp:5106 msgctxt "MainWindow|" msgid "Number of confirmed local references." msgstr "" #: ../mainwindow.cpp:5107 msgctxt "MainWindow|" msgid "Number of worked local references." msgstr "" #: ../mainwindow.cpp:5108 msgctxt "MainWindow|" msgid "Number of confirmed QSOs." msgstr "" #: ../mainwindow.cpp:5109 msgctxt "MainWindow|" msgid "Number of worked QSOs." msgstr "" #: ../mainwindow.cpp:5110 msgctxt "MainWindow|" msgid "Number of QSOs worked on the selected year." msgstr "" #: ../mainwindow.cpp:5111 msgctxt "MainWindow|" msgid "Number of DXCC worked on the selected year." msgstr "" #: ../mainwindow.cpp:5112 msgctxt "MainWindow|" msgid "Number of CQ Zones worked on the selected year." msgstr "" #: ../mainwindow.cpp:5113 msgctxt "MainWindow|" msgid "Score for the DXMarathon on the selected year." msgstr "" #: ../mainwindow.cpp:5114 msgctxt "MainWindow|" msgid "Select the year you want to check." msgstr "" #: ../mainwindow.cpp:5116 msgctxt "MainWindow|" msgid "Status of the DX entity." msgstr "" #: ../mainwindow.cpp:5117 msgctxt "MainWindow|" msgid "Name of the DX entity." msgstr "" #: ../mainwindow.cpp:5135 ../mainwindow.cpp:7464 msgctxt "MainWindow|" msgid "Name" msgstr "" #: ../mainwindow.cpp:5139 msgctxt "MainWindow|" msgid "QTH" msgstr "" #: ../mainwindow.cpp:5142 msgctxt "MainWindow|" msgid "Locator" msgstr "" #: ../mainwindow.cpp:5145 msgctxt "MainWindow|" msgid "Power(rx)" msgstr "" #: ../mainwindow.cpp:5149 msgctxt "MainWindow|" msgid "RST(tx)" msgstr "" #: ../mainwindow.cpp:5152 msgctxt "MainWindow|" msgid "RST(rx)" msgstr "" #: ../mainwindow.cpp:5185 msgctxt "MainWindow|" msgid "Freq TX" msgstr "" #: ../mainwindow.cpp:5187 msgctxt "MainWindow|" msgid "Freq RX" msgstr "" #: ../mainwindow.cpp:5255 msgctxt "MainWindow|" msgid "QSO" msgstr "" #: ../mainwindow.cpp:5265 msgctxt "MainWindow|" msgid "QSL" msgstr "" #: ../mainwindow.cpp:5266 msgctxt "MainWindow|" msgid "eQSL" msgstr "" #: ../mainwindow.cpp:5267 ../mainwindow.cpp:6670 msgctxt "MainWindow|" msgid "Comment" msgstr "" #: ../mainwindow.cpp:5270 msgctxt "MainWindow|" msgid "Others" msgstr "" #: ../mainwindow.cpp:5272 msgctxt "MainWindow|" msgid "My Data" msgstr "" #: ../mainwindow.cpp:5273 msgctxt "MainWindow|" msgid "Satellite" msgstr "" #: ../mainwindow.cpp:5323 ../mainwindow.cpp:5355 msgctxt "MainWindow|" msgid "QSOs" msgstr "" #: ../mainwindow.cpp:5324 ../mainwindow.cpp:5346 ../mainwindow.cpp:5409 msgctxt "MainWindow|" msgid "DXCC" msgstr "" #: ../mainwindow.cpp:5325 msgctxt "MainWindow|" msgid "CQ" msgstr "" #: ../mainwindow.cpp:5327 msgctxt "MainWindow|" msgid "Score" msgstr "" #: ../mainwindow.cpp:5333 msgctxt "MainWindow|" msgid "Info" msgstr "" #: ../mainwindow.cpp:5337 msgctxt "MainWindow|" msgid "Award" msgstr "" #: ../mainwindow.cpp:5340 msgctxt "MainWindow|" msgid "Confirmed" msgstr "" #: ../mainwindow.cpp:5343 msgctxt "MainWindow|" msgid "Worked" msgstr "" #: ../mainwindow.cpp:5349 msgctxt "MainWindow|" msgid "WAZ" msgstr "" #: ../mainwindow.cpp:5352 msgctxt "MainWindow|" msgid "Local" msgstr "" #: ../mainwindow.cpp:5404 msgctxt "MainWindow|" msgid "Awards" msgstr "" #: ../mainwindow.cpp:5405 msgctxt "MainWindow|" msgid "Search" msgstr "" #: ../mainwindow.cpp:5407 msgctxt "MainWindow|" msgid "Log" msgstr "" #: ../mainwindow.cpp:5408 msgctxt "MainWindow|" msgid "DX-Cluster" msgstr "" #: ../mainwindow.cpp:5504 ../mainwindow.cpp:5515 ../mainwindow.cpp:5589 #: ../mainwindow.cpp:5599 msgctxt "MainWindow|" msgid "Save ADIF File" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "LoTW logfile has been properly exported!" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Remember to:" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Before uploading: sign the LoTW log; and" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "After uploading: mark as sent all the queued QSO (LoTW Tools)." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "There was no QSO to be exported." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "" "If you think that some QSO should have been exported, please look for them " "and ensure that the eQSL LoTW QSL sent box is marked as:" msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "Q - Queued" msgstr "" #: ../mainwindow.cpp:5567 msgctxt "MainWindow|" msgid "" "There was an error while exporting the LoTW. The log has not been exported!" msgstr "" #: ../mainwindow.cpp:5613 msgctxt "MainWindow|" msgid "Save Cabrillo File" msgstr "" #: ../mainwindow.cpp:5624 ../mainwindow.cpp:5648 msgctxt "MainWindow|" msgid "Open File" msgstr "" #: ../mainwindow.cpp:5765 msgctxt "MainWindow|" msgid "&Modify" msgstr "" #: ../mainwindow.cpp:6328 msgctxt "MainWindow|" msgid " - Needed for DXMarathon" msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Filling QSOs..." msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Abort filling" msgstr "" #: ../mainwindow.cpp:6580 msgctxt "MainWindow|" msgid "" "Filling DXCC in QSOs...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:6654 msgctxt "MainWindow|" msgid "Number" msgstr "" #: ../mainwindow.cpp:6656 msgctxt "MainWindow|" msgid "Date" msgstr "" #: ../mainwindow.cpp:6658 msgctxt "MainWindow|" msgid "Time" msgstr "" #: ../mainwindow.cpp:6666 msgctxt "MainWindow|" msgid "Band" msgstr "" #: ../mainwindow.cpp:6668 ../mainwindow.cpp:7449 msgctxt "MainWindow|" msgid "Mode" msgstr "" #: ../mainwindow.cpp:6683 msgctxt "MainWindow|" msgid "Print Log" msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Printing the log..." msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Abort printing" msgstr "" #: ../mainwindow.cpp:6703 ../mainwindow.cpp:6718 msgctxt "MainWindow|" msgid "" "Printing the log...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:7279 msgctxt "MainWindow|" msgid "" "TX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7352 msgctxt "MainWindow|" msgid "" "RX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7435 msgctxt "MainWindow|" msgid "KLog QSO received" msgstr "" #: ../mainwindow.cpp:7440 msgctxt "MainWindow|" msgid "The following QSO data has been received from WSJT-X to be logged:" msgstr "" #: ../mainwindow.cpp:7443 msgctxt "MainWindow|" msgid "Call" msgstr "" #: ../mainwindow.cpp:7446 msgctxt "MainWindow|" msgid "Freq" msgstr "" #: ../mainwindow.cpp:7452 msgctxt "MainWindow|" msgid "Time On" msgstr "" #: ../mainwindow.cpp:7455 msgctxt "MainWindow|" msgid "Time Off" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST TX" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST RX" msgstr "" #: ../mainwindow.cpp:7461 msgctxt "MainWindow|" msgid "DX-Grid" msgstr "" #: ../mainwindow.cpp:7467 msgctxt "MainWindow|" msgid "Comments" msgstr "" #: ../mainwindow.cpp:7470 msgctxt "MainWindow|" msgid "TX Pwr" msgstr "" #: ../mainwindow.cpp:7473 msgctxt "MainWindow|" msgid "Operator" msgstr "" #: ../mainwindow.cpp:7476 msgctxt "MainWindow|" msgid "Local-Grid" msgstr "" #: ../mainwindow.cpp:7526 msgctxt "MainWindow|" msgid "QSO logged from WSJT-X:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "A new mode not supported by KLog has been received from an external software " "or radio:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "If the received mode is correct, please contact KLog development team and " "request support for that mode" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "Do you want to keep receiving this alerts? (disabling this alerts will " "prevent that non-valid modes are detected)" msgstr "" #: ../mainwindow.cpp:7721 msgctxt "MainWindow|" msgid "" "A duplicated satellite has been detected in the file and will not be " "imported." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Please check the satellite information file and ensure it is properly " "populated." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Now you will see a more detailed error that can be used for debugging..." msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "An unexpected error ocurred!!" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "If the problem persists, please contact the developers" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "for analysis:" msgstr "" #: ../mainwindow.cpp:7731 msgctxt "MainWindow|" msgid "Error in function" msgstr "" #: ../mainwindow.cpp:7732 msgctxt "MainWindow|" msgid "Error code" msgstr "" #: ../mainwindow.cpp:7733 msgctxt "MainWindow|" msgid "Error text" msgstr "" #: ../mainwindow.cpp:7734 msgctxt "MainWindow|" msgid "Failed query" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "Recomendation:" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "" "Export, periodically, your data to ADIF to prevent a potential data loss." msgstr "" #: ../mainwindow.cpp:7745 msgctxt "MainWindow|" msgid "Do you want to keep showing errors?" msgstr "" #: ../mainwindowinputcomment.cpp:46 msgctxt "MainWindowInputComment|" msgid "Add a comment for this QSO." msgstr "" #: ../mainwindowinputeqsl.cpp:44 msgctxt "MainWindowInputEQSL|" msgid "Date of the ClubLog upload." msgstr "" #: ../mainwindowinputeqsl.cpp:45 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:46 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:47 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:48 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:50 msgctxt "MainWindowInputEQSL|" msgid "Status on ClubLog." msgstr "" #: ../mainwindowinputeqsl.cpp:51 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:52 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:53 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:54 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:58 msgctxt "MainWindowInputEQSL|" msgid "ClubLog" msgstr "" #: ../mainwindowinputeqsl.cpp:61 msgctxt "MainWindowInputEQSL|" msgid "eQSL Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:64 msgctxt "MainWindowInputEQSL|" msgid "eQSL Rec" msgstr "" #: ../mainwindowinputeqsl.cpp:67 msgctxt "MainWindowInputEQSL|" msgid "LoTW Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:70 msgctxt "MainWindowInputEQSL|" msgid "LoTW Rec" msgstr "" #: ../mainwindowinputothers.cpp:66 msgctxt "MainWindowInputOthers|" msgid "Primary Div" msgstr "" #: ../mainwindowinputothers.cpp:67 msgctxt "MainWindowInputOthers|" msgid "Secondary Div" msgstr "" #: ../mainwindowinputothers.cpp:68 msgctxt "MainWindowInputOthers|" msgid "IOTA" msgstr "" #: ../mainwindowinputothers.cpp:69 msgctxt "MainWindowInputOthers|" msgid "Entity" msgstr "" #: ../mainwindowinputothers.cpp:70 msgctxt "MainWindowInputOthers|" msgid "Propagation mode" msgstr "" #: ../mainwindowinputothers.cpp:78 msgctxt "MainWindowInputOthers|" msgid "Select the primary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:79 msgctxt "MainWindowInputOthers|" msgid "Select the secondary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:80 msgctxt "MainWindowInputOthers|" msgid "Select the entity for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:81 msgctxt "MainWindowInputOthers|" msgid "Select the propagation mode for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:82 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA continent for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:83 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA reference number for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:108 ../mainwindowinputothers.cpp:150 msgctxt "MainWindowInputOthers|" msgid "Not Identified" msgstr "" #: ../mainwindowinputothers.cpp:114 msgctxt "MainWindowInputOthers|" msgid "Not - Not Identified" msgstr "" #: ../mainwindowinputqsl.cpp:66 msgctxt "MainWindowInputQSL|" msgid "QSL Sent" msgstr "" #: ../mainwindowinputqsl.cpp:69 msgctxt "MainWindowInputQSL|" msgid "QSL Rec" msgstr "" #: ../mainwindowinputqsl.cpp:72 msgctxt "MainWindowInputQSL|" msgid "QSL Via" msgstr "" #: ../mainwindowinputqsl.cpp:75 msgctxt "MainWindowInputQSL|" msgid "QSL Msg" msgstr "" #: ../mainwindowinputqsl.cpp:78 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:79 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:80 msgctxt "MainWindowInputQSL|" msgid "QSL sending information." msgstr "" #: ../mainwindowinputqsl.cpp:81 msgctxt "MainWindowInputQSL|" msgid "QSL reception information." msgstr "" #: ../mainwindowinputqsl.cpp:83 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:84 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:85 msgctxt "MainWindowInputQSL|" msgid "Message of the QSL." msgstr "" #: ../mainwindowinputqsl.cpp:86 msgctxt "MainWindowInputQSL|" msgid "QSL via information." msgstr "" #: ../mainwindowmydatatab.cpp:61 msgctxt "MainWindowMyDataTab|" msgid "Watt" msgstr "" #: ../mainwindowmydatatab.cpp:64 msgctxt "MainWindowMyDataTab|" msgid "Keep this data" msgstr "" #: ../mainwindowmydatatab.cpp:66 ../mainwindowmydatatab.cpp:68 msgctxt "MainWindowMyDataTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowmydatatab.cpp:70 msgctxt "MainWindowMyDataTab|" msgid "Power used for the QSO in watts." msgstr "" #: ../mainwindowmydatatab.cpp:71 msgctxt "MainWindowMyDataTab|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindowmydatatab.cpp:72 msgctxt "MainWindowMyDataTab|" msgid "Callsign used over the air." msgstr "" #: ../mainwindowmydatatab.cpp:73 msgctxt "MainWindowMyDataTab|" msgid "My QTH locator." msgstr "" #: ../mainwindowmydatatab.cpp:75 msgctxt "MainWindowMyDataTab|" msgid "Power" msgstr "" #: ../mainwindowmydatatab.cpp:78 msgctxt "MainWindowMyDataTab|" msgid "Operator" msgstr "" #: ../mainwindowmydatatab.cpp:80 msgctxt "MainWindowMyDataTab|" msgid "Station Callsign" msgstr "" #: ../mainwindowmydatatab.cpp:83 msgctxt "MainWindowMyDataTab|" msgid "My Locator" msgstr "" #: ../mainwindowsattab.cpp:80 msgctxt "MainWindowSatTab|" msgid "Keep this data" msgstr "" #: ../mainwindowsattab.cpp:82 ../mainwindowsattab.cpp:84 msgctxt "MainWindowSatTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowsattab.cpp:85 ../mainwindowsattab.cpp:375 msgctxt "MainWindowSatTab|" msgid "Other - Sat not in the list" msgstr "" #: ../mainwindowsattab.cpp:88 #, qt-format msgctxt "MainWindowSatTab|" msgid "" "Name of the Satellite if not in the list. Select: \"%1\" to enable this box. " "(format like AO-51)." msgstr "" #: ../mainwindowsattab.cpp:91 msgctxt "MainWindowSatTab|" msgid "Satellite mode used." msgstr "" #: ../mainwindowsattab.cpp:92 msgctxt "MainWindowSatTab|" msgid "Select the satellite you are using." msgstr "" #: ../mainwindowsattab.cpp:93 msgctxt "MainWindowSatTab|" msgid "UpLink band." msgstr "" #: ../mainwindowsattab.cpp:94 msgctxt "MainWindowSatTab|" msgid "DownLink band." msgstr "" #: ../mainwindowsattab.cpp:95 msgctxt "MainWindowSatTab|" msgid "" "Locator of the DX station. This box is synchronized with the Locator box in " "the QSO tab." msgstr "" #: ../mainwindowsattab.cpp:98 msgctxt "MainWindowSatTab|" msgid "UpLink" msgstr "" #: ../mainwindowsattab.cpp:102 msgctxt "MainWindowSatTab|" msgid "DownLink" msgstr "" #: ../mainwindowsattab.cpp:106 msgctxt "MainWindowSatTab|" msgid "Satellite" msgstr "" #: ../mainwindowsattab.cpp:110 msgctxt "MainWindowSatTab|" msgid "Mode" msgstr "" #: ../mainwindowsattab.cpp:114 msgctxt "MainWindowSatTab|" msgid "DX Locator" msgstr "" #: ../mainwindowsattab.cpp:119 msgctxt "MainWindowSatTab|" msgid "Other" msgstr "" #: ../mainwindowsattab.cpp:125 ../mainwindowsattab.cpp:129 msgctxt "MainWindowSatTab|" msgid "MHz" msgstr "" #: ../mainwindowsattab.cpp:374 msgctxt "MainWindowSatTab|" msgid "Not Sat QSO" msgstr "" #: ../mainwindowsattab.cpp:411 msgctxt "MainWindowSatTab|" msgid "" "KLog has detected a satellite name that it does not recognise. If it should " "use one of the names of known satellites instead, please select it from the " "list. Alternatively, please contact the development team to add the new " "satellite name." msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "The satellite you have in your QSO is: " msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "" "Please know that the satellite name will not be saved if it is not in the " "list so that information may be lost!" msgstr "" #: ../awards.cpp:755 msgctxt "QObject|" msgid "New One, work it!" msgstr "" #: ../awards.cpp:759 ../awards.cpp:763 ../awards.cpp:769 ../awards.cpp:772 #: ../awards.cpp:775 ../awards.cpp:778 ../awards.cpp:784 ../awards.cpp:790 msgctxt "QObject|" msgid "Needed, work it!" msgstr "" #: ../awards.cpp:766 ../awards.cpp:781 ../awards.cpp:787 ../awards.cpp:793 msgctxt "QObject|" msgid "Worked but not confirmed" msgstr "" #: ../awards.cpp:796 msgctxt "QObject|" msgid "Confirmed" msgstr "" #: ../awards.cpp:800 msgctxt "QObject|" msgid "Not identified" msgstr "" #: ../database.cpp:271 ../database.cpp:323 msgctxt "QObject|" msgid "Database Error" msgstr "" #: ../database.cpp:1465 msgctxt "QObject|" msgid "KLog DB needs to be upgraded." msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "Do you want to upgrade it now?" msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "If DB is not upgraded KLog may not work properly." msgstr "" #: ../database.cpp:2072 msgctxt "QObject|" msgid "" "KLog has detected a previous log in the DB. All data will be migrated to a " "newly created DX type log for you." msgstr "" #: ../database.cpp:2090 msgctxt "QObject|" msgid "KLog: Enter Station callsign" msgstr "" #: ../database.cpp:2091 msgctxt "QObject|" msgid "Enter the station callsign used in this log" msgstr "" #: ../database.cpp:2092 msgctxt "QObject|" msgid "Station Callsign" msgstr "" #: ../database.cpp:2143 msgctxt "QObject|" msgid "" "All the data was migrated correctly. You should now go to " "Setup->Preferences->Logs to check that everything is OK." msgstr "" #: ../database.cpp:3572 ../database.cpp:3593 msgctxt "QObject|" msgid "Updating mode information..." msgstr "" #: ../database.cpp:3572 ../database.cpp:3757 ../database.cpp:3954 #: ../database.cpp:4155 ../database.cpp:7199 ../database.cpp:7422 #: ../dataproxy_sqlite.cpp:4801 msgctxt "QObject|" msgid "Abort updating" msgstr "" #: ../database.cpp:3593 ../database.cpp:3776 ../database.cpp:7291 #: ../database.cpp:7514 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "QSO: " msgstr "" #: ../database.cpp:3668 ../database.cpp:3845 ../database.cpp:4046 #: ../database.cpp:4254 msgctxt "QObject|" msgid "" "Canceling this update will cause data inconsistencies and possibly data " "loss. Do you still want to cancel?" msgstr "" #: ../database.cpp:3757 ../database.cpp:3776 ../database.cpp:3976 #: ../database.cpp:4178 msgctxt "QObject|" msgid "Updating bands information..." msgstr "" #: ../database.cpp:3952 #, qt-format msgctxt "QObject|" msgid "Updating bands information in %1 status..." msgstr "" #: ../database.cpp:3976 ../database.cpp:4178 msgctxt "QObject|" msgid "Progress: " msgstr "" #: ../database.cpp:4153 #, qt-format msgctxt "QObject|" msgid "Updating mode information in %1 status..." msgstr "" #: ../database.cpp:7199 msgctxt "QObject|" msgid "Updating DXCC award information..." msgstr "" #: ../database.cpp:7291 msgctxt "QObject|" msgid "Updating DXCC Award information..." msgstr "" #: ../database.cpp:7422 msgctxt "QObject|" msgid "Updating WAZ award information..." msgstr "" #: ../database.cpp:7514 msgctxt "QObject|" msgid "Updating WAZ Award information..." msgstr "" #: ../dataproxy_sqlite.cpp:4801 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "Updating DXCC and Continent information..." msgstr "" #: ../main.cpp:267 msgctxt "QObject|" msgid "Install wizard was canceled before completing..." msgstr "" #: ../main.cpp:268 msgctxt "QObject|" msgid "Do you want to remove the KLog dir from your disk?" msgstr "" #: ../main.cpp:281 msgctxt "QObject|" msgid "Your KLog dir has been removed" msgstr "" #: ../main.cpp:281 ../main.cpp:287 ../main.cpp:294 ../main.cpp:300 msgctxt "QObject|" msgid "Thank you for running KLog!" msgstr "" #: ../main.cpp:287 msgctxt "QObject|" msgid "" "I could not remove your KLog dir. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:294 msgctxt "QObject|" msgid "" "Your KLog dir could not be removed. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:300 msgctxt "QObject|" msgid "Remember that your KLog dir is on your system..." msgstr "" #: ../searchwidget.cpp:26 msgctxt "SearchWidget|" msgid "&Clear" msgstr "" #: ../searchwidget.cpp:27 msgctxt "SearchWidget|" msgid "&Export Highlighted" msgstr "" #: ../searchwidget.cpp:28 ../searchwidget.cpp:577 ../searchwidget.cpp:609 msgctxt "SearchWidget|" msgid "&Select All" msgstr "" #: ../searchwidget.cpp:29 msgctxt "SearchWidget|" msgid "&Search" msgstr "" #: ../searchwidget.cpp:30 msgctxt "SearchWidget|" msgid "All" msgstr "" #: ../searchwidget.cpp:69 msgctxt "SearchWidget|" msgid "Clear the searches." msgstr "" #: ../searchwidget.cpp:70 msgctxt "SearchWidget|" msgid "Export the search result to an ADIF file." msgstr "" #: ../searchwidget.cpp:71 msgctxt "SearchWidget|" msgid "Select/Unselect all the QSOs shown." msgstr "" #: ../searchwidget.cpp:72 msgctxt "SearchWidget|" msgid "Search in the log." msgstr "" #: ../searchwidget.cpp:73 msgctxt "SearchWidget|" msgid "Search in all logs." msgstr "" #: ../searchwidget.cpp:74 msgctxt "SearchWidget|" msgid "Enter the QRZ to search for." msgstr "" #: ../searchwidget.cpp:75 msgctxt "SearchWidget|" msgid "Search results." msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QRZ" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Date/Time" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Band" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Mode" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QSL Sent" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 ../searchwidget.cpp:787 msgctxt "SearchWidget|" msgid "QSL Rcvd" msgstr "" #: ../searchwidget.cpp:81 msgctxt "SearchWidget|" msgid "Station Callsign" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "ID" msgstr "" #: ../searchwidget.cpp:585 ../searchwidget.cpp:604 msgctxt "SearchWidget|" msgid "&Clear selection" msgstr "" #: ../searchwidget.cpp:679 msgctxt "SearchWidget|" msgid "Save File" msgstr "" #: ../searchwidget.cpp:762 msgctxt "SearchWidget|" msgid "QSL Send" msgstr "" #: ../searchwidget.cpp:821 msgctxt "SearchWidget|" msgid "&Delete" msgstr "" #: ../searchwidget.cpp:823 msgctxt "SearchWidget|" msgid "Delete a QSO" msgstr "" #: ../searchwidget.cpp:826 msgctxt "SearchWidget|" msgid "&Edit QSO" msgstr "" #: ../searchwidget.cpp:828 msgctxt "SearchWidget|" msgid "Edit this QSO" msgstr "" #: ../searchwidget.cpp:831 msgctxt "SearchWidget|" msgid "Via &bureau" msgstr "" #: ../searchwidget.cpp:833 msgctxt "SearchWidget|" msgid "Send this QSL via bureau" msgstr "" #: ../searchwidget.cpp:836 msgctxt "SearchWidget|" msgid "D&irect" msgstr "" #: ../searchwidget.cpp:838 msgctxt "SearchWidget|" msgid "Send this QSL via direct" msgstr "" #: ../searchwidget.cpp:841 msgctxt "SearchWidget|" msgid "&Request my QSL" msgstr "" #: ../searchwidget.cpp:843 msgctxt "SearchWidget|" msgid "Mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:846 msgctxt "SearchWidget|" msgid "Via Direct && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:847 msgctxt "SearchWidget|" msgid "Send this QSL via direct & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:850 msgctxt "SearchWidget|" msgid "Via Bureau && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:851 msgctxt "SearchWidget|" msgid "Send this QSL via bureau & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:855 msgctxt "SearchWidget|" msgid "&Request the QSL" msgstr "" #: ../searchwidget.cpp:857 msgctxt "SearchWidget|" msgid "Mark the QSL as requested" msgstr "" #: ../searchwidget.cpp:861 msgctxt "SearchWidget|" msgid "Via bureau && mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:862 msgctxt "SearchWidget|" msgid "QSL received via bureau & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:865 msgctxt "SearchWidget|" msgid "Via bureau" msgstr "" #: ../searchwidget.cpp:866 msgctxt "SearchWidget|" msgid "QSL received via bureau" msgstr "" #: ../searchwidget.cpp:870 msgctxt "SearchWidget|" msgid "Direc&t && mark as my QSL requested" msgstr "" #: ../searchwidget.cpp:871 msgctxt "SearchWidget|" msgid "QSL received via direct & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:874 msgctxt "SearchWidget|" msgid "Direc&t" msgstr "" #: ../searchwidget.cpp:875 msgctxt "SearchWidget|" msgid "QSL received via direct" msgstr "" #: ../searchwidget.cpp:1108 #, qt-format msgctxt "SearchWidget|" msgid "You have requested to delete the QSO with: %1" msgstr "" #: ../searchwidget.cpp:1113 msgctxt "SearchWidget|" msgid "Are you sure?" msgstr "" #: ../searchwidget.cpp:1176 msgctxt "SearchWidget|" msgid "Needed QSO to send the QSL" msgstr "" #: ../searchwidget.cpp:1184 msgctxt "SearchWidget|" msgid "My QSL requested to be sent" msgstr "" #: ../searchwidget.cpp:1189 ../searchwidget.cpp:1194 msgctxt "SearchWidget|" msgid "DX QSL pending to be received" msgstr "" #: ../setupdialog.cpp:90 msgctxt "SetupDialog|" msgid "My Data" msgstr "" #: ../setupdialog.cpp:91 ../setupdialog.cpp:172 ../setupdialog.cpp:327 msgctxt "SetupDialog|" msgid "Bands/Modes" msgstr "" #: ../setupdialog.cpp:92 ../setupdialog.cpp:333 msgctxt "SetupDialog|" msgid "DX-Cluster" msgstr "" #: ../setupdialog.cpp:93 ../setupdialog.cpp:174 ../setupdialog.cpp:339 msgctxt "SetupDialog|" msgid "Colors" msgstr "" #: ../setupdialog.cpp:94 ../setupdialog.cpp:175 ../setupdialog.cpp:345 msgctxt "SetupDialog|" msgid "Misc" msgstr "" #: ../setupdialog.cpp:95 ../setupdialog.cpp:176 msgctxt "SetupDialog|" msgid "World Editor" msgstr "" #: ../setupdialog.cpp:96 ../setupdialog.cpp:177 ../setupdialog.cpp:321 msgctxt "SetupDialog|" msgid "Logs" msgstr "" #: ../setupdialog.cpp:99 ../setupdialog.cpp:180 msgctxt "SetupDialog|" msgid "Satellites" msgstr "" #: ../setupdialog.cpp:100 ../setupdialog.cpp:181 msgctxt "SetupDialog|" msgid "HamLib" msgstr "" #: ../setupdialog.cpp:103 ../setupdialog.cpp:185 msgctxt "SetupDialog|" msgid "Cancel" msgstr "" #: ../setupdialog.cpp:104 ../setupdialog.cpp:186 msgctxt "SetupDialog|" msgid "OK" msgstr "" #: ../setupdialog.cpp:127 ../setupdialog.cpp:204 msgctxt "SetupDialog|" msgid "Config Dialog" msgstr "" #: ../setupdialog.cpp:171 ../setupdialog.cpp:315 msgctxt "SetupDialog|" msgid "User data" msgstr "" #: ../setupdialog.cpp:173 msgctxt "SetupDialog|" msgid "D&X-Cluster" msgstr "" #: ../setupdialog.cpp:178 msgctxt "SetupDialog|" msgid "ClubLog" msgstr "" #: ../setupdialog.cpp:179 msgctxt "SetupDialog|" msgid "WSJT-X" msgstr "" #: ../setupdialog.cpp:299 msgctxt "SetupDialog|" msgid "You need to enter at least one log in the Logs tab." msgstr "" #: ../setupdialog.cpp:351 msgctxt "SetupDialog|" msgid "World" msgstr "" #: ../setupdialog.cpp:380 msgctxt "SetupDialog|" msgid "DB has not been moved to new path" msgstr "" #: ../setupdialog.cpp:381 msgctxt "SetupDialog|" msgid "" "Go to the Misc tab and click on Move DB\n" " or the DB will not be moved to the new location." msgstr "" #: ../setupdialog.cpp:389 msgctxt "SetupDialog|" msgid "You need to enter at least a valid QRZ." msgstr "" #: ../setupdialog.cpp:390 msgctxt "SetupDialog|" msgid "Go to the User tab and enter valid QRZ." msgstr "" #: ../setupdialog.cpp:401 msgctxt "SetupDialog|" msgid "You have not selected the kind of log you want." msgstr "" #: ../setupdialog.cpp:402 msgctxt "SetupDialog|" msgid "" "You will be redirected to the Log tab.\n" "Please add and select the kind of log you want to use." msgstr "" #: ../setupentitydialog.cpp:69 msgctxt "SetupEntityDialog|" msgid "Entity" msgstr "" #: ../setupentitydialog.cpp:71 msgctxt "SetupEntityDialog|" msgid "Name of the Entity." msgstr "" #: ../setupentitydialog.cpp:73 msgctxt "SetupEntityDialog|" msgid "CQ" msgstr "" #: ../setupentitydialog.cpp:75 msgctxt "SetupEntityDialog|" msgid "CQ zone." msgstr "" #: ../setupentitydialog.cpp:77 msgctxt "SetupEntityDialog|" msgid "ITU" msgstr "" #: ../setupentitydialog.cpp:79 msgctxt "SetupEntityDialog|" msgid "ITU zone." msgstr "" #: ../setupentitydialog.cpp:85 msgctxt "SetupEntityDialog|" msgid "Latitude" msgstr "" #: ../setupentitydialog.cpp:87 ../setupentitydialog.cpp:91 msgctxt "SetupEntityDialog|" msgid "Longitude of the Entity." msgstr "" #: ../setupentitydialog.cpp:89 msgctxt "SetupEntityDialog|" msgid "Longitude" msgstr "" #: ../setupentitydialog.cpp:93 msgctxt "SetupEntityDialog|" msgid "UTC" msgstr "" #: ../setupentitydialog.cpp:95 msgctxt "SetupEntityDialog|" msgid "Local time difference to UTC." msgstr "" #: ../setupentitydialog.cpp:97 msgctxt "SetupEntityDialog|" msgid "Main prefix" msgstr "" #: ../setupentitydialog.cpp:99 msgctxt "SetupEntityDialog|" msgid "Main prefix of the entity." msgstr "" #: ../setupentitydialog.cpp:103 msgctxt "SetupEntityDialog|" msgid "ARRL ID" msgstr "" #: ../setupentitydialog.cpp:105 msgctxt "SetupEntityDialog|" msgid "ARRL ID." msgstr "" #: ../setupentitydialog.cpp:111 msgctxt "SetupEntityDialog|" msgid "Prefixes" msgstr "" #: ../setupentitydialog.cpp:113 msgctxt "SetupEntityDialog|" msgid "Comma separated possible prefixes, e.g. EA1, EA2, ..." msgstr "" #: ../setupentitydialog.cpp:116 msgctxt "SetupEntityDialog|" msgid "Date of the deletion." msgstr "" #: ../setupentitydialog.cpp:118 msgctxt "SetupEntityDialog|" msgid "Deleted" msgstr "" #: ../setupentitydialog.cpp:120 msgctxt "SetupEntityDialog|" msgid "Cancel" msgstr "" #: ../setupentitydialog.cpp:121 msgctxt "SetupEntityDialog|" msgid "OK" msgstr "" #: ../setupentitydialog.cpp:209 msgctxt "SetupEntityDialog|" msgid "Entity Dialog" msgstr "" #: ../setuppagebandmode.cpp:16 msgctxt "SetupPageBandMode|" msgid "Bands" msgstr "" #: ../setuppagebandmode.cpp:20 msgctxt "SetupPageBandMode|" msgid "Modes" msgstr "" #: ../setuppageclublog.cpp:45 msgctxt "SetupPageClubLog|" msgid "&Callsign" msgstr "" #: ../setuppageclublog.cpp:46 msgctxt "SetupPageClubLog|" msgid "ClubLog &password" msgstr "" #: ../setuppageclublog.cpp:47 msgctxt "SetupPageClubLog|" msgid "ClubLog &email" msgstr "" #: ../setuppageclublog.cpp:53 msgctxt "SetupPageClubLog|" msgid "Enter the email you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:54 msgctxt "SetupPageClubLog|" msgid "Enter the callsign you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:55 msgctxt "SetupPageClubLog|" msgid "Enter your password in ClubLog." msgstr "" #: ../setuppageclublog.cpp:60 msgctxt "SetupPageClubLog|" msgid "&Send QSOs in real time" msgstr "" #: ../setuppageclublog.cpp:61 msgctxt "SetupPageClubLog|" msgid "&Activate ClubLog" msgstr "" #: ../setuppageclublog.cpp:62 msgctxt "SetupPageClubLog|" msgid "Use QSO Station &Callsign" msgstr "" #: ../setuppageclublog.cpp:63 msgctxt "SetupPageClubLog|" msgid "" "Send each QSO to ClubLog in real time, as they are added (or modified) in " "KLog." msgstr "" #: ../setuppageclublog.cpp:64 msgctxt "SetupPageClubLog|" msgid "Starts the ClubLog support in KLog." msgstr "" #: ../setuppageclublog.cpp:65 msgctxt "SetupPageClubLog|" msgid "" "Use the Station Callsign defined in each QSO instead of the one defined here." msgstr "" #: ../setuppagecolors.cpp:42 msgctxt "SetupPageColors|" msgid "New One" msgstr "" #: ../setuppagecolors.cpp:43 msgctxt "SetupPageColors|" msgid "Needed in this band" msgstr "" #: ../setuppagecolors.cpp:44 msgctxt "SetupPageColors|" msgid "Worked in this band" msgstr "" #: ../setuppagecolors.cpp:45 msgctxt "SetupPageColors|" msgid "Confirmed in this band" msgstr "" #: ../setuppagecolors.cpp:46 msgctxt "SetupPageColors|" msgid "Default" msgstr "" #: ../setuppagecolors.cpp:131 msgctxt "SetupPageColors|" msgid "Choose a color" msgstr "" #: ../setuppagedxcluster.cpp:74 msgctxt "SetupPageDxCluster|" msgid "Add" msgstr "" #: ../setuppagedxcluster.cpp:75 msgctxt "SetupPageDxCluster|" msgid "Delete" msgstr "" #: ../setuppagedxcluster.cpp:77 msgctxt "SetupPageDxCluster|" msgid "Show &HF spots" msgstr "" #: ../setuppagedxcluster.cpp:78 msgctxt "SetupPageDxCluster|" msgid "Show V/&UHF spots" msgstr "" #: ../setuppagedxcluster.cpp:79 msgctxt "SetupPageDxCluster|" msgid "Show W&ARC spots" msgstr "" #: ../setuppagedxcluster.cpp:80 msgctxt "SetupPageDxCluster|" msgid "Show &worked spots" msgstr "" #: ../setuppagedxcluster.cpp:81 msgctxt "SetupPageDxCluster|" msgid "Show &confirmed spots" msgstr "" #: ../setuppagedxcluster.cpp:82 msgctxt "SetupPageDxCluster|" msgid "Show ANN/&FULL messages" msgstr "" #: ../setuppagedxcluster.cpp:83 msgctxt "SetupPageDxCluster|" msgid "Show WW&V messages" msgstr "" #: ../setuppagedxcluster.cpp:84 msgctxt "SetupPageDxCluster|" msgid "Show WC&Y messages" msgstr "" #: ../setuppagedxcluster.cpp:86 msgctxt "SetupPageDxCluster|" msgid "DX Spots" msgstr "" #: ../setuppagedxcluster.cpp:98 msgctxt "SetupPageDxCluster|" msgid "Messages" msgstr "" #: ../setuppagedxcluster.cpp:156 msgctxt "SetupPageDxCluster|" msgid "KLog: Add a DXCluster server" msgstr "" #: ../setuppagedxcluster.cpp:157 msgctxt "SetupPageDxCluster|" msgid "" "Add the address followed by the :port\n" "Example: dxfun.com:8000\n" "If no port is specified, 41112 will be used by default:" msgstr "" #: ../setuppagehamlib.cpp:50 msgctxt "SetupPageHamLib|" msgid "Activate HamLib" msgstr "" #: ../setuppagehamlib.cpp:51 msgctxt "SetupPageHamLib|" msgid "" "Activates the hamlib support that will enable the connection to a radio." msgstr "" #: ../setuppagehamlib.cpp:53 msgctxt "SetupPageHamLib|" msgid "RTS on" msgstr "" #: ../setuppagehamlib.cpp:54 msgctxt "SetupPageHamLib|" msgid "Setting RTS may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:55 msgctxt "SetupPageHamLib|" msgid "DTR on" msgstr "" #: ../setuppagehamlib.cpp:56 msgctxt "SetupPageHamLib|" msgid "Setting DTR may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:66 msgctxt "SetupPageHamLib|" msgid "Radio" msgstr "" #: ../setuppagehamlib.cpp:68 msgctxt "SetupPageHamLib|" msgid "Select your rig." msgstr "" #: ../setuppagehamlib.cpp:72 msgctxt "SetupPageHamLib|" msgid "Defines the interval to pool the radio in msecs." msgstr "" #: ../setuppagehamlib.cpp:78 msgctxt "SetupPageHamLib|" msgid "Pool interval" msgstr "" #: ../setuppagehamlib.cpp:90 msgctxt "SetupPageHamLib|" msgid "Port" msgstr "" #: ../setuppagehamlib.cpp:92 msgctxt "SetupPageHamLib|" msgid "" "Select the serial port. Only the serial ports that are detected are shown." msgstr "" #: ../setuppagehamlib.cpp:96 msgctxt "SetupPageHamLib|" msgid "Scan" msgstr "" #: ../setuppagehamlib.cpp:97 msgctxt "SetupPageHamLib|" msgid "Click to identify the serial ports available in your computer." msgstr "" #: ../setuppagehamlib.cpp:102 msgctxt "SetupPageHamLib|" msgid "Bauds" msgstr "" #: ../setuppagehamlib.cpp:104 msgctxt "SetupPageHamLib|" msgid "Select the serial port speed." msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "5 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "6 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "7 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "8 bits" msgstr "" #: ../setuppagehamlib.cpp:113 msgctxt "SetupPageHamLib|" msgid "Data bits" msgstr "" #: ../setuppagehamlib.cpp:115 msgctxt "SetupPageHamLib|" msgid "Select the serial data bits." msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "None" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Hardware" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Software XON/XOFF" msgstr "" #: ../setuppagehamlib.cpp:123 msgctxt "SetupPageHamLib|" msgid "Flow control" msgstr "" #: ../setuppagehamlib.cpp:125 msgctxt "SetupPageHamLib|" msgid "Select the serial flow control" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "No parity" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Even" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Odd" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Space" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Mark" msgstr "" #: ../setuppagehamlib.cpp:133 msgctxt "SetupPageHamLib|" msgid "Parity" msgstr "" #: ../setuppagehamlib.cpp:135 msgctxt "SetupPageHamLib|" msgid "Select the serial parity." msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1 bit" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1.5 bits" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "2 bits" msgstr "" #: ../setuppagehamlib.cpp:144 msgctxt "SetupPageHamLib|" msgid "Stop bits" msgstr "" #: ../setuppagehamlib.cpp:146 msgctxt "SetupPageHamLib|" msgid "Select the serial stop bits." msgstr "" #: ../setuppagelogs.cpp:70 msgctxt "SetupPageLogs|" msgid "&New" msgstr "" #: ../setuppagelogs.cpp:71 msgctxt "SetupPageLogs|" msgid "&Edit" msgstr "" #: ../setuppagelogs.cpp:72 msgctxt "SetupPageLogs|" msgid "&Remove" msgstr "" #: ../setuppagelogs.cpp:75 msgctxt "SetupPageLogs|" msgid "Add a new log." msgstr "" #: ../setuppagelogs.cpp:79 msgctxt "SetupPageLogs|" msgid "Edit the selected log." msgstr "" #: ../setuppagelogs.cpp:80 msgctxt "SetupPageLogs|" msgid "Remove the selected log." msgstr "" #: ../setuppagelogs.cpp:82 msgctxt "SetupPageLogs|" msgid "Select the log you want to open." msgstr "" #: ../setuppagelogs.cpp:219 msgctxt "SetupPageLogs|" msgid "KLog" msgstr "" #: ../setuppagelogs.cpp:220 msgctxt "SetupPageLogs|" msgid "Do you really want to remove this log?" msgstr "" #: ../setuppagelogs.cpp:221 msgctxt "SetupPageLogs|" msgid "All the QSOs from this log will be also deleted..." msgstr "" #: ../setuppagelogs.cpp:253 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#3)" msgstr "" #: ../setuppagelogs.cpp:260 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#2)" msgstr "" #: ../setuppagelogs.cpp:267 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#1)" msgstr "" #: ../setuppagelogs.cpp:327 msgctxt "SetupPageLogs|" msgid "ID" msgstr "" #: ../setuppagelogs.cpp:330 msgctxt "SetupPageLogs|" msgid "Date" msgstr "" #: ../setuppagelogs.cpp:333 msgctxt "SetupPageLogs|" msgid "Station Callsign" msgstr "" #: ../setuppagelogs.cpp:336 msgctxt "SetupPageLogs|" msgid "Operators" msgstr "" #: ../setuppagelogs.cpp:339 msgctxt "SetupPageLogs|" msgid "Comments" msgstr "" #: ../setuppagelogs.cpp:342 msgctxt "SetupPageLogs|" msgid "Type" msgstr "" #: ../setuppagelogs.cpp:649 msgctxt "SetupPageLogs|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagelogs.cpp:652 msgctxt "SetupPageLogs|" msgid "KLog - SetupPageLogs" msgstr "" #: ../setuppagelogsnew.cpp:92 msgctxt "SetupPageLogsNew|" msgid "&Date" msgstr "" #: ../setuppagelogsnew.cpp:93 msgctxt "SetupPageLogsNew|" msgid "&Station Callsign" msgstr "" #: ../setuppagelogsnew.cpp:94 msgctxt "SetupPageLogsNew|" msgid "&Operators" msgstr "" #: ../setuppagelogsnew.cpp:95 msgctxt "SetupPageLogsNew|" msgid "Comm&ent" msgstr "" #: ../setuppagelogsnew.cpp:97 msgctxt "SetupPageLogsNew|" msgid "&Ok" msgstr "" #: ../setuppagelogsnew.cpp:98 msgctxt "SetupPageLogsNew|" msgid "&Cancel" msgstr "" #: ../setuppagelogsnew.cpp:155 msgctxt "SetupPageLogsNew|" msgid "Select categories" msgstr "" #: ../setuppagelogsnew.cpp:159 msgctxt "SetupPageLogsNew|" msgid "Callsign used for this log." msgstr "" #: ../setuppagelogsnew.cpp:160 msgctxt "SetupPageLogsNew|" msgid "Comma separated list of operators: callsign1, callsign2." msgstr "" #: ../setuppagelogsnew.cpp:162 msgctxt "SetupPageLogsNew|" msgid "Start date of this log." msgstr "" #: ../setuppagelogsnew.cpp:163 msgctxt "SetupPageLogsNew|" msgid "Add a comment about this log." msgstr "" #: ../setuppagelogsnew.cpp:165 msgctxt "SetupPageLogsNew|" msgid "&Type of Operation" msgstr "" #: ../setuppagelogsnew.cpp:172 msgctxt "SetupPageLogsNew|" msgid "Select the kind of operation for this log." msgstr "" #: ../setuppagelogsnew.cpp:179 msgctxt "SetupPageLogsNew|" msgid "&Mode Category" msgstr "" #: ../setuppagelogsnew.cpp:181 msgctxt "SetupPageLogsNew|" msgid "Select the mode category." msgstr "" #: ../setuppagelogsnew.cpp:187 msgctxt "SetupPageLogsNew|" msgid "O&perators Category" msgstr "" #: ../setuppagelogsnew.cpp:189 msgctxt "SetupPageLogsNew|" msgid "Select the operators category." msgstr "" #: ../setuppagelogsnew.cpp:194 msgctxt "SetupPageLogsNew|" msgid "&Assisted Category" msgstr "" #: ../setuppagelogsnew.cpp:196 msgctxt "SetupPageLogsNew|" msgid "Select the assisted category." msgstr "" #: ../setuppagelogsnew.cpp:202 msgctxt "SetupPageLogsNew|" msgid "Po&wer Category" msgstr "" #: ../setuppagelogsnew.cpp:204 msgctxt "SetupPageLogsNew|" msgid "Select the power category." msgstr "" #: ../setuppagelogsnew.cpp:210 msgctxt "SetupPageLogsNew|" msgid "&Bands Category" msgstr "" #: ../setuppagelogsnew.cpp:212 msgctxt "SetupPageLogsNew|" msgid "Select the bands category." msgstr "" #: ../setuppagelogsnew.cpp:217 msgctxt "SetupPageLogsNew|" msgid "O&verlay" msgstr "" #: ../setuppagelogsnew.cpp:219 msgctxt "SetupPageLogsNew|" msgid "Select the Overlay category." msgstr "" #: ../setuppagelogsnew.cpp:380 ../setuppagelogsnew.cpp:933 msgctxt "SetupPageLogsNew|" msgid "Categories not OK" msgstr "" #: ../setuppagelogsnew.cpp:577 msgctxt "SetupPageLogsNew|" msgid "" "You need to enter a valid QRZ in the Station Callsign box.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:688 msgctxt "SetupPageLogsNew|" msgid "" "You selected an invalid combination.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:925 msgctxt "SetupPageLogsNew|" msgid "Categories OK" msgstr "" #: ../setuppagemisc.cpp:38 msgctxt "SetupPageMisc|" msgid "&Imperial system" msgstr "" #: ../setuppagemisc.cpp:39 msgctxt "SetupPageMisc|" msgid "&Log in real time" msgstr "" #: ../setuppagemisc.cpp:40 msgctxt "SetupPageMisc|" msgid "&Time in UTC" msgstr "" #: ../setuppagemisc.cpp:41 msgctxt "SetupPageMisc|" msgid "&Save ADIF on exit" msgstr "" #: ../setuppagemisc.cpp:42 msgctxt "SetupPageMisc|" msgid "Use this &default filename" msgstr "" #: ../setuppagemisc.cpp:43 msgctxt "SetupPageMisc|" msgid "Mark &QSO to send QSL when QSL is received" msgstr "" #: ../setuppagemisc.cpp:44 msgctxt "SetupPageMisc|" msgid "Complete QSO with previous data" msgstr "" #: ../setuppagemisc.cpp:45 msgctxt "SetupPageMisc|" msgid "Show the Station &Callsign used in the search box" msgstr "" #: ../setuppagemisc.cpp:46 msgctxt "SetupPageMisc|" msgid "&Reset to My Data for all QSOs" msgstr "" #: ../setuppagemisc.cpp:47 msgctxt "SetupPageMisc|" msgid "&Check for new versions automatically" msgstr "" #: ../setuppagemisc.cpp:48 msgctxt "SetupPageMisc|" msgid "&Provide Info for statistics" msgstr "" #: ../setuppagemisc.cpp:49 msgctxt "SetupPageMisc|" msgid "Manage DX-Marathon" msgstr "" #: ../setuppagemisc.cpp:54 ../setuppagemisc.cpp:55 msgctxt "SetupPageMisc|" msgid "Browse" msgstr "" #: ../setuppagemisc.cpp:56 msgctxt "SetupPageMisc|" msgid "Move DB" msgstr "" #: ../setuppagemisc.cpp:116 msgctxt "SetupPageMisc|" msgid "" "QSOs will be marked as pending to send a QSL if you receive the DX QSL and " "have not sent yours." msgstr "" #: ../setuppagemisc.cpp:117 msgctxt "SetupPageMisc|" msgid "The search box will show also the callsign on the air to do the QSO." msgstr "" #: ../setuppagemisc.cpp:118 msgctxt "SetupPageMisc|" msgid "" "All the data from the My Data tab will be used or data from the previous QSO " "will be maintained." msgstr "" #: ../setuppagemisc.cpp:119 msgctxt "SetupPageMisc|" msgid "" "Check if there is a new release of KLog available every time you start KLog." msgstr "" #: ../setuppagemisc.cpp:120 msgctxt "SetupPageMisc|" msgid "" "If new version checking is selected, KLog will send the developer your " "callsign, KLog version & Operating system to help in improving KLog." msgstr "" #: ../setuppagemisc.cpp:121 msgctxt "SetupPageMisc|" msgid "Check it for Imperial system (Miles instead of Kilometers)." msgstr "" #: ../setuppagemisc.cpp:122 msgctxt "SetupPageMisc|" msgid "Select to use real time." msgstr "" #: ../setuppagemisc.cpp:123 msgctxt "SetupPageMisc|" msgid "Select to use UTC time." msgstr "" #: ../setuppagemisc.cpp:124 msgctxt "SetupPageMisc|" msgid "Select if you want to save to ADIF on exit." msgstr "" #: ../setuppagemisc.cpp:125 msgctxt "SetupPageMisc|" msgid "" "Select to use the following name for the logfile without being asked for it " "again." msgstr "" #: ../setuppagemisc.cpp:126 msgctxt "SetupPageMisc|" msgid "Complete the current QSO with previous QSO data." msgstr "" #: ../setuppagemisc.cpp:127 msgctxt "SetupPageMisc|" msgid "Select if you want to manage DX-Marathon." msgstr "" #: ../setuppagemisc.cpp:128 msgctxt "SetupPageMisc|" msgid "This is the default file where ADIF data will be saved." msgstr "" #: ../setuppagemisc.cpp:129 msgctxt "SetupPageMisc|" msgid "This is the directory where the database (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:130 msgctxt "SetupPageMisc|" msgid "Click to change the default ADIF file." msgstr "" #: ../setuppagemisc.cpp:131 msgctxt "SetupPageMisc|" msgid "Click to change the path of the database." msgstr "" #: ../setuppagemisc.cpp:132 msgctxt "SetupPageMisc|" msgid "Click to move the DB to the new directory." msgstr "" #: ../setuppagemisc.cpp:274 msgctxt "SetupPageMisc|" msgid "Open File" msgstr "" #: ../setuppagemisc.cpp:602 msgctxt "SetupPageMisc|" msgid "Select Directory" msgstr "" #: ../setuppagemisc.cpp:633 msgctxt "SetupPageMisc|" msgid "This is the directory where DB (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:639 msgctxt "SetupPageMisc|" msgid "" "Please specify an existing directory where the database (logbook.dat) will " "be saved." msgstr "" #: ../setuppagemisc.cpp:674 msgctxt "SetupPageMisc|" msgid "File moved" msgstr "" #: ../setuppagemisc.cpp:684 msgctxt "SetupPageMisc|" msgid "File copied" msgstr "" #: ../setuppagemisc.cpp:694 msgctxt "SetupPageMisc|" msgid "File NOT copied" msgstr "" #: ../setuppagemisc.cpp:707 msgctxt "SetupPageMisc|" msgid "" "The target directory does not exist. Please select an existing directory." msgstr "" #: ../setuppagesats.cpp:64 msgctxt "SetupPageSats|" msgid "&New" msgstr "" #: ../setuppagesats.cpp:65 msgctxt "SetupPageSats|" msgid "&Edit" msgstr "" #: ../setuppagesats.cpp:66 msgctxt "SetupPageSats|" msgid "&Remove" msgstr "" #: ../setuppagesats.cpp:67 msgctxt "SetupPageSats|" msgid "&Import" msgstr "" #: ../setuppagesats.cpp:68 msgctxt "SetupPageSats|" msgid "E&xport" msgstr "" #: ../setuppagesats.cpp:70 msgctxt "SetupPageSats|" msgid "Add a new satellite." msgstr "" #: ../setuppagesats.cpp:71 msgctxt "SetupPageSats|" msgid "Edit the selected satellite." msgstr "" #: ../setuppagesats.cpp:72 msgctxt "SetupPageSats|" msgid "Remove the selected satellite." msgstr "" #: ../setuppagesats.cpp:73 msgctxt "SetupPageSats|" msgid "" "Import a satellites file. It will replace the satellites you have now " "configured." msgstr "" #: ../setuppagesats.cpp:74 msgctxt "SetupPageSats|" msgid "Export your current satellites to a file." msgstr "" #: ../setuppagesats.cpp:76 msgctxt "SetupPageSats|" msgid "Select the sat you want to open." msgstr "" #: ../setuppagesats.cpp:210 msgctxt "SetupPageSats|" msgid "KLog" msgstr "" #: ../setuppagesats.cpp:211 msgctxt "SetupPageSats|" msgid "Do you really want to remove this satellite?" msgstr "" #: ../setuppagesats.cpp:212 msgctxt "SetupPageSats|" msgid "This satellite will not be longer available to be selected ..." msgstr "" #: ../setuppagesats.cpp:244 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#3)" msgstr "" #: ../setuppagesats.cpp:251 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#2)" msgstr "" #: ../setuppagesats.cpp:258 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#1)" msgstr "" #: ../setuppagesats.cpp:318 msgctxt "SetupPageSats|" msgid "ID" msgstr "" #: ../setuppagesats.cpp:321 msgctxt "SetupPageSats|" msgid "Short" msgstr "" #: ../setuppagesats.cpp:324 msgctxt "SetupPageSats|" msgid "Name" msgstr "" #: ../setuppagesats.cpp:327 msgctxt "SetupPageSats|" msgid "Uplink" msgstr "" #: ../setuppagesats.cpp:330 msgctxt "SetupPageSats|" msgid "Downlink" msgstr "" #: ../setuppagesats.cpp:333 msgctxt "SetupPageSats|" msgid "Modes" msgstr "" #: ../setuppagesats.cpp:571 msgctxt "SetupPageSats|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagesats.cpp:574 msgctxt "SetupPageSats|" msgid "KLog - SetupPageSats" msgstr "" #: ../setuppagesats.cpp:584 msgctxt "SetupPageSats|" msgid "Open Satellites File" msgstr "" #: ../setuppagesats.cpp:603 msgctxt "SetupPageSats|" msgid "KLog warning" msgstr "" #: ../setuppagesats.cpp:605 msgctxt "SetupPageSats|" msgid "" "An unexpected error ocurred while importing the satellite data.\n" "\n" "It may be caused because the file you are trying to import does not have the " "right format." msgstr "" #: ../setuppagesats.cpp:608 msgctxt "SetupPageSats|" msgid "" "Please check the format or contact the developer for analysis with the error " "code: " msgstr "" #: ../setuppagesats.cpp:675 msgctxt "SetupPageSats|" msgid "Save Satellites File" msgstr "" #: ../setuppagesatsnew.cpp:46 msgctxt "SetupPageSatsNew|" msgid "Short name" msgstr "" #: ../setuppagesatsnew.cpp:47 msgctxt "SetupPageSatsNew|" msgid "Sat name" msgstr "" #: ../setuppagesatsnew.cpp:48 msgctxt "SetupPageSatsNew|" msgid "UpLink" msgstr "" #: ../setuppagesatsnew.cpp:49 msgctxt "SetupPageSatsNew|" msgid "DownLink" msgstr "" #: ../setuppagesatsnew.cpp:50 msgctxt "SetupPageSatsNew|" msgid "Modes" msgstr "" #: ../setuppagesatsnew.cpp:56 msgctxt "SetupPageSatsNew|" msgid "&Ok" msgstr "" #: ../setuppagesatsnew.cpp:57 msgctxt "SetupPageSatsNew|" msgid "&Cancel" msgstr "" #: ../setuppagesatsnew.cpp:103 msgctxt "SetupPageSatsNew|" msgid "" "Enter the short name. Try to use the LoTW short name so you can upload your " "QSO to LoTW afterwards." msgstr "" #: ../setuppagesatsnew.cpp:104 msgctxt "SetupPageSatsNew|" msgid "Enter the name of the satellite." msgstr "" #: ../setuppagesatsnew.cpp:105 msgctxt "SetupPageSatsNew|" msgid "Enter the uplink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:106 msgctxt "SetupPageSatsNew|" msgid "Enter the downlink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:107 msgctxt "SetupPageSatsNew|" msgid "Enter the modes in this format: USB" msgstr "" #: ../setuppagesatsnew.cpp:385 msgctxt "SetupPageSatsNew|" msgid "" "Some of the data you have entered is not correct, the satellite can't be " "added." msgstr "" #: ../setuppageudp.cpp:10 msgctxt "SetupPageUDP|" msgid "Start UDP Server" msgstr "" #: ../setuppageudp.cpp:33 msgctxt "SetupPageUDP|" msgid "Log automatically QSOs from WSJT-X" msgstr "" #: ../setuppageudp.cpp:34 msgctxt "SetupPageUDP|" msgid "Allow WSJT-X to send logged QSO to KLog" msgstr "" #: ../setuppageudp.cpp:35 #, qt-format msgctxt "SetupPageUDP|" msgid "" "QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging " "into KLog unless \"%1\" is selected" msgstr "" #: ../setuppageudp.cpp:38 msgctxt "SetupPageUDP|" msgid "" "KLog will log automatically any QSO coming from WSJT-X without any manual " "confirmation." msgstr "" #: ../setuppageudp.cpp:41 msgctxt "SetupPageUDP|" msgid "Receive and Update QSO data to KLog" msgstr "" #: ../setuppageudp.cpp:42 msgctxt "SetupPageUDP|" msgid "" "KLog will automatically show and update data coming from WSJT-X (DX " "callsign, locator, RPT, ...)" msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "UDP port number where the UDP Server will listen for packets." msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "" "Make sure it is the same port where the other programs are sending the data " "to. Default port is 2237." msgstr "" #: ../setuppageudp.cpp:59 msgctxt "SetupPageUDP|" msgid "" "UDP Server will receive QSOs sent from other programs like WSJT-X allowing " "you to log in KLog automatically from those programs." msgstr "" #: ../setuppageudp.cpp:65 msgctxt "SetupPageUDP|" msgid "UDP Port" msgstr "" #: ../setuppageudp.cpp:78 msgctxt "SetupPageUDP|" msgid "QSO notification timeout (milisecs)" msgstr "" #: ../setuppageudp.cpp:79 msgctxt "SetupPageUDP|" msgid "" "Milliseconds that the notification of QSO received from WSJTX will be shown." msgstr "" #: ../setuppageuserdata.cpp:40 msgctxt "SetupPageUserDataPage|" msgid "&Personal data" msgstr "" #: ../setuppageuserdata.cpp:41 msgctxt "SetupPageUserDataPage|" msgid "Station &data" msgstr "" #: ../setuppageuserdata.cpp:70 msgctxt "SetupPageUserDataPage|" msgid "Enter your name." msgstr "" #: ../setuppageuserdata.cpp:71 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 1st line." msgstr "" #: ../setuppageuserdata.cpp:72 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 2nd line." msgstr "" #: ../setuppageuserdata.cpp:73 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 3rd line." msgstr "" #: ../setuppageuserdata.cpp:74 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 4th line." msgstr "" #: ../setuppageuserdata.cpp:75 msgctxt "SetupPageUserDataPage|" msgid "Enter your city." msgstr "" #: ../setuppageuserdata.cpp:76 msgctxt "SetupPageUserDataPage|" msgid "Enter your zip code." msgstr "" #: ../setuppageuserdata.cpp:77 msgctxt "SetupPageUserDataPage|" msgid "Enter your province or state." msgstr "" #: ../setuppageuserdata.cpp:78 msgctxt "SetupPageUserDataPage|" msgid "Enter your country." msgstr "" #: ../setuppageuserdata.cpp:80 msgctxt "SetupPageUserDataPage|" msgid "&Name" msgstr "" #: ../setuppageuserdata.cpp:81 msgctxt "SetupPageUserDataPage|" msgid "&Address" msgstr "" #: ../setuppageuserdata.cpp:82 msgctxt "SetupPageUserDataPage|" msgid "Cit&y" msgstr "" #: ../setuppageuserdata.cpp:83 msgctxt "SetupPageUserDataPage|" msgid "&Zip Code" msgstr "" #: ../setuppageuserdata.cpp:84 msgctxt "SetupPageUserDataPage|" msgid "Pro&v/State" msgstr "" #: ../setuppageuserdata.cpp:85 msgctxt "SetupPageUserDataPage|" msgid "Countr&y" msgstr "" #: ../setuppageuserdata.cpp:139 ../setuppageuserdata.cpp:140 #: ../setuppageuserdata.cpp:141 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for rig" msgstr "" #: ../setuppageuserdata.cpp:142 ../setuppageuserdata.cpp:143 #: ../setuppageuserdata.cpp:144 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for antenna" msgstr "" #: ../setuppageuserdata.cpp:145 msgctxt "SetupPageUserDataPage|" msgid "Enter your power information." msgstr "" #: ../setuppageuserdata.cpp:147 msgctxt "SetupPageUserDataPage|" msgid "&Rig 1" msgstr "" #: ../setuppageuserdata.cpp:148 msgctxt "SetupPageUserDataPage|" msgid "R&ig 2" msgstr "" #: ../setuppageuserdata.cpp:149 msgctxt "SetupPageUserDataPage|" msgid "Ri&g 3" msgstr "" #: ../setuppageuserdata.cpp:150 msgctxt "SetupPageUserDataPage|" msgid "Antenna &1" msgstr "" #: ../setuppageuserdata.cpp:151 msgctxt "SetupPageUserDataPage|" msgid "Antenna &2" msgstr "" #: ../setuppageuserdata.cpp:152 msgctxt "SetupPageUserDataPage|" msgid "Antenna &3" msgstr "" #: ../setuppageuserdata.cpp:153 msgctxt "SetupPageUserDataPage|" msgid "Po&wer" msgstr "" #: ../setuppageuserdata.cpp:186 msgctxt "SetupPageUserDataPage|" msgid "Enter the station callsign that will be used for logging." msgstr "" #: ../setuppageuserdata.cpp:187 msgctxt "SetupPageUserDataPage|" msgid "Enter the operators (comma separated if more than one)." msgstr "" #: ../setuppageuserdata.cpp:188 msgctxt "SetupPageUserDataPage|" msgid "" "Enter the locator of your station. Alternatively, KLog can use an " "approximate locator based on your callsign." msgstr "" #: ../setuppageuserdata.cpp:191 msgctxt "SetupPageUserDataPage|" msgid "&QRZ" msgstr "" #: ../setuppageuserdata.cpp:192 msgctxt "SetupPageUserDataPage|" msgid "&Operators" msgstr "" #: ../setuppageuserdata.cpp:193 msgctxt "SetupPageUserDataPage|" msgid "&CQ Zone" msgstr "" #: ../setuppageuserdata.cpp:194 msgctxt "SetupPageUserDataPage|" msgid "&ITU Zone" msgstr "" #: ../setuppageuserdata.cpp:195 ../setuppageuserdata.cpp:374 msgctxt "SetupPageUserDataPage|" msgid "&Locator" msgstr "" #: ../setuppageuserdata.cpp:370 msgctxt "SetupPageUserDataPage|" msgid "&Locator (not valid)" msgstr "" #: ../setuppageworldeditor.cpp:32 msgctxt "SetupPageWorldEditor|" msgid "Add" msgstr "" #: ../setuppageworldeditor.cpp:33 msgctxt "SetupPageWorldEditor|" msgid "Delete" msgstr "" #: ../setuppageworldeditor.cpp:34 msgctxt "SetupPageWorldEditor|" msgid "Edit" msgstr "" #: ../setuppageworldeditor.cpp:36 msgctxt "SetupPageWorldEditor|" msgid "Export World" msgstr "" #: ../setuppageworldeditor.cpp:37 msgctxt "SetupPageWorldEditor|" msgid "Import World" msgstr "" #: ../setuppageworldeditor.cpp:43 ../setuppageworldeditor.cpp:44 #: ../setuppageworldeditor.cpp:45 ../setuppageworldeditor.cpp:49 msgctxt "SetupPageWorldEditor|" msgid "Still not implemented." msgstr "" #: ../setuppageworldeditor.cpp:50 msgctxt "SetupPageWorldEditor|" msgid "Import a new cty.csv file" msgstr "" #: ../setuppageworldeditor.cpp:88 msgctxt "SetupPageWorldEditor|" msgid "" "An entities information file (cty.csv) has been detected in your KLog folder " "and will be loaded." msgstr "" #: ../setuppageworldeditor.cpp:97 msgctxt "SetupPageWorldEditor|" msgid "" "No entities information file (cty.csv) has been detected in your KLog folder." msgstr "" #: ../setuppageworldeditor.cpp:98 msgctxt "SetupPageWorldEditor|" msgid "KLog will not be able to show entities information." msgstr "" #: ../setuppageworldeditor.cpp:184 msgctxt "SetupPageWorldEditor|" msgid "Prefix" msgstr "" #: ../setuppageworldeditor.cpp:186 msgctxt "SetupPageWorldEditor|" msgid "Entity" msgstr "" #: ../setuppageworldeditor.cpp:188 msgctxt "SetupPageWorldEditor|" msgid "ARRL ID" msgstr "" #: ../setuppageworldeditor.cpp:190 msgctxt "SetupPageWorldEditor|" msgid "Continent" msgstr "" #: ../setuppageworldeditor.cpp:192 msgctxt "SetupPageWorldEditor|" msgid "CQ Zone" msgstr "" #: ../setuppageworldeditor.cpp:194 msgctxt "SetupPageWorldEditor|" msgid "ITU Zone" msgstr "" #: ../setuppageworldeditor.cpp:196 msgctxt "SetupPageWorldEditor|" msgid "UTC" msgstr "" #: ../setuppageworldeditor.cpp:198 msgctxt "SetupPageWorldEditor|" msgid "Latitude" msgstr "" #: ../setuppageworldeditor.cpp:200 msgctxt "SetupPageWorldEditor|" msgid "Longitude" msgstr "" #: ../setuppageworldeditor.cpp:203 msgctxt "SetupPageWorldEditor|" msgid "Deleted" msgstr "" #: ../setuppageworldeditor.cpp:206 msgctxt "SetupPageWorldEditor|" msgid "Since Date" msgstr "" #: ../setuppageworldeditor.cpp:208 msgctxt "SetupPageWorldEditor|" msgid "To Date" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "Open File" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "BigCTY (*.csv)" msgstr "" #: ../setuppageworldeditor.cpp:311 msgctxt "SetupPageWorldEditor|" msgid "Entities information has been updated." msgstr "" #: ../setuppageworldeditor.cpp:317 msgctxt "SetupPageWorldEditor|" msgid "Entities information has not been updated." msgstr "" #: ../showerrordialog.cpp:9 msgctxt "ShowErrorDialog|" msgid "KLog Message" msgstr "" #: ../softwareupdatedialog.cpp:17 msgctxt "SoftwareUpdateDialog|" msgid "Ok" msgstr "" #: ../softwareupdatedialog.cpp:35 msgctxt "SoftwareUpdateDialog|" msgid "KLog update" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Congratulations!" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Your KLog has been updated." msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "You already have the latest version." msgstr "" #: ../startwizard.cpp:42 msgctxt "StartWizard|" msgid "KLog - The free hamradio logging program" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Quit Setup" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Setup is not complete yet. Are you sure you want to quit setup?" msgstr "" #: ../statisticswidget.cpp:79 msgctxt "StatisticsWidget|" msgid "QSO per year" msgstr "" #: ../statisticswidget.cpp:80 msgctxt "StatisticsWidget|" msgid "DXCC per year" msgstr "" #: ../statisticswidget.cpp:81 msgctxt "StatisticsWidget|" msgid "CQ zones per year" msgstr "" #: ../statisticswidget.cpp:82 msgctxt "StatisticsWidget|" msgid "QSO per band" msgstr "" #: ../statisticswidget.cpp:83 msgctxt "StatisticsWidget|" msgid "QSO per mode" msgstr "" #: ../statisticswidget.cpp:84 msgctxt "StatisticsWidget|" msgid "QSO per DXCC" msgstr "" #: ../statisticswidget.cpp:85 msgctxt "StatisticsWidget|" msgid "QSO per Continent" msgstr "" #: ../statisticswidget.cpp:86 msgctxt "StatisticsWidget|" msgid "QSO per hour" msgstr "" #: ../statisticswidget.cpp:87 msgctxt "StatisticsWidget|" msgid "QSO per month" msgstr "" #: ../statisticswidget.cpp:88 msgctxt "StatisticsWidget|" msgid "Worked / Confirmed status" msgstr "" #: ../statisticswidget.cpp:89 msgctxt "StatisticsWidget|" msgid "Worked / Sent status" msgstr "" #: ../statisticswidget.cpp:90 msgctxt "StatisticsWidget|" msgid "Sent / Confirmed status" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:47 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ Zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:56 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:57 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 #, qt-format msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Years: %1/%2" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:47 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:57 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:58 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities per year" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Entities: " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:47 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSOs per band" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:56 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:57 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSO per band distribution" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands: " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:47 #: ../charts/statsqsospercontinentbarchartwidget.cpp:61 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "QSOs per continent" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:60 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Continents" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:47 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "QSOs per DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:53 #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data..." msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Entity: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:119 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:120 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Top ten DXCC per QSO" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:47 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs per hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:59 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:60 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs at hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:47 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSOs per mode" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:56 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:57 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSO per mode distribution" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes: " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:47 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs per month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jan" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Feb" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Mar" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Apr" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "May" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jun" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jul" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Aug" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Sep" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Oct" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Nov" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Dec" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:59 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:60 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs at Month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months: " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:47 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:56 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:57 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs per year" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 #, qt-format msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSO: %1/%2" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Sent - %1" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Worked, not confirmed - %1" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Worked - %1" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Sent - %2" msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Reading Satellites data file..." msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Abort reading" msgstr "" #: ../updatesatsdata.cpp:213 msgctxt "UpdateSatsData|" msgid "The Satellites information has been updated." msgstr "" #: ../updatesatsdata.cpp:231 msgctxt "UpdateSatsData|" msgid "Open File" msgstr "" #: ../updatesatsdata.cpp:233 msgctxt "UpdateSatsData|" msgid "Sat Data" msgstr "" #: ../world.cpp:171 msgctxt "World|" msgid "Entity" msgstr "" #: ../world.cpp:172 msgctxt "World|" msgid "Continent" msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Reading cty.csv..." msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Abort reading" msgstr "" #: ../elogclublog.cpp:58 ../elogclublog.cpp:118 msgctxt "eLogClubLog|" msgid "Host not found!" msgstr "" #: ../elogclublog.cpp:64 ../elogclublog.cpp:123 msgctxt "eLogClubLog|" msgid "Timeout error!" msgstr "" #: ../elogclublog.cpp:70 msgctxt "eLogClubLog|" msgid "It seems to be a PASSWORD ERROR; check your password." msgstr "" #: ../elogclublog.cpp:72 msgctxt "eLogClubLog|" msgid "KLog - ClubLog" msgstr "" #: ../elogclublog.cpp:73 msgctxt "eLogClubLog|" msgid "It seems that your ClubLog password is not correct." msgstr "" #: ../elogclublog.cpp:74 msgctxt "eLogClubLog|" msgid "" "Please check your password in the setup. ClubLog uploads will be disabled." msgstr "" #: ../elogclublog.cpp:84 ../elogclublog.cpp:128 msgctxt "eLogClubLog|" msgid "Undefined error..." msgstr "" #: ../elogclublog.cpp:391 msgctxt "eLogClubLog|" msgid "Callsign missing" msgstr "" #: ../elogclublog.cpp:395 msgctxt "eLogClubLog|" msgid "Invalid callsign" msgstr "" #: ../elogclublog.cpp:399 msgctxt "eLogClubLog|" msgid "Skipping SWL callsign" msgstr "" #: ../elogclublog.cpp:403 msgctxt "eLogClubLog|" msgid "Callsign is your own call" msgstr "" #: ../elogclublog.cpp:407 msgctxt "eLogClubLog|" msgid "Invalid callsign with no DXCC mapping" msgstr "" #: ../elogclublog.cpp:411 msgctxt "eLogClubLog|" msgid "Updated QSO" msgstr "" #: ../elogclublog.cpp:415 msgctxt "eLogClubLog|" msgid "Invalid ADIF record" msgstr "" #: ../elogclublog.cpp:419 msgctxt "eLogClubLog|" msgid "Missing ADIF record" msgstr "" #: ../elogclublog.cpp:423 msgctxt "eLogClubLog|" msgid "Test mode - parameters ok, no action taken" msgstr "" #: ../elogclublog.cpp:427 msgctxt "eLogClubLog|" msgid "Excessive API Usage" msgstr "" #: ../elogclublog.cpp:431 msgctxt "eLogClubLog|" msgid "Internal Error" msgstr "" #: ../elogclublog.cpp:435 msgctxt "eLogClubLog|" msgid "Rejected" msgstr "" #: ../elogclublog.cpp:439 msgctxt "eLogClubLog|" msgid "QSO Duplicate" msgstr "" #: ../elogclublog.cpp:443 msgctxt "eLogClubLog|" msgid "QSO Modified" msgstr "" #: ../elogclublog.cpp:447 msgctxt "eLogClubLog|" msgid "Missing Login" msgstr "" #: ../elogclublog.cpp:451 msgctxt "eLogClubLog|" msgid "QSO OK" msgstr "" #: ../elogclublog.cpp:455 ../elogclublog.cpp:479 msgctxt "eLogClubLog|" msgid "Upload denied" msgstr "" #: ../elogclublog.cpp:459 msgctxt "eLogClubLog|" msgid "No callsign selected" msgstr "" #: ../elogclublog.cpp:463 msgctxt "eLogClubLog|" msgid "No match found" msgstr "" #: ../elogclublog.cpp:467 msgctxt "eLogClubLog|" msgid "Dropped QSO" msgstr "" #: ../elogclublog.cpp:471 msgctxt "eLogClubLog|" msgid "OK" msgstr "" #: ../elogclublog.cpp:475 msgctxt "eLogClubLog|" msgid "Login rejected" msgstr "" #: ../elogclublog.cpp:483 msgctxt "eLogClubLog|" msgid "Rejected: Callsign is your own call" msgstr "" klog-1.8.6/translations/klog_fi.ts0000644000175000017500000136735114166020421016161 0ustar develdevel AboutDialog About KLog Tietoja KLogista By Tekijä KLog is a free logbook for hamradio operators. KLog on ilmainen päiväkirja radioamatööreille. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Anna arvostelusi KLogin eHam-arvostelusivulla: Find more information and the latest release at Lisätietoja ja viimeisin ohjelmistoversio löytyy osoitteesta Author Tekijä today tänään Main developer Pääkehittäjä KLog is developed by a very small team and you are invited to join! KLogia kehittää erittäin pieni ryhmä ihmisiä ja sinut on kutsuttu mukaan! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tiedäthän että tämän ominaisuuden voi ottaa käyttöön tai poistaa käytöstä asetukset valikon sekalaiset välilehdeltä. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Voit auttaa meitä myös lähettämällä virheilmoituksia tai ohjelmointiapua, ideoita tai mitä vain, mikä mielestäsi voisi parantaa KLogia. Authors Tekijät Translators bring KLog into your language. They are really an important part of the KLog development team. Kääntäjät tuovat KLogin kielellesi, ja he ovat todella tärkeä osa KLog-kehitystiimiä. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Kääntäjät Privacy advisory Tietosuojakäytäntö KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. KLog kehittäjät ovat sisällyttäneet ominaisuuden käyttäjätietojen raportoimiseksi KLog palvelimelle. Tämän tiedon ainoa tarkoitus on, asennettujen ohjelmaversioiden määrän tunnistaminen jotta, kehiystyötä voidaan kohdentaa suuntaan tai toiseen, käyttäjien tarpeet huomioiden. At present, the data that is provided is the following: Tällä hetkellä toimitettavat tiedot ovat seuraavat: Callsign Kutsutunnus KLog version KLog versio Operating system Käyttöjärjestelmä KLog KLog Privacy Tietosuoja AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok Ok Cancel Peru DX Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila Not defined All Kaikki QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Laske uudelleen Click to recalculate the award status. Napsauta laskeaksesi palkintotilanne uudestaan. Select the year you want to check. Valitse vuosi jonka haluat nähdä. QSOs QSO:t DXCC DXCC CQ CQ Award Palkinto Confirmed Vahvistettu Worked Työstetty WAZ WAZ Score Pisteet Annual Vuotuinen Number of confirmed DXCC entities. Vahvistettujen DXCC-yksiköiden määrä. Number of worked DXCC entities. Työstettyjen DXCC-yksiköiden määrä. Number of confirmed WAZ zones. Vahvistettujen WAZ vyöhykkeiden määrä. Number of worked WAZ zones. Työstettyjen WAZ vyöhykkeiden määrä. Number of confirmed QSOs. Vahvistettujen QSO:iden määrä. Number of worked QSOs. Työstettyjen QSO:iden määrä. Number of QSOs worked in the selected year. Työstettyjen QSO:iden määrä valittuna vuotena. Number of DXCCs worked in the selected year. Työstettyjen DXCC:n määrä valittuna vuotena. Number of CQ Zones worked in the selected year. Työstettyjen CQ alueiden määrä valittuna vuotena. Score for the DXMarathon in the selected year. DXMarathon pisteet valittuna vuotena DX-Marathon DX-Maratoni CTYPage Country data download Maakohtaisten tietojen lataus KLog needs country data... KLog tarvitsee maakohtaiset tiedot... &Download &Lataa &Ignore &Ohita Country data needed Maakohtaiset tiedot tarvitaan KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog käyttää cty.csv tiedostoa lähteestä https://www.country-files.com/ saadakseen DXCC informaation. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Sinun tulee ladata cty.csv tiedosto, jos haluat että KLog näyttää tehtyjen QSO:iden maat, lokaattorin, jne, Click on Download to download now. Napsauta Lataa ladataksesi nyt. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? En löydä palvelinta. Tarkista verkkoyhteys ja yritä uudelleen Haluatko yrittää uudelleen? DXCCStatusWidget Update Päivitä It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Yksikkö Prefix Etuliite Pref: CQ: CQ: ITU: ITU: Beam: Entity not worked in this band. Ei työstetty tällä taajuusalueella DXClusterWidget Click on Connect to connect to the DX-Cluster server Napsauta yhdistä, kun haluat muodostaa yhteyden DX-klusteripalvelimeen Connect Yhdistä Clear Tyhjennä Click on connect to connect to the DX-Cluster Napsauta yhdistä muodostaaksesi yhteyden DX-klusteriin Trying to connect to the server Muodostetaan yhteyttä palvelimeen KLog DXCluster KLog DXKlusteri The host was not found. Please check: Isäntää ei löytynyt. Tarkista: - your network connection; - the host name and port settings. - verkkoyhteytesi; - isäntänimi ja porttiasetukset. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Yhteys vertaisverkkoon evättiin. Varmista, että DX Klusteripalvelin on käynnissä ja tarkista, että isäntänimi ja porttiasetukset ovat oikein. The following error occurred: %1. Tapahtui seuraava virhe: %1. Connected to server Yhdistetty palvelimeen KLog message KLog viesti Enter your callsign to connect to the cluster: Syötä kutsutunnuksesi liittyäksesi klusteriin: Enter your password to connect to the cluster: (Just hit enter for no password) Syötä salasanasi yhteyden muodostamiseksi klusteriin: (Paina enter jättääksesi salasanan tyhjäksi) Disconnect Katkaise yhteys Not logged on, you may need to enter your callsign again. Et ole kirjautunut sisään, sinun on ehkä annettava kutsutunnuksesi uudelleen. Enter here the commands to be sent to the DX-Cluster server. Syötä tähän komennot, jotka lähetetään DX-klusteripalvelimelle Connection closed by the server Palvelin katkaisi yhteyden Click on Connect to connect to the DX-Cluster server. Napsauta yhdistä, muodostaaksesi yhteyden DX-klusteriin Send Lähetä It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Ohjelmistoversio tietokannassa on tyhjä Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Lentokonehajonta Aurora Revontulet Aurora-E Revontuliheijastukset Back scatter Common term in hamradio, do not translate if not sure Takasironta Earth-Moon-Earth Maa-Kuu-Maa Sporadic E Satunnaisheijastukset Field Aligned Irregularities Common term in hamradio, do not translate if not sure Kenttäsuuntainen hajonta F2 Reflection Common term in hamradio, do not translate if not sure F2 Heijastus Internet-assisted Internet-avusteinen Ionoscatter Common term in hamradio, do not translate if not sure Ionosfäärisironta Meteor scatter Common term in hamradio, do not translate if not sure Meteorisironta Terrestrial or atmospheric repeater or transponder Maanpäällinen tai ilmakehässä oleva toistin tai transponderi Rain scatter Common term in hamradio, do not translate if not sure Sadesironta Satellite Satelliitti Trans-equatorial Common term in hamradio, do not translate if not sure Päiväntasaajan ylittävä Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfäärikanavat Yes Kyllä No Ei Requested Pyydetty Ignore/Invalid Hylkää/Mitätön Validated Vahvistettu Queued Jonossa Uploaded Lähetetty Do not upload Älä lähetä Modified Muokattu Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Elektrooninen Manager Common term in hamradio, do not translate if not sure Hallinta KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Kaikki QSO:t on päivitetty DXCC:llä ja mantereella. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: cty.csv:n lataus epäonnistui virhekoodilla: Download of cty.csv done. cty.csv:n lataus valmis. There is already a cty.csv file in the folder but it will be replaced with the new one. Kansiossa on jo cty.csv-tiedosto, mutta se korvataan uudella. Could not open %1 for writing Ei voitu avata %1 kirjoittamista varten FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Kirjoitetaan ADIF-tiedostoa... Abort writing Keskeytä kirjoitus QSO: QSO: Writing ADIF file... QSO: Kirjoitetaan ADIF-tiedostoon... QSO: You have canceled the file export. The file will be removed and no data will be exported. Olet peruuttanut tiedoston viennin. Tiedosto poistetaan, eikä tietoja viedä. KLog - Error KLog - Virhe The selected log does not exist, please check it again. Valittua lokia ei ole olemassa, tarkista uudestaan. The file %1 can't be opened. Tiedostoa %1 ei voida avata. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled KLog - Käyttäjä keskeytti Do you still want to cancel? Haluatko varmasti peruuttaa? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Luetaan LoTW-tiedostoa... Abort reading Keskeytä lukeminen Importing LoTW ADIF file... KLog - Log selection KLog - Lokin valinta There is more than one log in this logfile. Tässä lokitiedostossa on enemmän kuin yksi loki. All logs will be imported into the current log. Kaikki lokit tuodaan nykyiseen lokiin. Do you want to continue? Haluatko jatkaa? Reading ADIF file... Luetaan ADIF-tiedostoa... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... Tuodaan ADIF-tiedostoa... KLog - Duplicated QSOs KLog - QSO päällekkäisyyksiä It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) ADIF-tiedostossa jota olet tuomassa, on päällekkäisiä QSO:ita. Haluatko jatkaa? (Duplikaatti QSO:ita ei tuoda) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? You have canceled the file import. The file will be removed and no data will be imported. Olet peruuttanut tiedoston tuonnin. Tiedosto poistetaan, tietoja ei tuoda. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Joistakin tämän lokin QSO:ista, (esim.: %1) näkyy puuttuvan RST-TX tieto. If you select NO, maybe the QSO will not be imported. Jos valitset EI, voi olla että QSO:ta ei tuoda. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Joistakin tämän lokin QSO:ista, (esim.: %1) näkyy puuttuvan RST-TX tieto. KLog - Apply to all QSOs in this log? KLog - Käytä kaikissa tämän lokin QSO:issa. Please edit the ADIF file and make sure that it include at least: Muokkaa ADIF-tiedostoa ja varmista, että se sisältää ainakin: and ja This QSO had: Tässä QSO:ssa oli: This QSO is not including the minimum data to consider a QSO as valid! Tässä QSO:ssa ei ole vähimmäistietoja jotta QSO voidaan todeta oikeaksi! - The band missing and the following call: - Taajuusalue puuttuu ja seuraava kutsu: - The mode missing and the following call: - Tila puuttuu ja seuraava kutsu: - The date missing and the following call: - Päiväys puuttuu ja seuraava kutsu: - The time missing and the following call: - Aika puuttuu ja seuraava kutsu: Do you want to continue with the current file? Haluatko jatkaa nykyisen tiedoston kanssa? KLog: Not all required data found! KLog: kaikkia vaadittavia tietoja ei löydetty! KLog - No Station callsign entered. KLog - Aseman kutsutunnusta ei ole syötetty, KLog - QSO without Station Callsign KLog - QSO josta puuttuu aseman kutsutunnus KLog: No RST TX found! KLog: RST TX:ää ei löydy! KLog: No RST RX found! KLog: RST RX:ää ei löydy! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Portti Enter the port of the radio. HamLibSerialConfigWidget Bauds Baudia Select the serial port speed. Valitse sarjaportin nopeus. Port Portti Select the serial port. Only the serial ports that are detected are shown. Valitse sarjaportti. Vain tunnistetut sarjaportit näytetään. Scan Skannaa Click to identify the serial ports available in your computer. Klikkaa tunnistaaksesi saatavilla olevat sarjaportit. 5 bits 5 bittiä 6 bits 6 bittiä 7 bits 7 bittiä 8 bits 8 bittiä Data bits Data bittejä Select the serial data bits. Valitse databittien määrä. None Ei mitään Hardware Laitteisto Software XON/XOFF Ohjelmisto XON/XOFF Flow control Sarjadatan ohjaus Select the serial flow control Valitse sarjadatan ohjausmenetelmä. No parity Ei pariteettia Even Parillinen Odd Pariton Space Tyhjä Mark Merkki Parity Pariteetti Select the serial parity. Valitse sarjadatan pariteetti. Default Oletus 1 bit 1 bitti 2 bits 2 bittiä Stop bits Stop bitit Select the serial stop bits. Valitse sarjadatan stop bitit. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Manner Prefix Etuliite CQ CQ ITU ITU Short Path Lyhyt reitti Long Path Pitkä reitti Deg Astetta Miles Mailia Km Km IntroPage Welcome to KLog! Tervetuloa KLog:iin! Welcome to KLog! - brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Welcome to KLog Tervetuloa Klog:iin This looks like it's the first time you've run KLog on this computer. Näyttää siltä, että käynnistit KLog:in ensimmäistä kertaa tällä tietokoneella. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Se on suunniteltu tarjoamaan yleisttä DX, sekä kilpailu lokinpitoa. It supports QSL management, import and export of ADIF Se tarjoaa QSL hallintaa, sekä ADIF tuontia ja vientiä and Cabrillo file formats and many other features... ja Cabrillo-tiedostomuotoja, sekä paljon muita ominaisuuksia... Before you can start using KLog, you will be asked to: Ennen kuin voit aloittaa KLog:in käytön, sinua pyydetään: Acknowledge to the terms of the license. Hyväksymään lisenssin ehdot. Download the DX entities information. Lataamaan DX-yksiköiden tiedot. Enter your callsign, CQ zone, etc. and main configuration. Antamaan kutsutunnuksesi, CQ-vyöhykeesi, jne. sekä pääkokoonpanosi. Enjoy KLog and contact the development team if you have any suggestions! Nauttimaan KLogista ja ottamaan yhteyttä kehitystiimiin, jos sinulla on ehdotuksia! LicPage KLog License information KLogin käyttöoikeustiedot Welcome to KLog!- brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Acknowledge Hyväksy Be aware that KLog is free software. Huomioi, että KLog on ilmainen ohjelmisto. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL Lähetys QSL Rcvd QSL Vastaanotettu &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &Bureau:n kautta Send this QSL via bureau Lähetä tämä QSO bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSO Direct:in kautta Via bureau Bureau:n kautta QSL &received via bureau QSL &vastaanotettu bureau:n kautta Direct Direct QSL received via direc&t QSL vastaanotettu Direc&t:in kautta Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa Check in DXHeat.com Tarkista DXHeat.com:ssa Check this callsign in DXHeat.com Tarkista kutsutunnus DXHeat.com:ssa Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Lataa LoTW:iin Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Lisää &Clear T&yhjennä Callsign of the QSO. Band of the QSO. QSO:n taajuusalue. Mode of the QSO. QSO:n moodi. Date of the QSO. QSO:n päivämäärä. Time of the QSO. QSO:n aika. Add the QSO to the log. Lisää QSO lokiin. Clears the QSO entry. Poistaa QSO merkinnän. KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kutsutunnus DUPE Translator: DUPE is a common world for hams. Do not translate of not sure &Modify &Muokkaa MainWindow Starting KLog Käynnistetään KLog DX Entity DX Yksikkö &Log Window &Loki ikkuna KLog KLog Ready Valmis An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Tapahtui odottamaton virhe, kun yritit lisätä QSO:n lokiin. Jos ongelma jatkuu, ota yhteyttä kehittäjään analyysiä varten: You have selected an entity: Olet valinnut yksikön: that is different from the KLog proposed entity: joka eroaa KLog:in ehdotetusta kokoonpanosta: Click on the prefix of the correct entity or Cancel to edit the QSO again. Napsauta oikean yksikön etuliitettä tai Peruuta, jos haluat muokata QSO:ta uudelleen. Click on the prefix of the right entity or Cancel to correct. Napsauta oikean yksikön etuliitettä tai paina Peruuta korjataksesi. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Haluatko varmasti poistua KLogi:sta? &File &Tiedosto Import an ADIF file into the current log. Tuo ADIF-tiedosto nykyiseen lokiin. Export the current log to an ADIF logfile. Vie nykyinen loki ADIF lokitiedostoon. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Vie kaikki QSO:t yhteen ADIF-tiedostoon, yhdistäen QSO:t kaikista lokeista. Print your log. Tulosta lokisi. KLog folder KLog-kansio Opens the data folder of KLog. Avaa KLog:in tallennuskansion. E&xit Ulo&s &Tools &Työkalut Fill in QSO data Täytä QSO:n tiedot Go through the log reusing previous QSOs to fill missing information in other QSOs. Käy loki läpi käyttäen edellisiä QSO:ita täyttämään puuttuvat tiedot muissa QSO:issa. Shows QSOs for which you should send your QSL and request the DX QSL. Näyttää QSO:t joita varten sinun tulisi lähettää QSL ja pyytää DX QSL:ää. Find My-QSLs pending to send Etsi Minun QSL:t jotka odottavat lähetystä Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Näyttää QSO:t joilla on odottavia pyyntöjä lähettää QSL:iä. Tämä jono tulisi pitää tyhjänä! Mark all queued QSOs in this log as sent to LoTW. Merkitse kaikki tämän lokin jonossa olevat QSO:t lähetetyiksi LoTW:iin. Mark all queued QSOs as sent to LoTW. Merkitse kaikki jonossa olevat QSO:t lähetetyiksi LoTW:iin. Sends the log to LoTW calling TQSL. Lähettää lokin LoTW:iin, käyttäen TQSL:ää. For updated DX-Entity data, update cty.csv. Päivitettyjä DX-yksikkö tietoja varten, päivitä cty.csv. Settings ... Stats Tilastot Show the statistics of your radio activity. Näytä radio aktiviteettisi tilastot. &Help &Ohjeet Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL ei ole asennettu, tai KLog ei löydä sitä. Tarkista asetukset. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Virhe #1: Käyttäjä keskeytti toiminnon tai TQSL ei ole määritetty. QSO:ita ei lähetetty. Error #2: Upload was rejected by LoTW, please check your data. Virhe #2: Lähetys evättiin LoTW:n toimesta, tarkista tiedot. Error #3: The TQSL server returned an unexpected response. Virhe #3: TQSL palvelin palautti odottamattoman vastauksen. Error #4: There was a TQSL error. Virhe 4#: Tapahtui TQSL virhe. Error #5: There was a TQSLLib error. Virhe #5: Tapahtui TQSLlib virhe. Error #6: It was not possible to open the input file. Virhe #6: Lähdetiedostoa ei voitu avata. Error #7: It was not possible to open the ouput file. Virhe #7: Kohdetiedostoa ei voitu avata. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Virhe #8: QSO:ita ei käsitelty sillä osa QSO:ista oli kopioita tai aikajakson ulkopuolella. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Virhe #9: Osa QSO:ista käsiteltiin ja osa ohitettiin sillä ne olivat kopioita tai aikajakson ulkopuolella. Error #10: Command syntax error. KLog sent a bad syntax command. Virhe #10: Komentosyntaksivirhe. KLog lähetti virheellisen syntaksikomennon. Error #11: LoTW Connection error (no network or LoTW is unreachable). Virhe #11: LoTW yhteysvirhe (Ei verkkoyhteyttä, tai LoTW on tavoittamattomissa). Error #00: Unexpected error. Please contact the development team. Virhe #00: Odottamaton virhe. Otathan yhteyttä kehitystiimiin. The log that you have selected contains more than just one station callsign. Valitsemasi loki sisältää enemmän kuin vain yhden aseman kutsutunnuksen. Please select the station callsign you want to mark as sent to LoTW: Valitse aseman kutsutunnus, jonka haluat merkata ladatuksi LoTW:iin: Station Callsign: Aseman kutsutunnus: Define Station Callsign Määritä aseman kutsutunnus Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Syötä tässä lokissa käytettävä aseman kutsutunnus, tai jätä se tyhjäksi QSO:lle ilman määritettyä aseman kutsutunnusta: KLog - No station selected KLog - Ei valittua asemaa No station callsign has been selected and therefore no log will be marked Aseman kutsutunnusta ei ole valittu, joten lokia ei merkata Congratulations! Onnittelut! You already have the latest version. Sinulla on jo viimeisin versio. You can find the KLog data folder here: KLog talletuskansio löytyy täältä: You need to select one station callsign to be able to send your log to LoTW. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog KLog - QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: QSO kirjattu WSJT-X:stä: start käynnistys KLog - File not open KLog - Tiedosto ei auki Status bar ... Tilapalkki ... It seems that you have never done a backup or exported your log to ADIF. Näyttää siltä että et ole koskaan varmuuskopioinut tai vienyt lokiasi ADIF:iin. It seems that the latest backup you did is older than one month. Näyttää siltä että vanhin varmuuskopiosi on yli kuukauden vanha. Log backup recommended! Lokin varmuuskopiointia suositellaan! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. On hyvä varmuuskopioida täysi lokisi säännöllisesti, tiedon menettettämisen välttämiseksi ongelmatilanteissa. Kun loki viedään ADIF tiedostoon, se tulisi kopioida turvalliseen paikkaan, USB-tikulle, pilvipalveluun, toiselle tietokoneelle, ... KLog muistuttaa sinua varmuuskopioimaan tiedot kuukausittain. It seems that you are running this version of KLog for the first time. Näyttää siltä että käytät tätä KLog versiota ensikertaa. The setup will be open to allow you to do any new setup you may need. Asetukset aukeavat jotta voit tehdä tarvittavat muutokset. KLog - Unexpected error KLog - Odottamaton virhe KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. KLog - Select correct entity KLog - Vakitse oikea yksikkö No DXCC None Ei mitään You have requested to delete the QSO with: %1 Olet pyytänyt poistettaviksi QSO:t joissa on: %1 Are you sure? Oletko varma? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv Do you want to do it now? The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. You need to activate the %1 service in the eLog preferences. KLog - Exit KLog - Poistu KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Näyttää DX-QSL:t joiden pyynnöt tai QSL:t on lähetetty mutta vastausta ei saatu. Find requested pending to receive Shows the DX-QSLs that have been requested. Näyttää pyydetyt DX-QSL:t. LoTW tools ... Queue all QSLs from this log to be sent Aseta kaikki tämän lokin QSL:t lähetysjonoon. Mark all non-sent QSOs in this log as queued to be uploaded. Merkitse kaikki tämän lokin lähettämättömät QSO:t lähetysjonoon. Queue all QSLs to be sent Aseta kaikki QSL:t lähetysjonoon Put all the non-sent QSOs in the queue to be uploaded. Aseta kaikki jonossa olevat lähettämättömät QSO:t lähetettäväksi. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Merkitse kaikki jonossa olevat QSO:t lähetetyiksi Check the current callsign in QRZ.com Online manual (F1) ... &Debug ... All pending QSOs of this log has been marked as queued for LoTW! Kaikki tämän lokin odottavat QSO:t on merkattu LoTW jonoon! There was a problem to mark all pending QSOs of this log as queued for LoTW! Ilmeni ongelmia kaikkien QSO:iden asettamisessa LoTW jonoon! Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. All pending QSOs has been marked as queued for LoTW! Kaikki odottavat QSO:t on asetettu LoTW jonoon! All queued QSOs has been marked as sent to LoTW! Kaikki jonossa olevat QSO;t on merkattu LoTW:iin lähetetyiksi! There was a problem to mark all queued QSOs of this log as sent to LoTW! Ilmeni ongelmia kaikkien tämän lokin jonossa olevien QSO:iden LoTW:iin lähetetyiksi merkkaamisessa! KLog - Update checking result stop pysäytys No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL KLog needs to update the Entities database. KLog - Backup KLog - New version detected! KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - ClubLog error KLog - eQSL error KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - %1 Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data &Tips ... &About ... About Qt ... Check updates ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! About ... You need to select one station callsign to be able to send your log to eQSL.cc. KLog - Select the Station Callsign. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL Filling QSOs ... Date/Time Päivämäärä/aika Callsign Kutsutunnus Printing the log ... Station Callsign Aseman kutsutunnus Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode KLog - Ei tuettu tila A new mode not supported by KLog has been received from an external program or radio: Uusi ei tuettu tila on vastaanotettu ulkoisesta ohjelmasta tai radiosta: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Haluatko saada jatkossa tämän ilmoituksen? (Tämän ilmoituksen poistaminen estää epäsopivien tilojen tunnistamisen) Native Error Recommendation: Suositus: Periodically export your data to ADIF to prevent a potential data loss. Vie tiedot säännöllisesti ADIF:iin, tietojen menettämisen estämiseksi. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Jos olet varma että tietokannassa on QSO:ita ja KLog ei löydä niitä, voit ottaa yhteyttä kehittäjiin saadaksesi apua (katso valikon kohta Tietoja KLogista) It seems that there are no QSOs in the database. Näyttää siltä ettei tietokannassa ole yhtään QSO:ta. This function is disabled. Go to the Setup->LoTW tab to enable it. Tämä ominaisuus ei ole käytössä. Mene Asetukset->LoTW välilehdelle ottaaksesi sen käyttöön. There was an error while updating to Yes the LoTW QSL sent information. Tapahtui virhe QSL:n lataamisessa LoTW:iin? The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Tietojen lähetys LoTW:iin on valmis ja KLog on luonut tiedoston (%1) KLog kansioosi. Haluatko että KLog poistaa tiedoston? The file has been removed. Tiedosto poistettu. KLog - LoTW KLog - LoTW The logfile has been modified. Lokia on muokattu. It was not possible to open the debug file for writing. No debug log will be saved! Upload the queued QSOs to LoTW KLog - CTY.dat update This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Do you want to save your changes? Haluatko tallentaa muutokset? Queue all the QSOs to be uploaded Queue all the QSO to be uploaded UDP Server error The UDP server failed to %1. start or stop UDP-palvelinvirhe UDP-palvelin ei onnistunut %1. Status of the DX entity. DX yksikön tila. Name of the DX entity. DX yksikön nimi. QSO QSO QSL QSL eQSL eQSL Comment Kommentti Others Muut My Data Minun tiedot Satellite Satelliitti DXCC DXCC Info Info Awards Palkinnot Search Etsi Log Loki DX-Cluster DX-Klusteri Save ADIF File Tallenna ADIF-tiedosto Open File Avaa Tiedosto - Needed for DXMarathon - Tarvitaan DXMarathon:iin Abort filling Keskeytä täyttäminen Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Täytetään DXCC, CQz, ITUz ja Manner QSO:ihin... QSO: Number Numero Band Taajuusalue Mode Tila Print Log Tulosta loki Abort printing Keskeytä tulostus Printing the log... QSO: Tulostetaan lokia... QSO: The following QSO data has been received from WSJT-X to be logged: Seuraavat QSO tiedot vastaanotettu WSJT-X:ltä kirjattaviksi: Freq Taajuus Time On Lähetys alkaa Time Off Lähetys päättyy RST TX RST TX RST RX RST RX DX-Grid DX-Verkko Local-Grid Paikallisverkko If the received mode is correct, please contact KLog development team and request support for that mode Mikäli vastaanotettu tila on oikea, ota yhteyttä KLog-kehitystiimiin ja pyydä tukea kyseiselle tilalle KLog - Duplicated satellite KLog - Päällekkäinen satelliitti A duplicated satellite has been detected in the file and will not be imported. Tiedostossa havaittiin päällekkäinen satelliitti, eikä sitä tuoda. Please check the satellite information file and ensure it is properly populated. Tarkista satelliitti tiedot-tiedosto ja varmista ettö siellä on kaikki tarvittava. Now you will see a more detailed error that can be used for debugging... Nyt näet tarkemmat virhetiedot joita voidaan käyttää vianmäärityksessä... An unexpected error ocurred!! Odottamaton virhe tapahtui!! If the problem persists, please contact the developers Jos ongelma jatkuu, ota yhteyttä kehitystiimiin for analysis: analysointia varten: Error in function Virhe funktiossa Error text Virheteksti Failed query Epäonnistunut kysely KLog - Show errors KLog - Näytä virheet Do you want to keep showing errors? Haluatko jatkaa virheiden näyttämistä? MainWindowInputComment Comment Kommentti Add a comment for this QSO. Lisää tämän QSO:n kommentti. Keep this data Säilytä nämä tiedot Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. MainWindowInputEQSL Date of the ClubLog upload. ClubLog:in lähetyksen päivämäärä. Date of the QRZ.com upload. Date of the eQSL sending. eQSL lähetyksen päivämäärä. Date of the eQSL reception. eQSL:n vastaanoton päivämäärä. Date of the LoTW sending. LoTW:n lähetyksen päivämäärä. Date of the LoTW reception. LoTW vastaanoton päivämäärä. Status on ClubLog. ClubLog:n tilanne. Status on QRZ.com. Status of the eQSL sending. eQSL lähetyksen tilanne. Status of the eQSL reception. eQSL vastaanoton tilanne. Status of the LoTW sending. LoTW lähetyksren tila. Status of the LoTW reception. LoTW vastaanoton tila. ClubLog ClubLog QRZ.com eQSL Sent eQSL Sent eQSL Rec eQSL Vastaanotto LoTW Sent LoTW lähetetty LoTW Rec LoTW Vastaanotto MainWindowInputOthers Primary Div Ensisijainen hallinnollinen alue Secondary Div Toissijainen hallinnollinen alue IOTA IOTA Entity Yksikkö Propagation mode Etenemistapa Others Muut Keep propagation mode Select the primary division for this QSO. Valitse tämän QSO:n päädivisioona. Select the secondary division for this QSO. Valitse tämän QSO:n toissijainen divisioona. Select the entity for this QSO. Valitse tämän QSO:n yksikkö. Select the propagation mode for this QSO. Valitse tämän QSO:n etenemistapa. Select the IOTA continent for this QSO. Valitse tämän QSO:n IOTA-manner. Select the IOTA reference number for this QSO. Valitse tämän QSO:n IOTA-referenssinumero. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Ei tunnistettu Not - Not Identified Ei - Ei tunnistettu SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL lähetetty QSL Rec QSL Vastaanotto QSL Via QSL -kautta QSL Msg QSL Viesti Status of the QSL sending. QSL lähetyksen tila. Status of the QSL reception. QSL vastaanoton tila. QSL sending information. QSL lähetyksen tiedot. QSL reception information. QSL vastaanoton tiedot. Date of the QSL sending. QSL lähetyksen päivämäärä. Date of the QSL reception. QSL vastaanoton päivämäärä. Message of the QSL. QSL:n viesti. QSL via information. QSL -kautta tieto. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX Taajuus MHz:inä. RX Frequency in MHz. RX Taajuus MHz:inä. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Wattia MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Nimi QTH QTH DX Locator DX lokaattori Power(rx) Teho(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX TX Taajuus Freq RX RX Taajuus DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! RX Frequency in MHz. Frequency is not in a hamradio band! RX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! MainWindowMyDataTab Watts Wattia Keep this data Säilytä nämä tiedot My QTH locator. Minun QTH lokaattori. Power Teho Operator callsign Station Callsign Aseman kutsutunnus My Locator Minun lokaattori My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Minun QTH lokaattori. Tulisi olla muotoa Maidenhead, kuten IN70AA, enintään 10 merkkiä. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Säilytä nämä tiedot Other - Sat not in the list Muut - Satelliitti ei ole listalla Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satelliitin nimi, jos ei löydy listalta. Aktivoi tämä ruutu valitsemalla: "1%" (nimi on muodossa: A0-51). Satellite mode used. Satelliitti tilaa käytetty. Select the satellite you are using. Valitse satelliitti jota käytät. UpLink band. Lähetyslinkin taajuusalue. DownLink band. Vastaanottolinkin taajuusalue. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. DX aseman lokaattori. Tämä ruutu on sykronisoitu QSO välilehden, lokaattori ruudun kanssa. UpLink Lähetyslinkki DownLink Vastaanottolinkki Satellite Satelliitti Mode Tila DX Locator DX lokaattori Other Muuta MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. DX aseman lokaattori. Tulisi olla muotoa Maidenhead, kuten IN70AA, enintään 10 merkkiä. Not Sat QSO Ei Satelliitti QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog on havainnut satelliitin nimen, jota se ei tunnista. Jos sen tulisi sen sijaan käyttää jotain tunnettujen satelliittien nimistä sen sijaan, valitse se luettelosta. Vaihtoehtoisesti, voit ottaa yhteyttä kehitystiimiin lisätäksesi uuden satelliitin nimen. The satellite you have in your QSO is: QSO:ssa oleva satelliitti on: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Huomaathat että satelliitin nimeä ei tallenneta, ellei sitä löydy listasta, joten tämä tieto saattaa hävitä! RX Frequency in MHz. Frequency is not in a hamradio band! RX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! RX Frequency in MHz. RX Taajuus MHz:inä. TX Frequency in MHz. Frequency is not in a hamradio band! TX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! TX Frequency in MHz. TX Taajuus MHz:inä. OnlineMessageWidget The server returned the following error: %1 Not identified Ei tunnistettu QObject New One, work it! Uusi, wörki se! Needed, work it! Tarvitaan, wörki se! Worked but not confirmed Wörkitty, mutta ei vahvistettu Confirmed Vahvistettu Not identified Ei tunnistettu Database Error Tietokantavirhe KLog DB needs to be upgraded. KLog tietokanta pitää päivittää uudempaan. Do you want to upgrade it now? Haluatko päivittää uudempaan nyt? If DB is not upgraded KLog may not work properly. Jos tietokantaa ei päivitetä, KLog ei välttämättä toimi oikein. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog - tietokantapäivitys KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog on havainnut aikaisemman lokin tietokannassa. Kaikki tiedot siirretään juuri luotuun DX tyyppiseen lokiin. KLog: Enter Station callsign KLog: Syötä aseman kutsutunnus Enter the station callsign used in this log Syötä tässä lokissa käytetty aseman kutsutunnus Station Callsign Aseman kutsutunnus All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Kaikki tiedot siirrettiin oikein. Sinun tulisi nyt mennä Asetukset->Määritykset(Preferences)->Lokit(Logs) ja tarkistaa että kaikki on kunnossa. Updating mode information... Päivitetään tilatietoja... Abort updating Keskeytä päivittäminen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Tämän päivityksen peruuttaminen aiheuttaa epäjohdonmukaisuuksia ja mahdollisen tietojen menettämisen. Haluatko silti peruuttaa? Updating bands information... Päivitetään taajuusalue tiedot... Updating bands information in %1 status... Päivitetään taajuusalue tiedot %1 tila... Progress: Eteneminen: Updating mode information in %1 status... Päivitetään tilatiedot %1 tila... Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating information... Tietoja päivitetään... Updating DXCC and Continent information... Päivitetään DXCC- ja manner-tietoja... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Asennusohjelma keskeytettiin ennen valmistumista... Do you want to remove the KLog dir from your disk? Haluatko poistaa KLog-kansion kiintolevyltä? Your KLog dir has been removed KLog-kansio on poistettu Thank you for running KLog! Kiitos KLogin käyttämisestä! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. En voinut poistaa KLog-kansiota. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog-kansiota ei voitu poistaa. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Remember that your KLog dir is on your system... Muista että KLog-kansio on kiintolevyllä... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Päivämäärä Call Kutsutunnus RSTtx RSTtx RSTrx RSTrx Band Taajuusalue Comment Kommentti Mode Tila CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Manner Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL Sent Force Init Freq Taajuus Freq RX RX Taajuus Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW lähetetty Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Nimi Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Vastaanotettu QSL Sent QSL lähetetty QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Satelliitin tunnus SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear T&yhjennä &Export Highlighted &Vie Korostetut &Select All Valitse &kaikki &Search &Etsi Clear the searches. Tyhjennä etsinnät Export the search result to an ADIF file. Vie etsinnän tulokset ADIF-tiedostoon. Select/Unselect all the QSOs shown. Valitse/Poista valinnasta kaikki näkyvillä olevat QSO:t. Search in the log. Etsi lokista. Search in all logs. Etsi kaikista lokeista. Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection T&yhjennä valinta Save File Tallenna tiedosto All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! You have requested to delete the QSO with: %1 Olet pyytänyt poistettaviksi QSO:t joissa on: %1 Are you sure? Oletko varma? SearchWindow Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila QSL Sent QSL lähetetty QSL Rcvd QSL Vastaanotettu Station Callsign Aseman kutsutunnus ID ID Call Kutsutunnus Date/time Station callsign QSL Send QSL Lähetys &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &Bureau:n kautta Send this QSL via bureau Lähetä tämä QSO bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSO Direct:in kautta Via bureau Bureau:n kautta QSL &received via bureau QSL &vastaanotettu bureau:n kautta Direct Direct QSL received via direc&t QSL vastaanotettu Direc&t:in kautta Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa Check in DXHeat.com Tarkista DXHeat.com:ssa Check this callsign in DXHeat.com Tarkista kutsutunnus DXHeat.com:ssa &Request my QSL Pyy&dä minun QSL Mark my QSL as requested Merkitse minun QSL pyydetyksi Via Direct and mark DX QSL as requested Directin kautta ja merkitse DX QSL pyydetyksi Send this QSL via direct and mark DX QSL as requested Lähetä tämä QSL directin kautta ja merkitse DX QSL pyydetyksi Via Bureau and mark DX QSL as requested Bureau:n kautta ja merkitse DX QSL pyydetyksi Send this QSL via bureau and mark DX QSL as requested Lähetä tämä QSL bureau:n kautta ja merkitse DX QSL pyydetyksi &Request the QSL Pyydä QSL Mark the QSL as requested Merkitse QSL pyydetyksi Via bureau and mark my QSL as requested Bureau:n kautta ja merkitse minun QSL pyydetyksi QSL received via bureau and mark my QSL as requested QSL saapunut bureau:n kautta ja merkitse minun QSL pyydetyksi Direc&t and mark as my QSL requested Direc&t ja merkitse minun QSL pyydetty QSL received via direct and mark my QSL as requested QSL saapunut direct:in kautta ja merkitse minun QSL pyydetyksi Needed QSO to send the QSL Tarvittava QSO, QSL:n lähetystä varten My QSL requested to be sent QSL pyydetty lähetettäväksi DX QSL pending to be received DX QSL odottaa vastaanottoa SetupDialog Bands/Modes Taajuusalueet/Moodit DX-Cluster DX-Klusteri Colors Värit Log widget Misc Sekalaiset World Editor Maailma Editori Logs Lokit Satellites Satelliitit HamLib HamLib Cancel Peru OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Käyttäjätiedot D&X-Cluster D&X-Klusteri WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Ainakin yksi loki on syötettävä Lokit -välilehdellä. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Haluatko lisätä yhden lokin 'Lokit' välilehdelle, vaiko poistua KLog:sta? (Napsauta Kyllä lisätäksesi loki tai Ei poistuaksesi) World Maailma Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Siirry sekalaiset-välilehdelle ja napsauta "siirrä tietokanta" muulloin tietokantaa ei siirretä uuteen paikkaan. eLog DB has not been moved to new path. You have not selected the kind of log you want. Et ole valinnut minkälaisen lokin haluat. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sinut ohjataan lokit -välilehdelle. Lisää, ja valitse millaista lokia haluat käyttää. SetupEntityDialog Entity Yksikkö CQ CQ ITU ITU Latitude Leveysaste Longitude Pituusaste UTC UTC Main prefix Ensisijainen etuliite ARRL ID ARRL ID Prefixes Etuliitteet Comma separated possible prefixes, e.g. EA1, EA2, ... Mahdolliset etuliitteet, pilkulla eroteltuina, esim. OH1, OH2, ... Ok Ok Name of the Entity. Yksikön nimi. CQ zone. CQ-vyöhyke. ITU zone. ITU-vyöhyke. Longitude of the Entity. Yksikön pituuspiiri. Local time difference to UTC. Paikallinen aikaero UTC:n. Main prefix of the entity. Yksikön ensisijainen etuliite. ARRL ID. ARRL ID. Date of the deletion. Poistamisen päivämäärä. Deleted Poistettu Cancel Peru Entity Dialog Yksikköasetukset SetupPageBandMode Bands Taajuusalueet Modes Moodit SetupPageColors New One Uusi Needed in this band Tarvittu tällä taajuussalueella Worked in this band Työstetty tällä taajuusalueella Confirmed in this band Vahvistettu tällä taajuusalueella Default Oletus WSJT-X palette WSJT-X väripaletti Default palette Oletusväripaletti Dark Mode Color when the DXCC is an ATNO (All Time New One). Väri kun DXCC on tyyppiä ATNO (All Time New One). DXCC is confirmed in this band. DXCC on vahvistettu tällä taajuusalueella. Default color. Oletusväri. Sets a palette of colors similar to the one used in WSJT-X. Asettaa väripaletin samankaltaiseksi kuin on käytetty WSJT-X:ssä Sets the default palette. Asettaa oletusväripaletin. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Tämä DXCC on työstetty aiemmin eri taajuusalueella mutta ei valitulla taajuusalueella. Tämä saattaa olla tarpeellista CQ, ITU, Verkko, ... Worked DXCC, but not confirmed in this band. Työstetty DXCC, mutta ei vahvistettu tällä taajuusalueella. Sets the Dark Mode Choose a color Valitse väri SetupPageDxCluster Add Lisää Delete Poista Show &HF spots Näytä &HF Spotit Show V/&UHF spots Näytä V/&UHF spotit Show W&ARC spots Näytä W&ARC spotit Show &worked spots Näytä &työstetyt spotit Show &confirmed spots Näytä &vahvistetut spotit Show ANN/&FULL messages Näytä ANN/&FULL viestit Show WW&V messages Näytä WW&V viestit Show WC&Y messages Näytä WC&Y viestit Save DX Cluster activity Tallenna DX klusterin aktiviteetit Saves all the DX-Cluster activity to a file in the KLog folder Tallentaa kaikki DX-klusterin aktiviteetit tiedostoon KLog kansiossa DX Spots DX Spotit Others Muut Messages Viestit KLog: Add a DXCluster server KLog: Lisää DX-Klusteripalvelin Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Lisää osoite ja :portti Esimerkiksi: dxfun.com:8000 Jos porttia ei määritetä, Käytetään oletusarvoa 41112: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Syötä sähköposti jota käytit ClubLog:in rekisteröitymiseen. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Lähetä QSO:t ClubLogiin reaaliajassa, kun niitä lisätään (tai muokataan) KLogissa. Starts the ClubLog support in KLog. Käynnistää ClubLog tuen KLogissa. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW LoTW Upload Download TQSL path Use TQSL Käytä TQSL:ää LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. TQSL ohjelmiston polku. Enable the LoTW integration with TQSL. You will need to have TQSL installed Ota käyttöön LoTW integraatio TQSL:n. TQSL tulee olla asennettu. Select File Valitse tiedosto SetupPageHamLib Activate HamLib Aktivoi HamLib Activates the hamlib support that will enable the connection to a radio. Aktivoi hamlib tuen joka mahdollistaa yhteyden radioon. Read-Only mode Vain-Luku tila If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Jos otettu käyttöön, KLog lukee Taajuuden/Moodin radiolta, mutta ei koskaan lähetä komentoja radiolle. Radio Radio Select your rig. Valitse kokoonpanosi. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Uusi &Edit &Muokkaa &Remove &Poista Add a new log. Lisää uusi loki. Edit the selected log. Muokkaa valittua lokia. Remove the selected log. Poista valittu loki. KLog KLog Do you really want to remove this log? Haluatko varmasti poistaa tämän lokin? All the QSOs from this log will also be deleted... Kaikki tämän lokin QSO:t tullaan myös poistamaan... Log has not been removed. (#3) Lokia ei ole poistettu (#3) Log has not been removed. (#2) Lokia ei ole poistettu (#2) Log has not been removed. (#1) Lokia ei ole poistettu (#1) ID ID Date Päivämäärä Station Callsign Aseman kutsutunnus Operators Operaattorit Comments Kommentit QSOs QSO:t The new log could not be created. An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageLogs KLog - Lokisivujen asetus SetupPageLogsNew &Date P&äivämäärä &Station Callsign A&seman kutsutunnus &Operators &Operaattorit Comm&ent Komm&entti &Ok &Ok &Cancel Peru Callsign used for this log. Tässä lokissa käytettävä kutsutunnus. Comma separated list of operators: callsign1, callsign2. Pilkulla eroteltu lista operaattoreista: kutsutunnus1, kutsutunnus2. Start date of this log. Tämän lokin aloituspäivämäärä. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system &Empiirinen järjestelmä &Log in real time &Kirjaa lokiin reaaliajassa &Time in UTC UTC &Aika &Save ADIF on exit &Tallenna ADIF kun ohjelma suljetaan Use this &default filename Käytä tätä &oletus tiedostonimeä Mark &QSO to send QSL when QSL is received Merkitse &QSO läheettämään QSL kun QSL on vastaanotettu Complete QSO with previous data Täydennä QSO edellisillä tiedoilla Show the Station &Callsign used in the search box Näytä hakukentässä käytetty &Asematunnus &Check for new versions automatically &Tarkista automaattisesti uusien versioiden varalta &Provide Info for statistics &Jaa tietoja tilastointia varten Manage DX-Marathon Hallinnoi DX Marathonia Activate the application debug log Aktivoi ohjelman vianhakuloki Mark sent eQSL && LoTW in new QSO as queued Merkitse lähetetyiksi eQSL && LoTW uusissa QSO:issa kun ne asetetaan jonoon Browse Selaa Move DB Siirrä tietokanta QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO:t merkataan QSL:n lähetystä odottaviksi, jos DX QSL on saapunut, etkä ole lähettänyt omaasi. The search box will also show the callsign on the air to do the QSO. Hakupalkki näyttää kutsutunnuksen QSO:ta tehdessä myös lähetyksessä. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Jos version tarkistus on valittu, KLog lähettää kehittäjälle kutsutunnuksen, KLog version, sekä käyttöjärjestelmän, KLog:in kehittämistä varten. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Napsauta merkataksesi lähetysjonoon kaikki eQSL:t (LoTW ja eQSL) kaikissa uusissa QSO:issa oletuksena. Check if there is a new release of KLog available every time you start KLog. Tarkista KLog päivitysten varalta joka käynnistyskerralla. Check non-valid calls &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Tarkista imperiaalisen järjestelmän varalta (Mailit kilometrien sijaan). Select to use real time. Valitse käyttääksesi oikeaa aikaa. Select to use UTC time. Valitse käyttääksesi UTC -aikaa Select if you want to save to ADIF on exit. Valitse jos haluat tallentaa ADIF-tiedostoon kun ohjelma suljetaan. Select to use the following name for the logfile without being asked for it again. Valitse käyttääksesi seuraavaa lokitiedoston nimeä ilman että sitä kysytään joka kerta. Complete the current QSO with previous QSO data. Täydennä nykyinen QSO edellisen QSO:n tiedoilla. Select if you want to manage DX-Marathon. Valitse jos haluat hallinnoida DX Marathonia. This is the default file where ADIF data will be saved. Tämä on oletustiedosto johon ADIF tiedot tallennetaan. This is the directory where the database (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Click to change the default ADIF file. Napsauta vaihtaaksesi oletus ADIF-tiedostoa. Click to change the path of the database. Napsauta vaihtaaksesi tietokannan sijainti. Click to move the DB to the new directory. Napsauta Siirtääksesi tietokanta uuteen kansioon. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivoi ohjelman vianhakulokin. Tästä voi olla hyötyä jos jokin ei toimi odotetulla tavalla. Vikaloki luodaan KLog kansioon. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Avaa tiedosto Select Directory Valitse Kansio This is the directory where DB (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Please specify an existing directory where the database (logbook.dat) will be saved. Määritä olemassaoleva kansio johon tietokanta (lokbook.dat) tallennetaan. KLog - Move DB File moved Tiedosto on siirretty File copied Tiedosto on kopioitu File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Tiedostoa EI ole kopioitu The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Kohdekansiota ei ole olemassa. Valitse olemassaoleva kansio. SetupPageSats &New &Uusi &Edit &Muokkaa &Remove &Poista &Import &Tuo E&xport &Vie Add a new satellite. Lisää uusi satelliitti. Edit the selected satellite. Muokkaa valittua satelliittia. Remove the selected satellite. Poista valittu satelliitti. Export your current satellites to a file. Vie nykyiset satelliitit tiedostoon. Select the sat you want to open. Valitse satelliitti jonka haluat avata. KLog KLog Do you really want to remove this satellite? Haluatko todella poistaa tämän satelliitin? Import a satellites file. It will replace the satellites you have in the current list. Tuo satelliittitiedosto. Tämä korvaa satelliitit jotka ovat nykyisessä listassa. This satellite will no be longer available to be selected ... Tämä satelliitti ei ole enään valittavissa ... Sat has not been removed. (#3) Satelliittia ei ole poistettu. (#3) Sat has not been removed. (#2) Satelliittia ei ole poistettu. (#2) Sat has not been removed. (#1) Satelliittia ei ole poistettu. (#1) ID ID Short Lyhyt tunnus Name Nimi Uplink Lähetys Downlink Vastaanotto Modes Moodit An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageSats KLog - AsetussivunTilastot Open Satellites File Avaa satelliittitiedosto KLog warning KLog varoitus An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Tapahtui odottamaton virhe satelliittidataa tuodessa. Se voi johtua siitä, että tuotava tiedosto on väärän tyyppinen. Please check the format or contact the developer for analysis with the error code: Tarkista tiedostotyyppi tai ota yhteyttä kehittäjään, tarkempaa selvitystä varten, virhekoodilla: Save Satellites File Tallenna Satelliittitiedosto SetupPageSatsNew Short name Lyhyt tunnus Sat name Satelliitin tunnus UpLink Lähetyslinkki DownLink Vastaanottolinkki Modes Moodit &Ok &Ok &Cancel P&eru Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Syötä lyhyt tunnus. Yritä käyttää LoTW tunnusta, jotta voit ladata QSO:si LoTW:iin jälkeenpäin. Enter the name of the satellite. Syötä satelliitin tunnus. Enter the uplink frequencies in this format: 144.300 Syötä lähetystaajuudet muodossa: 144.300 Enter the downlink frequencies in this format: 144.300 Syötä vastaanottotaajuudet muodossa: 144.300 Enter the modes in this format: USB Syötä moodit muodossa: USB Some of the data you have entered is not correct; the satellite can't be added. Osa syötetyistä tiedoista ei ole oikein; satelliittia ei voida lisätä. SetupPageSubdivisionNew &Date P&äivämäärä &Station Callsign A&seman kutsutunnus &Operators &Operaattorit Comm&ent Komm&entti &Ok &Ok &Cancel Callsign used for this log. Tässä lokissa käytettävä kutsutunnus. Comma separated list of operators: callsign1, callsign2. Pilkulla eroteltu lista operaattoreista: kutsutunnus1, kutsutunnus2. Start date of this log. Tämän lokin aloituspäivämäärä. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Poista Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Lokia ei ole poistettu (#3) Log has not been removed. (#2) Lokia ei ole poistettu (#2) Log has not been removed. (#1) Lokia ei ole poistettu (#1) ID ID Name Nimi Short Name CQ Zone CQ Vyöhyke ITU Zone ITU Vyöhyke Deleted Poistettu Start Date End Date DXCC DXCC An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Käynnistä UDP-palvelin Automatically log QSOs from WSJT-X Kirjaa QSO:t WSJT-X:stä automaattisesti Allow WSJT-X to send logged QSOs to KLog Salli WSJT-X:n lähettää kirjatut QSO:t KLog:iin QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected WSJT-X:ssä kirjatut QSO:t lähetetään KLog:iin, KLog kysyy vahvistusta ennen KLog:iin kirjaamista ellei "%1" ole valittuna KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog kirjaa automaattisesti kaikki QSO:t jotka tulevat WSJT-X:ltä, ilman manuaalista vahvistusta. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-portti jolla UDP-palvelin kuuntelee paketteja. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Varmista että se on sama portti johon muut ohjelmat lähettävät tiedot. Oletus on 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-palvelin vastaanottaa toisista ohjelmista lähetetyt QSO:t. Kuten WSJT-X, mahdollistaen sinulle automaattisen kirjaamisen näistä ohjelmista KLogiin. UDP Port UDP-portti Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) QSO:n ilmoitus aikakatkaisu (ms) Miliseconds that the notification of QSOs received from WSJTX will be shown. Aika jonka QSO:t vastaanotettu WSJT-X:ltä ilmoitus näytetään, millisekunneissa. SetupPageUserDataPage &Personal data &Henkilökohtaiset tiedot Station &data Aseman &tiedot Enter your name. Syötä nimesi. Enter your address - 1st line. Syötä osoitteesi - ensimmäinen rivi. Enter your address - 2nd line. Syötä osoitteesi - toinen rivi. Enter your address - 3rd line. Syötä osoitteesi - kolmas rivi. Enter your address - 4th line. Syötä osoitteesi - neljäs rivi. Enter your city. Syötä kaupunki. Enter your zip code. Syötä postinumero. Enter your province or state. Syötä maakunta tai osavaltio. Enter your country. Syötä maa. &Name &Nimi &Address &Osoite Cit&y &Kaupunki &Zip Code &Postinumero Pro&v/State Maak&unta Countr&y &Maa Enter your information for rig Syötä laitekokoonpanosi tiedot Enter your information for antenna Syötä antennitiedot Enter your power information. Syötä tiedot tehonlähteestäsi. Enter the station callsign that will be used for logging. Syötä kirjaamiseen käytettävä aseman kutsutunnus. &Rig 1 Kokoonpano 1 R&ig 2 Kokoonpano 2 Ri&g 3 Kokoonpano 3 Antenna &1 Antenni &1 Antenna &2 Antenni &2 Antenna &3 Antenni &3 Po&wer Vi&rtalähde Enter the operators (comma separated if more than one). Syötä operaattorit (pilkulla eroteltuina jos useita). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Syötä aseman lokaattori. Vaihtoehtoisesti KLog voi käyttää arvioitua lokaattoria kutsutunnuksesi perusteella. &Callsign &Operators &Operaattorit &CQ Zone &CQ Alue &ITU Zone &ITU Alue &Locator &Lokaattori &Locator (not valid) &Lokaattori (virheellinen) SetupPageWorldEditor Add Lisää Delete Poista Edit Muokkaa Export World Vie maailma Import World Tuo maailma Still not implemented. Vielä toteuttamatta. Import a new cty.csv file Tuo uusi cty.csv-tiedosto An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. KLog kansiostasi löytyy yksikkötiedot-tiedosto (cty.csv)joka ladataan. No entities information file (cty.csv) has been detected in your KLog folder. KLog kansiostasi ei löydy yksikkötiedot-tiedostoa (cty.csv). KLog will not be able to show entities information. KLog ei pysty näyttämään yksikkötietoja. Prefix Etuliite Entity Yksikkö ARRL ID ARRL ID Continent Manner CQ Zone CQ Vyöhyke ITU Zone ITU Vyöhyke UTC UTC Latitude Leveysaste Longitude Pituusaste Deleted Poistettu Since Date Lähtien päivämäärästä To Date Päivämäärään asti Open File Avaa Tiedosto BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Yksikkötiedot on päivitetty. Entities information has not been updated. Yksikkötietoja ei ole päivitetty. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok Ok DX Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila ShowErrorDialog KLog Message KLog viesti SoftwareUpdateDialog Ok Ok KLog update KLog päivitys <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Onnittelut! Your KLog has been updated. KLog on päivitetty. You already have the latest version. Sinulla on jo viimeisin versio. StartWizard KLog - The free hamradio logging program KLog - Ilmainen amatööriradio kirjausohjelma Quit Setup Lopeta asennus Setup is not complete yet. Are you sure you want to quit setup? Asennus ei ole vielä valmis. Oletko varma että haluat lopettaa? StatisticsWidget QSO per year QSO:ta vuodessa DXCC per year DXCC:tä vuodessa CQ zones per year CQ vyöhykkeitä vuodessa QSO per band QSO:ta taajuusalueittain QSO per mode QSO:ta moodeittain QSO per DXCC QSO:ta DXCCittäin QSO per Continent QSO:ta mantereittain QSO per hour QSO:ta tunneittain QSO per month QSO:ta kuukausittain Worked / Confirmed status Workitty / Vahvistettu tila Worked / Sent status Workitty / Lähetetty tila Sent / Confirmed status Lähetetty / Vahvistettu tila Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ Vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen CQ zones CQ vyöhykkeet CQ zones per year CQ vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Years: %1/%2 Vuodet: %1%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Kutsutunnus Date Päivämäärä Band Taajuusalue Mode Tila DXCC DXCC Satellite Satelliitti Confirmed Vahvistettu No Ei StatsEntitiesPerYearBarChartWidget Chart title Listan otsikko Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen DXCC Entities DXCC Yksiköitä DXCC Entities per year DXCC Yksiköitä vuosittain Reading data ... Luetaan tietoja ... Entities: Yksiköitä StatsFieldPerBandWidget All Kaikki Mode: Band Taajuusalue Worked Työstetty Confirmed Vahvistettu StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Kutsutunnus Date Päivämäärä Band Taajuusalue Mode Tila Grid Satellite Satelliitti Confirmed Vahvistettu No Ei StatsQSOsPerBandBarChartWidget QSOs per band QSO:t taajuusalueittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Bands Taajuusalueet QSOs per band distribution QSO:t taajuuksia kohden jakauma Reading data ... Luetaan tietoja ... Bands: Taajuusalueet: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO:t mantereittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Continents Mantereet Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO:ta DXCC:tä kohti Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Reading data... Luetaan tietoja... DXCC DXCC Top ten DXCC per QSO Kymmenen parasta DXCC:tä QSOittain StatsQSOsPerHourBarChartWidget QSOs per hour QSO:t tunneittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Hours Tunnit QSOs at hour QSO:t tunnissa Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerModeBarChartWidget QSOs per mode QSO:t moodeittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Modes Moodit QSOs per mode distribution QSO:t moodia kohden jakauma Reading data ... Luetaan tietoja ... Modes: Moodit: StatsQSOsPerMonthBarChartWidget QSOs per month QSO:t kuukausittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Jan Tammi Feb Helmi Mar Maalis Apr Huhti May Touko Jun Kesä Jul Heinä Sep Syys Oct Loka Nov Marras Dec Joulu Aug Elo Months Kuukaudet QSOs at Month QSO:t kuukaudessa Reading data ... Luetaan tietoja ... Months: Kuukaudet: StatsQSOsPerYearBarChartWidget Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen QSOs QSO:t QSOs per year QSO:ta vuodessa Reading data ... Luetaan tietoja ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Lähetetty - %1 Confirmed - %2 Vahvistettu - %2 Sent / Confirmed status Lähetetty / Vahvistettu tila StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Wörkitty, ei vahvistettu - %1 Confirmed - %2 Vahvistettu - %2 Worked / Confirmed status Workitty / Vahvistettu tila StatsWorkedSentPieChartWidget Worked - %1 Wörkitty - %1 Sent - %2 Lähetetty - %2 Worked / Sent status Workitty / Lähetetty tila TipsDialog KLog tips KLog vinkit Next Seuraava Previous Edellinen <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Vinkki #1:</b><br>Tiesitkö....<br>Voit käyttää <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> lukeaksesi automaattisesti koko lokin ja täyttääksesi DXCC, CQ, ITU vyöhykkeet ja mantereen? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Vinkki #3:</b><br>Tiesitkö....<br>Voit käyttää <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> etsiäksesi kaikkia QSO:ita joiden DXCC tulee vielä vahvistaa etkä vielä ole lähettänyt QSL korttia? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Vinkki #7:</b><br>Tiesitkö....<br>Löydät QSL:t jotka ovat vielä lähettämättä <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>Tämä työkalu listaa hakukenttään kaikki QSO:t merkittyinä QSL <i>Pyydetty</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Vinkki #6:</b><br>Tiesitkö....<br>Löydät tiedoston joka sisältää kaikki lokit ja muun tiedon logbook.dat tiedostosta ja .klogrc tiedoston, joka sisältää KLog asetustiedoston KLog kansiossa avaamalla <a href="#FileOpenKLogFolder">File->KLog folder</a> valikon? {5:?} <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Vinkki #20:</b><br>Tiesitkö...<br>Voit nähdä QSO:n joka sisältää tietyn DXCC yksikön tietyllä taajuusalueella osoittamalla taajuusaluetta DXCC työkalussa? {7:?} <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Vinkki #8:</b><br>Tiesitkö....<br>Löydät QSL:t joita vielä odotat <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>Tämä työkalu listaa etsintäkenttään kaikki QSO:t jotka merkitty QSL <i>Lähetetty</i> mutta ei ole vielä saanut QSL korttia DX:ltä. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Vinkki #9:</b><br>Tiesitkö....<br>Löydät QSL:t joita vielä odotat menemällä <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>Tämä työkalu listaa etsintäkentään kaikki QSO:t joissa QSL-rec on merkitty <i>Pyydetty</i> mutta ei ole saanut QSL korttia DX:ltä. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Vinkki #10:</b><br>Tiesitkö....<br>Voit liittyä ryhmään <a href=https://t.me/klogchat>English KLog Telegram group</a> keskustellaksesi KLog:sta englanniksi? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Vinkki #11:</b><br>Tiesitkö...<br>Voit liittyä ryhmään <a href=https://t.me/KLogES>Spanish Telegram group</a> keskustellaksesi KLog:sta espanjaksi? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Vinkki #13:</b><br>Tiesitkö...<br>Voit <a href=https://twitter.com/_ea4k>seurata EA4K:ta twitterissä</a> saadaksesi uusimmat tiedot KLog:sta? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Vinkki #14:</b><br>Tiesitkö...<br>Voit kirjoittaa oman <a href=https://www.eham.net/reviews/detail/3118>arvostelun KLog:sta sivustolla eHam.net </a> auttaaksesi muita käyttäjiä löytämään KLog:in? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Vinkki #15:</b><br>Tiesitkö...<br>Voit liittyä kehitystiimiin yksinkertaisesti <a href=https://www.klog.xyz/contact>Ottamalla yhteyttä</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Vinkki #16:</b><br>Tiesitkö...<br>On monia tapoja antaa oma panoksesi KLog:iin jotkin niistä on mainittu tällä sivulla: <a href=https://www.klog.xyz/contrib>KLog Contribute</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Vinkki #17:</b><br>Tiesitkö...<br>Voit auttaa kääntämään KLog:in omalle kielellesi? Käy katsomassa: <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> . <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Vinkki #18:</b><br>Tiesitkö...<br>Voit kaksoisnapsauttaa yksikön nimeä DXCC listassa ja kaikki kyseisen DXCC yksikön QSO:t näytetään etsintäkentässä? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Vinkki #19:</b><br>Tiesitkö...<br>Voit napauttaa QSO:ta oikealla hiiren napilla ja valita <i>Check in QRZ.com</i> nähdäksesi kutsutunnuksen QRZ.com:ssa? UpdateSatsData Reading Satellites data file... Luetaan satelliitti tiedot-tiedostoa... Abort reading Peruuta lukeminen The Satellites information has been updated. Satelliitti tiedot päivitetty. Open File Avaa tiedosto Sat Data Satelliittitiedot World Entity Yksikkö Continent Manner Reading cty.csv... Luetaan cty.csv... Abort reading Keskeytä luku WorldMapWidget World map Maailman kartta View Näkymä Zoom In(25%) Lähennä(25%) Zoom Out(25%) Loitonna(25%) Normal Size Normaali koko Fit to window Sovita ikkunaan eLogClubLog Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! KLog - ClubLog KLog - ClubLog Undefined error... Määrittelemätön virhe... Undefined error number (#%1)... QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Kutsutunnus puuttuu Invalid callsign Väärä kutsutunnus Skipping SWL callsign Ohitetaan SWL kutsutunnus Callsign is your own call Kutsutunnus on oma kutsusi Invalid callsign with no DXCC mapping Virheellinen kutsutunnus, ilman DXCC kartoitusta Updated QSO QSO päivitetty Invalid ADIF record Virheellinen ADIF tieto Missing ADIF record Puuttuva ADIF tieto Test mode - parameters ok, no action taken Testitila - parametrit ok, toimintoja ei tehty Excessive API Usage Liiallinen API:n käyttö Internal Error Sisäinen Virhe Rejected Hylätty QSO Duplicate QSO Duplikaatti QSO Modified QSO muokattu Missing Login Puuttuva sisäänkirjaus QSO OK QSO OK Upload denied Lataus kielletty No callsign selected Ei valittua kutsutunnusta No match found Vastaavuutta ei löytynyt Dropped QSO Pudotettu QSO OK OK Login rejected Sisäänkirjautuminen evätty Rejected: Callsign is your own call Hylätty: Kutsutunnus on oma kutsusi eLogQrzLog Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Kutsutunnus puuttuu eQSLUtilities Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/translations/klog_en.ts0000644000175000017500000121431514166020407016160 0ustar develdevel AboutDialog About KLog By KLog is a free logbook for hamradio operators. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Find more information and the latest release at Author today Main developer KLog is developed by a very small team and you are invited to join! If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Authors Translators bring KLog into your language. They are really an important part of the KLog development team. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Translators Privacy advisory KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Callsign KLog version Operating system Be aware that you can enable/disable this feature from the Misc tab in the Setup page. KLog Privacy AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok Cancel DX Date/Time Band Mode Not defined All QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Click to recalculate the award status. Select the year you want to check. QSOs DXCC CQ Award Confirmed Worked WAZ Score Annual Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon CTYPage Country data download KLog needs country data... &Download &Ignore Country data needed KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. KLog I can't find the host. Please check your network and try again Do you want to try again? DXCCStatusWidget Update Prefix Entity Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server Connect Clear Click on connect to connect to the DX-Cluster Trying to connect to the server KLog DXCluster The host was not found. Please check: - your network connection; - the host name and port settings. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. The following error occurred: %1. Connected to server KLog message Enter your callsign to connect to the cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Disconnect Not logged on, you may need to enter your callsign again. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Click on Connect to connect to the DX-Cluster server. Send It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Bureau Common term in hamradio, do not translate if not sure Direct Electronic Manager Common term in hamradio, do not translate if not sure KLog DXCC All QSOs have been updated with a DXCC and the Continent. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Download of cty.csv done. There is already a cty.csv file in the folder but it will be replaced with the new one. Could not open %1 for writing FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager KLog - Error The selected log does not exist, please check it again. The selected callsign (%1) is not valid, please check it again to export the log. The file %1 can't be opened. There are no QSOs pending to be exported with that station callsign. Writing ADIF file... Abort writing Export Exporting ADIF file... QSO: %1 / %2 KLog - User cancelled You have canceled the file export. The file will be removed and no data will be exported. Do you still want to cancel? Export progress Writing ADIF file... QSO: KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Abort reading Importing LoTW ADIF file... QSO: You have canceled the file import. The file will be removed and no data will be imported. KLog - Log selection There is more than one log in this logfile. All logs will be imported into the current log. Do you want to continue? Reading ADIF file... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) This QSO is not including the minimum data to consider a QSO as valid! Please edit the ADIF file and make sure that it include at least: and This QSO had: - The band missing and the following call: - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: Do you want to continue with the current file? KLog: Not all required data found! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. If you select NO, maybe the QSO will not be imported. KLog: No RST TX found! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog: No RST RX found! KLog - No Station callsign entered. KLog - Apply to all QSOs in this log? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog - QSO without Station Callsign KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent Prefix CQ ITU Short Path Long Path Deg Miles Km IntroPage Welcome to KLog! Welcome to KLog! - brought to you under the terms of the GPL! Welcome to KLog This looks like it's the first time you've run KLog on this computer. KLog is a free hamradio logging program that can run on Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF and Cabrillo file formats and many other features... Before you can start using KLog, you will be asked to: Acknowledge to the terms of the license. Download the DX entities information. Enter your callsign, CQ zone, etc. and main configuration. Enjoy KLog and contact the development team if you have any suggestions! LicPage KLog License information Welcome to KLog!- brought to you under the terms of the GPL! Acknowledge Be aware that KLog is free software. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW password needed Please enter your LoTW password: KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. Are you sure that you want to use that station callsign (%1)? KLog - LoTW File already exists There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog - LoTW Can't write the file KLog was not able to save the file %1. Error returned: %2 The file %1 already exists. Downloading data to file: %1. KLog - LoTW download KLog - LoTW Start date selection This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to used this date (%1) as start date? KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found The remote server redirected our connection to %1 Do you want to follow the redirection? KLog - LoTW File not found KLog can't find the downloaded file. It was not possible for find the file %1 that has been just downloaded. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs It seems that LoTW has no QSO with the Station Callsign you are using (%1). KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? Now KLog will process the downloaded QSO and update your local log. LogModel Date Call Band Mode RSTtx RSTrx Comment LogWindow QSL Send QSL Rcvd &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Clear Callsign of the QSO. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clears the QSO entry. KLog will show real time if enabled. Callsign &Modify DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Check always the current callsign in QRZ.com KLog - File not open It was not possible to open the debug file for writing. No debug log will be saved! Status bar ... DX Entity Starting KLog &Log Window Upload the queued QSOs to LoTW Watts MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. KLog CTY.dat update KLog needs to update the Entities database. You can update the entities database in Tools->Update cty.csv Do you want to do it now? It seems that you have never done a backup or exported your log to ADIF. It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. KLog backup The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. KLog new version detected! It seems that you are running this version of KLog for the first time. The setup will be open to allow you to do any new setup you may need. Ready KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSOs: %2 KLog KLog - Unexpected error An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: KLog - Not valid call The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. KLog - Select correct entity You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? No DXCC None Click on the prefix of the right entity or Cancel to correct. Save ADIF File You have requested to delete several QSOs This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Are you sure? You have requested to delete the QSO with: %1 KLog ClubLog error The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 KLog ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. KLog eQSL error The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 KLog eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? KLog - eQSL There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog QRZ.com error The QRZ.com upload process has finished with an error and the log was possibly not uploaded. KLog QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. KLog %1 You need to activate the %1 service in the eLog preferences. KLog - Exit Do you really want to exit KLog? The logfile has been modified. Do you want to save your changes? KLog ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &File &Import from ADIF ... Import an ADIF file into the current log. Export to ADIF ... Export the current log to an ADIF logfile. Export all logs to ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. &Print Log ... Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. QSL tools ... Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSOs as sent Mark all queued QSOs as sent to LoTW. Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Queue all the QSOs to be uploaded Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Check the current callsign in QRZ.com Queue all the QSO to be uploaded Upload the queued QSOs to QRZ.com ... Update cty.csv For updated DX-Entity data, update cty.csv. Update Satellite Data Stats Show the statistics of your radio activity. Setup Setup ... &Help &Tips ... &Debug ... &About ... About Qt ... Check updates ... KLog LoTW All pending QSOs of this log has been marked as queued for LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL finished with no error. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Define Station Callsign You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the callsign you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: KLog - No station selected No station callsign has been selected and therefore no log will be marked Do you really want to mark ALL these QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to LoTW All queued QSOs of this log has been marked as sent for LoTW! There was a problem to mark all queued QSOs of this log as sent for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog update checking result Congratulations! You already have the latest version. You can find the KLog data folder here: start UDP Server error The UDP server failed to %1. start or stop stop It seems that there are no QSOs in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Sends the log to LoTW calling TQSL. This function is disabled. Go to the Setup->LoTW tab to enable it. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Logging operator's callsign. Callsign used over the air. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. TX RST. RX RST. Status of the DX entity. Name of the DX entity. Name QTH DX Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX QSO QSL eQSL Comment Others My Data Satellite Info Awards Search Log DX-Cluster DXCC No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog - LoTW You need to select one station callsign to be able to send your log to LoTW. If you uploaded any QSO to LoTW while you were using TQSL you can now mark them as sent in KLog. Do you want to mark as Sent all the QSOs uploaded to LoTW? There was an error while updating to Yes the LoTW QSL sent information. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. You need to select one station callsign to be able to send your log to eQSL.cc. KLog - Select the Station Callsign. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to ClubLog The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to eQSL The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL KLog QRZ.COM Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Open File DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. - Needed for DXMarathon Filling QSOs ... Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Date/Time Callsign RSTtx RSTrx Band Mode Print Log Printing the log ... Abort printing Printing the log... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! KLog QSO received The following QSO data has been received from WSJT-X to be logged: Freq Time On Time Off RST TX RST RX DX-Grid Local-Grid Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Duplicated QSOs have to match another exiting QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error code Error text Failed query Recommendation: Periodically export your data to ADIF to prevent a potential data loss. KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment Add a comment for this QSO. Keep this data Data entered in this tab will be copied into the next QSO. MainWindowInputEQSL Date of the ClubLog upload. Date of the QRZ.com upload. Date of the eQSL sending. Date of the eQSL reception. Date of the LoTW sending. Date of the LoTW reception. Status on ClubLog. Status on QRZ.com. Status of the eQSL sending. Status of the eQSL reception. Status of the LoTW sending. Status of the LoTW reception. ClubLog QRZ.com eQSL Sent eQSL Rec LoTW Sent LoTW Rec MainWindowInputOthers Primary Div Secondary Div IOTA Entity Propagation mode Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Keeps the same propagation mode for next QSO. Not Identified Not - Not Identified MainWindowInputQSL QSL Sent QSL Rec QSL Via QSL Msg Status of the QSL sending. Status of the QSL reception. QSL sending information. QSL reception information. Date of the QSL sending. Date of the QSL reception. Message of the QSL. QSL via information. MainWindowMyDataTab Watts Keep this data Data entered in this tab will be copied into the next QSO. Power used for the QSO in watts. Logging operator's callsign. Callsign used over the air. My QTH locator. Power Operator callsign Station Callsign My Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. MainWindowSatTab Keep this data Data entered in this tab will be copied into the next QSO. Other - Sat not in the list Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink DownLink Satellite Mode DX Locator Other MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. The satellite you have in your QSO is: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frequency in MHz. QObject New One, work it! Needed, work it! Worked but not confirmed Confirmed Not identified Database Error KLog DB needs to be upgraded. Do you want to upgrade it now? If DB is not upgraded KLog may not work properly. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog: Enter Station callsign Enter the station callsign used in this log Station Callsign All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Abort updating QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Updating bands information... Updating bands information in %1 status... Progress: Updating mode information in %1 status... Updating information... Updating DXCC and Continent information... Install wizard was canceled before completing... Do you want to remove the KLog dir from your disk? Your KLog dir has been removed Thank you for running KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Remember that your KLog dir is on your system... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found SearchWidget &Clear &Export Highlighted &Select All &Search All logs Clear the searches. Export the search result to an ADIF file. Select/Unselect all the QSOs shown. Search in the log. Search in all logs. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. You have requested to delete the QSO with: %1 Are you sure? All in log Not defined &Clear selection Save File SearchWindow Call Date/Time Band Mode QSL Sent QSL Rcvd Station Callsign ID Date/time Station callsign QSL Send &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Mark my QSL as requested Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL Mark the QSL as requested Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL My QSL requested to be sent DX QSL pending to be received SetupDialog User data Bands/Modes D&X-Cluster Colors Misc World Editor Logs eLog WSJT-X Satellites HamLib Cancel OK Settings You need to enter at least one log in the Logs tab. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) DX-Cluster World DB has not been moved to new path. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. You will be redirected to the Log tab. Please add and select the kind of log you want to use. SetupEntityDialog Entity Name of the Entity. CQ CQ zone. ITU ITU zone. Latitude Longitude of the Entity. Longitude UTC Local time difference to UTC. Main prefix Main prefix of the entity. ARRL ID ARRL ID. Prefixes Comma separated possible prefixes, e.g. EA1, EA2, ... Date of the deletion. Deleted Cancel Ok Entity Dialog SetupPageBandMode Bands Modes SetupPageColors New One Needed in this band Worked in this band Confirmed in this band Default WSJT-X palette Default palette Color when the DXCC is an ATNO (All Time New One). This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Choose a color SetupPageDxCluster Add Delete Show &HF spots Show V/&UHF spots Show W&ARC spots Show &worked spots Show &confirmed spots Show ANN/&FULL messages Show WW&V messages Show WC&Y messages Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots Others Messages KLog: Add a DXCluster server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Defines the interval to poll the radio in msecs. Poll interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New &Edit &Remove Add a new log. Edit the selected log. Remove the selected log. KLog Do you really want to remove this log? All the QSOs from this log will also be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Date Station Callsign Operators Comments QSOs The new log could not be created. An error has occurred showing the following error code: KLog - SetupPageLogs SetupPageLogsNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system &Log in real time &Time in UTC &Save ADIF on exit Use this &default filename Mark &QSO to send QSL when QSL is received Complete QSO with previous data Show the Station &Callsign used in the search box &Check for new versions automatically &Provide Info for statistics Manage DX-Marathon Activate the application debug log Mark sent eQSL && LoTW in new QSO as queued &Delete always temp ADIF file after uploading QSOs Browse Move DB QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. The search box will also show the callsign on the air to do the QSO. Check if there is a new release of KLog available every time you start KLog. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Check it for Imperial system (Miles instead of Kilometers). Select to use real time. Select to use UTC time. Select if you want to save to ADIF on exit. Select to use the following name for the logfile without being asked for it again. Complete the current QSO with previous QSO data. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. This is the directory where the database (logbook.dat) will be saved. Click to change the default ADIF file. Click to change the path of the database. Click to move the DB to the new directory. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Select Directory This is the directory where DB (logbook.dat) will be saved. Please specify an existing directory where the database (logbook.dat) will be saved. KLog - Move DB File moved File copied File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. SetupPageSats &New &Edit &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have in the current list. Export your current satellites to a file. Select the sat you want to open. KLog Do you really want to remove this satellite? This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name Uplink Downlink Modes An error has occurred showing the following error code: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink DownLink Modes &Ok &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid Call in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Name Short Name CQ Zone ITU Zone Deleted Start Date End Date DXCC An error has occurred showing the following error code: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Address Cit&y &Zip Code Pro&v/State Countr&y Enter your information for rig Enter your information for antenna Enter your power information. &Rig 1 R&ig 2 Ri&g 3 Antenna &1 Antenna &2 Antenna &3 Po&wer Enter the station callsign that will be used for logging. Enter the operators (comma separated if more than one). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. &Callsign &Operators &CQ Zone &ITU Zone &Locator &Locator (not valid) SetupPageWorldEditor Add Delete Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. No entities information file (cty.csv) has been detected in your KLog folder. KLog will not be able to show entities information. Prefix Entity ARRL ID Continent CQ Zone ITU Zone UTC Latitude Longitude Deleted Since Date To Date Open File BigCTY (*.csv) Entities information has been updated. Entities information has not been updated. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok DX Date/Time Band Mode ShowErrorDialog KLog Message SoftwareUpdateDialog Ok KLog update Congratulations! Your KLog has been updated. You already have the latest version. StartWizard KLog - The free hamradio logging program Quit Setup Setup is not complete yet. Are you sure you want to quit setup? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Date Band Mode DXCC Satellite Confirmed No StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading DXCC Entities DXCC Entities per year Reading data ... Entities: StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Date Band Mode Grid Satellite Confirmed No StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Bands QSOs per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Reading data... DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Modes QSOs per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget QSOs per year Reading data ... Abort reading QSOs Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #2:</b><br>Do you know...<br>You can use <a href="#ToolsFillInDXCC">Tools->Fill in DXCC data</a> to automatically read the full log to fill the DXCC QSO data? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #4:</b><br>Do you know...<br>You can export your QSO marked as QSL requested with <a href="#FileExportQSLADIFToPrint">File->Export Requested QSL to ADIF...</a> to create an ADIF file that you will be able to import into a QSL tag creation program to print tags for your QSL cards? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? <b>Tip #6:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://lists.nongnu.org/mailman/listinfo/klog-users>KLog-users mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #20:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? <b>Tip #21:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->Upload to LoTW...</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->Export ADIF for LoTW... TIP-Default: Text UpdateSatsData Reading Satellites data file... Abort reading The Satellites information has been updated. Open File Sat Data World Entity Continent Reading cty.csv... Abort reading WorldMapWidget World map View Zoom In(25%) Zoom Out(25%) Normal Size Fit to window eLogClubLog Host not found! Timeout error! QSO dupe or not existing (#%1)... KLog - ClubLog We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Undefined error... Callsign missing Invalid callsign Skipping SWL callsign Callsign is your own call Invalid callsign with no DXCC mapping Updated QSO Invalid ADIF record Missing ADIF record Test mode - parameters ok, no action taken Excessive API Usage Internal Error Rejected QSO Duplicate QSO Modified Missing Login QSO OK Upload denied No callsign selected No match found Dropped QSO OK Login rejected Rejected: Callsign is your own call eLogQrzLog Host not found! Timeout error! Undefined error number (#%1) KLog - QRZ.com We have received the following error from QRZ.com (%1) Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: Callsign missing eQSLUtilities KLog - eQSL eQSL has sent the following message: %1 Host not found! Timeout error! Undefined error number (#%1)... We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: klog-1.8.6/translations/klog_fr.ts0000644000175000017500000135741214166020421016167 0ustar develdevel AboutDialog About KLog A propos de KLog By Par KLog is a free logbook for hamradio operators. KLog est un carnet de trafic libre pour les radioamateurs. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Veuillez fournir votre révision dans la page de révision eHam de KLog : Find more information and the latest release at Trouvez plus d'information et la dernière version à Author Auteur today aujourd'hui Main developer Développeur principal KLog is developed by a very small team and you are invited to join! KLog est développé par une très petite équipe et vous êtes invités à nous rejoindre ! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Vous pouvez aussi nous aider en postant des rapports de bogues ou de petites contributions au code source, idées ou tout ce qui selon vous, pourrait améliorer KLog. Authors Auteurs Translators bring KLog into your language. They are really an important part of the KLog development team. Les traducteurs portent KLog dans votre langue. Ils ont une part importante dans l'équipe de développement KLog. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Traducteurs Privacy advisory Avis de confidentialité KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Actuellement, les données qui sont collectées sont les suivantes : Callsign Indicatif KLog version Version de KLog Operating system Système d'exploitation KLog KLog Privacy Confidentialité AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok Ok Cancel Annuler DX Date/Time Date/Heure Band Bande Mode Mode Not defined All Tout QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Recalculer Click to recalculate the award status. Cliquer pour recalculer le statut du diplôme Select the year you want to check. Sélectionnez l'année que vous souhaitez vérifier. QSOs QSOs DXCC DXCC CQ CQ Award Diplôme Confirmed Confirmé Worked Réalisé WAZ WAZ Score Score Annual Annuel Number of confirmed DXCC entities. Nombre d'entités DXCC confirmées. Number of worked DXCC entities. Nombre d'entités DXCC contactées. Number of confirmed WAZ zones. Nombre de zones WAZ confirmées. Number of worked WAZ zones. Nombre de zones WAZ contactées. Number of confirmed QSOs. Nombre de QSOs confirmés. Number of worked QSOs. Nombre de QSOs réalisés. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Téléchargement des données des Pays KLog needs country data... Klog a besoin des données des pays... &Download Télécharger &Ignore Ignorer Country data needed Données de pays nécessaire KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Cliquer sur Télecharger pour télécharger maintenant. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Je ne peux pas trouver le serveur distant. Veuillez vérifier votre connexion réseau et réessayez Souhaitez-vous réessayez ? DXCCStatusWidget Update Mise à jour It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entité Prefix Préfixe Pref: Préf : CQ: CQ : ITU: ITU : Beam: Beam : Entity not worked in this band. Entité non contacté sur cette bande DXClusterWidget Click on Connect to connect to the DX-Cluster server Cliquez sur Se connecter pour se connecter au serveur DX-Cluster Connect Se connecter Clear Effacer Click on connect to connect to the DX-Cluster Cliquer sur Se connecter pour se connecter au DX-Cluster Trying to connect to the server Tentative de connexion au serveur KLog DXCluster DXCluster KLog The host was not found. Please check: Le serveur distant n'a pas été trouvé. Veuillez vérifier : - your network connection; - the host name and port settings. - Votre connexion réseau ; - La configuration du nom d'hôte et du port du serveur distant. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexion a été refusée par le serveur distant. Soyez sûr que le serveur DXCluster est lancé et vérifiez que le paramètrage du nom d'hôte du serveur distant et du port sont corrects. The following error occurred: %1. L'erreur suivante s'est produite : %1. Connected to server Connecté au serveur KLog message Message KLog Enter your callsign to connect to the cluster: Entrez votre indicatif pour vous connecter au cluster : Enter your password to connect to the cluster: (Just hit enter for no password) Entrez votre mot de passe pour vous connecter au cluster : (Tapez juste sur la touche Entrée s'il n'y a pas de mot de passe) Disconnect Sé déconnecter Not logged on, you may need to enter your callsign again. Non connecté, vous devrez peut-être ressaisir votre indicatif. Enter here the commands to be sent to the DX-Cluster server. Saisir ici les commandes à envoyer au serveur DX-Cluster Connection closed by the server Connexion fermée par le serveur Click on Connect to connect to the DX-Cluster server. Cliquer sur "Se connecter" pour se connecter au serveur DX-Cluster. Send Envoyer It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null La version du logiciel dans la BD est null Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terre-Lune-Terre Sporadic E Sporadique E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Internet-assisted Assisté par Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Répéteur terrestre ou atmosphérique ou transpondeur Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satellite Trans-equatorial Common term in hamradio, do not translate if not sure Trans-équatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Oui No Non Requested Demandé Ignore/Invalid Ignoré/Incorrect Validated Validé Queued Mis en file d'attente Uploaded Téléversé Do not upload Ne pas téléverser Modified Modifié Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Électronique Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC DXCC KLog All QSOs have been updated with a DXCC and the Continent. Tous les QSOs ont été mis à jour avec le DXCC et le continent. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Le téléchargement de cty.csv a échoué avec le code d'erreur suivant : Download of cty.csv done. Téléchargement de cty.csv terminé. There is already a cty.csv file in the folder but it will be replaced with the new one. Il y a déjà un fichier cty.csv dans le répertoire, il va être remplacé par le nouveau. Could not open %1 for writing Ouverture impossible de %1 pour écriture FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... En cours d'enregistrement du fichier ADIF... Abort writing Annuler l'enregistrement QSO: QSO : Writing ADIF file... QSO: Enregistrement du fichier ADIF... QSO : You have canceled the file export. The file will be removed and no data will be exported. Vous avez annulé l'export du fichier. Le fichier sera supprimé et aucune donnée ne sera exportée. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Souhaitez-vous toujours annuler ? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Lecture en cours du fichier LoTW... Abort reading Lecture interrompue Importing LoTW ADIF file... KLog - Log selection There is more than one log in this logfile. Il y a plus d'un log dans ce fichier de logs. All logs will be imported into the current log. Tous les logs seront importés dans le log en cours. Do you want to continue? Souhaites-vous continuer ? Reading ADIF file... Lecture du fichier ADIF en cours... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... Importation du fichier ADIF en cours... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Il semble qu'il y ait quelques QSOs en doublon dans le fichier ADIF que vous importez. Souhaitez vous continuer ? (Les QSOs en doublon ne seront pas importés) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? Please edit the ADIF file and make sure that it include at least: Veuillez éditer le fichier ADIF et soyez sûr qu'il contient à minima : and et This QSO had: Ce QSO a : This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - La bande est manquante pour l'indicatif suivant : - The mode missing and the following call: - Le mode est manquant pour l'indicatif suivant : - The date missing and the following call: - La date est manquante pour l'indicatif suivant : - The time missing and the following call: - L'heure est manquante pour l'indicatif suivant : Do you want to continue with the current file? Souhaitez-vous continuer avec le fichier en cours ? KLog: Not all required data found! KLog : Tous les données requises n'ont pas été trouvés ! KLog - No Station callsign entered. KLog - QSO without Station Callsign KLog: No RST TX found! KLog : Pas de RST TX trouvé ! KLog: No RST RX found! KLog : Pas de RST RX trouvé ! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Sélectionner la vitesse du port série Port Port Select the serial port. Only the serial ports that are detected are shown. Sélectionner le port série. Seuls les ports série détectés sont affichés. Scan Scanner Click to identify the serial ports available in your computer. Cliquer pour identifier les ports série disponible sur votre ordinateur 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de données Select the serial data bits. Sélectionner les bits de données None Aucun Hardware Matériel Software XON/XOFF Software XON/XOFF Flow control Contrôle de flux Select the serial flow control Sélectionner le contrôle de flux No parity Pas de parité Even Pair Odd Impair Space Espace Mark Marque Parity Parité Select the serial parity. Sélectionner la parité Default Défaut 1 bit 1 bit 2 bits 2 bits Stop bits Bits d'arrêt Select the serial stop bits. Sélectionner les bits d'arrêt InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Préfixe CQ CQ ITU ITU Short Path Chemin Court Long Path Chemin Long Deg Deg Miles Miles Km Km IntroPage Welcome to KLog! Bienvenue sur KLog ! Welcome to KLog! - brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Welcome to KLog Bienvenue sur KLog This looks like it's the first time you've run KLog on this computer. Il semble que c'est la première fois que vous lancez KLog sur cet ordinateur. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Il supporte la gestion des QSLs, l'import et l'export and Cabrillo file formats and many other features... aux formats de fichiers ADIF et Cabrillo et aussi beaucoup d'autres fonctionnalités... Before you can start using KLog, you will be asked to: Avant que vous puissiez utiliser KLog, il va vous être demandé de : Acknowledge to the terms of the license. Prendre connaissance des termes de la licence. Download the DX entities information. Télécharger les informations des entités DX. Enter your callsign, CQ zone, etc. and main configuration. Entrer votre indicatif, zone CQ etc... et la configuration principale. Enjoy KLog and contact the development team if you have any suggestions! Appréciez KLog et contactez l'équipe de développement si vous avez des suggestions ! LicPage KLog License information Information de licence KLog Welcome to KLog!- brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Acknowledge Remerciements Be aware that KLog is free software. Sachez que KLog est un logiciel libre. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL envoyée QSL Rcvd QSL reçue &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer un QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irecte Send this QSL via direct Envoyer cette QSL via direct Via bureau Via bureau QSL &received via bureau QSL &reçue via bureau Direct Direct QSL received via direc&t QSL reçue via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Ajouter &Clear Effa&cer Callsign of the QSO. Band of the QSO. Bande Mode of the QSO. Mode Date of the QSO. Date Time of the QSO. Heure Add the QSO to the log. Ajouter le contact Clears the QSO entry. Efface la saisie KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Indicatif DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DOUBLON &Modify &Modifier MainWindow Starting KLog Démarrage de Klog DX Entity Entité DX &Log Window Fenêtre de &log KLog KLog It seems that you have never done a backup or exported your log to ADIF. It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Ready Prêt An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Une erreur inattendue s'est produite en essayant d'ajouter votre QSL au fichier de log. Si le problème persiste, veuillez contacter le développeur pour analyse : You have selected an entity: Vous avez sélectionné une entité : that is different from the KLog proposed entity: qui est différente de l'entité proposée par KLog : Click on the prefix of the correct entity or Cancel to edit the QSO again. Cliquez sur le préfixe de l'entité correcte ou Annuler pour éditer à nouveau le QSO. Click on the prefix of the right entity or Cancel to correct. Cliquez sur le préfix de l'entité correcte ou Annuler pour corriger. RSTrx RSTrx RSTtx RSTtx You need to select one station callsign to be able to send your log to LoTW. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL KLog needs to update the Entities database. KLog - Backup KLog - New version detected! KLog - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &About ... About Qt ... Check updates ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! About ... KLog - Update checking result You need to select one station callsign to be able to send your log to eQSL.cc. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Date/Heure Do you really want to exit KLog? Souhaitez-vous quitter KLog ? &File &Fichier Import an ADIF file into the current log. Importer un fichier ADIF dans le log en cours. Export the current log to an ADIF logfile. Exporter le log en cours vers un fichier de log ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporter TOUS les QSOs dans un fichier ADIF en fusionnant les QSOs de tous les logs. Print your log. Imprimer votre log KLog folder Répertoire de KLog Opens the data folder of KLog. Ouvre le répertoire de données de KLog. E&xit Quitter &Tools Ou&tils Fill in QSO data Saisir les données de QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Parcourir le log pour compléter des informations manquantes dans d'autres QSOs en réutilisant de précédents QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Affiche les QSOs pour lesquels vous devez envoyer votre QSL et demander la QSL DX. Find My-QSLs pending to send Rechercher Mes-QSLs en attente d'envoi Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Affiche les QSOs avec des demandes en attente d'envoi de QSLs. Vous devriez conserver cette file vide ! Mark all queued QSOs in this log as sent to LoTW. Marquer tous les QSOs en file d'attente de ce log comme envoyé à LoTW. Mark all queued QSOs as sent to LoTW. Marquer tous les QSOs en file d'attente comme envoyés à LoTW. Sends the log to LoTW calling TQSL. It was not possible to open the debug file for writing. No debug log will be saved! KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. No DXCC None Aucun You have requested to delete the QSO with: %1 Vous avez demandé à supprimer le QSO avec : %1 Are you sure? Êtes-vous sûr ? The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com For updated DX-Entity data, update cty.csv. Pour des données d'entités DX mises à jour, mettre à jour cty.csv. Stats Statistiques Show the statistics of your radio activity. Afficher les statistiques de votre activité radio &Help Aide &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Le log que vous avez sélectionné contient plus qu'un seul indicatif de station. Please select the station callsign you want to mark as sent to LoTW: Veuillez sélectionner l'indicatif de la station que vous souhaitez marquer comme envoyé à LoTW : Station Callsign: Indicatif de la Station : Define Station Callsign Définir l'indicatif de la Station Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Enter l'indicatif de la station à utiliser pour ce log ou laisser vide pour un QSO sans un indicatif de station défini : You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Aucun indicatif de station n'a été sélectionné, par conséquent aucun log ne sera marqué Congratulations! Félicitations ! You already have the latest version. Vous disposez déjà de la dernière version. You can find the KLog data folder here: Vous pouvez trouver le répertoire de données KLog ici : TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog QRZ.COM Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: QSO loggué depuis WSJT-X : start démarrer Check always the current callsign in QRZ.com KLog - File not open Status bar ... Upload the queued QSOs to LoTW You can update the entities database in Tools->Update cty.csv Do you want to do it now? It seems that you are running this version of KLog for the first time. Il semble que vous exécutiez cette version de KLog pour la première fois. The setup will be open to allow you to do any new setup you may need. La fenêtre de configuration va s'ouvrir pour vous permettre de faire toute configuration dont vous avez besoin. KLog - Unexpected error The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Select correct entity KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - QRZ.com error KLog has received an error from QRZ.com. KLog - Exit Queue all the QSOs to be uploaded Queue all the QSO to be uploaded All pending QSOs of this log has been marked as queued for LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! stop arrêter If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si vous êtes sûr que la base de données contient des QSOs et que KLog ne parvient pas à les trouver, veuillez "contacter les développeurs (voir A propos de KLog) pour de l'aide. It seems that there are no QSOs in the database. This function is disabled. Go to the Setup->LoTW tab to enable it. No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 There was an error while updating to Yes the LoTW QSL sent information. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW KLog - Select the Station Callsign. The logfile has been modified. Le fichier de log a été modifié KLog - CTY.dat update Do you want to save your changes? Voulez-vous sauvegarder vos modifications ? UDP Server error The UDP server failed to %1. start or stop Erreur du serveur UDP Le serveur UDP à échoué : %1. Status of the DX entity. Statut de la contrée contactée Name of the DX entity. Nom de la contrée contactée QSO QSO QSL QSL eQSL eQSL Comment Commentaire Others Autres My Data Mes Données Satellite Satellite DXCC DXCC Info Info Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Awards Diplômes Search Rechercher Log Log DX-Cluster Cluster-DX Save ADIF File Enregistrer le Fichier ADIF Open File Ouvrir un Fichier - Needed for DXMarathon - Nécessaire pour le DXMarathon Abort filling Annuler la saisie Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Saisir DXCC, zone CQ, zone ITU, Continent dans les QSOs… QSO : Number Numéro Callsign Indicatif Band Bande Mode Mode Print Log Imprimer le Log Abort printing Annuler l'impression Printing the log ... Printing the log... QSO: Impression du log… QSO : The following QSO data has been received from WSJT-X to be logged: Les données de QSO suivant ont été reçues de WSJT-X pour être logguées : Freq Fréq Time On Heure de début Time Off Heure de fin RST TX TX RST RST RX RX RST DX-Grid DX-Grid Local-Grid Grid-Local Station Callsign Indicatif de la Station Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. If the received mode is correct, please contact KLog development team and request support for that mode Si le mode reçu est correct, veuillez contacter l'équipe de développement KLog et demandez le support de ce mode KLog - QRZ.COM KLog - QSO received KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Un Satellite en doublon a été détecté dans le fichier et ne sera pas importé. Please check the satellite information file and ensure it is properly populated. Veuillez vérifier le fichier des informations sur les Satellites et assurez-vous qu'il est proprement rempli. Now you will see a more detailed error that can be used for debugging... Vous allez voir une erreur plus détaillée qui pourra être utilisée pour le déboggage... An unexpected error ocurred!! Une erreur inattendue s'est produite !! If the problem persists, please contact the developers Si le problème persiste, veuillez contacter les développeurs for analysis: pour analyse : Error in function Erreur dans la fonction Error text Texte d'erreur Failed query Requête échouée KLog - Show errors Do you want to keep showing errors? Voulez-vous continuer à afficher les erreurs ? MainWindowInputComment Comment Commentaire Add a comment for this QSO. Ajouter un commentaire pour ce QSO Keep this data Conserver ces données Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs MainWindowInputEQSL Date of the ClubLog upload. Date du transfert vers ClubLog Date of the QRZ.com upload. Date of the eQSL sending. Date de l'envoi de l'eQSL Date of the eQSL reception. Date de réception de l"eQSL Date of the LoTW sending. Date de l'envoi LoTW. Date of the LoTW reception. Date de la réception LoTW Status on ClubLog. Statut sur ClubLog Status on QRZ.com. Status of the eQSL sending. Statut de l'envoi de l'eQSL Status of the eQSL reception. Statut de la réception de l'eQSL Status of the LoTW sending. Statut de l'envoi LoTW Status of the LoTW reception. Statut de la réception LoTW ClubLog ClubLog QRZ.com eQSL Sent eQSL Env. eQSL Rec eQSL Reçu LoTW Sent LoTW Env. LoTW Rec LoTW Reçu MainWindowInputOthers Primary Div Div Principale Secondary Div Div Secondaire IOTA IOTA Entity Entité Propagation mode Mode de propagation Others Autres Keep propagation mode Select the primary division for this QSO. Choisir la division principale pour ce QSO Select the secondary division for this QSO. Choisir la division secondaire pour ce QSO Select the entity for this QSO. Choisir l'entité pour ce QSO Select the propagation mode for this QSO. Choisir le mode de propagation pour ce QSO Select the IOTA continent for this QSO. Choisir le continent IOTA pour ce QSO Select the IOTA reference number for this QSO. Choisir la référence IOTA pour ce QSO Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Non Identifié Not - Not Identified Non - Non Identifié SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL Env. QSL Rec QSL Reçue QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Statut de l'envoi de la QSL Status of the QSL reception. Statut de la réception de la QSL QSL sending information. Informations d'envoi de la QSL QSL reception information. Informations de réception de la QSL Date of the QSL sending. Date d'envoi de la QSL Date of the QSL reception. Date de la réception de la QSL Message of the QSL. Message de la QSL QSL via information. Information QSL via MainWindowInputQSO TX RST. RST TX RX RST. RST RX TX Frequency in MHz. Fréquence TX en MHz RX Frequency in MHz. Fréquence RX en MHz Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Nom QTH QTH DX Locator Locator DX Power(rx) Puissance(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Fréq TX Freq RX Fréq RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! Fréquence d'émission en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! RX Frequency in MHz. Frequency is not in a hamradio band! Fréquence de réception en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! MainWindowMyDataTab Watts Watts Keep this data Conserver ces données My QTH locator. Mon QTH locator. Power Puissance Operator callsign Station Callsign Indicatif de la Station My Locator Mon Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Conserver ces données Other - Sat not in the list Autre - Sat n'est pas dans la liste Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Le nom du Satellite n'est pas dans la liste. Choisir : "%1" pour activer ce champ. (format like AO-51). Satellite mode used. Mode Satellite utilisé Select the satellite you are using. Choisir le satellite que vous utilisez UpLink band. Bande UpLink DownLink band. Bande DownLink Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la station contactée. Ce champ est synchronisé avec le champ Locator de l'onglet QSO UpLink UpLink DownLink DownLink Satellite Satellite Mode Mode DX Locator Locator DX Other Autre MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO QSO non Sat KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog a détecté un nom de satellite qu'il ne reconnaît pas. Si vous préférez utiliser l'un des noms de satellites connus à la place, veuillez le choisir dans la liste. Sinon, veuillez contacter l'équipe de développement pour ajouter le nouveau nom de satellite. The satellite you have in your QSO is: Le satellite que vous avez dans votre QSO est : Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! Fréquence de réception en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! RX Frequency in MHz. Fréquence RX en MHz TX Frequency in MHz. Frequency is not in a hamradio band! Fréquence d'émission en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! TX Frequency in MHz. Fréquence TX en MHz OnlineMessageWidget The server returned the following error: %1 Not identified Non identifié QObject New One, work it! Un Nouveau, le faire ! Needed, work it! Nécessaire, le faire ! Worked but not confirmed Réalisé mais non confirmé Confirmed Confirmé Not identified Non identifié Database Error Erreur de base de données KLog DB needs to be upgraded. La BD de KLog doit être mise à jour. Do you want to upgrade it now? Voulez-vous la mettre à jour maintenant ? If DB is not upgraded KLog may not work properly. Si la BD n'est pas mise à jour, KLog peut ne pas fonctionner correctement. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog a détecté un ancien journal dans la BD. Toutes les données seront migrées vers un nouveau journal de type DX pour vous. KLog: Enter Station callsign KLog : Saisir l'indicatif de la Station Enter the station callsign used in this log Saisir l'indicatif de la station utilisé dans ce log Station Callsign Indicatif de la Station Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Mise à jour des informations sur les modes... Abort updating Mise à jour annulée QSO: QSO : Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annuler cette mise à jour entraînera une altération des données et une perte de données possible. Souhaitez-vous quand même annuler ? Updating bands information... Mise à jour des informations de bande... Updating bands information in %1 status... Mise à jour des information sur les bandes en statut %1... Progress: Progression : Updating mode information in %1 status... Mise à jour des informations sur les modes en statut %1... Updating information... Updating DXCC and Continent information... Mise à jour des informations sur les Contrées DXCC et Continents... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... L'assistant d'installation a été annulé avant de terminer... Do you want to remove the KLog dir from your disk? Voulez-vous supprimer le répertoire KLog de votre disque ? Your KLog dir has been removed Votre répertoire KLog a été supprimé Thank you for running KLog! Merci à vous d'utiliser KLog ! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Je n'ai pas pu supprimer votre répertoire KLog. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque-dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Votre répertoire KLog ne peut pas être supprimé. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque dur. Remember that your KLog dir is on your system... Rappelez-vous que votre répertoire KLog est sur votre système... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Date Call Indicatif RSTtx RSTtx RSTrx RSTrx Band Bande Comment Commentaire Mode Mode CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Continent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL Env. Force Init Freq Fréq Freq RX Fréq RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW Env. Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Nom Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL reçue QSL Sent QSL Env. QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Nom du satellite SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear Effa&cer &Export Highlighted &Exporter la Sélection &Select All Tout &Sélectionner &Search Rechercher Clear the searches. Effacer les recherches. Export the search result to an ADIF file. Exporter le résultat de la recherche vers un fichier ADIF. Select/Unselect all the QSOs shown. Sélectionner/Désélectionner tous les QSOs affichés. Search in the log. Rechercher dans le log. Search in all logs. Rechercher dans tous les logs. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection Effacer la sélection Save File Sauvegarder le Fichier You have requested to delete the QSO with: %1 Vous avez demandé à supprimer le QSO avec : %1 Are you sure? Êtes-vous sûr ? SearchWindow Date/Time Date/Heure Band Bande Mode Mode QSL Sent QSL Env. QSL Rcvd QSL reçue Station Callsign Indicatif de la Station ID ID Call Indicatif Date/time Station callsign QSL Send QSL envoyée &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer un QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irecte Send this QSL via direct Envoyer cette QSL via direct Via bureau Via bureau QSL &received via bureau QSL &reçue via bureau Direct Direct QSL received via direc&t QSL reçue via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Demande&r ma QSL Mark my QSL as requested Marquer ma QSL en demandée Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL Demande&r la QSL Mark the QSL as requested Marquer la QSL en demandée Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSO nécessaire pour envoyer la QSL My QSL requested to be sent Mes QSL demandés à envoyer DX QSL pending to be received QSL DX en attente de réception SetupDialog Bands/Modes Bandes/Modes DX-Cluster Cluster DX Colors Couleurs Log widget Misc Divers World Editor Editeur du Monde Logs Logs Satellites Satellites HamLib HamLib Cancel Annuler OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Données utilisateur D&X-Cluster Cluster D&X WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Vous devez saisir au moins un log dans l'onglet Logs. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Souhaitez-vous ajouter un log dans l'onglet des Logs ou quitter KLog ? (Cliquez Oui pour ajouter un log ou Non pour quitter KLog) World Monde Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aller dans l'onglet "Divers" et cliquer sur "Déplacer la base de données" sinon la base de données ne sera pas déplacée vers le nouvel emplacement. eLog DB has not been moved to new path. You have not selected the kind of log you want. Vous n'avez pas choisi le type de log que vous souhaitez. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Vous allez être redirigé vers l'onglet Log. Veuillez ajouter et choisir le type de log que vous souhaitez utiliser. SetupEntityDialog Entity Entité CQ CQ ITU ITU Latitude Latitude Longitude Longitude UTC UTC Main prefix Préfix principal ARRL ID ID ARRL Prefixes Préfixes Comma separated possible prefixes, e.g. EA1, EA2, ... Préfixes possibles séparés par des virgules : EA1, EA2... Ok Ok Name of the Entity. Nom de la Contrée CQ zone. Zone CQ ITU zone. Zone ITU Longitude of the Entity. Longitude de la Contrée DXCC Local time difference to UTC. Différence entre l'heure locale et l'heure UTC Main prefix of the entity. Préfixe principal de la contrée ARRL ID. ID ARRL Date of the deletion. Date de suppression Deleted Supprimé Cancel Annuler Entity Dialog Fenêtre de l'entité SetupPageBandMode Bands Bandes Modes Modes SetupPageColors New One Un Nouveau Needed in this band Nécessaire dans cette bande Worked in this band Contacté dans cette bande Confirmed in this band Confirmé dans cette bande Default Défaut WSJT-X palette Palette WSJT-X Default palette Palette par défaut Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Ce DXCC a déjà été réalisé sur une autre bande mais pas dans la bande sélectionnée. Cela peut être dû au CQ, ITU, Grid... Worked DXCC, but not confirmed in this band. DXCC réalisé mais non confirmé sur cette bande. Sets the Dark Mode Choose a color Choisir une couleur SetupPageDxCluster Add Ajouter Delete Supprimer Show &HF spots Afficher les spots &HF Show V/&UHF spots Afficher les spots V/&UHF Show W&ARC spots Afficher les spots W&ARC Show &worked spots Afficher les spots contactés Show &confirmed spots Afficher les spots &confirmés Show ANN/&FULL messages Afficher les messages ANN/&FULL Show WW&V messages Afficher les messages WW&V Show WC&Y messages Afficher les messages WC&Y Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots Spots DX Others Autres Messages Messages KLog: Add a DXCluster server KLog : Ajouter un serveur Cluster DX Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Ajouter l'adresse suivie par le :port Exemple : dxfun.com:8000 Si aucun port n'est précisé, le port 41112 sera utilisé par défaut : SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Entrez le mail utilisé lors de votre inscription à ClubLog Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envoyer chaque QSO à ClubLog en même temps qu'ils sont ajoutés ou modifiés dans KLog Starts the ClubLog support in KLog. Activer le support de ClubLog dans KLog Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activer HamLib Activates the hamlib support that will enable the connection to a radio. Activer le support hamlib pour permettre la connexion à un transceiver. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Radio Select your rig. Sélectionnez votre rig Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Nouveau &Edit &Editer &Remove Supp&rimer Add a new log. Ajouter un nouveau log Edit the selected log. Éditer le log sélectionné Remove the selected log. Supprimer le log sélectionné KLog KLog Do you really want to remove this log? Souhaitez-vous réellement retirer ce log ? All the QSOs from this log will also be deleted... QSOs QSOs The new log could not be created. Log has not been removed. (#3) Le log n'a pas été retiré. (#3) Log has not been removed. (#2) Le log n'a pas été retiré. (#2) Log has not been removed. (#1) Le log n'a pas été retiré. (#1) ID ID Date Date Station Callsign Indicatif de la Station Operators Opérateurs Comments Commentaires An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageLogs KLog - Page de configuration des journaux SetupPageLogsNew &Date &Date &Station Callsign Indicatif de la &Station &Operators &Opérateurs Comm&ent Comm&entaire &Ok &Ok &Cancel &Annuler Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Indicatif utilisé pour ce log Comma separated list of operators: callsign1, callsign2. Liste d'opérateurs séparés par une virgule : indicatif1, indicatif2... Start date of this log. Date de démarrage du log SetupPageMisc &Imperial system Système &Impérial &Log in real time Journalisation en temps réel &Time in UTC Heure en UTC &Save ADIF on exit &Sauvegarder l'ADIF en quittant Use this &default filename Utiliser ce nom de fichier par &défaut Mark &QSO to send QSL when QSL is received Marquer le &QSO pour envoyer une QSL quand la QSL est reçue Complete QSO with previous data Compléter le QSO avec les données du précédent Show the Station &Callsign used in the search box Afficher l'indicatif de la station utilisée dans le champ de recherche &Check for new versions automatically Vérifier les nouvelles versions automatiquement &Provide Info for statistics Fournir des informations pour les statistiques Manage DX-Marathon Gérer le DX-Marathon Activate the application debug log Activer le journal de débogage de l'application Mark sent eQSL && LoTW in new QSO as queued Browse Parcourir Move DB Déplacer la BD QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Les QSOs seront marqués en attente pour envoyer une QSL si vous recevez la QSL et que vous n'avez pas encore retourné la vôtre The search box will also show the callsign on the air to do the QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Vérifier si une nouvelle version de KLog est disponible chaque fois que vous lancez KLog Check non-valid calls &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Cocher pour le système Imperial (Miles au lieu de Kilomètres) Select to use real time. Sélectionner pour utiliser l'heure en temps réel. Select to use UTC time. Sélectionnez pour utiliser l'heure UTC Select if you want to save to ADIF on exit. Sélectionnez si vous souhaitez enregistrer vers ADIF en quittant Select to use the following name for the logfile without being asked for it again. Sélectionnez pour utiliser le nom indiqué pour le fichier de log sans que cela soit à nouveau demandé Complete the current QSO with previous QSO data. Complète le QSO en cours avec les données du QSO précédent Select if you want to manage DX-Marathon. Sélectionner pour gérer le DX-Marathon This is the default file where ADIF data will be saved. Fichier par défaut où les données ADIF seront sauvegardées This is the directory where the database (logbook.dat) will be saved. Répertoire où la base de données (logbook.dat) sera sauvegardée Click to change the default ADIF file. Cliquez pour changer le fichier ADIF par défaut. Click to change the path of the database. Cliquez pour modifier le chemin de la base de données. Click to move the DB to the new directory. Cliquez pour déplacer la BD vers le nouveau répertoire. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activer le journal de débogage de l'application. Cela peut être utile si quelque chose ne fonctionne pas correctement. Un fichier de débogage sera créé dans le répertoire de KLog. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Ouvrir un Fichier Select Directory Sélectionnez un répertoire This is the directory where DB (logbook.dat) will be saved. C'est le répertoire où la BD (logbook.dat) sera sauvegardée. Please specify an existing directory where the database (logbook.dat) will be saved. Veuillez spécifier un répertoire existant où la base de données (logbook.dat)sera sauvegardée. KLog - Move DB File moved Fichier déplacé File copied Fichié copié File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Fichier NON copié The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Le répertoire cible n'existe pas. Veuillez sélectionner un répertoire existant. SetupPageSats &New &Nouveau &Edit &Editer &Remove &Retirer &Import &Importer E&xport E&xporter Add a new satellite. Ajouter un nouveau satellite Edit the selected satellite. Editer le satelite sélectionné Remove the selected satellite. Retirer le satellite sélectionné Export your current satellites to a file. Exporte la liste des satellites actuels vers un fichier Select the sat you want to open. Sélectionner le satellite à éditer KLog KLog Do you really want to remove this satellite? Souhaitez-vous vraiment retirer ce satellite ? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Le satellite n'a pas été retiré. (#3) Sat has not been removed. (#2) Le satellite n'a pas été retiré. (#2) Sat has not been removed. (#1) Le satellite n'a pas été retiré. (#1) ID ID Short Court Name Nom Uplink Uplink Downlink Downlink Modes Modes An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Ouvrir le fichier des satellites KLog warning Avertissement KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Une erreur innatendue s'est produite pendant l'importation des données des satellites. Cela peut provenir du fait que le fichier que vous essayer d'importer n'a pas le format requis. Please check the format or contact the developer for analysis with the error code: Veuillez vérifier le format ou contacter le développeur pour analyse avec le code d'erreur : Save Satellites File Enregistrer le fichier des satellites SetupPageSatsNew Short name Nom court Sat name Nom du satellite UpLink UpLink DownLink DownLink Modes Modes &Ok &Ok &Cancel &Annuler Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Saisir le nom court. Essayez d'utiliser le nom court LoTW ce qui vous permettra ensuite d'envoyer votre QSO à LoTW. Enter the name of the satellite. Saisir le nom du satellite Enter the uplink frequencies in this format: 144.300 Saisir les fréquences d'uplink dans ce format : 144.300 Enter the downlink frequencies in this format: 144.300 Saisir les fréquences de downlink dans ce format : 144.300 Enter the modes in this format: USB Saisir les modes dans ce format : USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Date &Station Callsign Indicatif de la &Station &Operators &Opérateurs Comm&ent Comm&entaire &Ok &Ok &Cancel &Annuler Callsign used for this log. Indicatif utilisé pour ce log Comma separated list of operators: callsign1, callsign2. Liste d'opérateurs séparés par une virgule : indicatif1, indicatif2... Start date of this log. Date de démarrage du log Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Le log n'a pas été retiré. (#3) Log has not been removed. (#2) Le log n'a pas été retiré. (#2) Log has not been removed. (#1) Le log n'a pas été retiré. (#1) ID ID Name Nom Short Name CQ Zone Zone CQ ITU Zone Zone ITU Deleted Supprimé Start Date End Date DXCC DXCC An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Démarrer le serveur UDP Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Numéro du port UDP où le serveur UDP doit être à l'écoute des paquets réseaux Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Le serveur UDP recevra les QSOs envoyés par d'autres programmes tels que WSJT-Xvous permettant ainsi de les logger automatiquement dans KLog UDP Port Port UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data Données &Personnelles Station &data &Données de la Station Enter your name. Saisir vore nom Enter your address - 1st line. Saisir votre adresse - 1ère ligne Enter your address - 2nd line. Saisir votre adresse - 2ème ligne Enter your address - 3rd line. Saisir votre adresse - 3ème ligne Enter your address - 4th line. Saisir votre adresse - 4ème ligne Enter your city. Saisir votre ville Enter your zip code. Saisir votre code postal Enter your province or state. Saisir votre province ou état Enter your country. Saisir votre pays &Name &Nom &Address &Adresse Cit&y Ville &Zip Code Code Postal Pro&v/State Pro&vince/Etat Countr&y Pa&ys Enter your information for rig Entrez vos informations de rig Enter your information for antenna Entrez les informations de votre antenne Enter your power information. Saisir votre puissance Enter the station callsign that will be used for logging. Saisir l'indicatif de la station qui sera utilisé pour le log &Rig 1 Ri&g 1 R&ig 2 Ri&g 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer Puissance Enter the operators (comma separated if more than one). Entrez les opérateurs (séparés par une virgule si plusieurs) Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Entrez le locator de votre station. Alternativement, KLog peut utiliser un locator approximatif basé sur votre indicatif. &Callsign &Operators &Opérateurs &CQ Zone Zone &CQ &ITU Zone Zone &ITU &Locator &Locator &Locator (not valid) &Locator (invalide) SetupPageWorldEditor Add Ajouter Delete Supprimer Edit Éditer Export World Exporter Import World Importer Still not implemented. Pas encore implémenté. Import a new cty.csv file Importer un nouveau fichier cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un fichier d'information sur les entités (cty.csv) a été détecté dans votre répertoire KLog et sera chargé. No entities information file (cty.csv) has been detected in your KLog folder. Aucun fichier d'information sur les entités (cty.csv) n'a été détecté dans votre répertoire KLog. KLog will not be able to show entities information. KLog ne sera pas en mesure d'afficher des informations d'entité. Prefix Préfixe Entity Entité ARRL ID ID ARRL Continent Continent CQ Zone Zone CQ ITU Zone Zone ITU UTC UTC Latitude Latitude Longitude Longitude Deleted Supprimé Since Date Depuis la Date To Date Jusqu'à la Date Open File Ouvrir un fichier BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Les informations d'entité ont été mises à jour. Entities information has not been updated. Les informations d'entitées n'ont pas été mises à jour. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok Ok DX Date/Time Date/Heure Band Bande Mode Mode ShowErrorDialog KLog Message Message KLog SoftwareUpdateDialog Ok Ok KLog update Mise à jour KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Félicitations ! Your KLog has been updated. Votre KLog a été mis à jour. You already have the latest version. Vous avez déjà la dernière version. StartWizard KLog - The free hamradio logging program KLog - Le logiciel libre de journalisation des contacts radioamateurs Quit Setup Quitter l'Installation Setup is not complete yet. Are you sure you want to quit setup? L'installation n'est pas encore terminée. Êtes-vous sûr de quitter l'installation ? StatisticsWidget QSO per year QSO par an DXCC per year DXCC par an CQ zones per year Zones CQ par an QSO per band QSO par bande QSO per mode QSO par mode QSO per DXCC QSO par DXCC QSO per Continent QSO par continent QSO per hour QSO par heure QSO per month QSO par mois Worked / Confirmed status Réalisé / Statut confirmé Worked / Sent status Réaisé / Statut d'envoi Sent / Confirmed status Envoyé / Statut confirmé Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ par an Reading data ... Lecture des données... Abort reading Interrompre la lecture CQ zones Zones CQ CQ zones per year Zones CQ par an Reading data ... Lecture des données en cours... Years: %1/%2 Années : %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numéro Callsign Indicatif Date Date Band Bande Mode Mode DXCC DXCC Satellite Satellite Confirmed Confirmé No Non StatsEntitiesPerYearBarChartWidget Chart title Titre du graphique Reading data ... Lecture des données... Abort reading Interrompre la lecture DXCC Entities Contrées DXCC DXCC Entities per year Contrées DXCC par an Reading data ... Lecture des données en cours... Entities: Contrées DXCC : StatsFieldPerBandWidget All Tout Mode: Band Bande Worked Réalisé Confirmed Confirmé StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numéro Callsign Indicatif Date Date Band Bande Mode Mode Grid Satellite Satellite Confirmed Confirmé No Non StatsQSOsPerBandBarChartWidget QSOs per band QSOs par bande Reading data ... Lecture des données... Abort reading Lecture interrompue Bands Bandes QSOs per band distribution Reading data ... Lecture des données en cours... Bands: Bandes : StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs par continent Reading data ... Lecture des données... Abort reading Lecture interrompue Continents Continents Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs par DXCC Reading data ... Lecture des données... Abort reading Lecture interrompue Reading data... Lecture des données en cours... DXCC DXCC Top ten DXCC per QSO Top 10 DXCC par QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs par heure Reading data ... Lecture des données... Abort reading Lecture interrompue Hours Heures QSOs at hour QSOs à l'heure Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerModeBarChartWidget QSOs per mode QSOs par mode Reading data ... Lecture des données... Abort reading Lecture interrompue Modes Modes QSOs per mode distribution Reading data ... Lecture des données en cours... Modes: Modes : StatsQSOsPerMonthBarChartWidget QSOs per month QSOs par mois Reading data ... Lecture des données... Abort reading Lecture interrompue Jan Jan Feb Fév Mar Mar Apr Avr May Mai Jun Juin Jul Juil Sep Sep Oct Oct Nov Nov Dec Déc Aug Août Months Mois QSOs at Month QSOs du mois Reading data ... Lecture des données en cours... Months: Mois : StatsQSOsPerYearBarChartWidget Reading data ... Lecture des données... Abort reading Lecture interrompue QSOs QSOs QSOs per year QSOs par an Reading data ... Lecture des données en cours... QSO: %1/%2 QSO : %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Envoyé - %1 Confirmed - %2 Confirmé - %2 Sent / Confirmed status Envoyé / Statut confirmé StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Réalisé, non confirmé - %1 Confirmed - %2 Confirmé - %2 Worked / Confirmed status Réalisé / Statut confirmé StatsWorkedSentPieChartWidget Worked - %1 Réalisé - %1 Sent - %2 Envoyé - %2 Worked / Sent status Réaisé / Statut d'envoi TipsDialog KLog tips Astuces KLog Next Suivant Previous Précédent <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Astuce #1:</b><br>Le saviez-vous...<br>Vous pouvez utiliser <a href="#ToolsFillInQSO">Outils->Saisir les données de QSO</a> pour lire automatiquement le log complet pour compléter DXCC, CQ et les zones et continents ITU ? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Astuce #3:</b><br>Le saviez-vous...<br>Vous pouvez utiliser <a href="#ToolsFindQSO2QSL">Outils->Outils QSL...->Rechercher les QSO pour QSL</a> pour rechercher tous les QSO dont vous devriez envoyer votre QSL parce que vous devez encore confirmer ce DXCC et que vous n'avez pas encore envoyé votre carte QSL ? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Astuce #8:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous êtes toujours en attente avec <a href="#ToolsReceivePendingQSL">Outils->Outils QSL...->Rechercher des QSLs-DX en attente de réception</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Envoyé" est <i>Envoyé</i> mais dont vous n'avez pas encore reçu la carte QSL. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Astuce #9:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous êtes en attente avec <a href="#ToolsReceiveRecPendingQSL">Outils->Outils QSL...->Rechercher les demandes en attente de réception</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Reçu" est <i>Demandé</i> mais dont vous n'avez pas encore reçu la carte QSL. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Astuce #10:</b><br>Le saviez-vous...<br>Vous pouvez vous abonner au <a href=https://t.me/klogchat>Groupe Telegram pour KLog Telegram</a> pour échanger autour de KLog en anglais ? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Astuce #7:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous devez encore envoyer avec <a href="#ToolsSendPendingQSL">Outils->Outils QSL...->Rechercher Mes-QSLs en attente d'envoi</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Envoyé" est <i>Demandé</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Astuce #14:</b><br>Le saviez-vous...<br>Vous pouvez écrire votre propre <a href=https://www.eham.net/reviews/detail/3118>commentaire concernant KLog sur eHam.net</a> pour inciter les autres utilisateurs à utiliser KLog ? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Astuce #15:</b><br>Le saviez-vous...<br>Vous pouvez joindre l'équipe de développement simplement <a href=https://www.klog.xyz/contact>en nouc contactant</a> ? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Astuce #16:</b><br>Le saviez-vous...<br>Il y a beaucoup de façons pour contribuer à Klog et certains d'entre eux sont listés dans la page de <a href=https://www.klog.xyz/contrib>Contribuer à KLog</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Astuce #17:</b><br>Le saviez-vous...<br>Vous pouvez aider à traduire KLog dans votre langue. Veuillez consulter la page des <a href=https://www.klog.xyz/contrib/translations>Traductions KLog</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Lecture du fichier de données Satellites en cours... Abort reading Lecture annulée The Satellites information has been updated. Les informations sur les Satellites ont été mises à jour. Open File Ouvrir un Fichier Sat Data Données Sat. World Entity Entité Continent Continent Reading cty.csv... En cours de lecture de cty.csv... Abort reading Lecture annulée WorldMapWidget World map Carte mondiale View Vue Zoom In(25%) Zommer(25%) Zoom Out(25%) Dé-zoomer(25%) Normal Size Taille standard Fit to window Adapter à la fenêtre eLogClubLog Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! KLog - ClubLog KLog - ClubLog Undefined error... Erreur indéfinie... Undefined error number (#%1)... QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Indicatif manquant Invalid callsign Indicatif invalide Skipping SWL callsign Sauter l'indicatif SWL Callsign is your own call L'indicatif est le vôtre Invalid callsign with no DXCC mapping Indicatif invalide sans correspondance DXCC Updated QSO QSO mis à jour Invalid ADIF record Entrée ADIF incorrecte Missing ADIF record Entrée ADIF manquante Test mode - parameters ok, no action taken Mode test - paramètres ok, pas d'action réalisée Excessive API Usage Utilisation excessive de l'API Internal Error Erreur interne Rejected Rejeté QSO Duplicate QSO en Doublon QSO Modified QSO Modifié Missing Login Identifiant non saisi QSO OK QSO OK Upload denied Déversement interdit No callsign selected Pas d'indicatif sélectionné No match found Pas de correspondance trouvée Dropped QSO QSO rejeté OK OK Login rejected Identifiant rejeté Rejected: Callsign is your own call Rejeté : L'indicatif est le vôtre eLogQrzLog Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Indicatif manquant eQSLUtilities Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/translations/klog_pl.ts0000644000175000017500000133461614166020421016174 0ustar develdevel AboutDialog About KLog O progrmie By Przez KLog is a free logbook for hamradio operators. KLog jest darmowym programem logującym dla krótkofalowców. Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Proszę o napisanie opini na tema KLog na stronie eHam: Find more information and the latest release at Aby dowiedzieć się więcej oraz najnowsze wydania na You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Możesz również pomóc przesyłając błędy programu oraz swoje pomysły lub cokolwiek co pomogło by w poprawie KLog. At present, the data that is provided is the following: W tym momęcie, dane dostarczone zawierają: Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Author Autor today dzisiaj Main developer Główny twórca KLog is developed by a very small team and you are invited to join! KLOG Jest tworzony przez bardzo małe grono entuzjastów. Dołącz do nas! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Authors Autorzy Translators bring KLog into your language. They are really an important part of the KLog development team. Tłumacze przełożli KLOG na Twój język. Tłumacze są naprawdę ważną częścią grupy rozwojowej KLOG. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Tłumacze Privacy advisory Postanowienia prawne KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Callsign Znak wywoławczy KLog version Wersja KLog Operating system System operacyjny Be aware that you can enable/disable this feature from the Misc tab in the Setup page. KLog Klog Privacy Prywatność AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok OK Cancel Anuluj DX Date/Time Data/Czas Band Pasmo Mode Emisja Not defined All Wszystko QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Click to recalculate the award status. Select the year you want to check. QSOs QSOs DXCC DXCC CQ CQ Award Confirmed Potwierdzone Worked WAZ Score Annual Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon CTYPage Country data download Lista krajów została pobran KLog needs country data... Klog wymga danych państwa... &Download &Pobieranie &Ignore &Ignorownie Country data needed Wymagana lista krajów KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Proszę nacisnąć Pobierz aby zacząć pobieranie. KLog Klog I can't find the host. Please check your network and try again Do you want to try again? Nie mogę odnaleźć host. Proszę sprawdzić swoje połączenie sieciowe oraz spróbować ponownie Czy chciałbyś spróbować ponownie? DXCCStatusWidget Update Aktualizacja It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Jednostka Prefix Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server Naciśnij Połącz aby połączyć z DX-Cluterem Connect Połącz Clear Wyczyść Click on connect to connect to the DX-Cluster Naciśnij na Połącz aby połączyć z DX-Cluster Trying to connect to the server Próba nawiązania połączenia z serwerem KLog DXCluster Klog DX Cluster The host was not found. Please check: Host nie został odnaleziony. Proszę sprawdzić: - your network connection; - the host name and port settings. - połączenie sieciowe; - nazwa hosta oraz ustawienia portów. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Połączenie zostało odrzucone przez peer Upewnij się że DX Cluster jest włączony oraz sprawdź czy ustawienia są prawidłowe. The following error occurred: %1. Pojawił się pewien błąd:%1. Connected to server Połączono z serwerem KLog message Wiadomość KLog Enter your callsign to connect to the cluster: Wprowadź swój znak aby połączyć się z clusterem: Enter your password to connect to the cluster: (Just hit enter for no password) Wprowadź swoje hasło aby połączyć się z Clusterem: ( Naciśnij Enter aby połączyć bez hasła ) Disconnect Rozłącz Not logged on, you may need to enter your callsign again. Nie zalogowano, być może konieczne będzie wpisać Twój znak ponownie. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Połączenie zamknięte przez serwer Click on Connect to connect to the DX-Cluster server. Send Wyślij It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Wersja oprogramowania w DB jest zero Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Satelita Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct Direct Electronic KLog DXCC KLog DXCC KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Pobieranie pliku CTY.CSV zakończone z błędem o kodzie: Download of cty.csv done. Pobieranie pliku CTY.CSV ukończone. There is already a cty.csv file in the folder but it will be replaced with the new one. Plik CTY.CSV już znajduje się w folderze ale zostnie on zastąpiony nowym. Could not open %1 for writing FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Zapisywanie pliku ADIF... Abort writing Przerwij zapisywanie Writing ADIF file... QSO: Zapisywanie pliku ADIF... QSO: It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Wygląda na to że w pliku ADIF który właśnie importujesz znajduje się kilka zduplikowanych QSO. Czy nadal chcesz kontynuować? ( Zduplikowane QSO nie będą zaimportowane ) You have canceled the file export. The file will be removed and no data will be exported. Eksport pliku zosał anulowany. Plik zostanie usunięty oraz żadne dane wyeksportowane. Do you still want to cancel? Czy nadal chcesz anulować? There is more than one log in this logfile. W tym pliku logu znajduje się więcej niż jeden log. All logs will be imported into the current log. Wszystkie logi zostaną zaimportowane do bierzącego logu. Do you want to continue? Czy nadal chcesz kontynuować? Importing ADIF file... Importowanie pliku ADIF... QSO: QSO: This QSO had: To QSO miało: Do you want to continue with the current file? Czy nadal chcesz kontynuować z obecnym plikiem? Reading LoTW file... Wczytywanie pliku LOTW... Reading ADIF file... Wczytywanie pliku ADIF... KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled The selected callsign (%1) is not valid, please check it again to export the log. KLog - Log selection KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: Please edit the ADIF file and make sure that it include at least: Proszę o sprawdzenie pliku ADIF oraz upewnienie się że zawiera przynajmniej: and oraz Abort reading Przerwij wczytywanie KLog - Duplicated QSOs You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Importing LoTW ADIF file... This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - Brakuje pasma w wybranym QSO: - The mode missing and the following call: - Brakuje emisji dla wybranego znaku: - The date missing and the following call: - Brakuje daty dla wybranego znaku: - The time missing and the following call: - Brakuje czasu dla wybranego znaku: KLog: Not all required data found! KLog: Nie wszystkie wymagane dane zostały znalezione! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? KLog: No RST TX found! Klog: Nie znaleziono RST-TX! KLog: No RST RX found! Klog: Nie znaleziono odebranych raportów RST-RX! KLog - No Station callsign entered. KLog - QSO without Station Callsign HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Select the serial port speed. Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. Default Domyślny 1 bit 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontynent Prefix Prefiks CQ CQ ITU ITU Short Path Krótka droga Long Path Długa droga Deg Miles Mile Km Km IntroPage Welcome to KLog! Witamy w KLog! Welcome to KLog! - brought to you under the terms of the GPL! Witamy w KLog! - Napisanym pod licęcją GPL! Welcome to KLog Witaj w KLog This looks like it's the first time you've run KLog on this computer. Wygląda na to że to pierwszy raz kiedy korzystasz z KLog na tym komputerze. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Posiada możlowość zarządzania kartami QSL, import oraz eksport z oraz do ADIF and Cabrillo file formats and many other features... oraz format Cabrill and wiele innych funkcji... Before you can start using KLog, you will be asked to: Zanim zaczniesz korzystać z KLog, będziesz poproszony o: Acknowledge to the terms of the license. Informacje dotyczące warunków licencji. Download the DX entities information. Pobierz Informacje o jednostakach DX. Enter your callsign, CQ zone, etc. and main configuration. Podaj swój znak wywoławczy, Strefę CQ, oraz inne przy konfiguracji główniej. Enjoy KLog and contact the development team if you have any suggestions! Korzystaj z KLog oraz z twóracmi programu jeśli masz jakieś sugestje! LicPage KLog License information KLog informacje na temat licęcji Welcome to KLog!- brought to you under the terms of the GPL! Witaj w KLog! -Napisany pod licencją GPL! Acknowledge Acknowledge Be aware that KLog is free software. Pamiętaj o tym że KLog jest oprogramowaniem darmowym. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL wysłane QSL Rcvd QSL Otrzymane &Delete &Delete Delete a QSO Usuń QSO &Edit QSO &Edit QSO Edit this QSO Edytuj QSO Via &bureau Via &bureau Send this QSL via bureau Wyśłij QSL przez biuro D&irect D&irect Send this QSL via direct Wyślij QSL direktem Via bureau Przez biuro QSL &received via bureau QSL &received via bureau Direct Direct QSL received via direc&t QSL odebrane przez direct&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Clear &Clear Callsign of the QSO. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clears the QSO entry. KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Znak wywoławczy &Modify DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Starting KLog DX Entity &Log Window KLog Klog It seems that you have never done a backup or exported your log to ADIF. It was not possible to open the debug file for writing. No debug log will be saved! Status bar ... KLog - CTY.dat update It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. KLog - Backup KLog - New version detected! Ready An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. No DXCC None Click on the prefix of the right entity or Cancel to correct. KLog - ClubLog error KLog - eQSL error KLog - %1 Settings ... Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to LoTW. There was an error while updating to Yes the LoTW QSL sent information. KLog - Select the Station Callsign. The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? KLog - File not open KLog - Unexpected error KLog - Select correct entity KLog - Exit &File Import an ADIF file into the current log. Export the current log to an ADIF logfile. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSOs as sent to LoTW. Sends the log to LoTW calling TQSL. For updated DX-Entity data, update cty.csv. Stats Show the statistics of your radio activity. &Help Upload the queued QSOs to LoTW KLog needs to update the Entities database. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. Queue all the QSOs to be uploaded Queue all the QSO to be uploaded KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Log który właśnie został zaznaczony zawiera więcej niż jeden znak stacji. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Znak Stacji: Define Station Callsign Zdefinuj Znak Stacji Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Wprowadż znak stacji aby używać go z tym Logiem, lub pozostaw puste miejsce dlaQSO bez znaku: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Congratulations! Gratulacje! You already have the latest version. Już posiadasz najnowszą wersję. You can find the KLog data folder here: start stop If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog KLog - QRZ.COM QRZ.COM KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: It seems that you are running this version of KLog for the first time. The setup will be open to allow you to do any new setup you may need. You have requested to delete the QSO with: %1 Are you sure? Czy jesteś pewien? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv Do you want to do it now? The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog Klog -ClubLog KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. You need to activate the %1 service in the eLog preferences. The logfile has been modified. Do you want to save your changes? KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... All pending QSOs of this log has been marked as queued for LoTW! Now you can upload them to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog - Update checking result UDP Server error The UDP server failed to %1. start or stop It seems that there are no QSOs in the database. This function is disabled. Go to the Setup->LoTW tab to enable it. Status of the DX entity. Name of the DX entity. QSO QSL eQSL Comment Komentarz Others My Data Moje dane Satellite Satelita You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Data/Czas Callsign Znak wywoławczy Printing the log ... Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. DXCC DXCC Info Awards Search Log DX-Cluster DX-Klaster Save ADIF File The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW Open File Otwórz plik - Needed for DXMarathon Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Band Pasmo Mode Emisja Print Log Abort printing Printing the log... QSO: The following QSO data has been received from WSJT-X to be logged: Freq Time On Time Off RST TX RST RX DX-Grid Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error text Failed query KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment Komentarz Add a comment for this QSO. Keep this data Zachowaj te dane Data entered in this tab will be copied into the next QSO. MainWindowInputEQSL Date of the ClubLog upload. Data aktualizacji ClubLog. Date of the QRZ.com upload. Date of the eQSL sending. Data wysłania eQSL. Date of the eQSL reception. Data otrzymania eQSL. Date of the LoTW sending. Date of the LoTW reception. Status on QRZ.com. Status of the LoTW sending. Status of the LoTW reception. QRZ.com LoTW Sent LoTW Rec Status on ClubLog. Status ClubLog. Status of the eQSL sending. Status wysłania eQSL. Status of the eQSL reception. Status otrzymywanych eQSL. ClubLog ClubLog eQSL Sent eQSL Wysłane eQSL Rec eQSL Otrzymane MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Jednostka Propagation mode Typ propagacji Others Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Not - Not Identified SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL wysłane QSL Rec QSL Otrzymane QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Stan wysłanych kart QSL. Status of the QSL reception. Stan kart QSL otrzymanych. QSL sending information. Informacje dotyczące wysyłania QSL. QSL reception information. Informacje dostyczące odebranej karty QSL. Date of the QSL sending. Data wysłania karty QSL. Date of the QSL reception. Data otrzymania karty QSL. Message of the QSL. Informacje o QSL. QSL via information. Info o sposobie wysłania QSL. MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name QTH DX Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Keep this data Zachowaj te dane My QTH locator. Mój QTH Lokator. Power Moc Operator callsign Station Callsign Znak stacji My Locator Mój lokator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Zachowaj te dane Other - Sat not in the list Inne - Satelita nie jest na liście Data entered in this tab will be copied into the next QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink UpLink DownLink DownLink Satellite Satelita Mode Emisja DX Locator Other Inne MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO QSO nie przez SAT KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog wykrył nazwę satelity która nie została rozpoznana. Jeśli chcesz użyć jednej ze znanych zamiast tej, proszę wybrać ją z listy. Ewentualnie, proszę o kontak z twórcami programu aby satelita mógł zostać do listy w kolejnych wydaniach. The satellite you have in your QSO is: Satelita w Twoim QSO to: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frequency in MHz. OnlineMessageWidget The server returned the following error: %1 Not identified Nie zidetyfikowany QObject New One, work it! New One, work it! Needed, work it! Potrzebny, zrób QSO! Worked but not confirmed Zrobione, ale nie potwierdzone Confirmed Potwierdzone Not identified Nie zidetyfikowany Database Error Błąd bazy dancyh KLog DB needs to be upgraded. Baza danych KLog musi zostać zaktualizowana. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog wykrył poprzedni LOG w bazie dancy. Wszystkie dane zostaną dla Ciebie zaimportowane do nowo utworzonego Logu. KLog: Enter Station callsign KLog: Wprowadź znak stacji Enter the station callsign used in this log Wprowadź znak używany w KLog Station Callsign Znak Stacji QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Przerwanie tej aktualizjacji może grozić utratą danych, Czy napewno chcesz przerwać? Progress: Postęp: Updating mode information... Updating mode information... Do you want to upgrade it now? Czy chcesz aktualizować teraz? If DB is not upgraded KLog may not work properly. Jeśli DB nie zostanie zauktualizowana KLog może nie działać poprawnie. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Abort updating Przerwij aktualizowanie Updating bands information... Aktualizowanie informacjo o pasmach... Updating bands information in %1 status... Updating bands information in %1 status... Updating mode information in %1 status... Updating mode information in %1 status... Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Proces aktualizacji został przerwany przed zakończeniem... Do you want to remove the KLog dir from your disk? Czy chcesz usunąć katalog KLoog ze sswojego dysku? Your KLog dir has been removed Katalog KLog został usunięty I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Usunięcie katalogu KLog było nie możliwe. Powinieneś zrobić to manualnie jeśli aby katalog KLog został całkowicie usunięty. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Katalog KLog nie został usunięty. Aby usunąć ten katalog z dysku powinieneś usunąć go ręcznie. Remember that your KLog dir is on your system... Pamiętaj że katalog Klo jest w zainstalowany na Twoim systemie... Thank you for running KLog! Dziękujemy za korzystanie z KLog! Updating information... Updating DXCC and Continent information... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Data Call RSTtx RSTtx RSTrx RSTrx Band Pasmo Comment Komentarz Mode Emisja CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontynent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL Wysłane Force Init Freq Freq RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Otrzymane QSL Sent QSL wysłane QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH Region Rig RX Pwr Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear &Clear &Select All &Select All &Search &Search &Export Highlighted &Export Highlighted All logs Clear the searches. Wyczyść wyszukiwanie. Export the search result to an ADIF file. Wyeksportuj wyniki wyszukiwania do pliku ADIF. Select/Unselect all the QSOs shown. Zaznacz/Odznacz wszystkie wyświetlone QSO. Search in the log. Przeszukaj log. Search in all logs. Przeszukaj we wszystkich logach. You have requested to delete the QSO with: %1 Select the Station Callsign used to do this QSO. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! All in log Not defined &Clear selection &Clear selection Save File Zapisz plik Are you sure? Czy jesteś pewien? SearchWindow Date/Time Data/Czas Band Pasmo Mode Emisja QSL Sent QSL wysłane QSL Rcvd QSL Otrzymane Station Callsign ID ID Call Date/time Station callsign QSL Send QSL wysłane &Delete &Delete Delete a QSO Usuń QSO &Edit QSO &Edit QSO Edit this QSO Edytuj QSO Via &bureau Via &bureau Send this QSL via bureau Wyśłij QSL przez biuro D&irect D&irect Send this QSL via direct Wyślij QSL direktem Via bureau Przez biuro QSL &received via bureau QSL &received via bureau Direct Direct QSL received via direc&t QSL odebrane przez direct&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL &Request my QSL Mark my QSL as requested Zaznacz moje QSL jako oczekiwane Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL &Request the QSL Mark the QSL as requested Zaznacz to QSL jako oczekiwane Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSO wymagne aby wysłać QSL My QSL requested to be sent Moje QSL jako oczekiwane DX QSL pending to be received DX QSL jako oczekjące SetupDialog Bands/Modes Pasma/Emisje DX-Cluster DX-Klaster Colors Kolory Log widget Misc Inne World Editor Edycja Znaków Logs Logi Satellites HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) DB has not been moved to new path. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Cancel Anuluj OK OK User data Dane użytkownika D&X-Cluster D&X-Cluster You will be redirected to the Log tab. Please add and select the kind of log you want to use. Zstaniesz przekierowany do zakłdki Log. Proszę wybrać z którego logu chcesz obecnie korzystać. World Świat eLog WSJT-X Settings You need to enter at least one log in the Logs tab. Wymagane jest abyś dodał przynajmniej jeden Log w zakładce Log. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. Nie zanaczono żadnego logu. SetupEntityDialog Entity Jednostka CQ CQ ITU ITU Latitude Szerokość Longitude Szerokość UTC UTC Main prefix Główny Prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixy oddzielpone przecinkiem Np EA1, EA2, ... Prefixes Prefiksy Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted Usunięty Cancel Anuluj Ok OK Entity Dialog Opis Jednostki SetupPageBandMode Bands Pasma Modes Emisje SetupPageColors New One Nowy kraj Needed in this band Potrzebny na tym paśmie Worked in this band Zrobiony na tym paśmie Confirmed in this band Potwierdzony na tym paśmie Default Domyślny WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Wybierz kolor SetupPageDxCluster Add Dodaj Delete Usuń Show &HF spots Pokaż &HF spots Show V/&UHF spots Pokaż V/&UHF spots Show W&ARC spots Pokaż W&ARC spots Show &worked spots Pkaż &worked spots Show &confirmed spots Pokaż &confirmed spots Show ANN/&FULL messages Pokaż ANN/&FULL messages Show WW&V messages Pokaż WW&V messages Show WC&Y messages Pokaż WC&Y messages Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots DX spot Others Messages Wiadomość KLog: Add a DXCluster server KLog: Dodaj server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Proszę podać adres razem z numerem :portu Na przykład: dxfun.com:8000 Jeśli numer portu nie zostanie podany, port 41112 zostanie użyty jako domyślny: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Wprowadź e-mail którego użyłeś podczas rejestracji w ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &New &Edit &Edit &Remove &Remove KLog Klog All the QSOs from this log will also be deleted... Log has not been removed. (#3) Log nie został usunięty. (#3) Do you really want to remove this log? Czy na pewno chcesz usunąć ten Log? Add a new log. Edit the selected log. Remove the selected log. Log has not been removed. (#2) Log nie został usunięty. (#2) Log has not been removed. (#1) Log nie został usunięty. (#1) ID ID Date Data Station Callsign Znak stacji Operators Comments Komentarz QSOs QSOs The new log could not be created. An error has occurred showing the following error code: Wystąpił błąd o wskazanym kodzie błędu: KLog - SetupPageLogs Klog -SetupPageLogs SetupPageLogsNew &Date &Date &Station Callsign &Satation Callsign &Operators &Operators Comm&ent Comm&ent &Ok &OK &Cancel &Cancel Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista operatorów oddzielona przecinkiem: Znak Sacji1, Znak Stacji2. {1,?} Start date of this log. SetupPageMisc &Imperial system &Imperial system &Log in real time &Log in real time &Time in UTC &Time in UTC &Save ADIF on exit &Save ADIF on exit Use this &default filename Use this &default filname Mark &QSO to send QSL when QSL is received Mark &QSO to send QSL when QSL is recived Complete QSO with previous data Uzupełnij QSO ze wcześniejszymi danymi Show the Station &Callsign used in the search box Show the Station &Callsign used in the search box Manage DX-Marathon Activate the application debug log &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO zostanie oznaczone jako oczekujące QSL jeśli otrzymasz kartę QSL a Twoja jeszcze nie została wysłana. Check it for Imperial system (Miles instead of Kilometers). Select to use the following name for the logfile without being asked for it again. Proszę zaznaczyć wybrnaną nazwę pliku aby nie być ponownie pytany o jego nazwę. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. To jest domyślna nazwa pliku w którym ADIF zostanie zapisany. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Delete Always the adif file created after uploading QSOs Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. Proszę wybrać istniejący katalog w którym baza danych programu ( logbook.dat) zostanie zapisana. &Check for new versions automatically &Check for new version automaticlly &Provide Info for statistics &Provide info for statistics Mark sent eQSL && LoTW in new QSO as queued Browse Przeglądaj Move DB Przenieś DB Check if there is a new release of KLog available every time you start KLog. Sprawdź czy są dostępne nowe wydania KLog każdorazowno kiedy KLog jest uruchamiany. Select to use real time. Zaznacz aby pracować w czasie rzeczywistym. Select to use UTC time. Zaznacz aby użyć czasu UTC. Select if you want to save to ADIF on exit. Zaznacz aby zapisać do ADIF przy wyjściu z programu. Complete the current QSO with previous QSO data. Uzupełnij obecne QSO danymi z poprzednich QSO. This is the directory where the database (logbook.dat) will be saved. To jest katalog w którym baza danych ( logbook.dat) zostanie zapisana. Click to change the path of the database. Kliknij aby zmienić miejsce w którym baza danych zostanie zapisana. This is the directory where DB (logbook.dat) will be saved. To jest katalog w którym DB ( logbook.dat ) zostanie zapisana. Click to change the default ADIF file. Kliknij aby zmienić domyślny plik ADIF. Check non-valid calls The search box will also show the callsign on the air to do the QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Click to move the DB to the new directory. Kliknij aby przenieść DB do nowego katalogu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Open File Otwórz plik Select Directory Zaznacz Katalog KLog - Move DB File moved Plik przeniesiony File copied Plik skopiowany File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Plik NIE skopiowany The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Katalog docelowy nie istnieje . Proszę wybrać istniejący katalog. SetupPageSats &New &New &Edit &Edit &Remove &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Export your current satellites to a file. Select the sat you want to open. KLog Klog Do you really want to remove this satellite? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID ID Short Name Uplink Downlink Modes Emisje An error has occurred showing the following error code: Wystąpił błąd o wskazanym kodzie błędu: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink UpLink DownLink DownLink Modes Emisje &Ok &OK &Cancel &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Date &Station Callsign &Satation Callsign &Operators &Operators Comm&ent Comm&ent &Ok &OK &Cancel &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista operatorów oddzielona przecinkiem: Znak Sacji1, Znak Stacji2. {1,?} Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Klog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log nie został usunięty. (#3) Log has not been removed. (#2) Log nie został usunięty. (#2) Log has not been removed. (#1) Log nie został usunięty. (#1) ID ID Name Short Name CQ Zone Strefa CQ ITU Zone Strefa ITU Deleted Usunięty Start Date End Date DXCC DXCC An error has occurred showing the following error code: Wystąpił błąd o wskazanym kodzie błędu: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Personal data Station &data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Name &Address &Address Cit&y Cit&y &Zip Code &Zip Code Pro&v/State Pro&v/State Countr&y Countr&y Enter your information for rig Wpisz informacje o swoim radiu Enter your information for antenna Wpisz informacje o swojej antenie Enter your power information. Enter the station callsign that will be used for logging. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Wpisz lokator swojej stacji. Alternatywnie KLog może skorzystać z przybliżonej lokalizacji bazując na Twoim znaku wywoławczym. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&wer Enter the operators (comma separated if more than one). Wpisz operatorów ( skorzystaj z przecinka jeśli więcej niż jeden ). &Callsign &Operators &Operators &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Locator &Locator (not valid) &Locator (not valid) SetupPageWorldEditor Add Dodaj Delete Usuń Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Plik z informacjami jednostek DXCC ( cty.csv ) został wykryty w katalogu KLog i zostanie on wczytany. No entities information file (cty.csv) has been detected in your KLog folder. Plik z jednostkami DXCC nie został wykryty ( cty.csv) w folderze KLog. KLog will not be able to show entities information. KLog nie będzie mógł pokazać informacji jednostek DXCC. Prefix Prefix Entity Jednostka ARRL ID ARRL ID Continent Kontynent CQ Zone Strefa CQ ITU Zone Strefa ITU UTC UTC Latitude Szerokość geograficzna Longitude Długość geograficzna Deleted Usunięty Since Date Od daty To Date Do daty Open File Otwórz plik BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informacje o jednostkach DXCC zostały zaktualizowane. Entities information has not been updated. Informacje o jednostkach DXCC nie zostały zaktualizowane. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok OK DX Date/Time Data/Czas Band Pasmo Mode Emisja ShowErrorDialog KLog Message SoftwareUpdateDialog Ok OK KLog update Aktualizacja KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Gratulacje! Your KLog has been updated. Twój KLog został zaktualizowany. You already have the latest version. Już posiadasz najnowszą wersję. StartWizard KLog - The free hamradio logging program KLog - Darmowy program logujący dla krótkofalowców Quit Setup Opuść Ustawienia Setup is not complete yet. Are you sure you want to quit setup? Ustawienia nie zostały jeszcze ukończone. Czy jesteś pewien że chcesz opuścić ustawienia? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading Przerwij wczytywanie CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Znak wywoławczy Date Data Band Pasmo Mode Emisja DXCC DXCC Satellite Satelita Confirmed Potwierdzone No StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading Przerwij wczytywanie DXCC Entities DXCC Entities per year Reading data ... Entities: StatsFieldPerBandWidget All Wszystko Mode: Band Pasmo Worked Confirmed Potwierdzone StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Znak wywoławczy Date Data Band Pasmo Mode Emisja Grid Satellite Satelita Confirmed Potwierdzone No StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Przerwij wczytywanie Bands Pasma QSOs per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Przerwij wczytywanie Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Przerwij wczytywanie Reading data... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Przerwij wczytywanie Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Przerwij wczytywanie Modes Emisje QSOs per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Przerwij wczytywanie Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget Reading data ... Abort reading Przerwij wczytywanie QSOs QSOs QSOs per year Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Abort reading Przerwij wczytywanie The Satellites information has been updated. Open File Otwórz plik Sat Data World Entity Jednostka Continent Kontynent Reading cty.csv... Wczytywanie cty.csv... Abort reading Przerwij wczytywanie WorldMapWidget World map View Zoom In(25%) Zoom Out(25%) Normal Size Fit to window eLogClubLog Host not found! Host nie został odnaleziony! Timeout error! Przekroczony został limit czasu! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... KLog - ClubLog Klog -ClubLog QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Undefined error... Niezidenfikowany błąd... Callsign missing Brak znaku wywoławczego Invalid callsign Niepoprawny znak wywoławczy Skipping SWL callsign Opuszczanie znaków wywołaczych stacji nasłuchowych SWL Callsign is your own call Znka wywoławczy jest Twoim własnym znakiem Invalid callsign with no DXCC mapping Niepoprawny znak wywoławczy brak w spisie DXCC Updated QSO QSO Zaktualizowane Invalid ADIF record Niepoprawny zapis ADIF Missing ADIF record Brakujący wpis ADIF Test mode - parameters ok, no action taken Tryb testujący -Parametry OK, brak akcji Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Excessive API Usage Znaczne użcie API Internal Error Błąd wewnętrzny Rejected Odrzucony QSO Duplicate QSO zduplikowane QSO Modified QSO Zmodyfikowane Missing Login Brakujący Login QSO OK QSO OK Upload denied Przesyłanie odrzucone No callsign selected Znak wywoławczy nie zaznaczony No match found Nie znaleziono poasujących elemętów Dropped QSO QSO Opuszczone OK OK Login rejected Logowanie odrzucone Rejected: Callsign is your own call Odrzucone: Znak wywoławczy jest Twoim własnym znakiem eLogQrzLog Host not found! Host nie został odnaleziony! Timeout error! Przekroczony został limit czasu! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Brak znaku wywoławczego eQSLUtilities Host not found! Host nie został odnaleziony! Timeout error! Przekroczony został limit czasu! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/translations/klog_it.ts0000644000175000017500000141767314166020421016202 0ustar develdevel AboutDialog About KLog About KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Puoi essere di aiuto inviando bug report, contribuendo alla programmazione del software, o con idee o suggerimenti, o ogni altra cosa pensi possa essere utile per migliorare KLog. Authors Autori By Grazie a Author Autore KLog is a free logbook for hamradio operators. KLog è un logbook libero per operatori radio. Please provide your review in KLog's eHam review page: Per favore inserisci il tuo commento di utlizzo sulla maschera KLog dedicata ai commenti: today oggi Main developer Sviluppatore Senior KLog is developed by a very small team and you are invited to join! Klog è sviluppato da un esiguo numero di programmatori e tu sei invitato a partecipare! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Gli sviluppatori KLog hanno incluso nel software uan funzionalità che invia alcuni dati utente ai server di KLog con l'unico scopo di contare il numero di installazioni, in modo da concentrare gli sforzi verso le effettive necessità degli utilizzatori. At present, the data that is provided is the following: Attualmente, i dati inviati sono esclusivamente i seguenti: Translators bring KLog into your language. They are really an important part of the KLog development team. I traduttori portano KLog nella tua lingua, pertanto sono parte integrante della squadra di sviluppo di KLog. Find more information and the latest release at Disponibili ulteriori informazioni sull'ultima versione presso Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Questa è una versione di sviluppo non definitiva e potrebbe contenere molti bug. <br>Fai backup frequenti durante l'uso di questo software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. A partire dalla versione 0.6.2, KLog è stato completamente riscritto per formire un'applicazione disponibile su tutti i magigori sistemi operativi (Gnu/Linux, macOS e Windows) e per inserire nuove funzionalità. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Se vuoi aiutare puoi iscriverti a <a href="https://groups.io/g/klog">mailing listi di KLog</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Se KLog non è disponibile nella tua lingua e vuoi essere di aiuto sarebbe il massimo tu ci scrivessi sulla <a href="https://groups.io/g/klog">mailing list di KLog</a>! Translators Traduttori Privacy advisory Nota sul trattamento dei dati personali Callsign Nominativo KLog version Versione KLog Operating system Sistema operativo Be aware that you can enable/disable this feature from the Misc tab in the Setup page. In ogni momento puoi sempre abilitare/disabilitare questa funzione nella linguetta Altro della maschera di configurazione. KLog KLog Privacy Privacy AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Scegli il nominativo di stazione da usare durante il trasferimento del log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Scegli la data di inizio dei QSO da esportare. Se non specificato diversamente userò semplicemente il primo QSO disponibile con il nominativo indicato. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Scegli la data di fine dei QSO da esportare. Se non specificato diversamente userò semplicemente l'ultimo QSO disponibile con il nominativo indicato. Station callsign Nominativo di stazione Start date Data di inizio End date Data di fine Ok Ok Cancel Annulla DX DX Date/Time Data/Ora Band Banda Mode Modo Not defined Non specificato All Tutti QSOs: Elenco QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO da trasferire su LoTW. This table shows the QSOs that will be sent to LoTW. Questo elenco contiene i QSO trasferiti a LOTW. KLog - QSOs to be uploaded to ClubLog. KLog. QSO da trasferire su ClubLog. This table shows the QSOs that will be sent to ClubLog. Questo elenco contiene i QSO che saranno trasferiti a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog. QSO da trasferire su eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Questo elenco contiene i QSO che saranno trasferiti su eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog. QSO da trasferire su QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Questo elenco contiene i QSO che saranno trasferiti a QRZ.com. This table shows the QSOs that will be exported to ADIF. Questo elenco contiene i QSO esportati verso ADIF. AwardsWidget Recalculate Ricalcolo Click to recalculate the award status. Click per ricalcolare stato riconoscimenti. Select the year you want to check. Scegli quale anno vuoi controllare. QSOs Lista QSO DXCC DXCC CQ CQ Award Riconoscimento Confirmed Confermato Worked Processato WAZ WAZ Score Punteggio Annual Annuale Number of confirmed DXCC entities. Numero di collegamenti DXCC confermati. Number of worked DXCC entities. Numero di collegamenti DXCC processati. Number of confirmed WAZ zones. Numero di zone WAZ confermate. Number of worked WAZ zones. Numero di zone WAZ processate. Number of confirmed QSOs. Numero di QSO confermati. Number of worked QSOs. Numero di QSO processati. Number of QSOs worked in the selected year. Numero QSO processati durante l'anno indicato. Number of DXCCs worked in the selected year. Numero di DXCC processati durante l'anno indicato. Number of CQ Zones worked in the selected year. Numero di zone CQ processate durante l'anno indicato. Score for the DXMarathon in the selected year. Punteggio numerico nella DX marathon durante l'anno indicato. DX-Marathon DX-Marathon CTYPage Country data download Scarico Country KLog needs country data... Dati Country richiesti da KLog... &Download &Scarica &Ignore &Ignora Country data needed Dati Country richiesti KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog utilizza il file cty.csv disponibile su https://www.country-files.com/ per ottenere informaizoni sui DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Se vuoi che KLog mostri countries, locator, ecc nell'elenco QSO è indispensabile scaricare il file cty.cvs. Click on Download to download now. Clicca su Scarica per avviare immediatamente il trasferimento. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Il server è irraggiungibile. Verifica la conenssione di rete e riprova Vuoi riprovare? DXCCStatusWidget Update Aggiornamento It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Elemento Prefix Prefisso Pref: Pref: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Collegamento non processato per questa banda. DXClusterWidget Click on Connect to connect to the DX-Cluster server Clicca su Connetti per collegarti immediatamente al server DX-Cluter Connect Connetti Clear Pulisci Click on connect to connect to the DX-Cluster Clicca su Connetti per collegarti immediatamente al DX-Cluster Trying to connect to the server Tentativo di connessione al server in corso KLog DXCluster KLog DXCluster The host was not found. Please check: Server irraggiungibile. Controlla: - your network connection; - the host name and port settings. - la tua configurazione di rete; -la configurazione del nome del server ed il numero di porta. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conenssione è stata rifiutata dall'altro lato. Verifica che il server DXCluster sia effettivamente in esecuzione, e controlla nome del server host e porta impostati. The following error occurred: %1. Appena verificato l'errore: %1. Connected to server Connesso al server KLog message Messaggio KLog Enter your callsign to connect to the cluster: Scegli il nominativo da usare per la connessione al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Inserisci la password di connessione al cluster: (dai direttamente Invio se non serve una password) Disconnect Scollega Not logged on, you may need to enter your callsign again. Non collegato, può essere necessario reinserire il nominativo. Enter here the commands to be sent to the DX-Cluster server. Inserisci i comandi da trasmettere al server DX-Clouster. Connection closed by the server Collegamento terminato dal server Click on Connect to connect to the DX-Cluster server. Clicca per avviare il collegamento al server DX-Cluster. Send Invia It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Impossibile aprire il file per annotare i collegamenti DX sul server DX-Cluster! DataProxy_SQLite Software version in DB is null Versione software nel DB non inserita Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terra-Luna-Terra Sporadic E E sporadico Internet-assisted Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satellite Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Tutti i QSO e dil Continente aggiornati con DXCC. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed Query non fallita F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes No No Requested Richiesto Ignore/Invalid Ignorare/Invalido Validated Validato Queued In coda Uploaded Trasferito Do not upload Non trasferito Modified Modificato Direct Diretto Electronic Electronic KLog DXCC KLog-DXCC KLog - Invalid call detected KLog - Chiamata non valida rilevata An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Nominativo bianco rilevato. Vuoi esportare comunque questo QSO (clicca su Sì) oppure vuoi cancellare l'elemento per non esportarlo su ADIF? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Un nominatico con formato non valido è stato rilevato %1, Vuoi esportare questo nominativo comunque (clocca su Sì) oppure vuoi evitare che sia esportato sul log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Esportare un nominativo sbagliato può causare concreti problemi nell'applicazione che importa questo log, sebbene sia sempre possibile che questo sia un nominativo valido erroneamente identificato da KLog. DownLoadCTY Download of cty.csv failed with the following error code: Scarico di cty.csv fallito con il codice di errore: Download of cty.csv done. Scarico di cty.cvs completato. There is already a cty.csv file in the folder but it will be replaced with the new one. E' già presente un file cty.cvs nella cartella ma sarà sovrascritto dal nuovo. Could not open %1 for writing Impossibile aprire %1 per scrittura FileAwardManager Open Award file Apre file Award Award files (*.awa) Files Award (*.awa) Award file not opened File Award non aperto KLog was not able to read the award file KLog non è riuscito a leggere il file award It was not possible to open the file %1 for reading. Non è stato possibile aprire il file %1 in lettura. AWA wrong format AWA formato sbagliato The AWA file does not have the right format Il file AWA non è composto nel corretto formato AWA file does not have an <EOH> field Il file AWA non ha un campo <EOH> KLog - %1 KLog - %1 FileManager Writing ADIF file... File ADIF in scrittura... Abort writing Scrittura annullata Writing ADIF file... QSO: File ADIF in scrittura... QSO: You have canceled the file export. The file will be removed and no data will be exported. Operazione di export annullata. File cancellato e niente export. KLog - Error KLog - Errore The selected log does not exist, please check it again. Non trovo il log scelto. Ricontrolla. The file %1 can't be opened. Impossibile aprire il file %1. Do you still want to cancel? Sei ancora convinto di annullare? QSO: QSO: KLog - User cancelled KLog - Annullato dall'utente Exporting ADIF file... QSO: %1 / %2 Export file ADIF... QSO: %1 / %2 Reading LoTW file... File LoTW in lettura... Reading ADIF file... File ADIF in lettura... KLog - Duplicated QSOs KLog - QSO duplicati Please edit the ADIF file and make sure that it include at least: Per favore correggi il file ADIF ed accertati che contenga almeno: and e This QSO had: Questo QSO aveva: KLog - No Station callsign entered. KLog - Nessun nominativo di stazione inserito. KLog - QSO without Station Callsign KLog - QSO senza nominativo di stazione definito Abort reading Annulla lettura There is more than one log in this logfile. Questo log file contiene più di 1 voce. All logs will be imported into the current log. Tutte le voci saranno importante nell'attuale log. Do you want to continue? Vuoi proseguire? Importing ADIF file... Import di file ADIF file in corso... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) QSO duplicati nel file ADIF che stai importando. Vuoi continuare comunque? (i QSO duplicati non saranno importati) KLog - Log selection KLog - Log scelta You have canceled the file import. The file will be removed and no data will be imported. Import annullato. File rcancellato e nessun dato importato. There are no QSOs pending to be exported with that station callsign. Non ci sono QSO in attesa di export con il nominativo indicato. Export Export Export progress Progresso export Processing LoTW ADIF file... Lavorazione file LoTW ADIF... Abort processing Interruzione lavorazione LoTW reading Lettura LoTW KLog - Add new QSOs? KLog - Aggiunge nuovi QSO? Do you want to add non existing QSOs to your local log? Vuoi aggiungere i QSO non ancora presenti nel tuo log locale? There are some QSOs in the LoTW log that are not in your local log. Esistono QSO nel log LoTW assenti dal tuo log locale. Processing LoTW ADIF file...... QSO: %1 / %2 Lavorazione LoTW ADIF file.... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Hai annullato l'operazione LoTW. L'operazione sarà arestata e il tuo log potrebbe non essere completamente aggiornato. Do you want to add dupe QSOs to your local log? Vuoi aggiungere QSO duplicati al tuo log locale? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Questo log file contiene QSO che possono essere duplicati in quanto con identico nominativbo, banda & modalità e una data molto ravvicinata. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Clicca su Sì per aggiungere una voce default %1 per il modo %2 a tutti i QSO con identico problema. KLog - Don't ask again KLog - Non chiedere ancora Do you want to reuse your answer? Vuoi riciclare la tua risposta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog utilizzerà automaticamente la tua precedente risposta per ogni altro riferimento simile, se trovato, senza richiedertelo. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Data/Ora:</i> %1</li><li>Nominativo: %2</li><li>Banda: %3</li><li>Modo: %4</li></ul> KLog - QSO not found KLog - QSO non trovato Do you want to add this QSO to the log?: Aggiungo questo QSO al log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Trovato un QSO proveniente da LoTW assente dal tuo log locale. Aggiungo questo QSO al log? KLog - Invalid call detected KLog - Chiamata invalida trovata An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Manca il nominativo. Esporto comunque il QSO (clicca su Sì) o rimuove il campo dal file log esportato? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Nominativo invalido trovato %1. Vuoi esportare questo nominativo comunque (scegli Sì) oppure vuoi rimuovere la voce dal file export? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Esportare chiamate invalide può provocare inconvenienti successivamente, quando poi il file sarà importato. Però un nominativo può essere corretto e Klog in errore. Pertanto è sempre possibile proseguire e correggere il nominativo successivamente, una volta completato l'export. The selected callsign (%1) is not valid, please check it again to export the log. Nominativo scelto invalido (%1), verificalo di nuovo prima di esportare il log. KLog - File not opened KLog - File non aperto It was not possible to open the file %1 for reading. Impossibile aprire il file %1 in lettura. KLog was not able to read the LoTW file Impossibile leggere il file LoTW Importing LoTW ADIF file... Import file loTW in corso... This QSO is not including the minimum data to consider a QSO as valid! Questo QSO non contiene il numero minimo di campi compilati necessari che rendono un QSO valido! - The band missing and the following call: - collegamento senza la banda specificata: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog ha trovato un QSO senza il nominativo di stazione caricato. Scegli il nominativo di stazione per questo QSO fra %1 e %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog ha trovato un QSO senza il nominativo di stazione caricato. Scegli il nominativo di stazione per questo QSO su %1: - The mode missing and the following call: - chiamata senza modo operativo specificato: - The date missing and the following call: - chiamata senza la data indicata: - The time missing and the following call: - chiamata senza l'ora indicata: Do you want to continue with the current file? Vuoi proseguire con il file corrente? KLog: Not all required data found! KLOg: Dati necessari mancanti! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. In alcuni QSO di questo log (es. %1) mancano le informazioni RST-TX. If you select NO, maybe the QSO will not be imported. Scegliendo No il QSO non sarà importato. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. In alcuni QSO di questo log (es. %1) mancano le informazioni RST-RX. KLog - Apply to all QSOs in this log? KLog - Applica a tutti i QSO di questo log? KLog: No RST TX found! KLog: Non trovato RST TX! KLog: No RST RX found! KLog: Non trovato RST RX! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Inserisci l'hostname o l'indirizzo della radio. Set de network port of the radio. Imposta la porta di rete della radio. Host/Address Host/Indirizzo Port Porta Enter the port of the radio. Inserisci la porta della radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Seleziona la velocità di comunicazione con la porta seriale. Port Porta Select the serial port. Only the serial ports that are detected are shown. Seleziona la porta seriale. Solo le porte seriali realmente trovate sono in elenco. Scan Scansione Click to identify the serial ports available in your computer. Clicca per cercare quali porte seriali sono disponibili sul tuo computer. 5 bits 5 bit 6 bits 6 bit 7 bits 7 bit 8 bits 8 bit Data bits Data Bit Select the serial data bits. Seleziona il numero di bit usati nella comunicazione via seriale. None Vuoto Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Controllo di flusso (flow control) Select the serial flow control Seleziona il tipo di controllo di flusso No parity Nessuna parità Even Even Odd Odd Space Spazio Mark Mark Parity Parità Select the serial parity. Scegli il bit di parità sulla seriale. Default Default 1 bit 1 bit 2 bits 2 bits Stop bits Bit di stop Select the serial stop bits. Seleziona il numero di bit di stop della seriale. InfoWidget 10M 10m 15M 15m 20M 20m 40M 40m 80M 80m 160M 160m 2M 2m 6M 6m 12M 12m 17M 17m 30M 30m 70CM 70cm Continent Contienente Prefix Prefisso CQ CQ ITU ITU Short Path Percorso breve Long Path Percorso lungo Deg Deg Miles Miglia Km Km IntroPage Welcome to KLog! Benvenuto/a su KLog! Welcome to KLog! - brought to you under the terms of the GPL! Benvenuto/a su KLog! -Utilizzabile regolamentato come da licenza GPL! Welcome to KLog Benvenuto/a su KLog This looks like it's the first time you've run KLog on this computer. E' la prima esecuzione di KLog su questo sistema. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog è un programma libero di log per uso radio che può funzionare su GNU/Linux, macOS, e Windows. It is designed to provide general purpose DX, and contest logging. E' pensato come generico supporto ai DX e log durante i contest. It supports QSL management, import and export of ADIF Questo software gestisce le QSL, e importa / esporta in formato ADIF and Cabrillo file formats and many other features... ed il formato Cabrillo e molto altro... Before you can start using KLog, you will be asked to: Prima di iniziare ad usare KLog, è necessario: Acknowledge to the terms of the license. Conferma dei termini di utilizzo descritti nella licenza. Download the DX entities information. Scarica collegamenti DX. Enter your callsign, CQ zone, etc. and main configuration. Inserisci nominativo di stazione, zona CQ e tutte le informazioni di base. Enjoy KLog and contact the development team if you have any suggestions! Buon lavoro con KLog. Puoi anche contattare lo staff di sviluppo per ogni eventuale proposta o suggerimento! LicPage KLog License information KLog informazioni sulla licenza Welcome to KLog!- brought to you under the terms of the GPL! Benvenuto/a su KLog! -Utilizzabile regolamentato come da licenza GPL! Acknowledge Conferma Be aware that KLog is free software. KLog è sviluppato come software libero. LoTWUtilities KLog - LoTW password needed KLog - password LoTW necessaria Please enter your LoTW password: Per favore inserisci la tua password LoTW: There is a file already existing with the name that will be used. Esiste già un file di nome identico a quello che vorresti usare. The file %1 already exist. Do you want to overwrite? Il file %1 esiste già. Posso sovrascriverlo? KLog was not able to save the file %1. Error returned: %2 KLog non riesce a salvare il file %1. Codice di errore restituito: %2 Downloading data to file: %1. Scarico informazioni nel file: %1. KLog - LoTW download KLog - Scarico LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Questa è la prima data di un QSO con il nominativo %1 nel log, se pensi che su LoTW possano esserci precedenti QSO, rispondi No. Do you want to use this date (%1) as start date? Vuoi utilizzare questa data (%1) come data di partenza? The remote server redirected our connection to %1 Redirezione connessione al server %1 Do you want to follow the redirection? Vuoi seguire la redirezione? It was not possible for find the file %1 that has been just downloaded. Il file %1 appena scaricato non risulta disponibile. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Su LoTW non risulta nessun QSO con il nominativo in uso (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Riprova e invia il file scaricato (%1) agli sviluppatori di KLog per analisi. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog QSO correttamente scaricati %1. Vuoi inserire nel tuo log i nuovi QSO appena scaricati? Double click on the date that you want to use as the start date for downloading QSOs. Doppio click sulla data che vuoi usare come prima data nello scarico dei QSO. KLog - LoTW Station callsign KLog - Nominativo di stazione LoTW There is not a single QSO in the log with that station callsign. Non c'è un solo QSO sul log con questo nominativo di stazione. Are you sure that you want to use that station callsign (%1)? Sei sicuro di voler usare questo nominativo di stazione (%1)? KLog - LoTW File already exists KLog - File LoTW già presente KLog - LoTW Can't write the file KLog . LoTW non riesce a scrivere il file The file %1 already exists. Il file %1 è già presente. KLog - LoTW Start date selection KLog - Selezione data iniziale LoTW KLog - LoTW Download error KLog - Errore durante lo scaricamento LoTW There was an error (%1) while downloading the file from LoTW. Si è verificato un errore (%1) durante lo scarico del file da LoTW. The downloading error details are: %1 I dettagli dell'errore durante lo scarico sono: %1 KLog - LoTW Redirection found KLog - Rilevata redirezione LoTW KLog - LoTW File not found KLog - File LoTW non trovato KLog can't find the downloaded file. KLog non trova il file scaricato. KLog - LoTW user/password error KLog - Username / password LoTW rifiutate LoTW server did not recognized your user/password Il server LoTW non riconosce l'username/password inserito Check your user and password and ensure your are using the right one before trying again. Verifica che l'username/passowrd inseriti siano quelli giusti prima di riprovare ancora. KLog - LoTW No QSOs KLog - LoTW numero QSO LoTW sent no QSOs LoTW invio numero di QSO KLog - LoTW Unknown error KLog - LoTW Errore imprevisto KLog can't recognize the file that has been downloaded from LoTW. KLog non può verificare se il file è stato correttamente scaricato da LoTW. Now KLog will process the downloaded QSO and update your local log. KLog inserirà i QSO appena scaricati sul tuo log locale. LogWindow QSL Send Trasmetti QSL QSL Rcvd Ricevi QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Trasmetti questa QSL via bureau D&irect D&irect Send this QSL via direct Trasmetti questa QSL via direct Via bureau Via bureau QSL &received via bureau QSL &ricevuta via bureau Direct Direct QSL received via direc&t QSL ricevuta via direc&t Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com Check in DXHeat.com Controlla su DXHeat.com Check this callsign in DXHeat.com Controlla questo nominativo su DXHeat.com Delete selected QSOs Cancella i QSO selezionati Delete the selected QSOs Cancella i QSO selezionati Export to ADIF Esporta su ADIF Export the selected QSOs to an ADIF file. Esporta i QSO selezionati su un file ADIF. Upload to LoTW Trasferisce a LoTW Upload the selected QSOs to LoTW Scarica i QSO selezionati su LoTW Upload to ClubLog Trasferisce a ClubLog Upload the selected QSOs to ClubLog Trasferisce i QSO selezionati su ClubLog Upload to eQSL.cc Trasferisce su eSQL.cc Upload the selected QSOs to eQSL.cc Trasferisce i QSO selezionati su eQSO.cc Send these QSLs via bureau Trasferisce questi QSO via bureau Send these QSLs via direct Trasferisce questi QSO via direct QSLs received via bureau QSL ricevute via bureau QSLs received via direc&t QSL ricevute via direc&t Select none Nessuna scelta Remove all selections Cancella tutte le scelte Select all Scegli Tutto Select all the QSOs Scegli tutti i QSO MainQSOEntryWidget &Add &Aggiunge &Clear &Pulisce Callsign of the QSO. Nominativo del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Modo operativo del QSO. Date of the QSO. Data del QSO. Time of the QSO. Ora del QSO. Add the QSO to the log. Aggiunge il QSO al log. Clears the QSO entry. Pulisce i campi del QSO. KLog will show real time if enabled. KLog lavorerà in tempo reale se abilitato. Real time Tempo-reale Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Nominativo &Modify &Modifica DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog KLog in avvio DX Entity Collegamento DX &Log Window Finestra &Log KLog KLog It seems that you have never done a backup or exported your log to ADIF. Non hai mai fatto un backup o esportato il tuo log su file ADIF. It was not possible to open the debug file for writing. No debug log will be saved! Impossobile aprire in scrittura il file di debug. Log di debug non salvato! Status bar ... Barra di stato ... KLog - CTY.dat update KLog - Aggiornamento CTY.dat It seems that the latest backup you did is older than one month. Il tuo ultimo backup risale a più di 1 mese fa. Log backup recommended! Backup del log raccomandato! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. E' buona abitudine fare regolarmente backup completo del tuo log per evitare di perderli in caso di problemi. Una volta esportato il tuo log su file ADIF, dovresti copiare il file su un supporto esterno e tenuto questo al sicuro, come una pennina USB, cloud drive, un altro computer, ... KLog ti ricoderà la necessità di fare il backup almeno 1 volta al mese. KLog - Backup klOG - Backup KLog - New version detected! KLog . Rilevata nuova versione! Ready Pronto An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Errore imprevisto durante l'aggiunta del QSO al tuo log. Se il problema si ripete, per favore contatta lo staff di sviluppo per analisi: KLog - Not valid call KLog - Collegamento non valido Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Caricare chiamate non valide nel log può dare problemi, quando trasmesse per riconoscimenti, se exportate su file ADIF verso altri sistemi o applicazioni. You have selected an entity: Hai scelto un elemento: that is different from the KLog proposed entity: diverso dall'elemento KLog proposto: Click on the prefix of the correct entity or Cancel to edit the QSO again. Clicca sul prefisso dell'elemento corretto o Annulla per tornare a correggere il QSO. No DXCC No DXCC None Vuoto Click on the prefix of the right entity or Cancel to correct. Clicca sul prefisso dell'elelemento a destra o su Cancella per correggere. KLog - ClubLog error KLog - errore ClubLog KLog - eQSL error KLog - errore eQL Download from LoTW ... Scarico da LoTW ... Download the full log from LoTW ... Scarico del log completo da LoTW ... ClubLog tools ... Strumenti ClubLog ... Upload the queued QSOs to ClubLog ... Trasferimento QSO in coda a ClubLog ... eQSL tools ... Strumenti eQSL ... Upload the queued QSOs to eQSL.cc ... Trasferimento QSO in coda a eQSL.cc ... QRZ.com tools ... Strumenti QRZ.com ... Your log has been updated with the LoTW downloaded QSOs. Il tuo log è stato aggiornato aggiungendo i QSO scaricati da LoTW. KLog has updated %1 QSOs from LoTW. KLog ha aggiornato i QSO %1 da LoTW. No QSOs have been exported to ADIF. Nessun QSO è stato esportato su ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog ha esportato N. %1 QSO su file ADIF: %2 You need to select one station callsign to be able to send your log to LoTW. Devi scegliere un nominativo di stazione per trasmettere il tuo log a LoTW. There was an error while updating to Yes the LoTW QSL sent information. Si è verificato un errore mentre marcavo come Spediti Sì verso LoTW. KLog - Select the Station Callsign. KLog - Scegli il nominativo di stazione. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Vuoi davvero uscire da KLog? KLog - File not open KLog - File non aperto KLog - Unexpected error KLog - Errore imprevisto KLog - Select correct entity KLog - Scegli il giusto elemento KLog - Exit KLog - Uscita &File &File Import an ADIF file into the current log. Importa un file ADIF nell'attuale log. Export the current log to an ADIF logfile. Esporta l'attuale log su un log file ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Esporta TUTTI i QSO in un file ADIF, fondendo QSO da tutti i diversi log. Print your log. Stampa il tuo log. KLog folder Cartella di KLog Opens the data folder of KLog. Apre la cartella dati di KLog. E&xit E&sce &Tools &Strumenti Fill in QSO data Inserisci i dati del QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Riempie i dati mancanti su QSO con dati presi da precedenti QSO. Shows QSOs for which you should send your QSL and request the DX QSL. Elenca i QSO per i quali devi ancora spedire la tua QSL e richiedere la QSL del DX. Find My-QSLs pending to send Trova le mie QSL ancora da spedire Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Evidenzia i QSO per i quali hai ancora da spedire le QSL. Questa lista dovrebbe essere sempre vuota! Mark all queued QSOs in this log as sent to LoTW. Indica come spediti a LoTW tutti i QSO in coda di questo log. Mark all queued QSOs as sent to LoTW. Indica come spediti a LoTW tutti i QSO in coda. Sends the log to LoTW calling TQSL. Invia il log delle chiamate TQSL a LoTw. For updated DX-Entity data, update cty.csv. Per aggiornare i collegamenti DX, aggiorna cty.csv. Stats Statistiche Show the statistics of your radio activity. Mostra le statistiche sulla tua attività radio. &Help &Aiuto KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL non installato o irraggiungibile per KLog. Per favore ricontrolla la configurazione. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Errore #1: Procedura annullata dall'utente o TQSL non configurato. Nessun QSOs è stato trasferito. Error #2: Upload was rejected by LoTW, please check your data. Errore #2: Il trasferimento è stato rifiutato da LoTW, per favore ricontrolla i tuoi dati. Error #3: The TQSL server returned an unexpected response. Errore #3: Il server TQSL ha risposto in modo inaspettato. Error #4: There was a TQSL error. Errore #4: Si è verificato un errore su TQSL. Error #5: There was a TQSLLib error. Errore #5: Si è verificato un errore con TQSLLib. Error #6: It was not possible to open the input file. Errore #6: Impossibile aprire in input il file. Error #7: It was not possible to open the ouput file. Errore #7: Impossobile aprire in output il file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Errore #8: Nessun QSO è stato processato perché alcuni QSO sono duplicati o hanno data al di fuori del limite ammesso. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Errore #9: Alcuni QSO sono stati processati, ed altri sono stati ignorati perché duplicati o con data al di fuori dei limiti ammessi. Error #10: Command syntax error. KLog sent a bad syntax command. Errore #10: Errore di sintassi sul comando. KLog ha inviato un comando con sintassi sbagliata. Error #11: LoTW Connection error (no network or LoTW is unreachable). Errore #11: Impossibile connettersi a LoTW (rete assente o server LoTw irraggiungibile). Error #00: Unexpected error. Please contact the development team. Errore #00: Errore inaspettato. Per favore contatta lo staff di sviluppo. The log that you have selected contains more than just one station callsign. Il log selezionato contiene più di un solo nominativo di stazione. Please select the station callsign you want to mark as sent to LoTW: Per favore scegli il nominativo di stazione che vuoi segnare come già inviato a LoTW: Station Callsign: Nominativo di stazione: Define Station Callsign Imposta il nominativo di stazione Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Scegli il nominativo di stazione per questo log o lascialo vuoto per i QSO senza nominativo impostato: KLog - No station selected KLog - Stazione non selezionata No station callsign has been selected and therefore no log will be marked Nessun nominativo di stazione scelto e qundi nessun log sarà segnato Congratulations! congratulazioni! You already have the latest version. Versione già aggiornata. You can find the KLog data folder here: La cartella dati di KLog è questa: start inizio stop stop If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Se sei davvero certo che il database contenga dei QSO anche se KLog non riesce a trovarne, per favore contatta gli sviluppatori (guarda About KLog) per aiuto. KLog - QSO received Klog - QSO ricevuto Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. I QSO duplicati hanno corrispondenza di nominativo, banda, modo, data ed ora con un QSO già esistente, relativamente al periodo definito nell'impostazione dell'account. QSO logged from WSJT-X: QSO loggato da WSJT-X: It seems that you are running this version of KLog for the first time. E' la prima esecuzione di questa versione di KLog. The setup will be open to allow you to do any new setup you may need. Adesso apro immediatamente la maschera di configurazione per permetterti tutte le modifiche richieste. You have requested to delete the QSO with: %1 Hai chiesto di cancellare il QSO con: %1 Are you sure? Sei sicuro? Check always the current callsign in QRZ.com Controlla sempre il nominativo su QRZ.com You can update the entities database in Tools->Update cty.csv Puoi aggiornare l'elenco delle località su Strumenti->Scarirco cty.cvs Do you want to do it now? Vuoi farlo adesso? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Il nominativo %1 non è un nominativo valido. Davvero vuoi aggiungerlo al log? KLog - Not valid callsign KLog - Nominativo non valido The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Il nominativo %1 non è un nomiantivo valido. Favvero vuoi aggiungerlo al log? You have requested to delete several QSOs Hai chiesto la cancellazione di parecchi QSO The ClubLog upload process has finished with an error and the log was possibly not uploaded. L'perazione di scarico di ClubLog è terminata con errori e probabilmente il log non è stato scaricato. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Per favore controlla i tuoid ati di collegamento, della tua connessione e dell'account ClubLog. Il codice di errore riportato era: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Vuoi segnare come trasferiti tutti i QSO trasferiti a ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. Si è verificato un errore durante l'aggiornamento a Sì delle informazioni QSO ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento è terminato e KLog ha creato un file (%1) nella cartella di KLog. Vuoi cancellare questo file? The file has not been removed. Il file non è stato cancellato. It seems that there was something that prevented KLog from removing the file You can remove it manually. Qualcosa ha impedito a Klog di cancellare il file Ma lo puoi comunque cancellare manualmente. The eQSL upload process has finished with an error and the log was possibly not uploaded. Il trasferimento eQSL è terminato ma con errori e qundi probabilmente non ha avuto termine. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Per favore controlla i tuoi dati account, la tuaa conenssione internet e le tue credenziali eQSL. Il codice di errore riportato era: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Vuoi marcare come trasferiti tutti i QSL mandati a eQSL? There was an error while updating to Yes the eQSL QSO upload information. Si è verificato un errore durante l'aggiornamento a Sì di eQSL delle informaizoni dei QSO. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento a eQSL è terminato e KLog a creato un file (%1) nella tua carrtella KLog. Vuoi cancellare quresto file? KLog - %1 KLog %1 The logfile has been modified. Il file di log è stato modificato. Do you want to save your changes? Vuoi salvare i cambiamenti? KLog - ADIF export KLog - exsporta ADIF &Import from ADIF ... &Importazione da Adif ... Export to ADIF ... Esportazione su ADIF ... Export all logs to ADIF ... Esporta tutti i log su ADIF ... &Print Log ... &Stampa Log ... QSL tools ... Strumenti QSL ... Find QSO to QSL Cerca QSO sulle QSL Find DX-QSLs pending to receive Cera le QSL su DX in attesa di ricezione Shows DX-QSLs for which requests or QSLs have been sent with no answer. Elenca QSL di DX per le quali richieste o QSL spedite sono ancora senza risposta. Find requested pending to receive Cerca richieste in attesa di ricezione Shows the DX-QSLs that have been requested. Elenca le QSL DX richieste. LoTW tools ... Strumenti LoTW ... Queue all QSLs from this log to be sent Mette in coda tutte le QSL di questo log ancora da spedire Mark all non-sent QSOs in this log as queued to be uploaded. Segna tutti i QSO non speditI di questo log mettendolI in coda in attesa per l'invio. Queue all QSLs to be sent Mette in coda tutte le QSL da spedire Put all the non-sent QSOs in the queue to be uploaded. Mette incoda tutti i QSO per essere inviati. Mark all queued QSOs from this log as sent Marca tutti i QSO In coda sul log come trasmessi Mark all queued QSOs as sent Marca tutti i QSO in coda come spediti Check the current callsign in QRZ.com Verifica il nominativo corrente su QRZ.com Upload the queued QSOs to QRZ.com ... Trasferisce i QSO In coda su QRZ.com ... Update cty.csv Aggiorna cty.csv Update Satellite Data Agggiorna dati satelliti Online manual (F1) ... Manuale online (F1) ... &Tips ... &Suggerimenti ... &Debug ... &Debug ... &About ... &About ... About Qt ... About Qt ... Check updates ... Controlla presenza aggiornamenti ... All pending QSOs of this log has been marked as queued for LoTW! Tutti i QSO di questo log in attesa sono inseriti in coda per LoTW! Now you can upload them to LoTW. Adesso puoi trasmetterlo a LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Impossibile marcare tutti i QSO di questo log in coda per LoTW! Your log has not been updated. Il tuo log non è stato aggiornato. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Nessun QSO è stato aggiornato con i dati provenienti da LoTW. Forse a causa di erroi contenuti nel file log o magari semplicemente perché il tuo log era già aggiornato. All pending QSOs has been marked as queued for LoTW! Tutti i QSO in attesa sono stati marcati per LoTW! All queued QSOs has been marked as sent to LoTW! Tutti i QSO in coda sono stati marcati come spediti a LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Impossibile marcare tutti i QSO di questo log in coda come spediti a LoTW! About ... About ... KLog - Update checking result KLog . risultato controllo aggiornamento UDP Server error The UDP server failed to %1. start or stop Errore Server UDP Il server UDP ha fallito a %1. It seems that there are no QSOs in the database. Sembra non ci siano QSO nel database. This function is disabled. Go to the Setup->LoTW tab to enable it. Questa funzione è disabilitata. Vai in "maschera configurazione > linguetta LoTW" per abilitarla. Status of the DX entity. Stato del collegamento DX. Name of the DX entity. Nome del collegamento DX. QSO QSO QSL QSL eQSL eQSL Comment Commento Others Altro My Data Miei Dati Satellite Satellite You need to select one station callsign to be able to send your log to ClubLog. E' necessario selezionare almeno un nominativo di stazione per poter trasferire il tuo log su ClubLog. Do you want to add this QSOs to your ClubLog existing log? Vuoi aggiungere questo QSO al tuo attuale log su ClubLog? If you don't agree, this upload will overwrite your current ClubLog existing log. Se non sei d'accordo, questo trasferimento sopvrascriverà il tuo corrente log su ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. E' necessario selezionare almeno un nominativo di stazione per poter trasferire il tuo log a eQSO.cc. Select the Station Callsign to use when quering LoTW: Seleziona il nominativo di stazione da usare intrerfacciandosi a LoTW: Please check the LoTW setup Prego controllare configurazione LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Utente LoTW non impostato o incorretto nominativo di stazione. Configura i parametri di connessione di LoTW. The log is ready to be uploaded to ClubLog. Il log è già stato trasferito su ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo di stato di ClubLog KLog could not mark the full log to be sent to ClubLog KLog non hjapotuto marcare l'intero log per il trasferimento a ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Qualcosa ha impedito a KLog di marcare i QSO come modificati. Riavvia KLog e riprova prima di contattare gli sviluppatori di KLog. The log is ready to be uploaded to eQSL.cc. Il log è già stato trasferito a eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo stato di eQSL.cc KLog could not mark the full log to be sent to eQSL KLog non ha potuto marcare l'intero log pe ril trasferimento su eQSL Filling QSOs ... Completamento QSO ... Date/Time Data/Ora Callsign Nominativo Station Callsign Nominativo di stazione Operator Callsign Nominativo operatore KLog - Non-supported mode KLog - modo non supportato A new mode not supported by KLog has been received from an external program or radio: Nuova modalità non supportata da KLog ricevuta da programma esterno o radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Vuoi continuare a ricecere questi allarmi? (disabilitando gli allarmi impedirai però anche il rilevamento di modalità non valide) Native Error Errore nativo Recommendation: Raccomandazione: Periodically export your data to ADIF to prevent a potential data loss. Periodicamente esporta i tuoi dati su file ADIF per prevenire potenziali perdite dati. DXCC DXCC Info Info Awards Riconoscimenti Search Ricerca Log Log DX-Cluster DX-CLuster Save ADIF File Salva file ADIF The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento verso LoTW è terminato e KLog ha creato un file (%1) nella tua cartella dati KLog. Vuoi cancellare il file? The file has been removed. Il file è stato cancellato. Upload the queued QSOs to LoTW Trasferisce i QSO in coda a LoTW KLog needs to update the Entities database. KLog deve aggiornare il database località. The backup was done successfully Il Backup è stato completato con successo KLog will remind you to backup your data again in aprox one month. KLog ti ricoderà di fare il backup dei tuoi dati ancora fra circa un mese. The backup was not properly done. Il backup NON è stato completato con successo. It is recommended to backup your data periodically to prevent lose or corruption of your log. E' fortemente raccomandabile fare il backup dei tuoi dati periodicamente per prevenire perdite o corruzioni del tuo log. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Questa operazione cancellerà definitivamente tutti i QSO selezionati e dati correlati e non potranno essere recuperati successivamente. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Il processo di trasferimento a QRZ.com è terminato con errori pertanto il log non è stato probabilmente trasferito. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Vuoi marcare come già trasferiti tutti i QSO trasferiti a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Si è verificato un errore durante il trasferimento a Sì su QRZ.com nelle informazioni di trasferimento. The QRZ.com upload process has finished successfully Il trasferimento si QRZ.com è stato completato con successo Call not found in QRZ.com Nominativo non trovato su QRZ.com KLog - QRZ.com error KLog errore QRZ.com KLog has received an error from QRZ.com. KLog ha ricevuto una segnalazione di errore da QRZ.com. You need to activate the %1 service in the eLog preferences. E' necessario attivare il servizio %1 fra le impostazioni di eLog. It is important to export to ADIF and save a copy as a backup. E' importante esportare su ADIF e salvare una copia cone backup per sicurezza. Saving the log was done successfully. Salvataggio del log fatto con successo. The ADIF export was not properly done. L'esportazione ADIF non è stata correttamente effettuata. Queue all the QSOs to be uploaded Mette in coda tutti i QSO per il trasferimento Queue all the QSO to be uploaded Mette in coda tutti i QSO per il trasferimento You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. Non ha selezionato un nominativo, KLog completerò il QSO senza annotare un nominativo di stazione e nessuno dei nominativi che inserisci qua. KLog - LoTW KLog - LoTW KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. Settings ... Impostazioni... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Sei certo di segnare TUTTI i QSO di questo log come da trasmettere? Questa procedura deve essere fatta SOLO SE QUESTO E' il primo trasferimento di QSO verso LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Sei certo di segnare TUTTI i QSO in sopeso di questo log come da trasmettere? Questa procedura deve essere fatta SOLO SE QUESTO E' il primo trasferimento di QSO verso LoTW. There was a problem to mark all pending QSOs as queued for LoTW! L'operazione di segnare tutti i QSO in sospeso per la trasmissione verso LoTW ha incontrato dei problemi! All queued QSOs of this log has been marked as sent to LoTW! Tutti i QSO di questo log sono stati indicati per la trasmissione verso LoTW! There was a problem to mark all queued QSOs as sent to LoTW! L'operazione di segnare tutti i QSO per la trasmissione verso LoTW ha incontrato dei problemi! TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL terminato senza errori. Vuoi marcare come Trasmesso per tutti i QSO trasferiti a LoTW? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Davvero vuoi marcare tutti i tuoi QSO come da trasmettere? Questo deve essere fatto solo la prima volta hce trasferisci QSO su %1 ClubLog ClubLog KLog - QRZ.COM KLog-QRZ.COM QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. Il log è pronto per il trasaferimento a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo di stato su QRZ.com KLog could not mark the full log to be sent to QRZ.com KLog non ha potuto marcare TUTTO il log per il trasfeirmento su QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. E' necessario impostare una valida key API per il tuo logbook QRZ.com fra le impostazioni di eLog. Open File Apre File - Needed for DXMarathon - Richiesto per DXMarathon Abort filling Annulla completamento Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Completamento dei campi DXCC, CQz, ITUz, Continente nel QSOs... QSO: Number Numero Band Banda Mode Modo Print Log Stampa Log Abort printing Annulla stampa Printing the log ... Stampa il log ... Printing the log... QSO: In stampa il log... QSO: The following QSO data has been received from WSJT-X to be logged: I dati del seguente QSO sono stati ricevuti da WSJT-X per essere inseriti nel log: Freq Frequenza Time On Tempo Acceso Time Off Tempo Spento RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Local-Grid KLog - WSJTX Dupe QSO KLog - WSJTX Duplica QSO This QSO seems to be duplicated. Do you want to save or discard it? Questo QSO sembra un duplicato. Vuoi salvarlo o scaricarlo? If the received mode is correct, please contact KLog development team and request support for that mode Se la modalità di ricezione è corretta, per favore contatta lo staff di sviluppo di KLog per richiedere l'inserimento della nuova modalità KLog - Duplicated satellite KLog - Satellite duplicato A duplicated satellite has been detected in the file and will not be imported. Un satellite duplicato è stato trovato nel file e non sarà importato. Please check the satellite information file and ensure it is properly populated. Per favore controlla il file delle informazioni dei satelliti e verifica che effettivamente contenga dei satelliti. Now you will see a more detailed error that can be used for debugging... Adesso ti mostro una indicazione di errore più dettagliata da usare come debug... An unexpected error ocurred!! Si è verificato un errore inaspettato!! If the problem persists, please contact the developers Se il problema continua, per favore contatta gli svipuppatori for analysis: per analisi: Error in function Errore in function Error text Messaggio di errore Failed query Query fallita KLog - Show errors KLog - Mostra errori Do you want to keep showing errors? Vuoi mantenere gli errori mostrati? MainWindowInputComment Comment Commento Add a comment for this QSO. Aggiungi un commento per questo QSO. Keep this data Tieni questi dati Data entered in this tab will be copied into the next QSO. Tutti i dati di questa maschera saranno precaricati di default durante l'inserimento del prossimo QSO. MainWindowInputEQSL Date of the ClubLog upload. Data del trasferimento su Clublog. Date of the QRZ.com upload. Data di scarico del trasferimento su QRZ.com. Date of the eQSL sending. Data di spedizione della eQSL. Date of the eQSL reception. Data di ricezione della eQSL. Date of the LoTW sending. Data dell'invio a LoTW. Date of the LoTW reception. Data della ricezione da LoTW. Status on QRZ.com. Stato su QRZ.com. Status of the LoTW sending. Stato dell'invio a LoTW. Status of the LoTW reception. Stato della ricezione da LoTW. QRZ.com QRZ.com LoTW Sent Invio a LoTW LoTW Rec Registrazione LoTW Status on ClubLog. Stato di ClubLog. Status of the eQSL sending. Stato della spedizione eQSL. Status of the eQSL reception. Stato della ricezione eQSL. ClubLog ClubLog eQSL Sent Invio eQSL eQSL Rec Registrazione eQSL MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Elemento Propagation mode Modalità di propagazione Others Altri Keep propagation mode Mantieni la modalità propagazione Select the primary division for this QSO. Scegli la primary division di questo QSO. Select the secondary division for this QSO. Scegli la secondary division di questo QSO. Select the entity for this QSO. Scegli l'elemento di questo QSO. Select the propagation mode for this QSO. Scegli la modalità di propagazione di questo QSO. Select the IOTA continent for this QSO. Scegli il continente IOTA di questo QSO. Select the IOTA reference number for this QSO. Scegli il numero ri riferimento IOTA di questo QSO. Keeps the same propagation mode for next QSO. Mantiene la stessa modalità propagazione nel prossimo QSO. Select the appropriate ADIF field for this QSO. Scegli il corretto campo ADIF per questo QSO. Value for the selected ADIF field. Valore del campo ADIF scelto. Not Identified Non identificato Not - Not Identified No - Non identificato SOTA Ref SOTA Ref Age Età VUCC grids Statistiche VUCC MainWindowInputQSL QSL Sent Invio QSL QSL Rec Registrazione QSL QSL Via QSL Via QSL Msg Messaggio QSL Status of the QSL sending. Stato invio QSL. Status of the QSL reception. Stato ricezione QSL. QSL sending information. Informazioni spedizione QSL. QSL reception information. Informazioni ricezione QSL. Date of the QSL sending. Data spedizione QSL. Date of the QSL reception. Data ricezione QSL. Message of the QSL. Messaggio QSL. QSL via information. Informazioni su Via QSL (modalità invio QSL). MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. Frequenza TX in MHz. RX Frequency in MHz. Frequenza RX in MHz. Power used by the contacted station. Potenza usata dalla stazione contattata. Name of the contacted operator. Nome operatore della stazione contattata. QTH of the contacted station. QTH della stazione contattata. Locator of the contacted station. Locatori della stazione contattata. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nome QTH QTH DX Locator DX Locator Power(rx) Potenza(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frequenza TX Freq RX Frequenza RX DX QTH locator. DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH locator. Il formato dovtrebbe seguire la regola come IN70AA fino a 10 caratteri. TX Frequency in MHz. Frequency is not in a hamradio band! Frequenza TX in MHz. Questa frequenza non appartiene a bande radioamatoriali! RX Frequency in MHz. Frequency is not in a hamradio band! Frequenza RX in MHz. Questa frequenza non appartiene a bande radioamatoriali! MainWindowMyDataTab Watts Watts Keep this data Mantieni questa data My QTH locator. Mio Locator QTH. Power Potenza Operator callsign Operatore di stazione Station Callsign Nominativo di stazione My Locator Il mio Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Il formato del QTH locator dovrebbe essere conformato (esempio IN70AA) fino ad un massimo di 10 caratteri. My Rig My Rig My Antenna La mia antenna My SOTA_Ref Il mio SOTA_Ref My VUCC_GRIDS I miei grafici VUCC MainWindowSatTab Keep this data Mantieni questi dati Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Il nome del satellite non è nella lista. Scegli: "%1" per abilitare questa opzione (formato usato AO-51). Satellite mode used. In uso modalità satellite. Select the satellite you are using. Scegli il satellite che stai utilizzando. UpLink band. Banda di uplink (uscita). DownLink band. Banda di downlink (ingresso). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locatore della stazione DX. Questo campo è sempre tenuto sincronizzato con il campo Locatore della maschera di inserimento del QSO. UpLink Uplink DownLink Downlink Satellite Satellite Mode Modalità DX Locator Locatore DX Other Altro MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Locatore della stazione DX. Il formato dovrebbe essere conformato (esempio IN70AA) per usare fino a 10 caratteri. Not Sat QSO QSO non satellitare KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. Nome di satellite sconosciuto a KLog perché non in elenco. Se hai la necessità specifica di inserire un satellite conosciuto, selezionabile dalla lista, puoi contattare lo staff di sviluppo e chiedere che il nuovo satellite sia inserito. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Per favore, tieni presente che il nome del satellite non sarà salvato se non in elenco, quindi questa informazione può andare persa! RX Frequency in MHz. Frequency is not in a hamradio band! Frequenza RX in MHz. Questa frequenza non appartiene a bande radioamatoriali! RX Frequency in MHz. Frequenza RX in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Frequenza TX in MHz. Questa frequenza non appartiene a bande radioamatoriali! TX Frequency in MHz. Frequenza TX in MHz. Other - Sat not in the list Altro - Satellite non in elenco Data entered in this tab will be copied into the next QSO. Tutti i dati caricati su questa maschera saranno precaricati nella maschera di inserimento del prossimo QSO. The satellite you have in your QSO is: Il satellite del tuo QSO è: OnlineMessageWidget The server returned the following error: %1 Il server ha riportato il seguente errore: %1 Not identified Non identificato QObject New One, work it! Uno nuovo, lavoralo! Needed, work it! Necessario, lavoralo! Worked but not confirmed Processato ma non confermato Confirmed Confermato Not identified Non identificato Database Error Errore nel database KLog DB needs to be upgraded. Il DB KLog deve essere aggiornato. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. La sequenza di aggiornamento è: - Esporta il log su ADIF utilizzando una vecchia versione di KLog. - Rimuovi il file logbook.dat dalla tua cartella dati KLog. - Installa la nuova versione KLog. - Importa il file ADIF appena esportato. KLog terminerà appena cliccherai su OK. KLog - DB update KLOg - Aggiornamento DB KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha trovato che il DB contiene già un log. Tutto quanto contenuto sarà automaticamente migrato sul tuo nuovo log tipo DX. KLog: Enter Station callsign KLog: Inserisci nominativo di stazione Enter the station callsign used in this log Inserisci il nominativo di stazione usato in questo log Station Callsign Nominativo di stazione QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annullare questo aggiornamento può causare inconsistenza dei dati e possibile perdita di dati. Ancora convinto/a a procedere con l'annullamento? Progress: Progresso: Updating mode information... Aggiornamento dati modalità... Do you want to upgrade it now? Vuoi effettuare l'aggiornamento adesso? If DB is not upgraded KLog may not work properly. Se il DB non è aggiornato KLog potrebbe non operare correttamente. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Aggiornare il software può causare problemi. Fare un backup del tuo DB, prima di procedere con l'aggiornamento, è sempre una buona idea. Do you want to backup your DB now? Vuoi fare il backup del tuo DB, adesso? The backup finished successfully. Il backup è terminato correttamente. You can find the backup in this file: %1 Il tuo backup si trova nel file: %1 The backup was not properly done. Il backup NON è stato completato con successo. You will be sent back to the starting point. Sarai riportato al punto di partenza. KLog - DB can't be updated automatically KLog - Il DB non può essere aggiornato automaticamente You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Ho trovato una versione KLog troppo vecchia, quindi l'aggiornamento alla nuova versione non può avvenire in modo automatico. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Dati migrati correttamente. Adesso devi solo verificare che sia tutto ok nella maschera Configurazione -> Preferenze -> Log. Abort updating Annulla aggiornamento Updating bands information... Aggiornamento dati bande... Updating bands information in %1 status... Aggiornamento dati bande in %1 stato... Updating mode information in %1 status... Aggiornamento dati modalità in %1 stato... Updating DXCC award information... Trasmissione informazioni DXCC award... Updating DXCC Award information... Trasmissione informazioni DXCC award... Updating WAZ award information... Trasmissione informazioni WAZ award... Updating WAZ Award information... Trasmissione informazioni WAZ award... KLog is already running. Klog è già in esecuzione. It is allowed to run only one instance. Puo essere seguito solo una volta sulla macchina. Install wizard was canceled before completing... L'installazione guidata è stata cancellata prima del completamento dell'operazione... Do you want to remove the KLog dir from your disk? Vuoi rimuovere la cartella KLog dal tuo disco? Your KLog dir has been removed La tua cartella KLog è stata eliminata I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Impossibile eliminare la tua cartella KLog. Dovrai eliminarla manualmente dal tuo hard disk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Impossibile eliminare la tua cartella KLog. Dovrai eliminarla manualmente dal tuo hard disk. Remember that your KLog dir is on your system... Ricorda che la cartella KLog è sul tuo sistema... Thank you for running KLog! Grazie per aver usato KLog! Updating information... Aggiornamento dati... Updating DXCC and Continent information... Aggiornamento dati DXCC e Continenti... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Trovato nominativo di stazione errato: %1. Per favore scegli un nuovo nominativo o forza la correttezza del corrente. An empty callsign has been detected. If it is possible, please enter the right call. Nominativo di stazione vuoto trovato. Se possibile, per favore inserisci il giusto nominativo. KLog - Not valid callsign found KLog - Nominativo di stazione trovato non valido Date Data Call Nominativo RSTtx RSTtx RSTrx RSTrx Band Banda Comment Commento Mode Modo CQz CQz ITUz ITUz DXCC DXCC Address Indirizzo Age Età County Country A_Index A_Index Ant_Az Ant_AZ Ant_El Ant_El Ant_Path Anth_Percorso ARRL_SECT ARRL_SECT Award_Submitted Award Inviato Award_granted Award_concesso Band_RX Banda_RX CheckContest CheckContest Class Class ClubLog SDate ClubLog SDate ClubLog status ClubLog stato Continent Continente Contacted Op Op Contattato Contest Id Id Contest Country Country Credit Submitted Credito Inviato Credit granted Credito concesso Dark Dok Do not translate if unsure, common hamradio term. Dark-Dok Fists Do not translate if unsure, common hamradio term. Prime Fists CC Do not translate if unsure, common hamradio term. Prime CC My Fists Do not translate if unsure, common hamradio term. Mie prime Nr bursts Do not translate if unsure, common hamradio term. Nr. bursts Nr pings Do not translate if unsure, common hamradio term. Nr. pings Sat mode SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distanza Email Email EQ_Call EQ_Nominativo eQSL RDate eQSL RDate eQSL SDate eQSL SDate eQSL Rcvd eQSL Rcvd eQSL Sent eQSL Sent Force Init Forza Init Freq Frequenza Freq RX Frequenza RX Gridsquare Statisticaa Guest OP Operatore ospite HRDLog SDate HRDLog SDate HRDLog status HRDLog stato IOTA IOTA IOTA Island id IOTA Id isola K Index Indice K Lat lat Lon Long LoTW RDate LoTW RDate LoTW SDate LoTW SDate LoTW Rcvd LoTW Rcvd LoTW Sent LoTW Sent Max Bursts Burst Max Multiplier Moltiplicatore MS Shower MS Shower My Antenna Mia antenna My City Mia città My Cnty Mio country My Country Mio Country My CQz Mio CQx My DXCC Mio DXCC My Gridsquare Mie statistiche My IOTA Mio IOTA My IOTA island id Mio id isola IOTA My ITUz Mio ITUz My Lat Mia Lat My Lon Mia Long My Name Mio nome My Postal code Mio codice postale My Rig Mio Rig My Sig Mio Sig My Sig Info Mie info Sig My SOTA ref Mie ref SOTA My State Mio stato My Street Mia Via My USACA counties Miei counties USACA My VUCC grids Mia statistica VUCC Name Nome Notes Note Operator Operatore Owner Callsign Nominativo proprietario Pfx Pfx Points Punti Precedence Priorità Prop Mode Prop Mode Public Key Chiave pubblica QRZcom SDate QRZcom SDate QRZcom status QRZcom stato QSL msg QSL msg QSL RDate QSL RDate QSL SDate QSL SDate QSL Rcvd QSL Rcvd QSL Sent QSL Sent QSL rcvd via QSL rcvd via QSL sent via QSL sent via QSL via QSL via QSO complete QSO completo QSO random QSO random QTH QTH Region Regione Rig Rig RX Pwr RX Pwr Sat name Nome satellite SFI SFI Sig Sig Sig Info Sig Info Silent key Do not translate if unsure, common hamradio term. Silent key SKCC SKCC SOTA Ref SOTA Ref SRX String SRX String SRX SRX STX String STX String State Stato Submode Sub-modo UKSMG UKSMG USACA counties USACA counties VE prov VE prov VUCC grids VUCC statistiche TX Pwr TX Pwr Web Web QSO Date off QSO Date spenta Transmitter id Id trasmettitore Log number Log number SearchWidget &Clear &Pulisci &Select All &Seleziona Tutto &Search &Cerca &Export Highlighted &Esporta elementi evidenziati All logs Tutti i log Clear the searches. Pulisce le ricerche. Export the search result to an ADIF file. Esporta i risultati della ricerca su un file ADIF. Select/Unselect all the QSOs shown. Seleziona/deleseziona tutti i QSO mostrati. Search in the log. Cerca nel log. Search in all logs. Cerca in tutti i log. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Scegli il nominativo da cercare per Enter '*' per mostrare tutti i QSO.. potrebbe essere lento sui log molto luunghi! Select the Station Callsign used to do this QSO. Scegli il nominativo di stazione usato in questo QSO. All in log Tutto il log Not defined Non definito &Clear selection &Pulisce selezione Save File Salva File You have requested to delete the QSO with: %1 Hai chiesto di cancellare il QSO con: %1 Are you sure? Sei sicuro? SearchWindow Date/Time Data/Ora Band Banda Mode Modo QSL Sent QSL Trasmessa QSL Rcvd QSL Ricevuta Station Callsign Nominativo di stazione ID ID Call Nominativo Date/time Data/ora Station callsign Nominativo di stazione QSL Send Trasmette QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Trasmetti la QSL via bureau D&irect D&irect Send this QSL via direct Trasmetti la QSL via direct Via bureau Via bureau QSL &received via bureau QSL &ricevuta via bureau Direct Direct QSL received via direc&t QSL ricevuta via direc&t Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com Check in DXHeat.com Controlla su DXHeat.com Check this callsign in DXHeat.com Controlla questo nominativo su DXHeat.com &Request my QSL &Richiedi la mia QSL Mark my QSL as requested Segna la mia QSL come richiesta Via Direct and mark DX QSL as requested Via Diretto e indica la QSL del DX come richiesta Send this QSL via direct and mark DX QSL as requested Spedisce questa QSL via diretto e indica la QSL del DX come richiesta Via Bureau and mark DX QSL as requested Via Bureau e segna la QSL del DX come richiesta Send this QSL via bureau and mark DX QSL as requested Spedisce questa QSL via bureau e segna la QSL del DX come richiesta &Request the QSL &Richiedi la QSL Mark the QSL as requested Segna la QSL come richiesta Via bureau and mark my QSL as requested Via bureau e segna la mia QSL come richiesta QSL received via bureau and mark my QSL as requested QSL ricevuta via bureau e segna lamia SQL come richiesta Direc&t and mark as my QSL requested Dire&tto e segna come mia QSL richiesta QSL received via direct and mark my QSL as requested QSL ricevuta via diretto e segna la mia QSL come richiesta Needed QSO to send the QSL QSO che richiedono l'invio della QSL My QSL requested to be sent La mia richiesta di QSL da inviare DX QSL pending to be received QSL di DX in attesa di ricezione SetupDialog Bands/Modes Bande/modi DX-Cluster DX-CLuster Colors Colori Misc Altro World Editor Editor mondiale Logs Log Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Vai nella linguetta Altro e clicca su Muove DB oppure il DB non sarà spostato nel nuovo percorso. Cancel Annulla Satellites Satelliti HamLib HamLib eLog eLog OK OK User data Dati utente Log widget Log widget D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings Impostazioni You need to enter at least one log in the Logs tab. Nella configurazione log deve essere caricato almeno un log. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Vuoi aggiungere un log nella maschera configrazione Log o vuoi terminare KLog? (Clicca Sì per aggiungere un log oppure No per uscire da KLog) World Mondo DB has not been moved to new path. Il DB non è stato spostato nel nuovo percorso. You need to enter at least a valid callsign. Devi inserire almeno un nominativo valido. Go to the User tab and enter valid callsign. Vai alla tab Utente e inserisci il nominatio valido. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Adesso ti porto nella maschera di configurazione dei log. Per favore aggiungi /seleziona il tipo di log che ti serve. You have not selected the kind of log you want. Non hai selezionato il tipo di log che ti interessa. SetupEntityDialog Entity Collegamento CQ CQ ITU ITU Latitude latitudine Longitude Longitudine UTC UTC Main prefix Prefisso principale ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... I prefissi sono separati da virgole, es. EA1,EA2, ... Prefixes Prefissi Name of the Entity. Nome del collegamento. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitudine del collegamento. Local time difference to UTC. Differenza tra ora locale e UTC. Main prefix of the entity. Prefisso principale del collegamento. ARRL ID. ARRL ID. Date of the deletion. Data della cancellazione. Deleted Cancellato Cancel Annulla Ok Ok Entity Dialog Maschera inserimento collegamento SetupPageBandMode Bands Bande Modes Modi SetupPageColors New One Uno nuovo Needed in this band Necessario in questa banda Worked in this band Processato per questa banda Confirmed in this band Comfermato in questa banda Default Default WSJT-X palette WSJT-X palette colori Default palette Default palette colori Dark Mode Visualizzazione notturna Color when the DXCC is an ATNO (All Time New One). Colore usato quando il DXCC è un ATNO (Sempre nuovo). DXCC is confirmed in this band. DXCC confermato in questa banda. Default color. Colore di default. Sets a palette of colors similar to the one used in WSJT-X. Seleziona una palette di colori simile a quella usata in WSJT-X. Sets the default palette. Seleziona la palette di default. Light Mode Visualizzazione diurna This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Questo DXCC è stato processato prima in un'altra banda, ma non nella banda richiesta. Magari a causa del CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC processato, ma non confermato per questa banda. Sets the Dark Mode Attiva la visualizzazione notturna Choose a color Scegli un colore SetupPageDxCluster Add Aggiunge Delete Cancella Show &HF spots Elenca spots &HF Show V/&UHF spots Elenca spots V/&UHF Show W&ARC spots Elenca spots W&ARC Show &worked spots Elenca spots &processati Show &confirmed spots Elenca spot &confermati Show ANN/&FULL messages Elenca messaggi ANN/&PIENO Show WW&V messages Elenca messaggi WW&V Show WC&Y messages Elenca messaggi WC&Y Save DX Cluster activity Salva le attività del DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Salva tutte le attività del DX Cluster su un file nella cartella KLog DX Spots DX Spots Others Altri Messages Messaggi KLog: Add a DXCluster server KLog: Aggiungi un server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Aggiungi un indirizzo seguito da una :porta Esempio: dxfun.com:8000 Se nessuna porta è esplicitamente indicata, la 41112 sarà usata di default: SetupPageELog ClubLog password Password ClubLog ClubLog email Email ClubLog Enter the email you used to register in ClubLog. Inserisci l'email scelta durante la registrazione a ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password ClubLog. Attenzione: La password sarà salvata in chiaro all'interno del file di configurazione di KLog!! (Se non vuoi inserire la password, Kalog te la chiederà ogni volta quando necesaria.) Send QSOs in real time Trasferisci QSO in tempo reale Activate ClubLog Attiva ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Trasferisci ogni QSO a ClubLog in tempo reale, appena aggiunti (o modificati) su KLog. Starts the ClubLog support in KLog. Avvia il supporto ClubLog su KLog. Activate eQSL.cc Attiva eQSL.cc Enter your username of eQSL.cc. Inserisci il tuo nome utente di eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la password per eQSL.cc, Attenzione: la password sarà salvata in chiaro ill'interno del file di configurazione di KLog!! (Se non vuoi tenere qua la password, Klog te la chiderà ogno volta che sarà necessaria) eQSL.cc password Password eQSL.cc eQSL.cc user Nome utente eQSL.cc ClubLog ClubLog eQSL.cc eQSL.CC QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Inserisci l'utente del tuo aaccount qrz.COM. Devi essere registrato aa QRZ.com per usare questo servizio. User Utente Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password QRZ.com. Warning: La password sarà salvata in chiaro all'interno del file di configurazione di KLog!! (Se non vuoi inserirla qua Klog te la chiederà ogno colta che sarà necessaria.) Password Password Activate QRZ.com Attiva QRZ.com Check automatically Controllo automatico Check in Qrz.com all Calls as they are entered Verifica su QRZ.com tutti i nominativi ma mano che sono inseriti Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key Key LogBook LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Key LogBook per il trasferimento di QSO. Ottieni questa key nella tua pagina web su QRZ.com. Ricorda che occorre che tu sia utente registrato su QRZ.com per pyoter usare questa funzionalità. LoTW LoTW Upload upload Download Dowload TQSL path path TQSL Use TQSL Usa TQSL LoTW password password LoTW LoTW user user LoTW Enter your LoTW user. Inserisci il tuo utente LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password per LoTW. Attenzione: La password sarà salvata in charo nel file di configurazione di KLog. Se non vuoi lasciarla esposta puoi evitare di inserirla e KLog te la chiederà ogni volta quando necessario, senza memorizzarla Path to the TQSL software. Path del software TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Abilita l'integrazione fra LoTW e TQSL. E' necessario aver installato TQSL Select File Seleziona file SetupPageHamLib Activate HamLib Attiva Hamlib Activates the hamlib support that will enable the connection to a radio. Attiva il supporto hamlib che permette la conenssioen diretta alla radio. Read-Only mode Modo in sola lettura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Se abilitato, KLog leggerà frequenza e modalità dalla radio ma senza trasmettere comando alla radio. Radio Radio Select your rig. seleziona il tuo rig. Serial Network Defines the interval to poll the radio in msecs. Imposta l'intervallo di poll della radio in msecondi. Poll interval Intervallo di poll Test: OK Test: OK Test: NOK Test: NON OK Test Test Click to test the connection to the radio Premi per verificare la connessione alla radio SetupPageLogView Fields Campi SetupPageLogs &New &Nuovo &Edit &Modifica &Remove &Elimina KLog KLog All the QSOs from this log will also be deleted... Tutti i QSO di questo log saranno cancellati... Log has not been removed. (#3) Impossibile cancellare l'intero log. (#3) Do you really want to remove this log? Davvero vuoi eliminare questo log? Add a new log. Crea nuovo log. Edit the selected log. Modifica il log selezionato. Remove the selected log. Calcella il log selezionato. Log has not been removed. (#2) Impossibile cancellare l'intero log. (#2) Log has not been removed. (#1) Impossibile cancellare l'intero log. (#1) ID ID Date Data Station Callsign Nominativo di stazione Operators Operatori Comments Commenti QSOs QSO The new log could not be created. Il nuovo log potrebbe non essere creato. An error has occurred showing the following error code: Si è verificato un errore con il codice: KLog - SetupPageLogs KLog - Maschera configurazione Log SetupPageLogsNew &Date &Data &Station Callsign &Nominativo di stazione &Operators &Operatori Comm&ent Comm&enta &Ok &Ok &Cancel &Annulla Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Inserisci una breve descrizione per questo log. Se lo inserisci, sarà mostrato sul titolo principale di KLog per distinguerlo. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. E' necessario che tu inserisca un valido nominativo nel box Nominativo di stazione. Il log non sarà aperto. Callsign used for this log. Nominativo usato per questo log. Comma separated list of operators: callsign1, callsign2. Elenco operatori separati da virgola: operatore, operatore2. Start date of this log. Data di inizio di questo log. SetupPageMisc &Imperial system Sistema &Imperiale &Log in real time &Log in tempo reale &Time in UTC &Ora in UTC &Save ADIF on exit &Salva ADIF all'uscita Use this &default filename Usa di &default questo nome file Mark &QSO to send QSL when QSL is received Segna il &QSO per inviare QSL quando una QSL è ricevuta Complete QSO with previous data Completa i dati del QSO con dati precedenti Show the Station &Callsign used in the search box Mostra il &nominativo di stazione inserito nella maschera di ricerca Mark sent eQSL && LoTW in new QSO as queued Mette in coda nei nuovi QSO per la spedizione eQSL && LoTW &Check for new versions automatically &Controlla automaticamente nuove versioni Check if there is a new release of KLog available every time you start KLog. Controlla se è diosponibile una nuova versione di KLog ogni volta che KLog si avvia. &Provide Info for statistics &Fornisci informazioni per statistiche Move DB Sposta DB The search box will also show the callsign on the air to do the QSO. La maschera di ricerca mostrerà anche il nominativo usato in trasmissione durante il QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Se la spunta sul checkbox di controllo di nuove versione è attiva, KLog trasmetterà algi sviluppatori il tuo nominativo la vesione di KLog, e dil sisstema operativo per aiutare lo sviluppo di nuove versioni di KLog. Select to use real time. Seleziona per il funzionamento in tempo reale. Select to use UTC time. Seleziona per usare l'ora UTC. Select if you want to save to ADIF on exit. Seleziona se vuoi salvare su file ADIF ad ogni uscita. Complete the current QSO with previous QSO data. Completa il QSO corrente ripescando i dati dal precedente QSO. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Clicca se vuoi che di default ad ogni nuovo QSO le eQSL (LoTW e eQSL) siano automaticamente messe in coda per la spedizione. This is the directory where DB (logbook.dat) will be saved. Cartella di salvataggio del DB (logbook.dat). Click to change the default ADIF file. Clicca per cambiare il file ADIF di default. Click to move the DB to the new directory. Clicca per spostare il DB su una nuova cartella. Select Directory Scegli la cartella KLog - Move DB KLog - Sposta DB File moved File spostato File copied File copiato File already exist. Il file esiste già. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Il file di destinazione già esiste e KLog non lo sovrascriverà. Per favore rimuovi il file dalal cartella di destinazione prima di tentare di spostare il file con KLog se vuoi essere sicuro che la procedura abbia successo. File NOT copied File NON copiato The file was not copied due to an unknown problem. Impossibile coopiare il file per problemi sconosciuti. The target directory does not exist. Please select an existing directory. La cartella di destinazione non esiste. Per favore scegli una cartella esistente. Browse Sfoglia Check non-valid calls Manage DX-Marathon Gestisci DX Marathon Activate the application debug log Attiva il log debug dell'applicazione &Delete always temp ADIF file after uploading QSOs &Cancella sempre il file temporaneo ADIF dopo il trasferimento dei QSO In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. In secondi, scegli il tempo limite per considerare una chiamata come duplicata, se anche banda e modo sono presenti. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO marcato come in attesa di spedizione QSL se hai già ricevuto la QSL del DX ma non ne hai ancora inviata una. Check it for Imperial system (Miles instead of Kilometers). Seleziona per attivare il sistema di misure Imperiale (Miglia invece di Kilometri). Select to use the following name for the logfile without being asked for it again. Scegli il nome del file di log (non ti verrà più chiesto). Select if you want to manage DX-Marathon. Seleziona se vuoi gestire la DX Marathon. This is the default file where ADIF data will be saved. File ADIF di default di salvataggio dei dati. This is the directory where the database (logbook.dat) will be saved. Cartella di salvataggio del database (logbook.dat). Click to change the path of the database. Clicca per cambiare il percorso del database. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Attiva il log di debug dell'applicazione. Questo purò rivelarsi utile se qualcosa dovesse non andare come previsto. Il file di debug è creato nella cartella dati di KLog. Delete Always the adif file created after uploading QSOs Cancella sempre il file ADIF creato dopo in trasferimento dei QSO Dupe time range: Tempo limite duplicato: Open File Apre File Please specify an existing directory where the database (logbook.dat) will be saved. Per favore indica una cartella valida per il salvataggio del database (logbook.dat). SetupPageSats &New &Nuovo &Edit &Modifica &Remove &Elimina &Import &Importa E&xport E&sporta Add a new satellite. Aggiunge un nuovo satellite. Edit the selected satellite. Modifica il satellite selezionato. Remove the selected satellite. Elimina il satellite selezionato. Export your current satellites to a file. Esporta i tuoi satelliti attuali su file. Select the sat you want to open. Seleziona il sat da aprire. KLog KLog Do you really want to remove this satellite? Davvero vuoi eliminare questo satellite? Import a satellites file. It will replace the satellites you have in the current list. Imposta file di satelliti. Questi sostituiranno i satelliti del tuo elenco corrente. This satellite will no be longer available to be selected ... Questo satellite non apparirà più nell'elenco dei satelliti selezionabili... Sat has not been removed. (#3) Sat non è stato rimosso. (#3) Sat has not been removed. (#2) Sat non è stato rimosso. (#2) Sat has not been removed. (#1) Sat non è stato rimosso. (#1) ID ID Short Breve Name Nome Uplink Uplink (uscita) Downlink Downlink (ingresso) Modes Modalità An error has occurred showing the following error code: Si è verificato un errore con il codice: KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Apre file satelliti KLog warning KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Impossibile importare i dati satellite a causa di un errore inaspettato. Il file che stai cercando di importare potrebbe non essere nel corretto formato. Please check the format or contact the developer for analysis with the error code: Per favore controlla il formato o contatta gli sviluppatori per analisi con il seguente codice di errore: Save Satellites File Salva file satelliti SetupPageSatsNew Short name Nome breve Sat name Nome satellite UpLink Uplink DownLink Downlink Modes Modi &Ok &Ok &Cancel &Annulla Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Inserisci il nome breve. Prova ad usare il nome breve LoTW in modo da trasferire i tuoi QSO a afterwards LoTW. Enter the name of the satellite. Inserici il nome del satellite. Enter the uplink frequencies in this format: 144.300 Inserisci la frequenza di uplink nel formato: 144.300 Enter the downlink frequencies in this format: 144.300 Inserisci la frequenza di downlink nel formato: 144.300 Enter the modes in this format: USB Inserisci i modi in questo formato: USB Some of the data you have entered is not correct; the satellite can't be added. Il satellite non può essere aggiunto perché qualche dato inserito non è corretto. SetupPageSubdivisionNew &Date &Data &Station Callsign &Nominativo di stazione &Operators &Operatori Comm&ent Comm&ento &Ok &Ok &Cancel &Annulla Callsign used for this log. Nominativo usato per questo log. Comma separated list of operators: callsign1, callsign2. Elenco operatori separati da virgola: operatore1, operatore2. Start date of this log. Data di inizio di questo log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Inserisci una breve descrizione per questo log. Se lo inserisci, sarà mostrato sul titolo principale di KLog per maggior chiarezza. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. E' necessario che tu inserisca un nominativo valido nel box del nominativo di stazione. Il log non sarà aperto. SetupPageSubdivisions &Remove &Elimina Import new Importa nuovo Import an AWA file with the subdivision details. Importa file AWA con tutti i dettagli. Remove the selected references. Cancella i riferimenti selezionati. Select the references you want to open. Scegli i riferimenti che vuoi aprire. KLog KLog Do you really want to remove the data of this entity? Davvero vuoi cancellare la data di questo elemento? All the subdivision information for this entity will be deleted... Tutte le informazioni per questo elemento saranno cancellati... Log has not been removed. (#3) Log non cancellato. (#3) Log has not been removed. (#2) Log non cancellato. (#2) Log has not been removed. (#1) Log non cancellato. (#1) ID ID Name Nome Short Name Nome abbreviato CQ Zone Zona CQ ITU Zone Zona ITU Deleted Cancellato Start Date Data di inizio End Date Data di fine DXCC DXCC An error has occurred showing the following error code: Si è verificato un errore con il seguente codice: KLog - SetupPageSubdivisions KLog - SetuoPageSubdivisions SetupPageUDP Start UDP Server Avvia server UDP Automatically log QSOs from WSJT-X Automaticamente log i QSO da WSJT-X Allow WSJT-X to send logged QSOs to KLog Permette a WSJT-X di spedire i QSO logged a KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected I QSO logged su WSJT-X saranno spediti a KLog e KLog chiederà conferma prima di logging into KLog a meno che "%1" sia selezionato KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog automaticamente log ogni QSO in arrivo da WSJT-X senza ulteriori conferme manuali. Update status information from WSJT-X Aggiornamento informazione di stato da WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog automaticamente mosterò ed aggiornerà i dati provenienti da WSJT-X (DX, nominativo, report, modo, ...) UDP port number where the UDP Server will listen for packets. Numero di porta UDP dove il server ascolta per ricevere pacchetti. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Verifica bene che la porta usata sia esattamente quella usata da altri programmi per trasmettere i dati. La porta di default è la 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Il server UDP riceve QSO trasmessi da altri programmi come WSJT-X permettendoti di avere accesso da Klog ai dati di questi programmi. UDP Port Porta UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleziona l'interfaccia per ascoltare UDP datagrammi provenienti da SWJT-X. Network interface Interfaccia di rete QSOs notification timeout (milisecs) Tempo di timeout di notifica QSO (millisecondi) Miliseconds that the notification of QSOs received from WSJTX will be shown. Millisecondi per la notifica di QSO ricevuti da WSJTX per essere mostrati. SetupPageUserDataPage &Personal data Dati &Personali Station &data &Data Stazione Enter your name. Inserisci il tuo nome. Enter your address - 1st line. Inserisci il tuo indirizzo - 1a linea. Enter your address - 2nd line. Inserisci il tuo indirizzo - 2a linea. Enter your address - 3rd line. Inserisci il tuo indirizzo - 3a linea. Enter your address - 4th line. Inserisci il tuo indirizzo - 4a linea. Enter your city. Inserisci la tua città. Enter your zip code. Inserisci il tuo codice postale. Enter your province or state. Inserisci la tua provincia o stato. Enter your country. Inserisci il tuo paese. &Name &Nome &Address &Indirizzo Cit&y Cit&tà &Zip Code &Cap Pro&v/State Pro&v/Stato Countr&y Countr&y Enter your information for rig Inserisci informazioni per l'impianto Enter your information for antenna Inserisci informazioni sulla tua antenna Enter your power information. Inserisci informazioni sulla tua potenza usata. Enter the station callsign that will be used for logging. Inserisci il nominativo di stazione che sarà usato per il log. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Inserisci il locator della tua stazione. In alternativa, KLog è in grado di usare un locator approssimativo ricavato dal tuo nominativo. &Rig 1 &Impianto 1 R&ig 2 &Impianto 1 Ri&g 3 &Impianto 1 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&tenza Enter the operators (comma separated if more than one). Inserisci gli operatori (separati da virgola se più di uno). &Callsign &Nominativo &Operators &Operatori &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Locator &Locator (not valid) &Locator (non valido) SetupPageWorldEditor Add Aggiunge Delete Cancella Edit Modifica Export World Esporta Mondo Import World IMporta mondo Still not implemented. Ancora non implementato. Import a new cty.csv file Importa un nuovo file cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un file elenco (cty.csv) è stato trovato nella cartella dati di KLog e sarà caricato. No entities information file (cty.csv) has been detected in your KLog folder. Nessun file elenco (cty.csv) è stato trovato nella cartella dati di KLog. KLog will not be able to show entities information. KLog non sarà in grado di mostrare le informazioni di collegamento. Prefix Prefisso Entity Collegamento ARRL ID ARRL ID Continent Continente CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latidudine Longitude Longitudine Deleted Eliminato Since Date Dalla data To Date Alla data Open File Apre File BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informazioni collegamento aggiornate. Entities information has not been updated. Informazioni collegamento non aggiornate. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. I seguenti QSO sono tutti quelli ricevuti dalla conferma LoTW. Ok Ok DX DX Date/Time Data/Ora Band Banda Mode Modo ShowErrorDialog KLog Message Messaggio KLog SoftwareUpdateDialog Ok Ok KLog update Aggiornamento KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>KLog nuova versione (%1) è disponibile! </h2></center><br>E' disponibile una nuova versione di KLog.<br><br><b>Puoi scaricare la nuova versione da:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! congratulazioni! Your KLog has been updated. KLog è stato aggiornato. You already have the latest version. Stai già usando la versione più recente. StartWizard KLog - The free hamradio logging program KLog.- Un software libero per radioamatori Quit Setup Esce dalla configurazione Setup is not complete yet. Are you sure you want to quit setup? Configurazione non ancora completa. Sei sicuro di voler uscire dalla configurazione? StatisticsWidget QSO per year QSO all'anno DXCC per year DXCC all'anno CQ zones per year Zone CQ all'anno QSO per band QSO per banda QSO per mode QSO per modo QSO per DXCC QSO per DXCC QSO per Continent QSO per Continente QSO per hour QSO all'ora QSO per month QSO al mese Worked / Confirmed status Stato Processati / Confermati Worked / Sent status Stato Processati / Spediti Sent / Confirmed status Stato Spediti / Confermati Satellite grid status Stato DXCC satellite Stato griglia satellite Satellite DXCC status Grids per band status Grids per stato banda DXCC per band status DXCC per stato banda StatsCQZPerYearBarChartWidget CQ Zones per year Zone CQ per anno Reading data ... Dati in lettura... Abort reading Cancellazione lettura CQ zones Zone CQ CQ zones per year Zone CQ Per anno Zone CQ per anno Reading data ... Lettura dati ... Years: %1/%2 Anni:%1/%2 StatsDXCCOnSatsWidget Show confirmed only Mostra solo i confermati Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Nominativo Date Data Band Banda Mode Modo DXCC DXCC Satellite Satellite Confirmed Confermato No No StatsEntitiesPerYearBarChartWidget Chart title Titolo della carta Reading data ... Lettura dati ... Abort reading Annulla lettura DXCC Entities Collegamenti DXCC DXCC Entities per year Collegamenti DXCC all'anno Reading data ... Lettura dati ... Entities: Collegamenti: StatsFieldPerBandWidget All Tutto Mode: Modo: Band Banda Worked Processato Confirmed Confermato StatsGridsOnSatsWidget Show confirmed only Mostra solo i confermati Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Nominativo Date Data Band Banda Mode Modo Grid Griglia Satellite Satellite Confirmed Confermato No No StatsQSOsPerBandBarChartWidget QSOs per band QSO per banda Reading data ... lettura dati ... Abort reading Annulla lettura Bands Bande QSOs per band distribution Distribuzione QSO per banda Reading data ... lettura dati ... Bands: Bande: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO per continente Reading data ... Lettura dati ... Abort reading Annulla lettura Continents Continenti Reading data ... Lettura dati ... Hours: Ore: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO per DXCC Reading data ... Lettura dati ... Abort reading Annulla lettura Reading data... lettura dati... DXCC DXCC Top ten DXCC per QSO Primi 10 DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO per ora Reading data ... Lettura dati ... Abort reading Annulla lettura Hours Ore QSOs at hour QSO all'ora Reading data ... lettura dati ... Hours: Ore: StatsQSOsPerModeBarChartWidget QSOs per mode QSO per modo Reading data ... Lettura dati ... Abort reading Annulla lettura Modes Modi QSOs per mode distribution QSO per distribuzione modo Reading data ... lettura dati ... Modes: Modi: StatsQSOsPerMonthBarChartWidget QSOs per month QSO per mese Reading data ... Lettura dati ... Abort reading Annulla lettura Jan Gen Feb Feb Mar Mar Apr Apr May Mag Jun Giu Jul Lug Sep Set Oct Ott Nov Nov Dec Dic Aug Ago Months Mesi QSOs at Month QSO al mese Reading data ... Lettura dati ... Months: Mesi: StatsQSOsPerYearBarChartWidget Reading data ... Lettura dati ... Abort reading Annulla lettura QSOs QSO QSOs per year QSO per anno Reading data ... Lettura dati ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Spedito - %1 Confirmed - %2 Confermato - %2 Sent / Confirmed status Stato Trasferiti / Confermati StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Processato, non confermato - %1 Confirmed - %2 Confermato - %2 Worked / Confirmed status Stato Processati / Confermati StatsWorkedSentPieChartWidget Worked - %1 Processato - %1 Sent - %2 Spedito - %2 Worked / Sent status Stato Processati / Spediti TipsDialog KLog tips KLog suggerimenti Next Successivo Previous Precedente <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #1:</b><br>Dovresti sapere che...<br>E' anche disponibile <a href="#ToolsFillInQSO">Strumenti->Completa dati QSO</a> che acquisce il log QSO completo di DXCC e lo usa per compilare automaticamente i dati della tua registrazione QSL Locale con informazioni DXCC, CQ, zone ITU e continenti? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #3:</b><br>Dovresti sapere che...<br>E' anche disponibile <a href="#ToolsFindQSO2QSL">Strumenti->Strumenti QSL...->Cerca QSO su QSL</a> per cercare tutti quei QSO per i quali dovresti spedire la QSL, non ancora spedita, perché stai ancora aspettando la conferma da DXCC? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #2:</b><br>Dovresti sapere che...<br>Puoi scoprire quali QSL hai ancora da spedire con <a href="#ToolsSendPendingQSL">Strumenti->Strumenti QSL...-> Trova le mie QSL In attesa di spedizione</a>.<bR>Questo strumento elencherà all'interno della maschera di ricerca tutte le QSL spedite segnate come <i>Richieste</i>. {2:?}. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #4:</b><br>Dovresti sapere che...<br>Puoi sempre inserire il wild char * nella maschera di ricerca, per trovare tutti i QSO fatti con uno specifico nominativo? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #5:</b><br>Dovresti sapere che...<br>Sono sempre disponibili tutti i tuoi log e altre informazioni nel file logbook.dat e nel file klogrc, nel file di configurazione di KLog config file nella cartella dati KLog aprendi direttamente il menù <a href="#FileOpenKLogFolder">File->Cartella KLog</a> ? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #6:</b><br>Dovresti sapere che...<br>E' possibile trasferire i tuoi QSO marcati e messi in coda per LoTW via TQSL con <a href="#ToolsUploadLoTW">Strumenti->Strumenti LoTW ...->Trasferisce il log delle chiamate a LoTW delle TQSL.</a> ?<br><br>E' necessario che TQSL nelle impostazioni per pytoer usare questa funzionalità. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #7:</b><br>Dovresti sapere che...<br>Puoi sempre vedere i QSO che confermano uno specifico collegamento DXCC all'interno di una specifica banda puntando con il mouse sulla banda nel widget DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #8:</b><br>Dovresti sapere che...<br>Puoi scoprire di quali QSL sei ancora in attesa con <a href="#ToolsReceivePendingQSL">Strumenti->Strumenti QSL...->Trova DX QSL in attesa di ricezione</a>.<bR>Questo strumento ti elencherà nella maschera di ricerca tutti i QSO marcati come <i>Spediti</i> ma per i quali non hai ancora ricevuto la QSL di risposta. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #9:</b><br>Dovresti sapere che...<br>Puoi scoprire le QSL che stai ancora aspettando con <a href="#ToolsReceiveRecPendingQSL">Strumenti->Strumenti QSL...->Cerca QSL richieste in attesa di ricezione</a>.<bR>Questo strumento ti elencherà nella maschera di ricerca tutti i QSO con il campo registrazione QSL marcato come <i>Richiesto</i> ma per i quali non hai ancora ricevuto la QSL relativa al DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #10:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti al <a href=https://t.me/klogchat>Inglese Gruppo Telegram KLog</a> per parlare di KLog in Inglese? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #11:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti al <a href=https://t.me/KLogES>Spagnolo Gruppo Telegram KLog</a> per parlare di KLog in Spagnolo? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #12:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti a <a href=https://groups.io/g/klog>Mailing list utenti KLog</a> per parlare via email su KLog in Inglese? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #13:</b><br>Dovresti sapere che...<br>Puoi sempre <a href=https://twitter.com/_ea4k>seguire EA4K su twitter</a> per ottenere aggiornamenti su KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #14:</b><br>Dovresti sapere che...<br>Puoi scrivere una tua <a href=https://www.eham.net/reviews/detail/3118>recenzione su eHam.net per KLog</a> per convincere altri utenti a scegliere KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #15:</b><br>Dovresti sapere che...<br>Puoi sempre unirti allo staff di sviluppo semplicemente <a href=https://www.klog.xyz/contact>Contattandoci</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #16:</b><br>Dovresti sapere che...<br>Puoi contribuire alla crescita di KLog in monlti diversi modi, contenuti nella pagina <a href=https://www.klog.xyz/contrib>KLog Contributo</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #17:</b><br>Dovresti sapere che...<br>Puoi aiutare a tradurre KLOg nella tua lingua? Per favore controlla sulla pagina <a href=https://www.klog.xyz/contrib/translations>KLog Traduzioni</a> . <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #18:</b><br>Dovresti sapere che...<br>Puoi fare un doppio click sul nome di un collegamento nell'elenco DXCC e saranno mostrati tutti i QSO relativi a quel collegamento DXCC nella maschera di ricerca? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #19:</b><br>Dovresti sapere che...<br>Puoi sempre cloccare su un QSO e verificare su <i>Check in QRZ.com</i> l'esistenza del nominativo su QRZ.com? UpdateSatsData Reading Satellites data file... Lettura file dati satelliti... Abort reading Annulla lettura The Satellites information has been updated. Informazioni satelliti aggiornate. Open File Apre File Sat Data Dati satelliti World Entity Collegamento Continent continente Abort reading Annulla lettura Reading cty.csv... Lettura cty.cvs... WorldMapWidget World map Mappa mondiale View Vista Zoom In(25%) Zoom In(25%) Zoom Out(25%) Zomm Out(25%) Normal Size Dimensione normale Fit to window Arrangia su finestra eLogClubLog Host not found! Host non trovato! Timeout error! Errore di Timeout! KLog - ClubLog KLog - ClubLog This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Questo errore può essere cusato dalla presenza di QSO duplicati o,quando rimossi, per QSO macanti. Undefined error... Errore indefinito... Callsign missing Nominativo di chiamata assente Invalid callsign Nominativo di stazione non valido Skipping SWL callsign Salto nominativo SWL Callsign is your own call Callsign is you own call Invalid callsign with no DXCC mapping Nominativo di stazione non valido con nessuna localizzazione DXCC Updated QSO Trasferito QSO Invalid ADIF record Record ADIF non valido Missing ADIF record Record ADIF mancante Test mode - parameters ok, no action taken Modalità test parametri ok, nessuna azione intrapresa Undefined error number (#%1)... Numero di errore idnefinito (#%1)... We have received an undefined error from Clublog (%1) Ricevuto erorre idnefinito da ClubLog (%1) QSO dupe or not existing (#%1)... QSO duplicato o mancante (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Per favore verifica nella tua configurazione e contatta il team di sviluppo di KLog se non riesci a farlo funzionare.Trasferimenti a ClubLog disabilitati. Excessive API Usage Eccessivo uso delle API Internal Error Errore Interno Rejected Rifiutato QSO Duplicate QSO Duplicato QSO Modified QSO Modificato Missing Login Login mancante QSO OK QSO OK Upload denied Trasferimento rifiutato No callsign selected Nessun nominativo selezionato No match found Nessuna corrispondenza trovata Dropped QSO QSO interrotto OK OK Login rejected Login rifiutato Rejected: Callsign is your own call Rifiutato: Nominativo is your own call eLogQrzLog Host not found! Host non trovato! Timeout error! Errore di Timeout! Undefined error number (#%1) Numero di errore undefinito (#%1) We have received the following error from QRZ.com (%1) Ricevuto il seguente errore da QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Nessuna KEY valida trovata Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Per favore configura la chiave API del tuo QRZ.com. La trovi nella pagina web del tuo logbok su QRZ.com. E' necessaria la registrazione sul sito QRZ.com poter ptoer usare questa funzione. KLog - QRZ.com password needed KLog. - Password QRZ.com richiesta Please enter your QRZ.com password: Per fsavore isnerisci la tua password QRZ.com: KLog - QRZ.com KLog QRZ.com Callsign missing Nominativo di stazione assente eQSLUtilities Host not found! Host non trovato! Timeout error! Errore di Timeout! Undefined error number (#%1)... Numero errore idnefinito (#%1)... eQSL Error: User or password incorrect Errore eQSL: utente o password sbagliate eQSL Warning: At least one of the uplodaded QSOs is duplicated. Warning eQSSL: Almeno uno del QSO trasaferiti è duplicato. eQSL: All the QSOs were properly uploaded. eQSL: Tutti i QSO correttamente trasferiti. KLog - eQSL.cc password needed KLog - Password eQSL.cc richiesto Please enter your eQSL.cc password: Pler favore isnerirsci la tua password per wQSO.cc: KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ha mandato il seguente messaggio: %1 We have received an undefined error from eQSL (%1) Ricevuto erorre idnefinito da eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Per favore controlla la tua configurazione e contatta il team di sviluppo di KLog se non riesci a rrisolvere i problema. Trasaferimento eQSL disabilitato. klog-1.8.6/translations/klog_ca.ts0000644000175000017500000143402514166020421016137 0ustar develdevel AboutDialog About KLog Quant al KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. També ens podeu ajudar enviant informes d'error o col·laboracions petites de codi, idees o el que penseu que podria millorar el KLog. Authors Autors By Per Author Autor KLog is a free logbook for hamradio operators. El KLog és un llibre de registre lliure per a operadors de radioafició. Please provide your review in KLog's eHam review page: Si us plau, proporcioneu comentaris a la pàgina de revisions del KLog a eHam: today avui Main developer Desenvolupador principal KLog is developed by a very small team and you are invited to join! El KLog està desenvolupat per un equip molt petit i esteu convidat a unir-vos-hi! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Els desenvolupadors del KLog han inclòs una funcionalitat que informa de diverses dades de l'usuari al servidor del KLog amb l'únic propòsit d'identificar el nombre de versions instal·lades, per tal d'enfocar el desenvolupament en una direcció o una altra tenint en compte les necessitats dels usuaris. At present, the data that is provided is the following: Actualment, les dades proporcionades són les següents: Translators bring KLog into your language. They are really an important part of the KLog development team. Els traductors adapten el KLog al vostre idioma. Són una part important de l'equip de desenvolupament del KLog. Find more information and the latest release at Podeu trobar més informació i l'últim llançament a Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Tingueu en compte que aquest és un llançament de desenvolupament i pot contenir molts errors.<br>Feu una còpia de seguretat de les dades abans d'usar aquest programari! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Des de la versió 0.6.2, el KLog s'ha reescrit completament per a proporcionar una aplicació multiplataforma que s'executa a tots els sistemes operatius principals (GNU/Linux, macOS i Windows) i per a implementar funcionalitats noves. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si us agradaria col·laborar, agrairem que us subscribiu a la <a href="https://groups.io/g/klog">llista de correu del KLog</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si el KLog encara no està en el vostre idioma i voleu ajudar-nos, agrairem que contacteu amb la <a href="https://groups.io/g/klog">llista de correu del KLog</a>! Translators Traductors Privacy advisory Avís de privadesa Callsign Indicatiu KLog version Versió del KLog Operating system Sistema operatiu Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tingueu en compte que podeu activar/desactivar aquesta funcionalitat des de la pestanya Varis de la pàgina de Configuració. KLog KLog Privacy Privadesa AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Seleccioneu l'indicatiu de l'estació de la qual voleu usar per pujar el registre. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Seleccioneu la data d'inici a exportar els QSO. La data predeterminada és la data del primer QSO amb aquest indicatiu d'estació. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Seleccioneu la data de fi a exportar els QSO. La data predeterminada és la data del darrer QSO amb aquest indicatiu d'estació. Station callsign Indicatiu de l'estació Start date Data d'inici End date Data final Ok D'acord Cancel Cancel·la DX DX Date/Time Data/hora Band Banda Mode Mode Not defined No s'ha definit All Tot QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO que es pujaran a LoTW. This table shows the QSOs that will be sent to LoTW. Aquesta taula mostra els QSO que s'enviaran al LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO que es pujaran a ClubLog. This table shows the QSOs that will be sent to ClubLog. Aquesta taula mostra els QSO que s'enviaran a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO que es pujaran a l'eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Aquesta taula mostra els QSO que s'enviaran a l'eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO que es pujaran al QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Aquesta taula mostra els QSO que s'enviaran a QRZ.com. This table shows the QSOs that will be exported to ADIF. Aquesta taula mostra els QSO que s'exportaran a ADIF. AwardsWidget Recalculate Torna a calcular Click to recalculate the award status. Cliqueu per tornar a calcular l'estat dels diplomes. Select the year you want to check. Seleccioneu l'any que voleu comprovar. QSOs QSO DXCC DXCC CQ CQ Award Diploma Confirmed Confirmat Worked Treballat WAZ WAZ Score Puntuació Annual Anual Number of confirmed DXCC entities. Nombre d'entitats DXCC confirmades. Number of worked DXCC entities. Nombre d'entitats DXCC treballades. Number of confirmed WAZ zones. Nombre de zones WAZ confirmades. Number of worked WAZ zones. Nombre de zones WAZ treballades. Number of confirmed QSOs. Nombre de QSO confirmats. Number of worked QSOs. Nombre de QSO treballats. Number of QSOs worked in the selected year. Nombre de QSO treballats durant l'any seleccionat. Number of DXCCs worked in the selected year. Nombre de DXCC treballades durant l'any seleccionat. Number of CQ Zones worked in the selected year. Nombre de zones CQ treballades durant l'any seleccionat. Score for the DXMarathon in the selected year. Puntuació per al DXMarathon a l'any seleccionat. DX-Marathon DX-Marathon CTYPage Country data download Baixa les dades de països KLog needs country data... El KLog necessita dades de països... &Download &Baixa &Ignore &Ignora Country data needed Cal les dades de països KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. El KLog usa el fitxer «cty.csv» de https://www.country-files.com/ per aconseguir la informació de les DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Cal baixar el fitxer «cty.csv» si voleu que el KLog mostri els països, el localitzador, etc. dels QSO que feu. Click on Download to download now. Cliqueu a Baixa per baixar ara. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No s'ha pogut trobar la màquina. Reviseu la configuració de xarxa i proveu de nou Voleu tornar-ho a intentar? DXCCStatusWidget Update Actualitza It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entitat Prefix Prefix Pref: Pref: CQ: CQ: ITU: ITU: Beam: Raig: Entity not worked in this band. L'entitat no ha treballat en aquesta banda. DXClusterWidget Connect Connecta Clear Neteja Click on connect to connect to the DX-Cluster Cliqueu a Connecta per connectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster del KLog Click on Connect to connect to the DX-Cluster server Cliqueu a Connecta per connectar al servidor de DX-Cluster Trying to connect to the server S'intenta connectar amb el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexió ha estat rebutjada pel servidor. Assegureu-vos que el servidor de DXCluster està executant-se i comproveu que la configuració del nom de la màquina i el port sigui correcta. The following error occurred: %1. Ha ocorregut el següent error: %1. Connected to server Connectat al servidor KLog message Kontest message Missatge del KLog Enter your callsign to connect to the cluster: Introduïu el vostre indicatiu per connectar al clúster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduïu la contrasenya per connectar al clúster: (premeu retorn si no hi ha contrasenya) Not logged on, you may need to enter your callsign again. No esteu connectat, cal tornar a introduir el vostre indicatiu un altre cop. Enter here the commands to be sent to the DX-Cluster server. Introduïu aquí les ordres a enviar al servidor DX-Cluster. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! No ha estat possible obrir per escriptura el fitxer a on desar els avisos de DX. No es desarà l'activitat del DX-Cluster! Disconnect Desconnecta The host was not found. Please check: No s'ha trobat la màquina. Comproveu: - your network connection; - the host name and port settings. - la connexió de xarxa; - la configuració del nom de màquina i el port. Connection closed by the server Connexió tancada pel servidor Click on Connect to connect to the DX-Cluster server. Feu clic a Connecta per connectar al servidor DX-Cluster. Send Envia DataProxy_SQLite Software version in DB is null La versió del programari a la BD és nul Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terra-Lluna-Terra Sporadic E Sporadic E Internet-assisted Assistit per Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Repetidor o transponedor terrestre o atmosfèric Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satèl·lit Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. S'han actualitzat tots els QSO amb un DXCC i el continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed No ha fallat la consulta F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes No No Requested Sol·licitat Ignore/Invalid Ignora/No vàlid Validated Validat Queued En cua Uploaded Pujat Do not upload No pujat Modified Modificat Direct Directe Electronic Electrònic KLog DXCC DXCC del KLog KLog - Invalid call detected KLog - S'ha detectat un indicatiu no vàlid An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? S'ha detectat un indicatiu buit. Voleu exportar igualment aquest QSO (clic a Sí) o eliminar el camp del registre ADIF exportat? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? S'ha detectat un indicatiu no vàlid %1. Voleu exportar igualment aquest indicatiu (clic a Sí) o eliminar l'indicatiu del fitxer de registre exportat? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. L'exportació d'indicatius incorrectes pot crear problemes potencials a les aplicacions a les quals s'importa aquest fitxer de registre. Tanmateix, podria ser un indicatiu correcte que el KLog ha identificat incorrectament com a no vàlid. DownLoadCTY Download of cty.csv failed with the following error code: La baixada del «cty.csv» ha fallat amb el codi d'error següent: Download of cty.csv done. La baixada de «cty.csv» ha finalitzat. There is already a cty.csv file in the folder but it will be replaced with the new one. Ja hi ha un fitxer «cty.csv» a la carpeta, però se substituirà pel nou. Could not open %1 for writing No s'ha pogut obrir %1 per a escriptura FileAwardManager Open Award file Obre un fitxer de diplomes Award files (*.awa) Fitxers de diplomes (*.awa) Award file not opened El fitxer de diplomes no s'ha obert KLog was not able to read the award file El KLog no ha pogut llegir el fitxer de diplomes It was not possible to open the file %1 for reading. No ha estat possible obrir el fitxer %1 per a lectura. AWA wrong format Format AWA incorrecte The AWA file does not have the right format El fitxer AWA no té el format correcte AWA file does not have an <EOH> field El fitxer AWA no té un camp <EOH> KLog - %1 KLog - %1 FileManager Reading ADIF file... S'està llegint el fitxer ADIF... Abort reading Interromp la lectura Writing ADIF file... Escrivint el fitxer ADIF... Abort writing Interromp l'escriptura Processing LoTW ADIF file... S'està processant el fitxer ADIF de LoTW... Abort processing S'interromp el procés LoTW reading Lectura de LoTW KLog - Add new QSOs? KLog - Afegeixo els QSO nous? Do you want to add non existing QSOs to your local log? Voleu afegir els QSO no existents al vostre registre local? There are some QSOs in the LoTW log that are not in your local log. Hi ha diversos QSO en el registre del LoTW que no estan el vostre registre local. Processing LoTW ADIF file...... QSO: %1 / %2 S'està processant el fitxer ADIF de LoTW...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Heu cancel·lat el procés de LoTW. El procés s'aturarà i el vostre registre podria no estar completament actualitzat. Do you want to add dupe QSOs to your local log? Voleu afegir els QSO duplicats al vostre registre local? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Hi ha diversos QSO en aquest fitxer de registre que poden ser duplicats atès que tenen el mateix indicatiu, banda i mode i una data molt propera. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Feu clic a Sí per afegir un %1 predeterminat per al mode %2 a tots els QSO amb un problema semblant. KLog - Don't ask again KLog - No ho tornis a preguntar Do you want to reuse your answer? Voleu reutilitzar la resposta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. El KLog usarà automàticament la resposta anterior per a altres ocurrències similars, si n'hi ha, sense tornar-ho a preguntar. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Data/Hora:</i> %1</li><li>Indicatiu: %2</li><li>Banda: %3</li><li>Mode: %4</li></ul> KLog - QSO not found KLog - No s'ha trobat el QSO Do you want to add this QSO to the log?: Voleu afegir aquest QSO al registre?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? S'ha trobat un QSO que ve del LoTW que no és al vostre registre local. Voleu que el KLog afegeixi aquest QSO al registre? KLog - Invalid call detected KLog - S'ha detectat un indicatiu no vàlid An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? S'ha detectat un indicatiu buit. Voleu exportar igualment aquest QSO (clic a Sí) o eliminar el camp del fitxer de registre exportat? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? S'ha detectat un indicatiu no vàlid %1. Voleu exportar igualment aquest indicatiu (clic a Sí) o eliminar l'indicatiu del fitxer de registre exportat? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. L'exportació d'indicatius incorrectes pot crear problemes potencials a les aplicacions a les quals s'importa aquest fitxer de registre. Tanmateix, podria ser un indicatiu correcte que el KLog ha identificat incorrectament com a no vàlid. En qualsevol cas podreu editar el fitxer ADIF una vegada acabi el procés d'exportació. The selected callsign (%1) is not valid, please check it again to export the log. L'indicatiu (%1) seleccionat no és vàlid, comproveu-ho de nou per a exportar el registre. There are no QSOs pending to be exported with that station callsign. No hi ha cap QSO pendent d'exportar amb aquest indicatiu d'estació. Export Exporta Export progress Progrés de l'exportació Writing ADIF file... QSO: S'està escrivint el fitxer ADIF... QSO: Reading LoTW file... S'està llegint el fitxer LoTW... You have canceled the file import. The file will be removed and no data will be imported. Heu cancel·lat la importació del fitxer. El fitxer s'eliminarà i no s'importarà cap dada. This QSO is not including the minimum data to consider a QSO as valid! Aquest QSO no inclou les dades mínimes per a considerar-se un QSO vàlid! Do you want to continue with the current file? Voleu continuar amb el fitxer actual? - The band missing and the following call: - Manca la banda i l'indicatiu següent: - The mode missing and the following call: - Manca el mode i l'indicatiu següent: - The date missing and the following call: - Manca la data i l'indicatiu següent: - The time missing and the following call: - Manca l'hora i l'indicatiu següent: You have canceled the file export. The file will be removed and no data will be exported. Heu cancel·lat l'exportació del fitxer. El fitxer s'eliminarà i no s'exportarà cap dada. KLog - Error KLog - Error The selected log does not exist, please check it again. El registre seleccionat no existeix, comproveu-ho de nou. The file %1 can't be opened. El fitxer «%1» no s'ha pogut obrir. KLog - User cancelled KLog - L'usuari ha cancel·lat Do you still want to cancel? Encara voleu cancel·lar? QSO: QSO: KLog - File not opened KLog - Fitxer no obert It was not possible to open the file %1 for reading. No ha estat possible obrir el fitxer %1 per a lectura. KLog was not able to read the LoTW file El KLog no ha pogut llegir el fitxer del LoTW Importing LoTW ADIF file... S'està important el fitxer ADIF del LoTW... KLog - Log selection KLog - Selecció de registre There is more than one log in this logfile. Hi ha més d'un registre en aquest fitxer de registre. All logs will be imported into the current log. S'importaran tots els registres al registre actual. Do you want to continue? Voleu continuar? Importing ADIF file... S'està important el fitxer ADIF... KLog - Duplicated QSOs KLog - QSO duplicats It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Sembla que hi ha diversos QSO duplicats al fitxer ADIF que s'està important. Voleu continuar? (Els QSO duplicats no s'importaran) KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: El KLog ha trobat un QSO sense un identificador definit d'estació. Introduïu l'identificador d'estació que es va usar per fer aquest QSO amb %1 a %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: El KLog ha trobat un QSO sense un identificador definit d'estació. Introduïu l'identificador d'estació que es va usar per fer aquest QSO a %1: Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Sembla que manca la informació RST-TX a diversos QSO d'aquest registre (p. ex.: %1). Exporting ADIF file... QSO: %1 / %2 S'està exportant el fitxer ADIF... QSO: %1 / %2 If you select NO, maybe the QSO will not be imported. Si seleccioneu No, potser no s'importaran els QSO. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Sembla que manca la informació RST-RX a diversos QSO d'aquest registre (p. ex.: %1). KLog - Apply to all QSOs in this log? KLog - Aplico a totes els QSO d'aquest registre? Please edit the ADIF file and make sure that it include at least: Editeu el fitxer ADIF i assegureu-vos que inclou, com a mínim: and i This QSO had: Aquest QSO té: KLog: Not all required data found! KLog: No s'han trobat totes les dades necessàries! KLog: No RST TX found! KLog: No s'ha trobat RST TX! KLog: No RST RX found! KLog: No s'ha trobat RST RX! KLog - No Station callsign entered. KLog - No s'ha introduït l'identificador de l'estació. KLog - QSO without Station Callsign KLog - QSO sense identificador de l'estació HamLibNetworkConfigWidget Enter the hostname or address of the radio. Introduïu el nom de la màquina o l'adreça de la ràdio. Set de network port of the radio. Estableix el port de xarxa de la ràdio. Host/Address Màquina/Adreça Port Port Enter the port of the radio. Estableix el port de la ràdio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Seleccioneu la velocitat del port sèrie. Port Port Select the serial port. Only the serial ports that are detected are shown. Seleccioneu el port sèrie. Només es mostren els ports sèrie detectats. Scan Escaneja Click to identify the serial ports available in your computer. Feu clic per identificar els ports sèrie disponibles a l'ordinador. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de dades Select the serial data bits. Seleccioneu els bits de dades del sèrie. None Sense Hardware Maquinari Software XON/XOFF Programari XON/XOFF Flow control Control de flux Select the serial flow control Seleccioneu el control de flux del sèrie No parity Sense paritat Even Parells Odd Senars Space Espai Mark Marca Parity Paritat Select the serial parity. Seleccioneu la paritat del sèrie. Default Predeterminat 1 bit 1 bit 2 bits 2 bits Stop bits Bits de parada Select the serial stop bits. Seleccioneu els bits d'aturada del sèrie. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Prefix CQ CQ ITU ITU Short Path Camí curt Long Path Camí llarg Deg Graus Miles Milles Km Km IntroPage Welcome to KLog! Welcome to Kontest! Us donem la benvinguda al KLog! Welcome to KLog! - brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït segons els termes de la GPL! Welcome to KLog Us donem la benvinguda al KLog This looks like it's the first time you've run KLog on this computer. Sembla que aquesta és la primera vegada que s'executa el KLog en aquest ordinador. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. El KLog és un programa lliure d'enregistrament de radioafició que es pot executar en el GNU/Linux, macOS, i Windows. It is designed to provide general purpose DX, and contest logging. Està dissenyat per proporcionar un enregistrament de caràcter general de DX i per a concursos. It supports QSL management, import and export of ADIF Permet la gestió de QSL, importació i exportació d'ADIF and Cabrillo file formats and many other features... de fitxer ADIF i Cabrillo, i moltes altres funcionalitats... Before you can start using KLog, you will be asked to: Abans de començar a usar el KLog, us demanarem: Acknowledge to the terms of the license. Reconeixement dels termes de la llicència. Download the DX entities information. Baixada de la informació de les entitats DX. Enter your callsign, CQ zone, etc. and main configuration. Introduïu el vostre identificador, zona CQ, etc. i configuració principal. Enjoy KLog and contact the development team if you have any suggestions! Gaudiu del KLog i contacteu amb l'equip de desenvolupament si teniu qualsevol suggeriment! LicPage KLog License information Informació de la llicència del KLog Welcome to KLog!- brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït segons els termes de la GPL! Acknowledge Reconeixement Be aware that KLog is free software. Tingueu present que el KLog és programari lliure. LoTWUtilities KLog - LoTW password needed KLog - Cal la contrasenya del LoTW Please enter your LoTW password: Introduïu la contrasenya del LoTW: There is a file already existing with the name that will be used. Ja hi ha un fitxer existent amb el nom que s'usarà. The file %1 already exist. Do you want to overwrite? El fitxer %1 ja existeix. Voleu sobreescriure'l? KLog was not able to save the file %1. Error returned: %2 El KLog no ha pogut desar el fitxer %1. Error retornat: %2 Downloading data to file: %1. S'estan baixant les dades al fitxer: %1. KLog - LoTW download KLog - Baixada del LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Aquesta és la primera data d'un QSO amb l'indicatiu %1 en aquest registre. Si penseu que podeu tenir QSO anteriors al LoTW, contesteu No. Do you want to use this date (%1) as start date? Voleu usar aquesta data (%1) com a data d'inici? The remote server redirected our connection to %1 El el servidor remot ha redireccionat la connexió a %1 Do you want to follow the redirection? Voleu seguir la redirecció? It was not possible for find the file %1 that has been just downloaded. No ha estat possible trobar el fitxer %1 que s'acaba de baixar. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Sembla que el LoTW no té cap QSO amb l'indicatiu d'estació que esteu usant (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Torneu a intentar-ho i envieu el fitxer baixat (%1) al desenvolupador del KLog per a la seva anàlisi. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? El KLog ha baixat correctament %1 QSO. Voleu actualitzar el registre amb les dades baixades? Double click on the date that you want to use as the start date for downloading QSOs. Feu clic doble a la data que vulgueu usar com a data d'inici per a baixar els QSO. KLog - LoTW Station callsign KLog - Indicatiu d'estació del LoTW There is not a single QSO in the log with that station callsign. No hi ha cap QSO individual al registre amb aquest indicatiu d'estació. Are you sure that you want to use that station callsign (%1)? Segur que voleu usar aquest indicatiu d'estació (%1)? KLog - LoTW File already exists KLog - El fitxer del LoTW ja existeix KLog - LoTW Can't write the file KLog - No s'ha pogut escriure el fitxer del LoTW The file %1 already exists. El fitxer %1 ja existeix. KLog - LoTW Start date selection KLog - Selecció de la data d'inici del LoTW KLog - LoTW Download error KLog - Error de baixada del LoTW There was an error (%1) while downloading the file from LoTW. S'ha produït un error (%1) en baixar el fitxer des del LoTW. The downloading error details are: %1 Els detalls de l'error de la baixada són: %1 KLog - LoTW Redirection found KLog - S'ha trobat una redirecció del LoTW KLog - LoTW File not found KLog - No s'ha trobat el fitxer del LoTW KLog can't find the downloaded file. No s'ha pogut trobar el fitxer baixat. KLog - LoTW user/password error KLog - Error d'usuari/contrasenya del LoTW LoTW server did not recognized your user/password El servidor LoTW no ha reconegut l'usuari/contrasenya Check your user and password and ensure your are using the right one before trying again. Verifiqueu l'usuari i la contrasenya i assegureu-vos que esteu usant els correctes abans de tornar a provar-ho. KLog - LoTW No QSOs KLog - LoTW no QSO LoTW sent no QSOs El LoTW no ha enviat cap QSO KLog - LoTW Unknown error KLog - Error desconegut del LoTW KLog can't recognize the file that has been downloaded from LoTW. El KLog no ha pogut reconèixer el fitxer que s'ha baixat des del LoTW. Now KLog will process the downloaded QSO and update your local log. Ara el KLog processarà els QSO baixats i actualitzarà el registre local. LogWindow QSL Send QSL enviada QSL Rcvd QSL rebuda &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa Via bureau Via bureau QSL &received via bureau QSL &rebuda via bureau Direct Directa QSL received via direc&t QSL rebuda via direc&ta Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Check in DXHeat.com Comprova a DXHeat.com Check this callsign in DXHeat.com Comprova aquest identificador a DXHeat.com Delete selected QSOs Suprimeix els QSO seleccionats Delete the selected QSOs Suprimeix els QSO seleccionats Export to ADIF Exporta a ADIF Export the selected QSOs to an ADIF file. Exporta els QSO seleccionats a un fitxer ADIF. Upload to LoTW Puja al LoTW Upload the selected QSOs to LoTW Puja els QSO seleccionats al LoTW Upload to ClubLog Puja a ClubLog Upload the selected QSOs to ClubLog Puja els QSO seleccionats a ClubLog Upload to eQSL.cc Puja a l'eQSL.cc Upload the selected QSOs to eQSL.cc Puja els QSO seleccionats a l'eQSL.cc Send these QSLs via bureau Envia aquestes QSL via bureau Send these QSLs via direct Envia aquestes QSL via directa QSLs received via bureau QSL rebudes via bureau QSLs received via direc&t QSL rebudes via direc&ta Select none No en seleccionis cap Remove all selections Elimina totes les seleccions Select all Selecciona-ho tot Select all the QSOs Selecciona tots els QSO MainQSOEntryWidget &Add &Afegeix &Clear &Neteja Callsign of the QSO. Indicatiu del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Mode del QSO. Date of the QSO. Data del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Afegeix el QSO al registre. Clears the QSO entry. Neteja l'entrada QSO. KLog will show real time if enabled. El KLog mostrarà l'hora real si està activada. Real time Temps real Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Indicatiu &Modify &Modifica DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog S'està iniciant el KLog DX Entity Entitat DX &Log Window &Finestra del registre KLog KLog It seems that you have never done a backup or exported your log to ADIF. Sembla que mai s'ha fet una còpia de seguretat o s'ha exportat el registre a ADIF. It seems that the latest backup you did is older than one month. Sembla que la darrera còpia de seguretat que s'ha fet és anterior a un mes. Log backup recommended! Es recomana una còpia de seguretat del registre! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. És una bona pràctica fer regularment una còpia de seguretat del registre complet per a evitar perdre dades en cas d'algun problema. Un cop feta l'exportació del registre a una fitxer ADIF, caldria copiar aquest fitxer en un lloc segur, com una unitat USB, una unitat al núvol, un altre ordinador,... El KLog us recordarà que feu una còpia de seguretat mensualment. Ready Llest An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: S'ha produït un error inesperat en intentar afegir el QSO al registre. Si el problema persisteix, contacteu amb el desenvolupador per a una anàlisi: You have selected an entity: Heu seleccionat una entitat: that is different from the KLog proposed entity: que és diferent de l'entitat proposada pel KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Feu clic al prefix de l'entitat correcta o Cancel·la per tornar a editar el QSO. Click on the prefix of the right entity or Cancel to correct. Feu clic al prefix de l'entitat correcta o Cancel·la per corregir. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Segur que voleu marcar TOTS els vostres QSO per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu QSO al %1 ClubLog ClubLog KLog - QRZ.COM KLog - QRZ.COM QRZ.COM QRZ.com Filling QSOs ... Omplint els QSO... RSTrx RSTrx RSTtx RSTtx Select the Station Callsign to use when quering LoTW: Seleccioneu l'indicatiu d'estació a usar per consultar el LoTW: Please check the LoTW setup Comproveu la configuració del LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. No s'ha definit cap usuari del LoTW o un indicatiu d'estació adequat. Obriu la pestanya del LoTW a l'arranjament i configureu la connexió del LoTW. Do you really want to exit KLog? Esteu segur que voleu sortir del KLog? KLog - CTY.dat update KLog - Actualització de CTY.dat KLog - Backup KLog - Còpia de seguretat KLog - New version detected! KLog - S'ha detectat una versió nova! &File &Fitxer Import an ADIF file into the current log. Importa un fitxer ADIF al registre actual. Export the current log to an ADIF logfile. Exporta el registre actual a un fitxer ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporta tots els QSO a un fitxer ADIF, fusionant els QSO de tots els registres. Print your log. Imprimeix el registre. KLog folder Carpeta del KLog Opens the data folder of KLog. Obre la carpeta de dades del KLog. E&xit S&urt &Tools &Eines Fill in QSO data Omple les dades QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Recorre el registre reutilitzant els QSO anteriors per omplir informació que manqui en altres QSO. Shows QSOs for which you should send your QSL and request the DX QSL. Mostra els QSO pels quals cal enviar la vostra QSL i sol·licitar la DX QSL. Find My-QSLs pending to send Cerca les meves QSL pendents d'enviar Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Mostra els QSO amb sol·licituds pendents d'enviar les QSL. Cal mantenir buida aquesta cua! Mark all queued QSOs in this log as sent to LoTW. Marca tots els QSO posats en cua d'aquest registre com a enviats al LoTW. Mark all queued QSOs as sent to LoTW. Marca tots els QSO posats en cua com a enviats al LoTW. Sends the log to LoTW calling TQSL. Envia el registre al LoTW cridant el TQSL. For updated DX-Entity data, update cty.csv. Per a dades DX-Entity actualitzades, actualitzeu el «cty.csv». Check always the current callsign in QRZ.com Comprova sempre l'indicatiu actual a QRZ.com You can update the entities database in Tools->Update cty.csv Podeu actualitzar la base de dades d'entitats a Eines -> Actualitza el «cty.csv» Do you want to do it now? Voleu fer-ho ara? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? L'indicatiu %1 no és un indicatiu vàlid. Esteu segur que voleu afegir aquest indicatiu al registre? KLog - Not valid callsign KLog - Indicatiu no vàlid The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? L'indicatiu %1 no és un indicatiu vàlid. Esteu segur que voleu afegir aquest indicatiu al registre? Stats Estadístiques Show the statistics of your radio activity. Mostra les estadístiques de la vostra activitat de ràdio. &Help &Ajuda Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Segur que voleu marcar TOTS els QSO d'aquest registre per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu aquests QSO al LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Segur que voleu marcar TOTS els QSO pendents per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu aquests QSO al LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. El TQSL no està instal·lat o el KLog no l'ha pogut trobar. Comproveu la configuració. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error núm. 1: L'usuari ha cancel·lat el procés o el TQSL no estava configurat. No s'ha pujat cap QSO. Error #2: Upload was rejected by LoTW, please check your data. Error núm. 2: El LoTW ha rebutjat la pujada, comproveu les dades. Error #3: The TQSL server returned an unexpected response. Error núm. 3: El servidor TQSL ha retornat una resposta inesperada. Error #4: There was a TQSL error. Error núm. 4: Hi ha hagut un error del TQSL. Error #5: There was a TQSLLib error. Error núm. 5: Hi ha hagut un error del TQSLLib. Error #6: It was not possible to open the input file. Error núm. 6: No ha estat possible obrir el fitxer d'entrada. Error #7: It was not possible to open the ouput file. Error núm. 7: No ha estat possible obrir el fitxer de sortida. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error núm. 8: No s'ha processat cap QSO ja que alguns QSO estaven duplicats o fora de l'interval de dates. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error núm. 9: S'han processat alguns QSO, i alguns QSO s'han ignorat perquè estaven duplicats o fora de l'interval de dates. Error #10: Command syntax error. KLog sent a bad syntax command. Error núm. 10: Error de sintaxi de l'ordre. El KLog ha enviat una ordre amb sintaxi incorrecta. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error núm. 11: Error de connexió al LoTW (no hi ha xarxa o el LoTW no és accessible). Error #00: Unexpected error. Please contact the development team. Error núm. 00: Error inesperat. Contacteu amb l'equip de desenvolupament. The log that you have selected contains more than just one station callsign. El registre que heu seleccionat conté més d'un indicatiu d'estació. Please select the station callsign you want to mark as sent to LoTW: Seleccioneu l'indicatiu d'estació que voleu marcar com enviat a LoTW: Station Callsign: Indicatiu d'estació: Define Station Callsign Defineix l'indicatiu d'estació Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduïu l'indicatiu d'estació emprat en aquest registre o deixeu-ho buit pels QSO sense indicatiu d'estació definit: KLog - No station selected KLog - No s'ha seleccionat cap estació No station callsign has been selected and therefore no log will be marked No s'ha seleccionat cap indicatiu, i per tant no es marcarà cap registre Congratulations! Enhorabona! You already have the latest version. Ja teniu la versió més recent. You can find the KLog data folder here: Podeu trobar la carpeta de dades del KLog aquí: start començar stop aturar If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si esteu segur que la base de dades conté QSO i el KLog no és capaç de trobar-los, contacteu amb els desenvolupadors (vegeu Quant al KLog) per sol·licitar ajuda. You need to select one station callsign to be able to send your log to LoTW. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre al LoTW. You need to select one station callsign to be able to send your log to ClubLog. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre a ClubLog. Do you want to add this QSOs to your ClubLog existing log? Voleu afegir aquests QSO al vostre registre existent del ClubLog? If you don't agree, this upload will overwrite your current ClubLog existing log. Si no hi esteu d'acord, aquesta pujada sobreescriurà el vostre registre actual existent a ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre a l'eQSL.cc. KLog - Select the Station Callsign. KLog - Selecció de l'indicatiu d'estació. The log is ready to be uploaded to ClubLog. Aquest registre està preparat per pujar-se al ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat del ClubLog KLog could not mark the full log to be sent to ClubLog El KLog no ha pogut marcar el registre complet per a enviar al ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Quelcom ha evitat que el KLog marqui els QSO com a modificats. Reinicieu el KLog i torneu-ho a provar abans de contactar amb els desenvolupadors del KLog. The log is ready to be uploaded to eQSL.cc. Aquest registre està preparat per pujar-se a l'eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat de l'eQSL.cc KLog could not mark the full log to be sent to eQSL El KLog no ha pogut marcar el registre complet per a enviar a l'eQSL QSO logged from WSJT-X: QSO enregistrat des del WSJT-X: It seems that you are running this version of KLog for the first time. Sembla que esteu executant aquesta versió del KLog per primera vegada. The setup will be open to allow you to do any new setup you may need. S'obrirà la configuració per permetre establir qualsevol paràmetre nou que calgui. KLog - ClubLog error KLog - Error del ClubLog KLog - eQSL error KLog - Error d'eQSL KLog - %1 KLog - %1 The logfile has been modified. El fitxer de registre s'ha modificat. Do you want to save your changes? Voleu desar els canvis? KLog - ADIF export KLog - Exportació ADIF Download from LoTW ... Baixa des del LoTW... Download the full log from LoTW ... Baixa el registre complet des del LoTW... ClubLog tools ... Eines del ClubLog... Upload the queued QSOs to ClubLog ... Puja els QSO en la cua a ClubLog... eQSL tools ... Eines d'eQSL... Upload the queued QSOs to eQSL.cc ... Puja els QSO en la cua a l'eQSL.cc... QRZ.com tools ... Eines de QRZ.com... Upload the queued QSOs to QRZ.com ... Puja els QSO en la cua a QRZ.com... Update cty.csv Actualitza el «cty.csv» Update Satellite Data Actualitza les dades dels satèl·lits Online manual (F1) ... Manual en línia (F1)... &Tips ... &Consells... &About ... &Quant a... About Qt ... Quant a les Qt... Check updates ... Comprova si hi ha actualitzacions... Your log has been updated with the LoTW downloaded QSOs. El registre s'ha actualitzat amb els QSO baixats del LoTW. KLog has updated %1 QSOs from LoTW. El KLog ha actualitzat %1 QSO des del LoTW. You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. No heu seleccionat cap indicatiu. El KLog marcarà els QSO sense cap indicatiu d'estació definit i aquells amb l'indicatiu que introduïu aquí. About ... Quant a... KLog - Update checking result KLog - Resultat de la comprovació d'actualitzacions UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor UDP ha fallat en %1. Status of the DX entity. Estat de l'entitat DX. Name of the DX entity. Nom de l'entitat DX. QSO QSO QSL QSL eQSL eQSL Comment Comentari Others Altres My Data Les meves dades Satellite Satèl·lit DXCC DXCC Info Informació KLog - File not open KLog - Fitxer no obert It was not possible to open the debug file for writing. No debug log will be saved! No s'ha pogut obrir per escriptura el fitxer de depuració. No es desarà cap fitxer de depuració! Status bar ... Barra d'estat... KLog - Unexpected error KLog - Error inesperat KLog - Not valid call KLog - Indicatiu no vàlid Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Afegir indicatius no vàlids al registre pot crear problemes en sol·licitar diplomes, exportar a fitxers ADIF o a altres sistemes o aplicacions. KLog - Select correct entity KLog - Seleccioneu l'entitat correcta No DXCC Sense DXCC None Sense You have requested to delete the QSO with: %1 Heu demanat suprimir el QSO amb: %1 Are you sure? Esteu segur? KLog needs to update the Entities database. Cal actualitzar la base de dades d'entitats del KLog. You have requested to delete several QSOs Heu sol·licitat suprimir diversos QSO The ClubLog upload process has finished with an error and the log was possibly not uploaded. El procés de pujada al ClubLog ha finalitzat amb un error i possiblement el registre no s'ha pujat. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Comproveu les vostres credencials, la connexió a Internet i el vostre compte al ClubLog. El codi d'error ha estat: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Voleu marcar com a pujats tots els QSO pujats al ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO al ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada al ClubLog ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? The file has not been removed. El fitxer no s'ha eliminat. It seems that there was something that prevented KLog from removing the file You can remove it manually. Sembla que hi ha hagut quelcom que ha evitat que el KLog elimini el fitxer El podeu eliminar manualment. The eQSL upload process has finished with an error and the log was possibly not uploaded. El procés de pujada a l'eQSL ha finalitzat amb un error i possiblement el registre no s'ha pujat. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Comproveu les vostres credencials, la connexió a Internet i el vostre compte a l'eQSL. El codi d'error ha estat: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Voleu marcar com a pujats tots els QSO pujats a l'eQSL? There was an error while updating to Yes the eQSL QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO a l'eQSL. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada a l'eQSL ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? KLog - Exit KLog - Sortida &Import from ADIF ... &Importa des d'ADIF... Export to ADIF ... Exporta a ADIF... Export all logs to ADIF ... Exporta tots els registres a ADIF... &Print Log ... Im&primeix el registre... QSL tools ... Eines QSL... Find QSO to QSL Cerca QSO a les QSL Find DX-QSLs pending to receive Cerca les DX-QSL pendents de rebre Shows DX-QSLs for which requests or QSLs have been sent with no answer. Mostra les DX-QSL que s'han sol·licitat o els QSL enviats que no tenen resposta. Find requested pending to receive Cerca sol·licituds pendents de rebre Shows the DX-QSLs that have been requested. Mostra les DX-QSL que s'han sol·licitat. LoTW tools ... Eines LoTW... Queue all QSLs from this log to be sent Posa a la cua per a enviar tots els QSL d'aquest registre Mark all non-sent QSOs in this log as queued to be uploaded. Marca tots els QSO no enviats en aquest registre com a posats en cua per pujar. Queue all QSLs to be sent Posa a la cua per a enviar tots els QSL Put all the non-sent QSOs in the queue to be uploaded. Posa tots els QSO no enviats a la cua per pujar. Mark all queued QSOs from this log as sent Marca tots els QSO posats en cua d'aquest registre com a enviats Mark all queued QSOs as sent Marca tots els QSO posats en cua com a enviats Check the current callsign in QRZ.com Comprova l'indicatiu actual a QRZ.com &Debug ... &Depura... All pending QSOs of this log has been marked as queued for LoTW! Tots els QSO pendents d'aquest registre s'han marcat com a posats en cua per al LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Hi ha hagut un problema en marcar tots els QSO pendents d'aquest registre com a posats en cua per al LoTW! Your log has not been updated. El registre no s'ha actualitzat. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. No s'ha actualitzat cap QSO amb les dades provinents del LoTW. Això pot passar per errors al fitxer de registre o senzillament perquè el registre ja estava actualitzat. All pending QSOs has been marked as queued for LoTW! Tots els QSO pendents s'han marcat com a posats en cua per al LoTW! All queued QSOs has been marked as sent to LoTW! Tots els QSO posats en cua s'han marcat com a enviats al LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua d'aquest registre com a enviats al LoTW! It seems that there are no QSOs in the database. Sembla que no hi ha cap QSO a la base de dades. This function is disabled. Go to the Setup->LoTW tab to enable it. Aquesta funció està desactivada. Aneu a la Configuració -> Pestanya LoTW per activar-la. Awards Diplomes Search Cerca Log Registre DX-Cluster DX-Cluster No QSOs have been exported to ADIF. No s'ha exportat cap QSO a ADIF. KLog has exported %1 QSOs to the ADIF file: %2 El KLog ha exportat %1 QSO al fitxer ADIF: %2 Save ADIF File Desa el fitxer ADIF There was an error while updating to Yes the LoTW QSL sent information. Hi ha hagut un error en actualitzar a Sí la informació d'enviament QSL al LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada al LoTW ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? The file has been removed. El fitxer s'ha eliminat. Date/Time Data/hora KLog - QSO received KLog - S'ha rebut un QSO Station Callsign Indicatiu de l'estació Operator Callsign Indicatiu de l'operador Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Els QSO duplicats cal que coincideixin amb un altre QSO existent amb el mateix indicatiu, banda, mode, data i hora, atenint en compte que el període es pot definir a la configuració. KLog - Non-supported mode KLog - Mode no implementat A new mode not supported by KLog has been received from an external program or radio: El KLog ha rebut un mode nou no admès des d'un programa extern o ràdio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Voleu mantenir la recepció d'aquestes alertes? (la desactivació d'aquestes alertes evitarà que es detectin els modes no vàlids) Native Error Error nadiu Recommendation: Recomanació: Periodically export your data to ADIF to prevent a potential data loss. Exporteu periòdicament les dades a ADIF per a evitar la pèrdua potencial de les dades. KLog - LoTW KLog - LoTW Upload the queued QSOs to LoTW Puja els QSO en la cua a LoTW The backup was done successfully La còpia de seguretat s'ha efectuat correctament KLog will remind you to backup your data again in aprox one month. El KLog us recordarà que feu una còpia de seguretat de les dades aproximadament dins un mes. The backup was not properly done. La còpia de seguretat no s'ha efectuat correctament. It is recommended to backup your data periodically to prevent lose or corruption of your log. És recomanable fer periòdicament còpia de seguretat de les dades per a evitar la pèrdua o la corrupció del registre. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Aquesta operació eliminarà definitivament els QSO seleccionats i les dades associades i no les podreu tornar a recuperar. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. El procés de pujada a QRZ.com ha finalitzat amb un error i possiblement el registre no s'ha pujat. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Voleu marcar com a pujats tots els QSO pujats a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO a QRZ.com. The QRZ.com upload process has finished successfully El procés de pujada a QRZ.com ha finalitzat correctament Call not found in QRZ.com Indicatiu no trobat a QRZ.com KLog - QRZ.com error KLog - Error de QRZ.com KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog has received an error from QRZ.com. El KLog ha rebut un error des de QRZ.com. You need to activate the %1 service in the eLog preferences. Cal activar el servei %1 a les preferències de l'eLog. It is important to export to ADIF and save a copy as a backup. És important exportar a ADIF i desar una còpia com a còpia de seguretat. Saving the log was done successfully. El desament del registre s'ha fet correctament. The ADIF export was not properly done. El desament ADIF no s'ha efectuat correctament. Settings ... Configuració... Queue all the QSOs to be uploaded Posa a la cua tots els QSO per a pujar Queue all the QSO to be uploaded Posa a la cua tots els QSO per a pujar Now you can upload them to LoTW. Ara els podeu pujar al LoTW. There was a problem to mark all pending QSOs as queued for LoTW! Hi ha hagut un problema en marcar tots els QSO pendents com a posats en cua per al LoTW! All queued QSOs of this log has been marked as sent to LoTW! Tots els QSO posats en cua d'aquest registre s'han marcat com a enviats al LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua com a enviats al LoTW! TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? El TQSL ha finalitzat sense cap error. Voleu marcar com a enviats tots els QSO pujats al LoTW? The log is ready to be uploaded to QRZ.com. Aquest registre està preparat per pujar-se a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat de QRZ.com KLog could not mark the full log to be sent to QRZ.com El KLog no ha pogut marcar el registre complet per a enviar a QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Cal definir una clau adequada de l'API per al vostre llibre de registre de QRZ.com a les preferències de l'eLog. Open File Obre un fitxer - Needed for DXMarathon - Necessari per DXMarathon Abort filling Interromp l'ompliment Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: S'està omplint DXCC, CQz, ITUz, continent al QSO... QSO: Number Número Callsign Indicatiu Band Banda Mode Mode Print Log Imprimeix el registre Abort printing Interromp la impressió Printing the log ... S'està imprimint el registre... Printing the log... QSO: S'està imprimint el registre... QSO: The following QSO data has been received from WSJT-X to be logged: S'han rebut les dades QSO següents des del WSJT-X per a enregistrar: Freq Freq Time On Hora d'inici Time Off Hora final RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Local-Grid KLog - WSJTX Dupe QSO KLog - QSO duplicat del WSJTX This QSO seems to be duplicated. Do you want to save or discard it? Sembla que aquest QSO és duplicat. El voleu desar o descartar? If the received mode is correct, please contact KLog development team and request support for that mode Si el mode rebut és correcte, contacteu amb l'equip de desenvolupament del KLog i sol·liciteu la implementació d'aquest mode KLog - Duplicated satellite KLog - Satèl·lit duplicat A duplicated satellite has been detected in the file and will not be imported. S'ha detectat un satèl·lit duplicat al fitxer i no s'importarà. Please check the satellite information file and ensure it is properly populated. Comproveu el fitxer d'informació del satèl·lit i assegureu que estigui correctament omplert. Now you will see a more detailed error that can be used for debugging... Ara veureu un error més detallat que es pot usar per a la depuració... An unexpected error ocurred!! Hi ha hagut un error inesperat!! If the problem persists, please contact the developers Si el problema persisteix, contacteu amb els desenvolupadors for analysis: per a l'anàlisi: Error in function Error a la funció Error text Text de l'error Failed query Ha fallat la consulta KLog - Show errors KLog - Mostra els errors Do you want to keep showing errors? Voleu mantenir la visualització dels errors? MainWindowInputComment Comment Comentari Add a comment for this QSO. Afegeix un comentari per a aquest QSO. Keep this data Mantén aquestes dades Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. MainWindowInputEQSL Date of the ClubLog upload. Data de la pujada al ClubLog. Date of the QRZ.com upload. Data de la pujada a QRZ.com. Date of the eQSL sending. Data de l'enviament de la eQSL. Date of the eQSL reception. Data de la recepció de la eQSL. Date of the LoTW sending. Data de l'enviament del LoTW. Date of the LoTW reception. Data de la recepció del LoTW. Status on QRZ.com. Estat al QRZ.com. Status of the LoTW sending. Estat de l'enviament del LoTW. Status of the LoTW reception. Estat de la recepció del LoTW. QRZ.com QRZ.com LoTW Sent LoTW enviat LoTW Rec LoTW rebut Status on ClubLog. Estat al ClubLog. Status of the eQSL sending. Estat de l'enviament de la eQSL. Status of the eQSL reception. Estat de la recepció de la eQSL. ClubLog ClubLog eQSL Sent eQSL enviada eQSL Rec eQSL rebuda MainWindowInputOthers Primary Div Div principal Secondary Div Div secundària IOTA IOTA Entity Entitat Propagation mode Mode de propagació Others Altres Keep propagation mode Mantén el mode de propagació Select the primary division for this QSO. Selecciona la divisió primària per aquest QSO. Select the secondary division for this QSO. Selecciona la divisió secundària per aquest QSO. Select the entity for this QSO. Selecciona l'entitat per aquest QSO. Select the propagation mode for this QSO. Selecciona el mode de propagació per aquest QSO. Select the IOTA continent for this QSO. Seleccioneu el continent IOTA per aquest QSO. Select the IOTA reference number for this QSO. Seleccioneu el número de referència IOTA per aquest QSO. Keeps the same propagation mode for next QSO. Mantén el mateix mode de propagació per al QSO següent. Select the appropriate ADIF field for this QSO. Selecciona el camp apropiat de l'ADIF per a aquest QSO. Value for the selected ADIF field. Valor per al camp ADIF seleccionat. Not Identified No identificat Not - Not Identified Not - No identificat SOTA Ref Referència SOTA Age Antiguitat VUCC grids Quadrícules VUCC MainWindowInputQSL QSL Sent QSL enviada QSL Rec QSL rebuda QSL Via QSL via QSL Msg Missatge QSL Status of the QSL sending. Estat de l'enviament de la QSL. Status of the QSL reception. Estat de la recepció de la QSL. QSL sending information. Informació d'enviament de la QSL. QSL reception information. Informació de recepció de la QSL. Date of the QSL sending. Data de l'enviament de la QSL. Date of the QSL reception. Data de la recepció de la QSL. Message of the QSL. Missatge de la QSL. QSL via information. QSL via informació. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. Freqüència de TX en MHz. RX Frequency in MHz. Freqüència de RX en MHz. Power used by the contacted station. Potència usada per l'estació contactada. Name of the contacted operator. Nom de l'operador contactat. QTH of the contacted station. QTH de l'estació contactada. Locator of the contacted station. Localitzador de l'estació contactada. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nom QTH QTH DX Locator Localitzador DX Power(rx) Potència (rx) RST(tx) RST (tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX DX QTH locator. Localitzador QTH de DX. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Localitzador DX QTH. El format hauria de ser «Maidenhead» semblant a IN70AA de fins a 10 caràcters. TX Frequency in MHz. Frequency is not in a hamradio band! Freqüència TX en MHz. La freqüència no es en una banda de radioafició! RX Frequency in MHz. Frequency is not in a hamradio band! Freqüència RX en MHz. La freqüència no es en una banda de radioafició! MainWindowMyDataTab Watts Watts Keep this data Mantén aquestes dades My QTH locator. El meu localitzador QTH. Power Potència Operator callsign Indicatiu de l'operador Station Callsign Indicatiu de l'estació My Locator El meu localitzador My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. El meu localitzador QTH. El format hauria de ser «Maidenhead» (p. ex. IN70AA) de fins a 10 caràcters. My Rig El meu equip My Antenna La meva antena My SOTA_Ref La meva referència SOTA My VUCC_GRIDS Les meves Quadrícules_VUCC MainWindowSatTab Keep this data Mantén aquestes dades Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nom del satèl·lit si no és a la llista. Seleccioneu: «%1» per activar aquest quadre. (format semblant AO-51). Satellite mode used. Mode usat de satèl·lit. Select the satellite you are using. Seleccioneu el satèl·lit que esteu usant. UpLink band. Banda de pujada (UpLink). DownLink band. Banda de baixada (DownLink). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Localitzador de l'estació DX. Aquest quadre està sincronitzat amb el quadre Localitzador de la pestanya QSO. UpLink Pujada DownLink Baixada Satellite Satèl·lit Mode Mode DX Locator Localitzador DX Other Altres MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Localitzador de l'estació DX. El format hauria de ser «Maidenhead» (p. ex. IN70AA) de fins a 10 caràcters. Not Sat QSO QSO sense satèl·lit KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. El KLog ha detectat un nom de satèl·lit que no reconeix. En el seu lloc, caldria usar un dels noms coneguts de satèl·lit. Seleccioneu-lo de la llista. Alternativament, contacteu amb l'equip de desenvolupament per afegir el nom nou de satèl·lit. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Tingueu en compte que el nom del satèl·lit no es desarà si no és a la llista, i per tant, aquesta informació es podria perdre! RX Frequency in MHz. Frequency is not in a hamradio band! Freqüència RX en MHz. La freqüència no es en una banda de radioafició! RX Frequency in MHz. Freqüència de RX en MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Freqüència TX en MHz. La freqüència no es en una banda de radioafició! TX Frequency in MHz. Freqüència de TX en MHz. Other - Sat not in the list Altres - El satèl·lit no és a la llista Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. The satellite you have in your QSO is: El satèl·lit que hi ha al QSO és: OnlineMessageWidget The server returned the following error: %1 El servidor ha retornat l'error següent: %1 Not identified No identificat QObject Database Error Error de base de dades KLog DB needs to be upgraded. La BD del KLog necessita actualitzar-se. Do you want to upgrade it now? La voleu actualitzar ara? If DB is not upgraded KLog may not work properly. Si la BD no s'actualitza, el KLog podria no funcionar adequadament. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. L'actualització de programari pot provocar problemes potencials. Sempre és una bona idea fer un còpia de seguretat de la BD. Do you want to backup your DB now? Voleu fer ara una còpia de seguretat de la BD? The backup finished successfully. La còpia de seguretat ha finalitzat correctament. You can find the backup in this file: %1 Podeu trobar la còpia de seguretat en aquest fitxer: %1 The backup was not properly done. La còpia de seguretat no s'ha efectuat correctament. You will be sent back to the starting point. Retornareu al punt d'inici. KLog - DB can't be updated automatically KLog - No s'ha pogut actualitzar automàticament la BD You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. S'està actualitzant des d'una versió massa antiga del KLog i aquesta actualització no es pot fer automàticament des d'aquesta versió. KLog - DB update KLog - Actualitza la BD KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. El KLog ha detectat un registre anterior a la BD. Es migraran totes les dades a un registre de tipus DX creat de nou. KLog: Enter Station callsign KLog: Introduïu l'indicatiu de l'estació Enter the station callsign used in this log Introduïu l'indicatiu emprat en aquest registre Station Callsign Indicatiu de l'estació QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? La cancel·lació d'aquesta actualització provocarà inconsistència de dades i possiblement pèrdua de dades. Encara voleu cancel·lar? Progress: Progrés: Updating DXCC award information... Actualització de la informació dels diplomes DXCC... Updating DXCC Award information... Actualització de la informació dels diplomes DXCC... Updating WAZ award information... Actualització de la informació dels diplomes WAZ... Updating WAZ Award information... Actualització de la informació dels diplomes WAZ... Updating mode information... Actualitzant informació del mode... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. El procés per actualitzar és: - Usant una versió antiga del KLog, exportar el registre a ADIF. - Eliminar el fitxer «logbook.dat» de la carpeta del KLog. - Instal·lar la versió nova del KLog. - Importar el fitxer ADIF. El KLog finalitzarà quan feu clic a D'acord. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Totes les dades s'han migrat correctament. Ara cal anar a Configuració -> Preferències -> Registres per a comprovar que tot és correcte. Abort updating Interromp l'actualització Updating bands information... Actualitzant informació de bandes... Updating bands information in %1 status... Actualitzant informació de bandes en %1... Updating mode information in %1 status... Actualitzant informació dels modes en %1... New One, work it! nNew One, work it! Un de nou, treballeu-ho! Needed, work it! Necessari, treballeu-ho! Worked but not confirmed Treballat però no confirmat Confirmed Confirmat Not identified No identificat KLog is already running. KLog ja s'està executant. It is allowed to run only one instance. Es permet executar només una instància. Install wizard was canceled before completing... L'assistent d'instal·lació s'ha cancel·lat abans de finalitzar... Do you want to remove the KLog dir from your disk? Voleu eliminar el directori del KLog del disc? Your KLog dir has been removed S'ha eliminat el directori del KLog I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Remember that your KLog dir is on your system... Recordeu que el directori del KLog és al vostre sistema... Thank you for running KLog! Moltes gràcies per usar el KLog! Updating information... S'està actualitzant la informació... Updating DXCC and Continent information... S'està actualitzant la informació dels DXCC i del continent... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. S'ha trobat un indicatiu incorrecte: %1. Introduïu un indicatiu nou o confirmeu que l'actual és un indicatiu correcte. An empty callsign has been detected. If it is possible, please enter the right call. S'ha detectat un indicatiu buit. Introduïu l'indicatiu correcte, si és possible. KLog - Not valid callsign found KLog - S'ha trobat un indicatiu no vàlid Date Data Call Indicatiu RSTtx RSTtx RSTrx RSTrx Band Banda Comment Comentari Mode Mode CQz CQz ITUz ITUz DXCC DXCC Address Adreça Age Antiguitat County Comtat A_Index A_Índex Ant_Az Ant_Az Ant_El Ant_El Ant_Path Ant_Camí ARRL_SECT ARRL_SECT Award_Submitted Diploma_enviat Award_granted Diploma_atorgat Band_RX Banda_RX CheckContest ComprovacióConcurs Class Classe ClubLog SDate ClubLog SDate ClubLog status ClubLog estat Continent Continent Contacted Op OP Contactat Contest Id ID concurs Country País Credit Submitted Crèdit Enviat Credit granted Crèdit Atorgat Dark Dok Do not translate if unsure, common hamradio term. DOK de DARC Fists Do not translate if unsure, common hamradio term. FISTS Fists CC Do not translate if unsure, common hamradio term. FISTS CC My Fists Do not translate if unsure, common hamradio term. El meu FISTS Nr bursts Do not translate if unsure, common hamradio term. Núm ràfegues Nr pings Do not translate if unsure, common hamradio term. Núm «pings» Sat mode SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distància Email Correu electrònic EQ_Call EQ_Call eQSL RDate eQSL RDate eQSL SDate eQSL SDate eQSL Rcvd eQSL rebuda eQSL Sent eQSL enviada Force Init Force Init Freq Freq Freq RX Freq RX Gridsquare Gridsquare Guest OP OP convidat HRDLog SDate HRDLog SDate HRDLog status HRDLog estat IOTA IOTA IOTA Island id ID illa IOTA K Index K Índex Lat Lat Lon Lon LoTW RDate LoTW RDate LoTW SDate LoTW SDate LoTW Rcvd LoTW rebut LoTW Sent LoTW enviat Max Bursts Màx ràfegues Multiplier Multiplicador MS Shower Pluja MS My Antenna La meva antena My City La meva ciutat My Cnty El meu comtat My Country El meu país My CQz La meva CQz My DXCC El meu DXCC My Gridsquare El meu Gridsquare My IOTA El meu IOTA My IOTA island id El meu ID d'illa IOTA My ITUz La meva ITUz My Lat La meva Lat My Lon La meva Lon My Name El meu nom My Postal code El meu codi postal My Rig El meu equip My Sig El meu SIG My Sig Info La informació del meu SIG My SOTA ref La meva referència SOTA My State El meu estat My Street El meu carrer My USACA counties El meu comtats USACA My VUCC grids Les meves quadrícules VUCC Name Nom Notes Notes Operator Operador Owner Callsign Indicatiu de l'operador Pfx Pfx Points Punts Precedence Precedència Prop Mode Mode prop Public Key Clau pública QRZcom SDate QRZcom SDate QRZcom status QRZcom estat QSL msg Missatge QSL QSL RDate QSL RDate QSL SDate QSL SDate QSL Rcvd QSL rebuda QSL Sent QSL enviada QSL rcvd via QSL rebuda via QSL sent via QSL enviada via QSL via QSL via QSO complete QSO completa QSO random QSO aleatòria QTH QTH Region Regió Rig Equip RX Pwr Potència RX Sat name Nom sat SFI SFI Sig SIG Sig Info Info del SIG Silent key Do not translate if unsure, common hamradio term. Silent key SKCC SKCC SOTA Ref Referència SOTA SRX String Cadena SRX SRX SRX STX String Cadena STX State Estat Submode Submode UKSMG UKSMG USACA counties Comtats USACA VE prov VE prov VUCC grids Quadrícules VUCC TX Pwr Potència TX Web Web QSO Date off Data fi QSO Transmitter id ID transmissor Log number Número de registre SearchWidget &Clear &Neteja &Select All &Selecciona-ho tot &Search &Cerca &Export Highlighted &Exporta els ressaltats All logs Tots els registres Clear the searches. Neteja les cerques. Export the search result to an ADIF file. Exporta el resultat de la cerca a un fitxer ADIF. Select/Unselect all the QSOs shown. Selecciona/Desselecciona tots els QSO mostrats. Search in the log. Cerca al registre. Search in all logs. Cerca a tots els registres. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Introduïu l'indicatiu a cercar. Introduïu «*» per a mostrar tots els QSO... pot ser lent als registres grans! Select the Station Callsign used to do this QSO. Seleccioneu l'indicatiu d'estació usat per fer aquest QSO. All in log A tot el registre Not defined No s'ha definit &Clear selection &Neteja la selecció Save File Desa fitxer You have requested to delete the QSO with: %1 Heu demanat suprimir el QSO amb: %1 Are you sure? Esteu segur? SearchWindow Date/Time Data/hora Band Banda Mode Mode QSL Sent QSL enviada QSL Rcvd QSL rebuda Station Callsign Indicatiu de l'estació ID ID Call Trucada Date/time Data/hora Station callsign Indicatiu de l'estació QSL Send QSL enviada &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa Via bureau Via bureau QSL &received via bureau QSL &rebuda via bureau Direct Directa QSL received via direc&t QSL rebuda via direc&ta Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Check in DXHeat.com Comprova a DXHeat.com Check this callsign in DXHeat.com Comprova aquest identificador a DXHeat.com &Request my QSL &Sol·licita la meva QSL Mark my QSL as requested Marca la meva QSL com a sol·licitada Via Direct and mark DX QSL as requested Via directa i marca la DX QSL com a sol·licitada Send this QSL via direct and mark DX QSL as requested Envia aquesta QSL via directa i marca la DX QSL com a sol·licitada Via Bureau and mark DX QSL as requested Via bureau i marca la DX QSL com a sol·licitada Send this QSL via bureau and mark DX QSL as requested Envia aquesta QSL via bureau i marca la DX QSL com a sol·licitada &Request the QSL &Sol·licita la QSL Mark the QSL as requested Marca la QSL com a sol·licitada Via bureau and mark my QSL as requested Via bureau i marca la meva QSL com a sol·licitada QSL received via bureau and mark my QSL as requested QSL rebuda via bureau i marca la meva QSL com a sol·licitada Direc&t and mark as my QSL requested Direc&ta i marca la meva QSL com a sol·licitada QSL received via direct and mark my QSL as requested QSL rebuda via directa i marca la meva QSL com a sol·licitada Needed QSO to send the QSL QSO necessari per enviar la QSL My QSL requested to be sent La meva QSL sol·licitada per enviar DX QSL pending to be received QSL del DX pendent de rebre SetupDialog User data Dades de l'usuari Bands/Modes Bandes/modes DX-Cluster DX-Cluster Colors Colors Misc Varis World Editor Editor mundial Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aneu a la pestanya Varis i feu clic a Mou la BD o la BD no es mourà a la ubicació nova. Cancel Cancel·la Satellites Satèl·lits HamLib HamLib eLog eLog OK D'acord D&X-Cluster D&X-Cluster Log widget Giny de registre WSJT-X WSJT-X Settings Configuració You need to enter at least one log in the Logs tab. Com a mínim cal introduir un registre a la pestanya Registres. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Voleu afegir un registre a la pestanya de Registres o sortir del KLog? (Feu clic a Sí per afegir un registre o No per a sortir del KLog) DB has not been moved to new path. La BD no s'ha mogut al camí nou. You need to enter at least a valid callsign. Com a mínim cal introduir un indicatiu vàlid com a mínim. Go to the User tab and enter valid callsign. Aneu a la pestanya Usuari i introduïu un indicatiu vàlid. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sereu redirigit a la pestanya Registre. Afegiu i seleccioneu la classe de registre que voleu usar. You have not selected the kind of log you want. No heu seleccionat la classe de registre que voleu. Logs Registres World Mundial SetupEntityDialog Entity Entitat CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefix principal ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixos possibles separats per comes, p. ex. EA1, EA2, ... Prefixes Prefixos Name of the Entity. Nom de l'entitat. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de l'entitat. Local time difference to UTC. Diferència de l'hora local respecte a UTC. Main prefix of the entity. Prefix principal de l'entitat. ARRL ID. ARRL ID. Date of the deletion. Data de la supressió. Deleted Suprimit Cancel Cancel·la Ok D'acord Entity Dialog Diàleg d'entitat SetupPageBandMode Bands Bandes Modes Modes SetupPageColors New One Un de nou Needed in this band Necessari en aquesta banda Worked in this band Treballat en aquesta banda Confirmed in this band Confirmed Confirmat en aquesta banda Default Predeterminat WSJT-X palette Paleta WSJT-X Default palette Paleta predeterminada Dark Mode Mode fosc Color when the DXCC is an ATNO (All Time New One). Color quan el DXCC és un ATNO («All Time New One», Un de nou de tots els temps ). DXCC is confirmed in this band. El DXCC està confirmat en aquesta banda. Default color. Color predeterminat. Sets a palette of colors similar to the one used in WSJT-X. Estableix una paleta de colors semblant a la usada al WSJT-X. Sets the default palette. Estableix la paleta predeterminada. Light Mode Mode clar This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Aquest DXCC va funcionar abans en una altra banda però no en la banda seleccionada. Pot haver estat necessari pel CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC treballat, però no confirmat en aquesta banda. Sets the Dark Mode Estableix el mode fosc Choose a color Escolliu un color SetupPageDxCluster Add Afegeix Delete Suprimeix Show &HF spots Show HF spots Mostra els avisos en &HF Show V/&UHF spots Show V/UHF spots Mostra els avisos en V/&UHF Show W&ARC spots Show WARC spots Mostra els avisos en W&ARC Show &worked spots Show worked spots Mostra els a&visos treballats Show &confirmed spots Show confirmed spots Mostra els avisos &confirmats Show ANN/&FULL messages Show ANN/FULL messages Mostra els missatges ANN/&FULL Show WW&V messages Show WWV messages Mostra els missatges WW&V Show WC&Y messages Show WCY messages Mostra els missatges WC&Y Save DX Cluster activity Desa l'activitat del DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Desa tota l'activitat del DX Cluster a un fitxer a la carpeta del KLog DX Spots Avisos DX Others Altres Messages Missatges KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Afegeix un servidor DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Afegeix l'adreça seguida de :port Exemple: dxfun.com:8000 Si no s'especifica port, s'usarà 41112 de forma predeterminada: SetupPageELog ClubLog password Contrasenya del ClubLog ClubLog email Correu electrònic del ClubLog Enter the email you used to register in ClubLog. Introduïu el correu electrònic usat per registrar-se al ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per al ClubLog. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Send QSOs in real time Envia els QSO en temps real Activate ClubLog Activa el ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envia cada QSO al ClubLog en temps real, quan s'afegeixin (o es modifiquin) en el KLog. Starts the ClubLog support in KLog. Inicia l'admissió del ClubLog al KLog. Activate eQSL.cc Activa l'eQSL.cc Enter your username of eQSL.cc. Introduïu el nom d'usuari de l'eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per a l'eQSL.cc. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) eQSL.cc password Contrasenya de l'eQSL.cc eQSL.cc user Usuari de l'eQSL.cc ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Introduïu l'usuari del vostre compte a QRZ.com. Cal estar subscrit a QRZ.com per a usar aquest servei. User Usuari Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per a QRZ.com. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Password Contrasenya Activate QRZ.com Activa QRZ.com Check automatically Comprova automàticament Check in Qrz.com all Calls as they are entered Comprova a QRZ.com tots els indicatius a mesura que s'entrin Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key Clau del LogBook LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Clau del LogBook per a pujar QSO. Aquesta clau es pot aconseguir a la pàgina web del vostre «logbook» de QRZ.com. Recordeu que cal una subscripció a QRZ.com per a usar aquesta funcionalitat. LoTW LoTW Upload Pujada Download Baixada TQSL path Camí al TQSL Use TQSL Usa el TQSL LoTW password Contrasenya de LoTW LoTW user Usuari de LoTW Enter your LoTW user. Introduïu l'usuari de LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per al LoTW. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Path to the TQSL software. Camí al programari del TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Activa la integració LoTW amb el TQSL. Cal tenir instal·lat el TQSL Select File Selecció de fitxer SetupPageHamLib Activate HamLib Activa la HamLib Activates the hamlib support that will enable the connection to a radio. Activa la implementació de la «hamlib» que activarà la connexió a la ràdio. Read-Only mode Mode de només lectura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Si està activat, el KLog llegirà la freqüència i el mode des de la ràdio però mai enviarà cap ordre a la ràdio. Radio Ràdio Select your rig. Seleccioneu el vostre equip. Serial Network Defines the interval to poll the radio in msecs. Defineix l'interval de sondeig de la ràdio en ms. Poll interval Interval de sondeig Test: OK Prova: Correcta Test: NOK Prova: No correcta Test Prova Click to test the connection to the radio Feu clic per a provar la connexió a la ràdio SetupPageLogView Fields Camps SetupPageLogs &New New &Nou &Edit &Edita &Remove &Elimina KLog KLog Do you really want to remove this log? Esteu segur que voleu eliminar aquest registre? Operators Operadors QSOs QSO An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: Log has not been removed. (#3) No s'ha eliminat el registre. (#3) Add a new log. Afegeix un registre nou. Edit the selected log. Edita el registre seleccionat. Remove the selected log. Elimina el registre seleccionat. All the QSOs from this log will also be deleted... Tots els QSO d'aquest registre també se suprimiran... Log has not been removed. (#2) No s'ha eliminat el registre. (#2) Log has not been removed. (#1) No s'ha eliminat el registre. (#1) The new log could not be created. No s'ha pogut crear el registre nou. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicatiu de l'estació Comments Comentaris Date Data SetupPageLogsNew &Ok D'ac&ord &Cancel &Cancel·la &Date &Data &Station Callsign Indicatiu d'e&stació &Operators &Operadors Comm&ent Com&entari Callsign used for this log. Indicatiu usat per aquest registre. Comma separated list of operators: callsign1, callsign2. Llista separada per comes dels operadors: indicatiu1, indicatiu2. Start date of this log. Data inicial d'aquest registre. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Afegiu un comentari quant a aquest registre. Si està omplert, es mostrarà al títol principal del KLog per a identificar el registre. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Cal introduir un indicatiu vàlid a la casella d'indicatiu d'estació. El registre no s'obrirà. SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Registre en temps real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit De&sa l'ADIF en sortir Use this &default filename Use this default filename Usa aquest nom de fitxer pre&determinat Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marca el &QSO per enviar QSL quan es rebi la QSL Complete QSO with previous data Completa QSO amb dades prèvies Manage DX-Marathon Gestiona una marató DX Activate the application debug log Activa el registre de depuració de l'aplicació &Delete always temp ADIF file after uploading QSOs &Suprimeix sempre el fitxer ADIF temporal després de pujar els QSO Move DB Mou la BD In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Introduïu l'interval horari, en segons, per a considerar un duplicat si s'introdueix els mateixos indicatius, bandes i modes. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Activeu-ho per al sistema imperial (milles en lloc de kilòmetres). Select to use the following name for the logfile without being asked for it again. Seleccioneu l'ús del nom següent com a fitxer de registre sense tornar-ho a preguntar. Select if you want to manage DX-Marathon. Seleccioneu si voleu gestionar la marató DX. This is the default file where ADIF data will be saved. Aquests és el fitxer predeterminat a on es desaran les dades ADIF. This is the directory where the database (logbook.dat) will be saved. Aquest és el directori a on es desarà la base de dades (logbook.dat). Click to change the path of the database. Cliqueu per canviar el camí a la base de dades. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activa el registre de depuració de l'aplicació. Això pot ser útil si hi ha quelcom que no funciona com s'espera. Es crearà un fitxer de depuració en el directori del KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Cliqueu per canviar com a posat a la cua (per enviar) tots els eQSL (LoTW i eQSL) a tots els QSO nous de manera predeterminada. Delete Always the adif file created after uploading QSOs Suprimeix sempre el fitxer ADIF creat després de pujar els QSO Dupe time range: Interval de temps dels «dupe»: Please specify an existing directory where the database (logbook.dat) will be saved. Especifiqueu un directori existent a on es desarà la base de dades (logbook.dat). This is the directory where DB (logbook.dat) will be saved. Aquest és el directori a on es desarà la BD (logbook.dat). Check non-valid calls Mark sent eQSL && LoTW in new QSO as queued Marca els eQSL enviats i LoTW als QSO nous com a posats a la cua Click to change the default ADIF file. Cliqueu per canviar el fitxer ADIF predeterminat. Click to move the DB to the new directory. Cliqueu per moure la BD a un directori nou. Select Directory Selecció de directori KLog - Move DB KLog - Mou la BD File moved S'ha mogut el fitxer File copied S'ha copiat el fitxer File already exist. El fitxer ja existeix. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. El fitxer de destinació ja existeix i el KLog no el substituirà. Suprimiu el fitxer de la carpeta de destinació abans de moure el fitxer amb el KLog per assegurar que el KLog pot copiar el fitxer. File NOT copied NO s'ha copiat el fitxer The file was not copied due to an unknown problem. No s'ha copiat el fitxer degut a un problema desconegut. The target directory does not exist. Please select an existing directory. El directori de destinació no existeix. Seleccioneu un directori existent. Show the Station &Callsign used in the search box Mostra l'indi&catiu d'estació usat al quadre de cerca &Check for new versions automatically &Comprova automàticament si hi ha versions noves QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Els QSO es marcaran com a pendents d'enviar una QSL si rebeu el DX QSL i no heu enviat el vostre. Check if there is a new release of KLog available every time you start KLog. Comprova si hi ha un llançament nou disponible del KLog cada vegada que s'iniciï el KLog. &Provide Info for statistics &Proporciona informació per a estadístiques The search box will also show the callsign on the air to do the QSO. El quadre de cerca també mostrà l'indicatiu a l'aire per fer el QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Si s'ha seleccionat la comprovació de versió nova, el KLog enviarà al desenvolupador el vostre indicatiu, la versió del KLog i el sistema operatiu per ajudar a millorar el KLog. Select to use real time. Seleccioneu-ho per emprar temps real. Select to use UTC time. Seleccioneu-ho per emprar l'hora UTC. Select if you want to save to ADIF on exit. Seleccioneu si voleu desar a l'ADIF en sortir. Complete the current QSO with previous QSO data. Completa el QSO actual amb dades de QSO anteriors. Browse Explora Open File Obre fitxer SetupPageSats &New &Nou &Edit &Edita &Remove &Elimina &Import &Importa E&xport E&xporta Add a new satellite. Afegeix un satèl·lit nou. Edit the selected satellite. Edita el satèl·lit seleccionat. Remove the selected satellite. Elimina el satèl·lit seleccionat. Export your current satellites to a file. Exporta els satèl·lits actuals a un fitxer. Select the sat you want to open. Seleccioneu el satèl·lit que voleu obrir. KLog KLog Do you really want to remove this satellite? Esteu segur que voleu eliminar aquest satèl·lit? Import a satellites file. It will replace the satellites you have in the current list. Importa un fitxer de satèl·lits. Substituirà els satèl·lits que hi ha a la llista actual. This satellite will no be longer available to be selected ... Aquest satèl·lit ja no tornarà a estar disponible per a ser seleccionat... Sat has not been removed. (#3) No s'ha eliminat el satèl·lit. (#3) Sat has not been removed. (#2) No s'ha eliminat el satèl·lit. (#2) Sat has not been removed. (#1) No s'ha eliminat el satèl·lit. (#1) ID ID Short Curt Name Nom Uplink Pujada Downlink Baixada Modes Modes An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: KLog - SetupPageSats KLog - Pàgina de configuració de satèl·lits Open Satellites File Obre el fitxer de satèl·lits KLog warning Avís del KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Hi ha hagut un error inesperat en importar les dades dels satèl·lits. Pot ser degut a que el fitxer que esteu intentant importar no té el format correcte. Please check the format or contact the developer for analysis with the error code: Verifiqueu el format o contacteu amb el desenvolupador per a un anàlisi amb el codi d'error: Save Satellites File Desa el fitxer de satèl·lits SetupPageSatsNew Short name Nom curt Sat name Nom del satèl·lit UpLink Pujada DownLink Baixada Modes Modes &Ok D'ac&ord &Cancel &Cancel·la Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduïu el nom curt. Intenteu usar el nom curt LoTW per a que pugueu pujar després el QSO a LoTW. Enter the name of the satellite. Introduïu el nom del satèl·lit. Enter the uplink frequencies in this format: 144.300 Introduïu les freqüències de pujada en aquest format: 144.300 Enter the downlink frequencies in this format: 144.300 Introduïu les freqüències de baixada en aquest format: 144.300 Enter the modes in this format: USB Introduïu els modes aquest format: USB Some of the data you have entered is not correct; the satellite can't be added. Alguna dada que heu introduït no és correcta; no s'ha pogut afegir el satèl·lit. SetupPageSubdivisionNew &Date &Data &Station Callsign Indicatiu d'e&stació &Operators &Operadors Comm&ent Com&entari &Ok D'ac&ord &Cancel &Cancel·la Callsign used for this log. Indicatiu usat per aquest registre. Comma separated list of operators: callsign1, callsign2. Llista separada per comes dels operadors: indicatiu1, indicatiu2. Start date of this log. Data inicial d'aquest registre. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Afegiu un comentari quant a aquest registre. Si està omplert, es mostrarà al títol principal del KLog per a identificar el registre. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Cal introduir un indicatiu vàlid a la casella d'indicatiu d'estació. El registre no s'obrirà. SetupPageSubdivisions &Remove &Elimina Import new Importa nou Import an AWA file with the subdivision details. Importa un fitxer AWA amb detalls de les subdivisions. Remove the selected references. Elimina les referències seleccionades. Select the references you want to open. Seleccioneu les referències que voleu obrir. KLog KLog Do you really want to remove the data of this entity? Esteu segur que voleu eliminar les dades d'aquesta entitat? All the subdivision information for this entity will be deleted... S'eliminarà tota la informació de subdivisions d'aquesta entitat... Log has not been removed. (#3) No s'ha eliminat el registre. (#3) Log has not been removed. (#2) No s'ha eliminat el registre. (#2) Log has not been removed. (#1) No s'ha eliminat el registre. (#1) ID ID Name Nom Short Name Nom curt CQ Zone Zona CQ ITU Zone Zona ITU Deleted Suprimit Start Date Data d'inici End Date Data final DXCC DXCC An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: KLog - SetupPageSubdivisions KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Inicia el servidor UDP Automatically log QSOs from WSJT-X Registra automàticament els QSO des del WSJT-X Allow WSJT-X to send logged QSOs to KLog Permet que el WSJT-X enviï QSO enregistrats al KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Els QSO enregistrats al WSJT-X s'enviaran al KLog i el KLog preguntarà abans d'enregistrar al KLog a menys que se seleccioni «%1» KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. El KLog enregistrarà automàticament qualsevol QSO provinent del WSJT-X sense cap confirmació manual. Update status information from WSJT-X Actualitza la informació d'estat des del WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) El KLog mostrarà i actualitzarà automàticament les dades provinents del WSJT-X (indicatiu DX, informe, mode, ...) UDP port number where the UDP Server will listen for packets. Número de port UDP a on el servidor UDP escoltarà els paquets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Assegureu-vos que és el mateix port al qual els altres programes estan les dades. El port predeterminat és 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP rebrà els QSO enviats des d'altres programes com el WSJT-X, permetent enregistrar-los automàticament al KLog des d'aquests programes. UDP Port Port UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleccioneu la interfície a escoltar els datagrames UDP provinents de WSJT-X. Network interface Interfície de xarxa QSOs notification timeout (milisecs) Temps d'expiració de les notificacions dels QSO (mil·lisegons) Miliseconds that the notification of QSOs received from WSJTX will be shown. Mil·lisegons en que es mostrarà la notificació dels QSO rebuts des del WSJTX. SetupPageUserDataPage &Personal data Personal data Dades &personals Station &data Station data &Dades de l'estació &Name Name &Nom &Address Address &Adreça Cit&y City Ci&utat &Zip Code Zip Code Codi &postal Pro&v/State Prov/State Pro&v/Estat Countr&y Country Paí&s Enter your information for rig Introduïu la informació de l'equip Enter your information for antenna Introduïu la informació de l'antena Enter your name. Introduïu el vostre nom. Enter your address - 1st line. Introduïu l'adreça - 1a línia. Enter your address - 2nd line. Introduïu l'adreça - 2a línia. Enter your address - 3rd line. Introduïu l'adreça - 3a línia. Enter your address - 4th line. Introduïu l'adreça - 4a línia. Enter your city. Introduïu la ciutat. Enter your zip code. Introduïu el codi postal. Enter your province or state. Introduïu la província o l'estat. Enter your country. Introduïu el país. Enter your power information. Introduïu la informació de potència. &Rig 1 &Equip 1 R&ig 2 E&quip 2 Ri&g 3 Eq&uip 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tència Enter the station callsign that will be used for logging. Introduïu l'indicatiu de l'estació que s'usarà per l'enregistrament. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduïu l'indicatiu de la vostra estació. Alternativament, el KLog pot usar un indicatiu aproximat a partir del vostre indicatiu. &Callsign Indi&catiu &Operators &Operadors &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Localitzador &Locator (not valid) &Localitzador (no vàlid) Enter the operators (comma separated if more than one). Introduïu els operadors (separats per comes si hi ha més d'un). SetupPageWorldEditor KLog will not be able to show entities information. El KLog no serà capaç de mostra la informació de les entitats. Prefix Prefix Entity Entitat An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. S'ha detectat un fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog i es carregarà. Add Afegeix Delete Suprimeix Edit Edita Export World Exporta el món Import World Importa el món Still not implemented. Encara no està implementat. Import a new cty.csv file Importa un fitxer «cty.csv» nou No entities information file (cty.csv) has been detected in your KLog folder. No s'ha detectat cap fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog. ARRL ID ARRL ID Continent Continent CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Suprimit Since Date Des de la data To Date Fins a la data Open File Obre fitxer BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. S'ha actualitzat la informació de les entitats. Entities information has not been updated. No s'ha actualitzat la informació de les entitats. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Els QSO següents són els que heu rebut la confirmació LoTW. Ok D'acord DX DX Date/Time Data/hora Band Banda Mode Mode ShowErrorDialog KLog Message Missatge del KLog SoftwareUpdateDialog Ok D'acord KLog update Actualització del KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>Hi ha una versió (%1) nova disponible del KLog! </h2></center><br>Hi ha una versió nova disponible del KLog.<br><br><b>Podeu aconseguir la versió nova a:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Enhorabona! Your KLog has been updated. S'ha actualitzat el KLog. You already have the latest version. Ja teniu la versió més recent. StartWizard KLog - The free hamradio logging program KLog - El programa lliure d'enregistrament de radioafició Quit Setup Surt de la configuració Setup is not complete yet. Are you sure you want to quit setup? La configuració encara no està completa. Esteu segur que voleu sortir de la configuració? StatisticsWidget QSO per year QSO per any DXCC per year DXCC per any CQ zones per year Zones CQ per any QSO per band QSO per banda QSO per mode QSO per mode QSO per DXCC QSO per DXCC QSO per Continent QSO per continent QSO per hour QSO per hora QSO per month QSO per mes Worked / Confirmed status Estat Treballat / Confirmat Worked / Sent status Estat Treballat / Enviat Sent / Confirmed status Estat Enviat / Confirmat Satellite grid status Estat de la quadrícula dels satèl·lits Satellite DXCC status Estat de la DXCC dels satèl·lits Grids per band status Quadrícules per estat de la banda DXCC per band status DXCC per estat de la banda StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura CQ zones Zones CQ CQ zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Years: %1/%2 Anys: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Mostra només els confirmats Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Només el satèl·lits LEO Number Número Callsign Indicatiu Date Data Band Banda Mode Mode DXCC DXCC Satellite Satèl·lit Confirmed Confirmat No No StatsEntitiesPerYearBarChartWidget Chart title Títol del gràfic Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura DXCC Entities Entitats DXCC DXCC Entities per year Entitats DXCC per any Reading data ... S'estan llegint les dades... Entities: Entitats: StatsFieldPerBandWidget All Tot Mode: Mode: Band Banda Worked Treballat Confirmed Confirmat StatsGridsOnSatsWidget Show confirmed only Mostra només els confirmats Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Només el satèl·lits LEO Number Número Callsign Indicatiu Date Data Band Banda Mode Mode Grid Quadrícula Satellite Satèl·lit Confirmed Confirmat No No StatsQSOsPerBandBarChartWidget QSOs per band QSO per banda Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Bands Bandes QSOs per band distribution QSO per distribució de banda Reading data ... S'estan llegint les dades... Bands: Bandes: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO per continent Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Continents Continents Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO per DXCC Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Reading data... S'estan llegint les dades... DXCC DXCC Top ten DXCC per QSO Els deu DXCC més importants per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO per hora Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Hours Hores QSOs at hour QSO per hora Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerModeBarChartWidget QSOs per mode QSO per mode Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Modes Modes QSOs per mode distribution QSO per distribució de mode Reading data ... S'estan llegint les dades... Modes: Modes: StatsQSOsPerMonthBarChartWidget QSOs per month QSO per mes Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Jan Gen Feb Feb Mar Mar Apr Abr May Mai Jun Jun Jul Jul Sep Set Oct Oct Nov Nov Dec Des Aug Ago Months Mesos QSOs at Month QSO per mes Reading data ... S'estan llegint les dades... Months: Mesos: StatsQSOsPerYearBarChartWidget Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura QSOs QSO QSOs per year QSO per any Reading data ... S'estan llegint les dades... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviat - %1 Confirmed - %2 Confirmat - %2 Sent / Confirmed status Estat Enviat / Confirmat StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Treballat, no confirmat - %1 Confirmed - %2 Confirmat - %2 Worked / Confirmed status Estat Treballat / Confirmat StatsWorkedSentPieChartWidget Worked - %1 Treballat - %1 Sent - %2 Enviat - %2 Worked / Sent status Estat Treballat / Enviat TipsDialog KLog tips Consells del KLog Next Següent Previous Anterior <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Consell núm. 1:</b><br>Sabíeu que...<br>poseu usar <a href="#ToolsFillInQSO">Eines -> Omple les dades QSO</a> per llegir automàticament el registre complet per a omplir les zones DXCC, CQ, ITU i el continent? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Consell núm. 3:</b><br>Sabíeu que...<br>podeu usar <a href="#ToolsFindQSO2QSL">Eines->Eines QSL...->Cerca QSO a les QSL</a> per cercar tots aquells QSO als que hauríeu d'enviar la vostra QSL perquè encara cal confirmar que el DXCC i vós encara no heu enviat la targeta QSL? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Consell núm. 13:</b><br>Sabíeu que...<br>podeu <a href=https://twitter.com/_ea4k>seguir a EA4K al Twitter</a> per aconseguir notícies quant al KLog? <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Consell núm. 18:</b><br>Sabíeu que...<br>podeu fer un clic doble a un nom d'entitat a la taula de DXCC i tots els QSO amb una entitat DXCC es mostraran al quadre de cerca? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Consell núm. 19:</b><br>Sabíeu que...<br>podeu fer clic amb el botó dret a un QSO i seleccionar <i>Comprova a QRZ.com</i> per comprovar aquest identificador a QRZ.com? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Consell núm. 2:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara cal enviar amb <a href="#ToolsSendPendingQSL">Eines->Eines QSL...->Cerca les meves QSL pendents d'enviar</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Sent marcada com a <i>Sol·licitada</i>. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Consell núm. 4:</b><br>Sabíeu que...<br>podeu introduir un «*» al quadre de cerca de la finestra de cerca per a cercar tots els QSO efectuats amb un indicatiu d'estació específic? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Consell núm. 5:</b><br>Sabíeu que...<br>podeu trobar el fitxer que conté tot el vostre registre i altra informació al fitxer «logbook.dat», i al «klogrc» que conté el fitxer de configuració del KLog, a la carpeta del KLog obrint el menú <a href="#FileOpenKLogFolder">Fitxer->Carpeta del KLog</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Consell núm. 6:</b><br>Sabíeu que...<br>podeu pujar els QSO marcats com a posats en cua del LoTW via el TQSL amb <a href="#ToolsUploadLoTW">Eines->Eines LoTW...->Envia el registre al LoTW cridant el TQSL.</a> ?<br><br>Cal configurar el TQSL a les preferències per a poder usar aquesta característica. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Consell núm. 7:</b><br>Sabíeu que...<br>podeu veure el QSO que confirma una entitat DXCC específica a una banda específica apuntant el ratolí sobre aquesta banda al giny del DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Consell núm. 8:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara esteu esperant amb <a href="#ToolsReceivePendingQSL">Eines->Eines QSL...->Cerca les DX-QSL pendents de rebre</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Sent marcada com a <i>Enviada</i> però que encara no heu rebut la targeta QSL des del DX. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Consell núm. 9:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara esteu esperant amb <a href="#ToolsReceiveRecPendingQSL">Eines->Eines QSL...->Cerca sol·licituds pendents de rebre</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Rec marcada com a <i>Sol·licitada</i> però que encara no heu rebut la targeta QSL des del DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Consell núm. 10:</b><br>Sabíeu que...<br>podeu subscriure's al <a href=https://t.me/klogchat>grup de Telegram del KLog en anglès</a> per conversar en anglès quant al KLog? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Consell núm. 11:</b><br>Sabíeu que...<br>podeu subscriure's al <a href=//https://t.me/KLogES>grup de Telegram en castellà</a> per conversar en castellà quant al KLog? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Consell núm. 12:</b><br>Sabíeu que...<br>podeu subscriure's a la <a href=https://groups.io/g/klog>llista de correu del KLog</a> per a conversar a través del correu quant al KLog en anglès? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Consell núm. 14:</b><br>Sabíeu que...<br>podeu escriure els vostres propis <a href=https://www.eham.net/reviews/detail/3118>comentaris a eHam.net quant al KLog</a> per ajudar als altres a decidir-se a usar el KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Consell núm. 15:</b><br>Sabíeu que...<br>podeu unir-vos a l'equip de desenvolupament senzillament <a href=https://www.klog.xyz/contact>contactant-nos</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Consell núm. 16:</b><br>Sabíeu que...<br>hi ha moltes maneres de col·laborar amb el KLog i varies estan llistades a la pàgina de <a href=https://www.klog.xyz/contrib>col·laboració del KLog</a>? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Consell núm. 17:</b><br>Sabíeu que...<br>podeu ajudar a traduir el KLog al vostre idioma? Si us plau, reviseu la pàgina de <a href=https://www.klog.xyz/contrib/translations>traduccions del KLog</a>. UpdateSatsData Reading Satellites data file... S'estan llegint el fitxer de les dades de satèl·lits... Abort reading Interromp la lectura The Satellites information has been updated. S'ha actualitzat la informació dels satèl·lits. Open File Obre un fitxer Sat Data Dades de satèl·lit World Entity Entitat Continent Continent Abort reading Interromp la lectura Reading cty.csv... S'està llegint el «cty.csv»... WorldMapWidget World map Mapa mundial View Vista Zoom In(25%) Apropa (25%) Zoom Out(25%) Allunya (25%) Normal Size Mida normal Fit to window Ajusta a la finestra eLogClubLog Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Aquest error pot estar provocat per una duplicitat del QSO, o si s'elimina, intenteu eliminar un QSO inexistent. Undefined error number (#%1)... Número d'error indefinit (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... QSO duplicat o no existent (#%1)... We have received an undefined error from Clublog (%1) S'ha rebut un error no definit des del Clublog (%1) Undefined error... Error no definit... Callsign missing Manca l'indicatiu Invalid callsign Indicatiu no vàlid Skipping SWL callsign S'omet l'indicatiu SWL Callsign is your own call Callsign is your ow call L'indicatiu és el vostre propi indicatiu Invalid callsign with no DXCC mapping Indicatiu no vàlid sense correspondència amb DXCC Updated QSO QSO actualitzat Invalid ADIF record Enregistrament ADIF no vàlid Missing ADIF record Manca enregistrament ADIF Test mode - parameters ok, no action taken Mode Test - paràmetres correctes, sense acció Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Si us plau, comproveu la configuració a la configuració i contacteu amb l'equip de desenvolupament del KLog si no ho podeu corregir. Les pujades al ClubLog es desactivaran. Excessive API Usage Ús excessiu de l'API Internal Error Error intern Rejected Rebutjat QSO Duplicate QSO duplicat QSO Modified QSO modificat Missing Login Manca inici de sessió QSO OK QSO OK Upload denied Pujada denegada No callsign selected No s'ha seleccionat cap indicatiu No match found Cap coincidència Dropped QSO QSO eliminat OK D'acord Login rejected S'ha rebutjat l'inici de sessió Rejected: Callsign is your own call Rebutjat: L'indicatiu és el vostre propi indicatiu eLogQrzLog Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! Undefined error number (#%1) Número d'error indefinit (#%1) We have received the following error from QRZ.com (%1) S'ha rebut l'error següents des de QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found No s'ha trobat cap clau vàlida Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Configureu la clau API de QRZ.com. La trobareu a la pàgina web de configuració del vostre «logbook» de QRZ.com. Cal una subscripció a QRZ.com per a usar aquesta funcionalitat. KLog - QRZ.com password needed KLog - Cal la contrasenya de QRZ.com Please enter your QRZ.com password: Introduïu la contrasenya de QRZ.com: KLog - QRZ.com KLog - QRZ.com Callsign missing Manca l'indicatiu eQSLUtilities Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! Undefined error number (#%1)... Número d'error indefinit (#%1)... eQSL Error: User or password incorrect Error d'eQSL: Usuari o contrasenya incorrectes eQSL Warning: At least one of the uplodaded QSOs is duplicated. Avís d'eQSL: Com a mínim hi ha un QSO pujat que està duplicat. eQSL: All the QSOs were properly uploaded. eQSL: Tots els QSO s'han pujat adequadament. KLog - eQSL.cc password needed KLog - Cal la contrasenya d'eQSL.cc Please enter your eQSL.cc password: Introduïu la contrasenya d'eQSL.cc: KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ha enviat el missatge següent: %1 We have received an undefined error from eQSL (%1) S'ha rebut un error no definit des de l'eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Si us plau, comproveu la configuració a la configuració i contacteu amb l'equip de desenvolupament del KLog si no ho podeu corregir Les pujades a l'eQSL es desactivaran. klog-1.8.6/translations/klog_da.ts0000644000175000017500000134070114166020421016135 0ustar develdevel AboutDialog About KLog Om KLog By af KLog is a free logbook for hamradio operators. KLog er en fri logbog for operatører af amatørradio. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Giv en anmeldelse i KLogs eHam-anmeldelsesside: Find more information and the latest release at Find yderligere information og den seneste udgivelse på Author Forfatter today i dag Main developer Hovedudvikler KLog is developed by a very small team and you are invited to join! KLog er udviklet af et meget lille hold og du er inviteret! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Du kan også hjælpe os ved at sende fejlrapporter eller små kodebidrag, ideer eller andet som kan forbedre KLog. Authors Forfattere Translators bring KLog into your language. They are really an important part of the KLog development team. Oversættere bringer KLog til dit sprog. De er en vigtig del af KLog-udviklingsholdet. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Oversættere Privacy advisory Privatlivsråd KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: I øjeblikket omfatter dataene følgende: Callsign Kaldesignal KLog version Klog-version Operating system Operativsystem KLog KLog Privacy Privatliv AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok O.k. Cancel Afbryd DX Date/Time Dato/tid Band Bånd Mode Tilstand Not defined All Alle QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Genberegn Click to recalculate the award status. Klik for at genberegne præmiestatus. Select the year you want to check. Vælg året du ønsker at kontrollere. QSOs QSO'er DXCC DXCC CQ CQ Award Præmie Confirmed Bekræftet Worked Bearbejdet WAZ WAZ Score Bedømmelse Annual Årlig Number of confirmed DXCC entities. Antallet af bekræftede DXCC-entiteter. Number of worked DXCC entities. Antallet af bearbejdede DXCC-entiteter. Number of confirmed WAZ zones. Antallet af bekræftede WAZ-zoner. Number of worked WAZ zones. Antallet af bearbejdede WAZ-zoner. Number of confirmed QSOs. Antallet af bekræftede QSO'er. Number of worked QSOs. Antallet af bearbejdede QSO'er. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Overførsel af landedata KLog needs country data... KLog skal bruge landedata ... &Download &Hent &Ignore &Ignorer Country data needed Landedata krævet KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Klik på Hent for at hente nu. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Jeg kan ikke finde værten. Kontroller dit netværk og prøv igen. Ønsker du at prøve igen? DXCCStatusWidget Update Opdater It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entitet Prefix Præfiks Pref: CQ: ITU: Beam: Entity not worked in this band. Entitet fungerede ikke i dette bånd. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klik på Forbind for at forbinde til DX-Cluster-serveren Connect Forbind Clear Ryd Click on connect to connect to the DX-Cluster Klik på forbind for at forbinde til DX-Cluster Trying to connect to the server Forsøger at forbinde til serveren KLog DXCluster KLog DXCluster The host was not found. Please check: Værten blev ikke fundet. Kontroller venligst: - your network connection; - the host name and port settings. - din netværksforbindelse; - værtsnavnet og portindstillinger. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Forbindelsen blev nægtet af modparten. Sikr dig, at DXCluster-serveren kører og kontroller at værtsnavnet og portindstillinger er korrekte. The following error occurred: %1. Den følgende fejl opstod: %1. Connected to server Forbundet med serveren KLog message KLog-besked Enter your callsign to connect to the cluster: Indtast dit kaldesignal for at forbinde til klyngen: Enter your password to connect to the cluster: (Just hit enter for no password) Indtast din adgangskode for at forbinde til klyngen: (Tryk på retur for at undlade adgangskode) Disconnect Afbryd Not logged on, you may need to enter your callsign again. Ikke logget ind, du skal eventuelt indtaste dit kaldesignal igen. Enter here the commands to be sent to the DX-Cluster server. Indtast kommandoerne, der skal sendes til DX-Cluster-serveren, her. Connection closed by the server Forbindelse afbrudt af serveren Click on Connect to connect to the DX-Cluster server. Klik på Forbind for at forbinde til DX-Cluster-serveren. Send Send It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Programversion i DB er nul Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Flystøj Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Baggrundsstøj Earth-Moon-Earth Jorden-månen-jorden Sporadic E Sporadisk E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Feltjusterede uregelmæssigheder F2 Reflection Common term in hamradio, do not translate if not sure F2-reflektion Internet-assisted Internetassisteret Ionoscatter Common term in hamradio, do not translate if not sure Ionostøj Meteor scatter Common term in hamradio, do not translate if not sure Meteorstøj Terrestrial or atmospheric repeater or transponder Terrestrisk eller atmosfærisk repeater eller transponder Rain scatter Common term in hamradio, do not translate if not sure Regnstøj Satellite Satellit Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ækvatoriale Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfærisk kanalisering Yes Ja No Nej Requested Anmodt Ignore/Invalid ignorer/ugyldig Validated Valideret Queued I kø Uploaded Overført Do not upload Overfør ikke Modified Ændret Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direkte Electronic Elektronisk Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC KLog-DXCC All QSOs have been updated with a DXCC and the Continent. Alle QSO'er er blevet opdateret med en DXCC og kontinentet. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Overførsel af cty.csv mislykkedes med den følgende fejlkode: Download of cty.csv done. Overførsel af cty.csv udført. There is already a cty.csv file in the folder but it will be replaced with the new one. Der er allerede en cty.csv-fil i mappen, men den vil blive erstattet med den nye. Could not open %1 for writing Kunne ikke åbne %1 for at skrive FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Skriver ADIF-fil ... Abort writing Afbryd skrivning Exporting ADIF file... QSO: %1 / %2 Writing ADIF file... QSO: Skriver ADIF-fil ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Du har afbrudt fileksporten. Filen vil blive fjernet og ingen data vil blive eksporteret. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Ønsker du stadig at afbryde? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Reading LoTW file... Læser LotW-fil ... Importing LoTW ADIF file... KLog - Log selection KLog - Duplicated QSOs KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Export progress This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - Båndet mangler og det følgende kald: - The mode missing and the following call: - Tilstanden mangler og det følgende kald: - The date missing and the following call: - Datoen mangler og det følgende kald: - The time missing and the following call: - Tidspunktet mangler og det følgende kald: Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? KLog - No Station callsign entered. KLog - QSO without Station Callsign Reading ADIF file... Læser ADIF-fil ... Abort reading Om læsning QSO: QSO: There is more than one log in this logfile. Der er mere end en log i denne logfil. All logs will be imported into the current log. Alle logge vil blive importeret i den nuværende log. Do you want to continue? Ønsker du at fortsætte? Importing ADIF file... Importerer ADIF-fil ... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Der ser ud til at der er nogle dublette QSO'er i ADIF-filen, du importerer. Ønsker du at fortsætte? (dublette QSO'er vil ikke blive importeret) Please edit the ADIF file and make sure that it include at least: Rediger din ADI-fil og sikr dig at den som minimum indeholder: and og This QSO had: Denne QSO havde: Do you want to continue with the current file? Ønsker du at fortsætte med den nuværende fil? KLog: Not all required data found! KLog: Ikke alle krævede data blev fundet! KLog: No RST TX found! KLog: Ingen RST TX blev fundet! KLog: No RST RX found! KLog: Ingen RST RX fundet! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Vælg den serielle porthastighed. Port Port Select the serial port. Only the serial ports that are detected are shown. Vælg den serielel port. Kun den serielle porter, der er registreret vises. Scan Skan Click to identify the serial ports available in your computer. Klik for at identificere de serielle porte tilgængelige i din computer. 5 bits 5-bit 6 bits 6-bit 7 bits 7-bit 8 bits 8-bit Data bits Databit Select the serial data bits. Vælg den serielle databit. None Ingen Hardware Udstyr Software XON/XOFF Software XON/XOFF Flow control Flow-kontrol Select the serial flow control Vælg den serielle flow-kontrol No parity Ingen paritet Even Lige Odd Ulige Space Mellemrum Mark Mærke Parity Paritet Select the serial parity. Vælg den serielle paritet. Default Standard 1 bit 1 bit 2 bits 2 bit Stop bits Stop-bit Select the serial stop bits. Vælg den serielle stop-bit. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinent Prefix Præfiks CQ CQ ITU ITU Short Path Kort sti Long Path Lang sti Deg Deg Miles Mil Km Km IntroPage Welcome to KLog! Velkommen til KLog! Welcome to KLog! - brought to you under the terms of the GPL! Velkommen til Klog! - bragt til dig under betingelserne i GPL'en! Welcome to KLog Velkommen til KLog This looks like it's the first time you've run KLog on this computer. Dette ser ud til, at det er første gang du afvikler KLog på denne computer. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Programemt understøtter QSL-håndtering, import og eksport af ADIF and Cabrillo file formats and many other features... samt Cabrillofilformater og mange andre funktioner ... Before you can start using KLog, you will be asked to: Før du kan begynde med KLog vil du blive spurgt om: Acknowledge to the terms of the license. Anerkendelse af betingelserne i licensen. Download the DX entities information. Hente DX-entitetsinformationen. Enter your callsign, CQ zone, etc. and main configuration. Indtast dit kaldesignal, CQ-zone etc. og hovedkonfiguration. Enjoy KLog and contact the development team if you have any suggestions! Nyd KLog og kontakt udviklingsholdet hvis du har nogen forslag! LicPage KLog License information KLog-licensinformation Welcome to KLog!- brought to you under the terms of the GPL! Velkommen til KLog! - bragt til dig under betingelsen i GPL'en! Acknowledge Anerkendelse Be aware that KLog is free software. Vær opmærksom på at KLog er et frit program. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL send QSL Rcvd QSL modt &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct Direct QSL received via direc&t QSL modtaget via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Tilføj &Clear &Ryd Callsign of the QSO. Band of the QSO. Bånd for QSO'en. Mode of the QSO. Tilstand for QSO'en. Date of the QSO. Dato for QSO'en. Time of the QSO. Tidspunkt for QSO'en. Add the QSO to the log. Tilføj QSO'en til loggen. Clears the QSO entry. Rydder QSO-elementet. KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kaldesignal DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE &Modify &Ændr MainWindow Starting KLog Starter KLog DX Entity DX-entitet &Log Window &Logvindue KLog Klog It seems that you have never done a backup or exported your log to ADIF. It was not possible to open the debug file for writing. No debug log will be saved! It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. It seems that you are running this version of KLog for the first time. The setup will be open to allow you to do any new setup you may need. Ready Klar An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Der opstod en uventet fejl under tilføjelse af QSO'en til din log. Hvis problemet består, så kontakt udvikleren for fejlsøgning: KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. You have selected an entity: Du har valgt en entitet: that is different from the KLog proposed entity: som er anderledes fra den af KLog foreslåede entitet: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klik på præfikset for den korrekte entitet eller Afbryd for at redigere QSO'en igen. No DXCC None Ingen Click on the prefix of the right entity or Cancel to correct. Klik på præfikset på den højre entitet eller Afbryd for at rette. KLog - QRZ.COM RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? &File &Fil Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Eksporter ALLE QSO'erne til en ADIF-fil, sammenføj QSO'erne fra alle loggene. KLog folder KLog-mappe E&xit &Afslut &Tools &Værktøjer Fill in QSO data Udfyld QSO-data Find My-QSLs pending to send Find My-QSL'er under afsendelse Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Viser QSO'erne med afventende forespørgsler for at sende QSL'er. Du bør holde denne kø tom! Shows DX-QSLs for which requests or QSLs have been sent with no answer. Import an ADIF file into the current log. Importer en ADIF-fil ind i den aktuelle log. Export the current log to an ADIF logfile. Eksporter den aktuelle log til en ADIF-logfil. Print your log. Udskriv din log. Opens the data folder of KLog. Åbner datamappen for KLog. Go through the log reusing previous QSOs to fill missing information in other QSOs. Gå igennem loggen der genbruger tidligere QSO'er for at udfylde manglende information i andre QSO'er. Shows QSOs for which you should send your QSL and request the DX QSL. Viser QSO'er som du bør sende din QSL og forespørge på DX QSL'en. KLog - File not open Status bar ... KLog - Unexpected error KLog - Select correct entity KLog - Exit Mark all queued QSOs in this log as sent to LoTW. Marker alle QSO'er i kø i denne log som sendt til LoTW. Mark all queued QSOs as sent to LoTW. Marker alle QSO'er i kø som sendt til LoTW. Sends the log to LoTW calling TQSL. You have requested to delete the QSO with: %1 Du har anmodt om at slette QSO'en med: %1 Are you sure? Er du sikker? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv Do you want to do it now? The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Find requested pending to receive LoTW tools ... Mark all queued QSOs from this log as sent Queue all the QSOs to be uploaded Check the current callsign in QRZ.com Queue all the QSO to be uploaded For updated DX-Entity data, update cty.csv. For opdaterede DX-Entity-data, opdater cty.csv. &Help &Hjælp Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. Please select the station callsign you want to mark as sent to LoTW: Vælg venligst stationskaldesignalet du ønsker at markere som sendt til LoTW: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected The log that you have selected contains more than just one station callsign. Loggen du har valgt indeholder mere end bare et stationskaldesignal. Shows the DX-QSLs that have been requested. Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs as sent All pending QSOs of this log has been marked as queued for LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! Station Callsign: Stationskaldesignal: Define Station Callsign Definer stationskaldesignal Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Indtast stationskaldesignalet at bruge for denne log eller efterlad den tom for QSO uden stationskaldesignal defineret: No station callsign has been selected and therefore no log will be marked Intet stationskaldesignal er blevet valgt og derfor vil ingen log blive markeret You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL Upload the queued QSOs to LoTW KLog needs to update the Entities database. KLog - Backup KLog - New version detected! KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - ClubLog error KLog - eQSL error KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - QRZ.com error KLog has received an error from QRZ.com. KLog - %1 KLog - ADIF export Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. About ... KLog - Update checking result TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? You need to select one station callsign to be able to send your log to eQSL.cc. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Dato/tid Callsign Kaldesignal Printing the log ... KLog - QSO received Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. Congratulations! Tillykke! You already have the latest version. Du har allerede den seneste version. You can find the KLog data folder here: Du kan finde KLog-datamappen her: start start stop stop If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Hvis du er sikker på, at databasen indeholder QSO'er og KLog ikke kan finde dem, så kontakt udviklerne (se Om KLog) for hjælp. It seems that there are no QSOs in the database. This function is disabled. Go to the Setup->LoTW tab to enable it. No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to LoTW. There was an error while updating to Yes the LoTW QSL sent information. KLog - Select the Station Callsign. The logfile has been modified. Logfilen er blevet ændret. KLog - CTY.dat update Do you want to save your changes? Ønsker du at gemme dine ændringer? Stats Stat Show the statistics of your radio activity. Vi statistik over din radioaktivitet. Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! UDP Server error The UDP server failed to %1. start or stop UDP-serverfejl UDP-serveren mislykkedes i at %1. Status of the DX entity. Status på DX-entitet. Name of the DX entity. Navn på DX-entitet. QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Andre My Data Mine data Satellite Satellit DXCC DXCC Info Info Awards Præmier Search Søg Log Log DX-Cluster DX-Cluster Save ADIF File Gem ADIF-fil The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW Freq Frek Time On Tid på Time Off Tid væk RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Lokalt-Net QSO logged from WSJT-X: QSO logget fra WSJT-X: Open File Åbn fil All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog QRZ.COM - Needed for DXMarathon - Krævet for DXMarathon Abort filling Afbryd udfyldning Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Nummer Band Bånd Mode Tilstand Print Log Udskrivningslog Abort printing Om udskrivning Printing the log... QSO: Udskrivning af loggen ... QSO: The following QSO data has been received from WSJT-X to be logged: De følgende QSO-data er blevet modtaget fra WSJT-X for at blive logget: Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. If the received mode is correct, please contact KLog development team and request support for that mode Hvis den modtagne tilstand er korrekt, så kontakt venligst KLog-udviklingsholdet og anmod om understøttelse for den tilstand KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. En dubletsatellit er blevet registreret i filen og vil ikke blive importeret. Please check the satellite information file and ensure it is properly populated. Kontroller venligst satellitinformationsfilen og sikr dig at den er korrekt udfyldt. Now you will see a more detailed error that can be used for debugging... Nu vil du se en mere detaljeret fejl, som kan bruges til fejlsøgning ... An unexpected error ocurred!! Der opstod en uventet fejl! If the problem persists, please contact the developers Hvis problemet består, så kontakt udviklerne for analysis: for analyse: Error in function Fejl i funktion Error text Fejltekst Failed query Mislykket forespørgsel KLog - Show errors Do you want to keep showing errors? Ønsker du fortsat at vise fejl? MainWindowInputComment Comment Kommentar Add a comment for this QSO. Tilføj en kommentar for denne QSO. Keep this data Behold disse data Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret ind i den næste QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato for ClubLog-overførslen. Date of the QRZ.com upload. Date of the eQSL sending. Dato for eQSL-afsendelsen. Date of the eQSL reception. Dato for eQSL-modtagelsen. Date of the LoTW sending. Dato for LoTW-afsendelsen. Date of the LoTW reception. Dato for LoTW-modtagelsen. Status on QRZ.com. Status of the LoTW sending. Status for LoTW-afsendelsen. Status of the LoTW reception. Status for LoTW-modtagelsen. QRZ.com LoTW Sent LoTW sendt LoTW Rec LoTW modt Status on ClubLog. Status for ClubLog. Status of the eQSL sending. Status for eQSL-afsendelsen. Status of the eQSL reception. Status for eQSL-modtagelsen. ClubLog ClubLog eQSL Sent eQSL sendt eQSL Rec eQSL modt MainWindowInputOthers Primary Div Primær div Secondary Div Sekundær div IOTA IOTA Entity Entitet Propagation mode Propagationtilstand Others Andre Keep propagation mode Select the primary division for this QSO. ælg den primære division for denne QSO. Select the secondary division for this QSO. Vælg den sekundære division for denne QSO. Select the entity for this QSO. Vælg identiteten for denne QSO. Select the propagation mode for this QSO. Vælg propagatonstilstand for denne QSO. Select the IOTA continent for this QSO. Vælg IOTA-kontinentet for denne QSO. Select the IOTA reference number for this QSO. Vælg IOTA-referencenummeret for denne QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Ikke Identificeret Not - Not Identified Ikke - ikke identificeret SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL sendt QSL Rec QSL modt QSL Via QSL via QSL Msg QSL bskd Status of the QSL sending. Status for QSL-afsendelsen. Status of the QSL reception. Status for QSL-modtagelsen. QSL sending information. QSL-afsendelsesinformation. QSL reception information. QSL-modtagelsesinformation. Date of the QSL sending. Dato for QSL-afsendelsen. Date of the QSL reception. Dato for QSL-modtagelsen. Message of the QSL. Besked for QSL'en. QSL via information. QSL via information. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX-frekvens i MHz. RX Frequency in MHz. RX-frekvens i MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watt MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Navn QTH QTK DX Locator DX-lokalisering Power(rx) Power(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! RX Frequency in MHz. Frequency is not in a hamradio band! RX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! MainWindowMyDataTab Watts Watt Keep this data Behold disse data My QTH locator. Min QTH-locator. Power Strøm Operator callsign Station Callsign Stationkaldesignal My Locator Min locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Behold disse data Other - Sat not in the list Andre - sat er ikke i listen Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret ind i den næste QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Navn på satellitten hvis ikke i listen. Vælg: »%1« for at aktivere denne boks. Satellite mode used. Satellittilstand anvendt. Select the satellite you are using. Vælg satelitten du bruger. UpLink band. UpLink-bånd. DownLink band. DownLink-bånd. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokalisering af DX-stationen. Denne boks er synkroniseret med lokaliseringsboksen i QSO-fanebladet. UpLink UpLink DownLink DownLink Satellite Satellit Mode Tilstand DX Locator DX-lokalisering Other Andet MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO Ikke sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog har registreret et satellitnavn, som det ikke genkender. Hvis det skal bruge et af navnene på kendte satellitter i stedet for, vælg det fra listen. Alternativt så kontakt udviklingsholdet for at tilføje det nye satellitnavn. The satellite you have in your QSO is: Satellitten du har i din QSO er: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! RX Frequency in MHz. RX-frekvens i MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX-frekvens i MHz. Frekvens er ikke i et amatørradiobånd! TX Frequency in MHz. TX-frekvens i MHz. OnlineMessageWidget The server returned the following error: %1 Not identified Ikke identficeret QObject New One, work it! Ny, bearbejd den! Needed, work it! Krævet, bearbejd den! Worked but not confirmed Bearbejdet men ikke bekræftet Confirmed Bekræftet Not identified Ikke identficeret Database Error Databasefejl KLog DB needs to be upgraded. KLog-databasen skal opgraderes. Do you want to upgrade it now? Ønsker du at opgradere den nu? If DB is not upgraded KLog may not work properly. Hvis databasen ikke bliver opgraderet så fungerer KLog måske ikke korrekt. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog har registreret en tidligere log i databasen. Alle data vil blive migreret til en ny DX-typelog. KLog: Enter Station callsign KLog: Indtast stationskaldesignal Enter the station callsign used in this log Indtast stationskaldesignalet brugt i denne log Station Callsign Stationskaldesignal Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Opdaterer tilstandsinformation ... Abort updating Afbryd opdatering QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Afbrydelse af denne opdatering vil medføre datauoverensstemmelser og muligvis datatab. Ønsker du stadig at afbryde? Updating bands information... Opdaterer båndinformation ... Updating bands information in %1 status... Opdaterer båndinformation i %1 status ... Progress: Status: Updating mode information in %1 status... Opdaterer tilstandsinformation i %1 status ... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Installationsguide blev afbrudt før fuldførelse ... Do you want to remove the KLog dir from your disk? Ønsker du at fjerne KLog-mappen fra din disk? Your KLog dir has been removed Din KLog-mappe er blevet fjernet Thank you for running KLog! Tak fordi du bruger KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Jeg kunne ikke fjerne din KLog-mappe. Du bør gøre det manuelt, hvis du ønsker at den fjernes fra din harddisk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Din KLog-mappe kan ikke fjernes. Du skal gøre det manuelt, hvis du ønsker den fjernet fra din harddisk. Remember that your KLog dir is on your system... Husk at din KLog-mappe er på dit system ... Updating information... Updating DXCC and Continent information... Opdaterer DSCC- og kontinentinformation ... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Dato Call Call RSTtx RSTtx RSTrx RSTrx Band Bånd Comment Kommentar Mode Tilstand CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL sendt Force Init Freq Frek Freq RX Freq RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW sendt Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Navn Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL modt QSL Sent QSL sendt QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTK Region Rig RX Pwr Sat name Sat.-navn SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear &Ryd &Export Highlighted &Eksporter markering &Select All &Vælg alle &Search &Søg Clear the searches. Ryd søgninger. Export the search result to an ADIF file. Eksporter søgeresutlatet til en ADIF-fil. Select/Unselect all the QSOs shown. Vælg/fravælg alle viste QSO'ere. Search in the log. Søg i loggen. Search in all logs. Søg i alle logge. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection &Ryd markering Save File Gem fil You have requested to delete the QSO with: %1 Du har anmodt om at slette QSO'en med: %1 Are you sure? Er du sikker? SearchWindow Date/Time Dato/tid Band Bånd Mode Tilstand QSL Sent QSL sendt QSL Rcvd QSL modt Station Callsign ID Id Call Call Date/time Station callsign QSL Send QSL send &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct QSL received via direc&t QSL modtaget via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL &Anmod om min QSL Mark my QSL as requested Marker min QSL som anmodt om Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL &Anmod om QSL'en Mark the QSL as requested Marker QSL'en som anmodt om Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL Krævet QSO til at sende QSL'en My QSL requested to be sent Min QSL anmodt om at blive sendt DX QSL pending to be received DX QSL igangværende til modtagelse SetupDialog Bands/Modes Bånd/tilstande DX-Cluster DX-Cluster Colors Farver Misc Diverse World Editor Verdensredigeringsprogram Logs Logge Satellites Sattelitter Cancel Afbryd HamLib HamLib OK O.k. User data Brugerdata Log widget D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Du skal indtaste mindst en log i fanebladet for logge. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) World Verden Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Gå til diversefanebladet og klik på flyt db ellers vil databasen ikke blive flyttet til den nye placering. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. eLog DB has not been moved to new path. You have not selected the kind of log you want. Du har valgt den slags log du ønsker. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Du vil blive dirigeret til log-fanebladet. Tilføj og vælg den slags log du ønsker at bruge. SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Breddegrad Longitude Længdegrad UTC UTC Main prefix Hovedpræfiks ARRL ID ARRL ID Prefixes Præfiks Comma separated possible prefixes, e.g. EA1, EA2, ... Kommaadskilt mulige præfiks, f.eks. EA1, EA2, ... Ok O.k. Name of the Entity. Navn på element. CQ zone. CQ-zone. ITU zone. ITU-zone. Longitude of the Entity. Længdegrad for entitet. Local time difference to UTC. Lokal forskel i tid til UTC. Main prefix of the entity. Hovedpræfiks for entitet. ARRL ID. ARRL-Id. Date of the deletion. Sletningsdato. Deleted Slettet Cancel Afbryd Entity Dialog Entitetdialog SetupPageBandMode Bands Bånd Modes Tilstande SetupPageColors New One Ny Needed in this band Krævet i dette bånd Worked in this band Bearbejdet i dette bånd Confirmed in this band Bekræftet i dette bånd Default Standard WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Vælg en farve SetupPageDxCluster Add Tilføj Delete Slet Show &HF spots Vis %HF-spot Show V/&UHF spots Vis V/&UHF-spot Show W&ARC spots Vis W&ARC-spot Show &worked spots Vis &bearbejdede spot Show &confirmed spots Vis &bekræftede spot Show ANN/&FULL messages Vis ANN/&FULL-beskeder Show WW&V messages Vis WW&V-beskeder Show WC&Y messages Vis WC&Y-beskeder Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots DX-spot Others Andre Messages Beskeder KLog: Add a DXCluster server Klog: Tilføj en DXCluster-server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Tilføj adressen fulgt af :port Eksempel: dxfun.com:8000 Hvis ingen port er angivet, så vil 41112 blive brugt som standard: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Indtast e-posten du ønsker at registrere i ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Send hver QSO til ClubLog i realtid, efterhånden som de tilføjes (eller ændres) i KLog. Starts the ClubLog support in KLog. Starter ClubLog-understøttelse i KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Aktiver HamLib Activates the hamlib support that will enable the connection to a radio. Aktiverer understøttelse af hamlib, der vil aktivere forbindelsen til en radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Radio Select your rig. Vælg din rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Ny &Edit &Rediger &Remove &Fjern Add a new log. Tilføj en ny log. Edit the selected log. Rediger den valgte log. Remove the selected log. Fjern den valgte log. KLog KLog Do you really want to remove this log? Ønsker du at fjerne denne log? All the QSOs from this log will also be deleted... QSOs QSO'er The new log could not be created. Log has not been removed. (#3) Log er ikke blevet fjernet. (#3) Log has not been removed. (#2) Log er ikke blevet fjernet. (#2) Log has not been removed. (#1) Log er ikke blevet fjernet. (#1) ID Id Date Dato Station Callsign Stationskaldesignal Operators Operatører Comments Kommentarer An error has occurred showing the following error code: Der opstod en fejl med denne fejlkode: KLog - SetupPageLogs KLog - SetupPageLogs SetupPageLogsNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &O.k. &Cancel &Afbryd Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Kaldesignal brugt for denne log. Comma separated list of operators: callsign1, callsign2. Kommaadskilt liste over operatører: kaldesignal1, kaldesignal2. Start date of this log. Startdato for denne log. SetupPageMisc &Imperial system &Imperial-system &Log in real time &Log i realtid &Time in UTC &Tid i UTC &Save ADIF on exit &Gem ADIF ved afslut Use this &default filename Brug dette &filnavn som standard Mark &QSO to send QSL when QSL is received Marker &QSO til at sende QSL når OSL er modtaget Complete QSO with previous data Fuldfør QSO med tidligere data Show the Station &Callsign used in the search box Vis stations&kaldesignal brugt i søgeboksen &Check for new versions automatically &Kontroller for nye versioner automatisk &Provide Info for statistics &Tilbyd information for statistik Manage DX-Marathon Håndter DX-Maraton Activate the application debug log Mark sent eQSL && LoTW in new QSO as queued Browse Gennemse Move DB Flyt database QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO'er vil blive markeret som afventende på at sende en QSL hvis du modtager DX QSL'en og ikke har sendt dine. The search box will also show the callsign on the air to do the QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Kontroller om der er en ny version af KLog tilgængelig hver gang du starter KLog. Check non-valid calls &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Kontroller for Imperial-system (mil i stedet for kilometer). Select to use real time. Vælg at bruge realtid. Select to use UTC time. Vælg at bruge UTC-tidspunkter. Select if you want to save to ADIF on exit. Vælg hvis du ønsker at gemme til ADIF ved afslut. Select to use the following name for the logfile without being asked for it again. Vælg at bruge det følgende navn for logfilen uden at blive spurgt om det igen. Complete the current QSO with previous QSO data. Fuldfør den nuværende QSO med tidligere QSO-data. Select if you want to manage DX-Marathon. Vælg om du ønsker at håndtere DX-Marathon. This is the default file where ADIF data will be saved. Dette er standardfilen hvor ADIF-data vil blive gemt. This is the directory where the database (logbook.dat) will be saved. Dette er mappen hvor databsen (logbook.dat) vil blive gemt. Click to change the default ADIF file. Klik for at ændre ADIF-standardfilen. Click to change the path of the database. Klik for at ændre stien for databasen. Click to move the DB to the new directory. Klik for at flytte databasen til den nye mappe. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Åbn fil Select Directory Vælg mappe This is the directory where DB (logbook.dat) will be saved. Dette er mappen hvor DB (logbook.dat) vil blive gemt. Please specify an existing directory where the database (logbook.dat) will be saved. Angiv en eksisterende mappe hvor databasen (logbook.dat) vil blive gemt. KLog - Move DB File moved Fil flyttet File copied Fil kopieret File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Filen blev IKKE kopieret The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Målmappen findes ikke. Vælg venligst en eksisterende mappe. SetupPageSats &New &Ny &Edit &Rediger &Remove &Fjern &Import &Import E&xport &Eksport Add a new satellite. Tilføj en ny satellit. Edit the selected satellite. Rediger den valgte satellit. Remove the selected satellite. Fjern den valgte satellit. Export your current satellites to a file. Eksporter dine nuværende satellitter til en fil. Select the sat you want to open. Vælg satellitten du ønsker at åbne. KLog KLog Do you really want to remove this satellite? Ønsker du virkelig at fjerne denne satellit? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat. er ikke blevet fjernet. (#3) Sat has not been removed. (#2) Sat. er ikke blevet fjernet. (#2) Sat has not been removed. (#1) Sat. er ikke blevet fjernet. (#1) ID Id Short Kort Name Navn Uplink Uplink Downlink Downlink Modes Tilstande An error has occurred showing the following error code: Der opstod en fejl der viser den følgende fejlkode: KLog - SetupPageSats Klog - SetupPageSats Open Satellites File Åbn satellitfil KLog warning KLog-advarsel An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Der opstod en uventet fejl under import af satellitdata. Det kan være fordi, at filen du forsøger at imporetere ikke har det korrekte format. Please check the format or contact the developer for analysis with the error code: Kontroller venligst formatet eller kontakt udvikleren for analyse med fejlkoden: Save Satellites File Gem satellitfil SetupPageSatsNew Short name Kort navn Sat name Sat.-navn UpLink UpLink DownLink DownLink Modes Tilstande &Ok &O.k. &Cancel &Afbryd Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Indtast det korte navn. Prøv at bruge LoTW-kort navn, så du kan overføre din QSo til LoTW efterfølgende. Enter the name of the satellite. Indtast navnet på satellitten. Enter the uplink frequencies in this format: 144.300 Indtast uplink-frekvenser i dette format: 144.300 Enter the downlink frequencies in this format: 144.300 Indtast downlink-frekvenser i dette format: 144.300 Enter the modes in this format: USB Indtast tilstandene i dette format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &O.k. &Cancel &Afbryd Callsign used for this log. Kaldesignal brugt for denne log. Comma separated list of operators: callsign1, callsign2. Kommaadskilt liste over operatører: kaldesignal1, kaldesignal2. Start date of this log. Startdato for denne log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Fjern Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log er ikke blevet fjernet. (#3) Log has not been removed. (#2) Log er ikke blevet fjernet. (#2) Log has not been removed. (#1) Log er ikke blevet fjernet. (#1) ID Id Name Navn Short Name CQ Zone CQ-zone ITU Zone ITU-zone Deleted Slettet Start Date End Date DXCC DXCC An error has occurred showing the following error code: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Start UDP-server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-portnummer hvor UDP-serveren vil lytte efter pakker. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-server vil modtage QSO'er sendt fra andre programmer såsom WSJT-X hvilket gør, at du kan logge ind i KLog automatisk fra disse programmer. UDP Port UDP-port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Personlige data Station &data Stations&data Enter your name. Indtast dit navn. Enter your address - 1st line. Indtast din adresse - 1. linje. Enter your address - 2nd line. Indtast din adresse - 2. linje. Enter your address - 3rd line. Indtast din adresse - 3. linje. Enter your address - 4th line. Indtast din adresse - 4. linje. Enter your city. Indtast din by. Enter your zip code. Indtast din zip-kode. Enter your province or state. Indtast din provins eller stat. Enter your country. Indtast dit land. &Name &Navn &Address &Adresse Cit&y &By &Zip Code &Zip-kode Pro&v/State &Prov/stat Countr&y &Land Enter your information for rig Indtast din information for rig Enter your information for antenna Indtast din information for antenne Enter your power information. Indtast din strøminformation. Enter the station callsign that will be used for logging. Indtast stationskaldesignalet som vil blive brugt til logning. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Strøm Enter the operators (comma separated if more than one). Indtast operatørerne (kommaadskilt hvis mere end en). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Indtast locatoren for din station. Alternativt kan KLog bruge en omtrentlig loacator baseret på dit kaldesignal. &Callsign &Operators &Operatører &CQ Zone &CQ-zone &ITU Zone &ITU-zone &Locator &Locator &Locator (not valid) &Locator (ikke gyldig) SetupPageWorldEditor Add Tilføj Delete Slet Edit Rediger Export World Eksportverden Import World Importverden Still not implemented. Endnu ikke implementeret. Import a new cty.csv file Importer en ny cty.csv-fil An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. En entitetsinformationsfil (cty.csv) er blevet registreret i din KLog-mappe og vil blive indlæst. No entities information file (cty.csv) has been detected in your KLog folder. Ingen entitetinformationsfil (cty.csv) er blevet registreret i din KLog-mappe. KLog will not be able to show entities information. KLog vil ikke kunne vise entitetinformation. Prefix Præfiks Entity Entitet ARRL ID ARRL-id Continent Kontinent CQ Zone CQ-zone ITU Zone ITU-zone UTC UTC Latitude Breddegrad Longitude Længdegrad Deleted Slettet Since Date Siden dato To Date Til dato Open File Åbn fil BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Entitetinformation er blevet opdateret. Entities information has not been updated. Entitetinformatoin er ikke blevet opdateret. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok O.k. DX Date/Time Dato/tid Band Bånd Mode Tilstand ShowErrorDialog KLog Message KLog-besked SoftwareUpdateDialog Ok O.k. KLog update KLog-opdatering <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Tillykke! Your KLog has been updated. Din KLog er blevet opdateret. You already have the latest version. Du har allerede den seneste version. StartWizard KLog - The free hamradio logging program KLog - Det frie logningsprogram for amatørradio Quit Setup Afslut opsætning Setup is not complete yet. Are you sure you want to quit setup? Opsætning er ikke færdig endnu. Er du sikker på, at du ønsker at afslutte opsætningen? StatisticsWidget QSO per year QSO per år DXCC per year DXCC per år CQ zones per year CQ-zoner per år QSO per band QSO per bånd QSO per mode QSO per tilstand QSO per DXCC QSO per DXCC QSO per Continent QSO per kontinent QSO per hour QSO per time QSO per month QSO per måned Worked / Confirmed status Bearbejdet / bekræftet status Worked / Sent status Bearbejdet / sendt-status Sent / Confirmed status Sendt / Bekræftet status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ-zoner per år Reading data ... Læser data ... Abort reading Afbryd læsning CQ zones CQ-zoner CQ zones per year CQ-zoner per år Reading data ... Læser data ... Years: %1/%2 År: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Nummer Callsign Kaldesignal Date Dato Band Bånd Mode Tilstand DXCC DXCC Satellite Satellit Confirmed Bekræftet No Nej StatsEntitiesPerYearBarChartWidget Chart title Diagramtitel Reading data ... Læser data ... Abort reading Afbryd læsning DXCC Entities DXCC-elementer DXCC Entities per year DXCC-elementer per år Reading data ... Læser data ... Entities: Elementer: StatsFieldPerBandWidget All Alle Mode: Band Bånd Worked Bearbejdet Confirmed Bekræftet StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Nummer Callsign Kaldesignal Date Dato Band Bånd Mode Tilstand Grid Satellite Satellit Confirmed Bekræftet No Nej StatsQSOsPerBandBarChartWidget QSOs per band QSO'er per bånd Reading data ... Læser data ... Abort reading Afbryd læsning Bands Bånd QSOs per band distribution Reading data ... Læser data ... Bands: Bånd: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO'er per kontinent Reading data ... Læser data ... Abort reading Afbryd læsning Continents Kontinenter Reading data ... Læser data ... Hours: Timer: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO'er per DSCC Reading data ... Læser data ... Abort reading Afbryd læsning Reading data... Læser data ... DXCC DXCC Top ten DXCC per QSO Top ti DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO'er per time Reading data ... Læser data ... Abort reading Afbryd læsning Hours Timer QSOs at hour QSO'er per time Reading data ... Læser data ... Hours: Timer: StatsQSOsPerModeBarChartWidget QSOs per mode QSO'er til tilstand Reading data ... Læser data ... Abort reading Afbryd læsning Modes Tilstande QSOs per mode distribution Reading data ... Læser data ... Modes: Tilstande: StatsQSOsPerMonthBarChartWidget QSOs per month QSO'er per måned Reading data ... Læser data ... Abort reading Afbryd læsning Jan Jan Feb Feb Mar Mar Apr Apr May Maj Jun Jun Jul Jul Sep Sep Oct Okt Nov Nov Dec Dec Aug Aug Months Måneder QSOs at Month QSO'er per måned Reading data ... Læser data ... Months: Måneder: StatsQSOsPerYearBarChartWidget Reading data ... Læser data ... Abort reading Afbryd læsning QSOs QSO'er QSOs per year QSO'er per år Reading data ... Læser data ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Sendt - %1 Confirmed - %2 Bekræftet - %2 Sent / Confirmed status Sendt / Bekræftet status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbejdet, ikke bekræftet - %1 Confirmed - %2 Bekræftet - %2 Worked / Confirmed status Bearbejdet / bekræftet status StatsWorkedSentPieChartWidget Worked - %1 Bearbejdet - %1 Sent - %2 Sendt - %2 Worked / Sent status Bearbejdet / sendt-status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Læser satellitdatafil ... Abort reading Om læsning The Satellites information has been updated. Satellitinformationen er blevet opdateret. Open File Åbn fil Sat Data Sat-data World Entity Entitet Continent Kontinent Reading cty.csv... Læser cty.csv ... Abort reading Afbryd læsning WorldMapWidget World map View Zoom In(25%) Zoom Out(25%) Normal Size Fit to window eLogClubLog Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! KLog - ClubLog KLog - ClubLog Undefined error... Fejl er ikke defineret ... Undefined error number (#%1)... QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Kaldesignal mangler Invalid callsign Ugyldig kaldesignal Skipping SWL callsign Udelader SWL-kaldesignal Callsign is your own call Kaldesignal er dit eget kald Invalid callsign with no DXCC mapping Ugyldigt kaldesignal uden DXCC-oversættelse Updated QSO Opdateret QSO Invalid ADIF record Ugyldig ADIF-post Missing ADIF record Manglende ADIF-post Test mode - parameters ok, no action taken Testtilstand - parametre o.k., ingen handling taget Excessive API Usage Overdreven API-forbrug Internal Error Intern fejl Rejected Afvist QSO Duplicate QSO dublet QSO Modified QSO ændret Missing Login Manglende logind QSO OK QSO OK Upload denied Overførsel afvist No callsign selected Inter kaldesignal valgt No match found Intet match fundet Dropped QSO Droppet QSO OK O.k. Login rejected Logind afvist Rejected: Callsign is your own call Afvist: Kaldesignal er dit eget kald eLogQrzLog Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Kaldesignal mangler eQSLUtilities Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/translations/klog_cs.ts0000644000175000017500000140533014166020421016156 0ustar develdevel AboutDialog About KLog O KLog By od KLog is a free logbook for hamradio operators. KLog je svobodný staniční log pro radioamatéry. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Mějte na paměti, že se jedná o vývojovou verzi a ta může obsahovat mnoho chyb.<br>Před použitím tohoto software proveďte zálohu dat! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Od verze 0.6.2 byl KLog přepsán tak, aby mohl běžet na všech hlavních operačních systémech (GNU/Linux, macOS a Windows) a podporoval nové funkce. Please provide your review in KLog's eHam review page: Prosím, napište Vaši recenzi na stránce eHam review: Find more information and the latest release at Více informací a nové verze najdete na Author Autor today dnes Main developer Hlavní vývojář KLog is developed by a very small team and you are invited to join! KLog je vyvíjen velmi malým týmem, ale každá další pomoc je vítaná! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Pokud KLog stále není ve vašem jazyce a chcete nám pomoci, můžete nás kontaktovat prostřednictvím <a href="https://groups.io/g/klog"> KLog mailing listu </a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Můžete nám také pomoci třeba zasláním hlášení o chybě nebo malým kusem kódu, nápady nebo čímkoliv, co si myslíte, že by mohlo vylepšit KLog. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Pokud potřebujete poradit, můžete se připojit k <a href="https://groups.io/g/klog">KLog mailing listu</a>! Authors Autoři Translators bring KLog into your language. They are really an important part of the KLog development team. Překladatelé překládají KLog do vašeho jazyka. Jsou opravdu důležitou součástí vývojového týmu KLog. Translators Překladatelé Privacy advisory Ochrana osobních údajů KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Vývojáři KLog implementovali funkci, která posílá některá uživatelská data na server KLog s jediným účelem - identifikovat počet nainstalovaných verzí, zaměřit vývoj jedním nebo druhým směrem s ohledem na potřeby uživatelů. At present, the data that is provided is the following: V současné době jsou poskytovány následující údaje: Callsign Volací značka KLog version KLog verze Operating system Operační systém Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tuto funkci můžete povolit nebo zakázat v menu Nastavení ->Nastavení ->záložka Různé. KLog KLog Privacy Soukromí AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Vyberte volací značku, kterou chcete použít pro nahrání logu. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Vyberte počáteční datum exportu QSO. Výchozí datum je datum prvního spojení s touto volací značkou. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Vyberte koncové datum exportu QSO. Výchozí datum je datum posledního spojení s touto volací značkou. Station callsign Volací značka Start date Počáteční datum End date Koncové datum Ok Ok Cancel Zrušit DX DX Date/Time Datum/Čas Band Pásmo Mode Druh provozu Not defined Nedefinovaná All Všechny QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO nahrávána do LoTW. This table shows the QSOs that will be sent to LoTW. Tabulka obsahuje QSO, která budou nahrána do LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO nahrávána do ClubLog. This table shows the QSOs that will be sent to ClubLog. Tabulka obsahuje QSO, která budou nahrána do ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO nahrávána do eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Tabulka obsahuje QSO, která budou nahrána do eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO nahrávána do QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Tabulka obsahuje QSO, která budou nahrána do QRZ.com. This table shows the QSOs that will be exported to ADIF. Tabulka obsahuje QSO, která budou exportována do ADIF. AwardsWidget Recalculate Přepočítat Click to recalculate the award status. Kliknutím přepočítáte stav diplomů. Select the year you want to check. Vyberte rok, který chcete zkontrolovat. QSOs QSO DXCC DXCC CQ CQ Award Diplom Confirmed Potvrzené Worked Navázané WAZ WAZ Score Skóre Annual Roční Number of confirmed DXCC entities. Počet potvrzených DXCC. Number of worked DXCC entities. Počet navázaných DXCC. Number of confirmed WAZ zones. Počet potvrzených WAZ. Number of worked WAZ zones. Počet navázaných WAZ. Number of confirmed QSOs. Počet potvrzených QSO. Number of worked QSOs. Počet navázaných QSO. Number of QSOs worked in the selected year. Počet QSO navázaných ve vybraném roce. Number of DXCCs worked in the selected year. Počet DXCC ve vybraném roce. Number of CQ Zones worked in the selected year. Počet CQ Zone navázaných ve vybraném roce. Score for the DXMarathon in the selected year. Výsledek DXMarathonu ve vybraném roce. DX-Marathon DX-Marathon CTYPage Country data download Stažení Country informací KLog needs country data... KLog požaduje Country informace... &Download &Stáhnout &Ignore &Ignorovat Country data needed Jsou potřeba Country informace KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog používá soubor cty.csv umístěný na https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Musíte si stáhnout soubor cty.csv, pokud chcete, aby vám KLog ukázal země, lokátor atd. Click on Download to download now. Stiskněte Stáhnout pro zahájení stahování. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Server nenalezen. Prosím, zkontrolujte připojení a zkuste to znovu Chcete to zkusit znovu? DXCCStatusWidget Update Aktualizovat It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Prefix Prefix Entity Stanice Pref: Pref: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Se stanicí nepracováno na tomto pásmu. DXClusterWidget Click on Connect to connect to the DX-Cluster server Kliknutím na Připojit se přípojíte do DX Clusteru Connect Připojit Clear Smazat Click on connect to connect to the DX-Cluster Kliknutím na Připojit se přopojíte do DX Clusteru Trying to connect to the server Pokouším se připojit k serveru KLog DXCluster KLog DXCluster The host was not found. Please check: Server nebyl nalezen. Prosím, překontrolujte: - your network connection; - the host name and port settings. - sítové nastavení; - jméno serveru a nastavení port. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Spojení bylo serverem odmítnuto. Zkontrolujte, zda je spuštěn DXCluster, a zkontrolujte, zda je název serveru a nastavení portu správné. The following error occurred: %1. Nastala následující chyba: %1. Connected to server Připojeno k serveru KLog message KLog zpráva Enter your callsign to connect to the cluster: Vložte svou volací značku pro připojení do clusteru: Enter your password to connect to the cluster: (Just hit enter for no password) Vložte heslo do DX clusteru: (Stiskněte Enter pro prázdné heslo) Disconnect Odpojit Not logged on, you may need to enter your callsign again. Nejste přihlášeni, možná budete muset znovu zadat svou volací značku. Enter here the commands to be sent to the DX-Cluster server. Zde zadejte příkazy, které se mají odeslat do DX-Clusteru. Connection closed by the server Spojení ukončeno Click on Connect to connect to the DX-Cluster server. Kliknutím na Připojit se připojíte do DX Clusteru. Send Odeslat It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Nebylo možné otevřít soubor s DX-Spoty pro zápis. Aktivita DX-Cluster nebude uložena! DataProxy_SQLite Software version in DB is null Verze SW v databázi je NULL Query didn't failed Dotaz neselhal Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Earth-Moon-Earth Sporadic E Sporadic E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Internet-assisted Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Převaděč nebo transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satelit Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Ano No Ne Requested Vyžádané Ignore/Invalid Ignorovat / Neplatné Validated Ověřené Queued Ve frontě Uploaded Nahrané Do not upload Nenahrávat Modified Modifikované Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Elektronicky Manager Common term in hamradio, do not translate if not sure Manažer KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Všechna QSO byla aktualizována na DXCC a Kontinent. KLog - Invalid call detected KLog - Byla zjištěna chybná značka An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Byla zjištěna prázdná volací značka. Přejete si přesto toto QSO exportovat (klikněte na Ano) nebo ho odstranit z exportu ADIF? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Byla zjištěna neplatná volací značka %1. Přejete si přesto toto QSO exportovat (klikněte na Ano) nebo ho odstranit z exportu? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Export chybných značek může způsobit problémy v aplikacích, do kterých potenciálně importujete tento log. Může to však být dobrá značka, kterou KLog nesprávně identifikoval. DownLoadCTY Download of cty.csv failed with the following error code: Stažení cty.csv se nezdařilo a skončilo touto chybou: Download of cty.csv done. Stažení cty.csv dokončeno. There is already a cty.csv file in the folder but it will be replaced with the new one. Soubor cty.csv již existuje, ale bude nahrazen novějším. Could not open %1 for writing Nepodařilo se zapsat do souboru %1 FileAwardManager Open Award file Otevřít soubor s diplomy Award files (*.awa) Diplom (*.awa) Award file not opened Nepodařilo se otevřít soubor s diplomem KLog was not able to read the award file KLog nebyl schopen přečíst soubor s diplomem It was not possible to open the file %1 for reading. Nebylo možné otevřít soubor %1 pro čtení. AWA wrong format Chybný formát AWA The AWA file does not have the right format Soubor AWA nemá správný formát AWA file does not have an <EOH> field Soubor AWA nemá pole <EOH> KLog - %1 KLog - %1 FileManager KLog - Error KLog - Chyba The selected log does not exist, please check it again. Vybraný log neexistuje, prosím, překontrolujte to znovu. The selected callsign (%1) is not valid, please check it again to export the log. Vybraná volací značka (%1) neexistuje, prosím, překontrolujte to znovu. The file %1 can't be opened. Soubor %1 se nepodařilo otevřít. There are no QSOs pending to be exported with that station callsign. Neexistuje žádné QSO, které by bylo s touto volací značkou exportováno. Writing ADIF file... Zapisuji ADIF... Abort writing Zapis přerušen Export Export Exporting ADIF file... QSO: %1 / %2 Exportuji ADIF... QSO: %1 / %2 KLog - User cancelled KLog - Zrušeno uživatelem You have canceled the file export. The file will be removed and no data will be exported. Zrušili jste export souboru. Soubor bude odstraněn. Do you still want to cancel? Stále to požadujete zrušit? Export progress Průběh exportu Writing ADIF file... QSO: Zapisuji ADIF... QSO: KLog - File not opened KLog - Soubor se nepodařilo otevřít It was not possible to open the file %1 for reading. Nebylo možné číst ze souboru %1. KLog was not able to read the LoTW file KLog nebyl schopen přečíst soubor LoTW Processing LoTW ADIF file... LoTW ADIF je zpracováván... Abort processing Přerušit zpracování LoTW reading Čtení LoTW KLog - Add new QSOs? KLog - Přidat nové QSOs? Do you want to add non existing QSOs to your local log? Přejete si přidat neexistující QSO do lokálního logu? There are some QSOs in the LoTW log that are not in your local log. V LoTW jsou spojení, která nejsou ve vašem lokálním logu. Processing LoTW ADIF file...... QSO: %1 / %2 LoTW ADIF je zpracováván...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Zrušili jste zpracování LoTW. Váš log nemusí být zcela aktualizovaný. Reading LoTW file... Čtení LoTW... Abort reading Přerušit čtení Importing LoTW ADIF file... Import LoTW ADIF... QSO: QSO: You have canceled the file import. The file will be removed and no data will be imported. Přerušili jste import souboru. Soubor bude odstraněn. Neimportovala se žádná data. KLog - Log selection KLog - Výběr logu There is more than one log in this logfile. V souboru je více než jeden log. All logs will be imported into the current log. Všechny logy budou importovány do aktuálního logu. Do you want to continue? Přejete si pokračovat? Reading ADIF file... Čtení ADIF... Do you want to add dupe QSOs to your local log? Přejete si vložit duplicitní QSO do lokálního logu? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Některá QSO v logu mohou být duplicitní, protože mají stejnou volací značku, pásmo & druh a velmi blízké datum. Importing ADIF file... Import ADIF... KLog - Duplicated QSOs KLog - Duplicitní QSO It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) V importovaném ADIF souboru jsou duplicitní QSO. Přejete si pokračovat? (Duplicitní QSO nebudou importována) This QSO is not including the minimum data to consider a QSO as valid! Toto QSO nezahrnuje minimální množinu informací, aby bylo považováno za platné! Please edit the ADIF file and make sure that it include at least: Upravte ADIF tak, aby obsahoval alespoň: and a This QSO had: QSO mělo: - The band missing and the following call: - Chybějící pásmo a následující volací značku: - The mode missing and the following call: - Chybějící druh provozu a následující volací značku: - The date missing and the following call: - Chybějící datum a následující volací značku: - The time missing and the following call: - Chybějící čas a následující volací značku: Do you want to continue with the current file? Přejete si pokračovat se současným souborem? KLog: Not all required data found! KLog: Nebyla nalezena všechna požadovaná data! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Některým QSO z tohoto logu (tj.: %1) chybí informace RST TX. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Kliknutím na Ano přidáte výchozí %1 pro druh %2 do všech QSO s podobným problémem. If you select NO, maybe the QSO will not be imported. Kliknutím na Ne nebudou QSO importována. KLog: No RST TX found! KLog: RST TX nenalezeno! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Některým QSO z tohoto logu (tj.: %1) chybí informace RST RX. KLog: No RST RX found! KLog: RST RX nenalezeno! KLog - No Station callsign entered. KLog - Není vložena volací značka. KLog - Apply to all QSOs in this log? KLog - Použít na všechna QSO v tomto logu? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog: Našlo se QSO bez volací značky. Vložte volací značku, která byla použita při tomto QSO s %1 na %2: KLog - QSO without Station Callsign KLog - QSO bez volací značky KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog: Našlo se QSO bez volací značky. Vložte volací značku, která byla použita při tomto QSO na %1: KLog - Don't ask again KLog - Znovu se neptat Do you want to reuse your answer? Přejete si opětovně použít odpověď? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog automaticky použije předchozí odpověď na jakýkoliv podobný výskyt, aniž by se znovu zeptal. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Datum/Čas:</i> %1</li><li>Značka: %2</li><li>Pásmo: %3</li><li>Druh: %4</li></ul> KLog - QSO not found KLog - QSO nenalezeno Do you want to add this QSO to the log?: Přejete si přidat QSO do logu?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Bylo nalezeno QSO původem z LoTW, které není v lokálním logu. Přejete si přidat toto spojení? KLog - Invalid call detected KLog - Byla zjištěna chybná značka An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Byla zjištěna prázdná volací značka. Přejete si přesto toto QSO exportovat (klikněte na Ano) nebo ho odstranit z exportu? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Byla zjištěna neplatná volací značka %1. Přejete si přesto exportovat tuto značku (stiskem Ano) nebo ji odstranit z exportu? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Export chybných značek může způsobit problémy v aplikacích, do kterých potenciálně importujete tento log. Může to však být dobrá značka, kterou KLog nesprávně identifikoval. Po exportu můžete také soubor ADIF upravit. HamLibNetworkConfigWidget Enter the hostname or address of the radio. Zadejte hostname nebo adresu rádia. Set de network port of the radio. Nastavení portu rádia. Host/Address Host/Adresa Port Port Enter the port of the radio. Zadejte port rádia HamLibSerialConfigWidget Bauds Rychlost Select the serial port speed. Vyberte rychlost sériového portu. Port Port Select the serial port. Only the serial ports that are detected are shown. Vyberte sériový port. Jsou zobrazeny pouze nalezené seriové porty. Scan Vyhledat Click to identify the serial ports available in your computer. Vyhledat dostupné sériové porty na tomto počítači. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Datové bity Select the serial data bits. Vyberte datové bity. None Žádný Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Řízení toku Select the serial flow control Vyberte řízení toku na sériovém portu No parity No parity Even Even Odd Odd Space Space Mark Mark Parity Parity Select the serial parity. Vyberte paritu sériového portu. Default Výchozí 1 bit 1 bit 2 bits 2 bits Stop bits Stop bity Select the serial stop bits. Vyberte Stop bity. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinent Prefix Prefix CQ CQ ITU ITU Short Path Short Path Long Path Long Path Deg Azimut Miles Mile Km Km IntroPage Welcome to KLog! Vítejte v KLog! Welcome to KLog! - brought to you under the terms of the GPL! Vítejte v KLog! - přinesen Vám byl za podmínek GPL! Welcome to KLog Vitejte v KLog This looks like it's the first time you've run KLog on this computer. Vypadá to, že je to první spuštění KLog na tomto počítači. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog je bezplatný staniční log pro radioamatéry, který běží na GNU/Linux, macOS a Windows. It is designed to provide general purpose DX, and contest logging. Je navržen tak, aby poskytoval vedení logu pro DX a soutěže. It supports QSL management, import and export of ADIF Podporuje QSL management, import a export ADIF and Cabrillo file formats and many other features... a Cabrillo a mnoho dalšího... Before you can start using KLog, you will be asked to: Než začnete KLog používat, budete požádáni o: Acknowledge to the terms of the license. Odsouhlasení licenčních podmínek. Download the DX entities information. Stažení DX informací. Enter your callsign, CQ zone, etc. and main configuration. Vložení Vaší volací značky, CQ Zone a hlavní konfigurace. Enjoy KLog and contact the development team if you have any suggestions! Užijte si KLog a kontaktujte vývojový tým, pokud máte jakékoliv návrhy! LicPage KLog License information KLog Licenční Informace Welcome to KLog!- brought to you under the terms of the GPL! Vítejte v KLog! - přinesen Vám byl za podmínek GPL! Acknowledge Odsouhlasit Be aware that KLog is free software. Uvědomte si, že KLog je svobodný software. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Dvakrát klikněte na datum, které chcete použít jako počáteční datum pro stažení QSO. KLog - LoTW password needed KLog - Je vyžadováno heslo LoTW Please enter your LoTW password: Vložte heslo do LoTW: KLog - LoTW Station callsign KLog - LoTW stanice There is not a single QSO in the log with that station callsign. V logu pro tuto stanici není žádné QSO. Are you sure that you want to use that station callsign (%1)? Opravdu si přejete použít stanici (%1)? KLog - LoTW File already exists KLog - Soubor LoTW již existuje There is a file already existing with the name that will be used. Soubor s takovým jménem již existuje. The file %1 already exist. Do you want to overwrite? Soubor %1 již existuje. Přejete si jej přepsat? KLog - LoTW Can't write the file KLog - LoTW Nelze zapsat do souboru KLog was not able to save the file %1. Error returned: %2 KLog nebyl schopen zapsat do souboru %1. Chyba : %2 The file %1 already exists. Soubor %1 již existuje. Downloading data to file: %1. Stahuji data to souboru: %1. KLog - LoTW download KLog - Stažení LoTW KLog - LoTW Start date selection KLog - LoTW Výběr počátečního data This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Toto je první datum spojení s volací značkou %1 v tomto logu Pokud si myslíte, že v LoTW můžete mít předchozí spojení, odpovězte Ne. Do you want to use this date (%1) as start date? Přejete si použít datum (%1) jako počáteční datum? KLog - LoTW Download error KLog - LoTW Chyba při stahování There was an error (%1) while downloading the file from LoTW. Při stahování souboru z LoTW došlo k chybě (%1). The downloading error details are: %1 Detaily chyby: %1 KLog - LoTW Redirection found KLog - LoTW Nalezeno přesměrování The remote server redirected our connection to %1 Vzdálený server přesměroval spojení na %1 Do you want to follow the redirection? Akceptujete toto přesměrování? KLog - LoTW File not found KLog - LoTW Soubor nenalezen KLog can't find the downloaded file. KLog nemůže nalézt stažený soubor. It was not possible for find the file %1 that has been just downloaded. Nebylo možné najít soubor %1, který byl právě stažen. KLog - LoTW user/password error KLog - LoTW Chyba uživatele/hesla LoTW server did not recognized your user/password LoTW odmítl vaše přihlašovací údaje (uživatel/heslo) Check your user and password and ensure your are using the right one before trying again. Než to zkusíte znovu, zkontrolujte své uživatelské jméno a heslo. KLog - LoTW No QSOs KLog - LoTW Žádné QSO LoTW sent no QSOs LoTW Nebylo odesláno žádné QSO It seems that LoTW has no QSO with the Station Callsign you are using (%1). LoTW neobsahuje QSO se značkou stanice, kterou právě používáte (%1). KLog - LoTW Unknown error KLog - LoTW Neznámá chyba KLog can't recognize the file that has been downloaded from LoTW. KLog nemůže rozpoznat soubor, který byl stažen z LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. Zkuste to znovu a pošlete stažený soubor (%1) vývojáři KLog k analýze. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog úspěšně stáhl %1 QSO. Chcete aktualizovat svůj log o stažená data? Now KLog will process the downloaded QSO and update your local log. KLog zpracuje stažená spojení a aktualizuje lokální log. LogWindow QSL Send Odeslat QSL QSL Rcvd QSL Přijato &Delete &Smazat Delete a QSO Smazat QSO &Edit QSO &Upravit QSO Edit this QSO Upravit QSO Via &bureau Via &bureau Send this QSL via bureau Odeslat QSL via bureau D&irect D&irect Send this QSL via direct Odeslat QSL direct Via bureau Via bureau QSL &received via bureau QSL &přijato via bureau Direct Direct QSL received via direc&t QSL přijato direc&t Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat značku v QRZ.com Check in DXHeat.com Vyhledat v DXHeat.com Check this callsign in DXHeat.com Vyhledat značku v DXHeat.com Delete selected QSOs Smazat vybraná QSO Delete the selected QSOs Smazat vybraná QSO Export to ADIF Export ADIF Export the selected QSOs to an ADIF file. Exportovat vybraná QSO do ADIF. Upload to LoTW Nahrát do LoTW Upload the selected QSOs to LoTW Nahrát vybraná QSO do LoTW Upload to ClubLog Nahrát do ClubLog Upload the selected QSOs to ClubLog Nahrát vybraná QSO do ClubLog Upload to eQSL.cc Nahrát do eQSL.cc Upload the selected QSOs to eQSL.cc Nahrát vybraná QSO to QSL.cc Send these QSLs via bureau Odeslat tyto QSL via bureau Send these QSLs via direct Odeslat tyto QSL direct QSLs received via bureau QSL přijatá via bureau QSLs received via direc&t QSL přijatá direc&t Select none Zrušit výběr Remove all selections Odebrat všechny výběry Select all Vybrat všechny Select all the QSOs Vybrat všechny QSO MainQSOEntryWidget &Add &Vložit &Clear S&mazat Callsign of the QSO. Volací značka. Band of the QSO. Pásmo. Mode of the QSO. Druh provozu. Date of the QSO. Datum. Time of the QSO. Čas. Add the QSO to the log. Vložit QSO do logu. Clears the QSO entry. Smazat QSO. KLog will show real time if enabled. Pokud zaškrtnuto, KLog zobrazuje skutečný čas. Real time Skutečný čas Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Stanice &Modify &Upravit DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Check always the current callsign in QRZ.com Vždy vyhledej stanici v QRZ.com KLog - File not open KLog - Soubor neotevřen It was not possible to open the debug file for writing. No debug log will be saved! Není možné zapsat do debug souboru. Debug informace nebudou zapisovány! Status bar ... Stanový řádek ... DX Entity DX země Starting KLog Startuji KLog &Log Window Okno &Logu Upload the queued QSOs to LoTW Nahrát zafrontovaná QSO to LoTW KLog - CTY.dat update KLog - CTY.dat aktualizace KLog needs to update the Entities database. KLog potřebuje aktualizovat databázi zemí. You can update the entities database in Tools->Update cty.csv Aktualizovat databázi zemí je možné v Nástrojích->Aktualizace cty.csv Do you want to do it now? Přejete si to nyní provést? It seems that you have never done a backup or exported your log to ADIF. Nebyla provedená záloha nebo export logu do ADIF. It seems that the latest backup you did is older than one month. Poslední záloha je starší více než jeden měsíc. Log backup recommended! Je doporučována záloha! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Je dobrým zvykem pravidelně zálohovat celý log, aby nedošlo v případě problému ke ztrátě dat. Jakmile exportujete svůj log do souboru ADIF, měli byste tento soubor zkopírovat na bezpečné místo, například na USB disk, do cloudu nebo jiný počítač. KLog vám připomene, abyste zálohovali každý měsíc. KLog - Backup KLog - Záloha The backup was done successfully Záloha proběhla úspěšně KLog will remind you to backup your data again in aprox one month. KLog připomene provést další zálohu přibližně za 1 měsíc. The backup was not properly done. Záloha se nepovedla. It is recommended to backup your data periodically to prevent lose or corruption of your log. Doporučujeme pravidelně zálohovat data, aby nedošlo ke ztrátě nebo poškození vašeho logu. KLog - New version detected! KLog - Byla zjištěna nová verze! It seems that you are running this version of KLog for the first time. Zdá se, že používáte tuto verzi KLogu poprvé. The setup will be open to allow you to do any new setup you may need. Otevře se nastavení, pro úpravu parametrů. Ready Připraven KLog KLog KLog - Unexpected error KLog - Neočekávána chyba An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Při pokusu o přidání spojení do vašeho logu došlo k neočekávané chybě. Pokud problém přetrvává, požádejte vývojáře o analýzu: KLog - Not valid call KLog - Neplatná značka The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Volací značka %1 není platná. Opravdu si přejete vložit tuto značku do logu? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Vložení neplatné značky do logu může způsobit problémy při žádosti o diplomy, exportu do ADIF. KLog - Select correct entity KLog - Vyberte správnou zemi You have selected an entity: Vybrali jste zemi: that is different from the KLog proposed entity: která se liší od země navrhované KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klikněte na prefix správné země nebo Zrušit upravte spojení. KLog - Not valid callsign KLog - Neplatná značka The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Volací značka %1 není platná. Opravdu si přejete vložit tuto stanici do logu? No DXCC Není DXCC None Žádný Click on the prefix of the right entity or Cancel to correct. Klikněte na prefix správné země nebo Zrušit pro upravení. Save ADIF File Uložit ADIF You have requested to delete several QSOs Bylo požadováno smazat několik QSO This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Tato operace definitivně odstraní všechna vybraná QSO a související data a nebudete jej moci znovu obnovit. Are you sure? Opravdu chcete odstranit QSO? You have requested to delete the QSO with: %1 Bylo požadováno smazat QSO s: %1 KLog - ClubLog error KLog - Chyba ClubLog The ClubLog upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do ClubLog byl dokončen s chybou. Log pravděpodobně nebyl nahrán. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Zkontrolujte prosím své přihlašovací údaje, připojení k internetu a účet Clublog. Chybový kód:%1 KLog - ClubLog KLog - ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Přejete si označit jako Nahraná všechna QSO nahraná na ClubLog? There was an error while updating to Yes the ClubLog QSO upload information. Došlo k chybě při nahrávání informací ClubLog QSO. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrávání do ClubLog bylo dokončeno. Byl vytvořen soubor (%1) v adresáři KLogu. Přejete si smazat tento soubor? The file has been removed. Soubor byl smazán. The file has not been removed. Soubor nebyl smazán. It seems that there was something that prevented KLog from removing the file You can remove it manually. Něco brání KLogu soubor smazat Můžete ho ručně smazat. KLog - eQSL error KLog - Chyba eQSL The eQSL upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do eQSL byl dokončen s chybou. Log pravděpodobně nebyl nahrán. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Zkontrolujte prosím své přihlašovací údaje, připojení k internetu a účet eQSL. Chybový kód:%1 KLog - eQSL KLog - eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Přejete si označit jako Nahraná všechna QSO nahraná na eQSL? There was an error while updating to Yes the eQSL QSO upload information. Došlo k chybě při nahrávání informací eQSL QSO. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrávání do eQSL bylo dokončeno. Byl vytvořen soubor (%1) v adresáři KLogu. Přejete si smazat tento soubor? KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - QRZ.com error KLog - Chyba QRZ.com The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do QRZ.com byl dokončen s chybou. Log pravděpodobně nebyl nahrán. KLog - QRZ.com KLog - QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Přejete si označit jako Nahraná všechna QSO nahraná na QRZ.com? There was an error while updating to Yes the QRZ.com QSO upload information. Došlo k chybě při nahrávání informací QRZ.com QSO. The QRZ.com upload process has finished successfully Nahrání QRZ.com bylo úspěšně dokončeno Call not found in QRZ.com Stanice nenalezena v QRZ.com KLog has received an error from QRZ.com. Byla přijata chyba z QRZ.com. KLog - %1 KLog - %1 You need to activate the %1 service in the eLog preferences. Je potřeba aktivovat službu %1 v Nastavení->Nastavení->eLog. KLog - Exit KLog - Ukončení Do you really want to exit KLog? Opravdu si přejete ukončit Klog? The logfile has been modified. Log byl modifikován. Do you want to save your changes? Přejete si uložit změny? KLog - ADIF export KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Je důležité provést export ADIF a kopii exportu použít jako zálohu. Saving the log was done successfully. Log byl úspěšně uložen. The ADIF export was not properly done. Export ADIF nebyl proveden správně. &File &Soubor &Import from ADIF ... &Import z ADIF ... Import an ADIF file into the current log. Importovat ADIF do současného logu. Export to ADIF ... Export do ADIF ... Export the current log to an ADIF logfile. Exportovat současný log do ADIF. Export all logs to ADIF ... Exportovat všechny logy do ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportovat všechny QSO do jednoho ADIF, sloučit QSO ze všech logů. &Print Log ... &Tisk logu ... Print your log. Tisk logu. KLog folder KLog adresář Opens the data folder of KLog. Otevřít KLog adresář. Settings ... Nastavení... E&xit &Ukončit &Tools Nás&troje Fill in QSO data Přepoužít QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Použít data z předešlých QSO pro vyplnění chybějících informací v QSO.. QSL tools ... QSL ... Find QSO to QSL Najít QSO pro QSL Shows QSOs for which you should send your QSL and request the DX QSL. Zobrazit QSO, pro která by měla být poslána QSL a požádáno o QSL protistanice. Find My-QSLs pending to send Najít QSL čekající na odeslání Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Zobrazit QSO s nevyřízenými požadavky na odeslání QSL. Tato fronta by měla být ideálně prázdná! Find DX-QSLs pending to receive Najít QSL čekající na potvrzení Shows DX-QSLs for which requests or QSLs have been sent with no answer. Zobrazit QSL, pro která bylo vyžádáno nebo odesláno QSL, ale není odpověď. Find requested pending to receive Najít nepřijaté vyžádané QSL Shows the DX-QSLs that have been requested. Zobrazí QSL, která byla vyžádána. LoTW tools ... LoTW ... Queue all QSLs from this log to be sent Všechna QSO z tohoto logu do fronty k odeslání Mark all non-sent QSOs in this log as queued to be uploaded. Do fronty pro odeslání budou vložena všechna neodeslaná QSO z tohoto logu. Queue all QSLs to be sent Všechna QSL do fronty k odeslání Put all the non-sent QSOs in the queue to be uploaded. Vložit všechna neodeslaná QSO do fronty k odeslání. Mark all queued QSOs from this log as sent Označit zafrontovaná QSO z tohoto logu jako odeslaná Mark all queued QSOs in this log as sent to LoTW. Označit zafrontovaná QSO z tohoto logu jako odeslaná do LoTW. Mark all queued QSOs as sent Označit zafrontovaná QSO jako odeslaná Mark all queued QSOs as sent to LoTW. Označit zafrontovaná QSO jako odeslaná do LoTW. Download from LoTW ... Stažení LoTW ... Download the full log from LoTW ... Stažení celého logu z LoTW ... ClubLog tools ... ClubLog ... Queue all the QSOs to be uploaded Všechna QSO do fronty k odeslání Upload the queued QSOs to ClubLog ... Odeslat QSO ve frontě ... eQSL tools ... eQSL ... Upload the queued QSOs to eQSL.cc ... Nahrát QSO ve frontě ... QRZ.com tools ... QRZ.com ... Check the current callsign in QRZ.com Vyhledat stanici v QRZ.com Queue all the QSO to be uploaded Všechna QSO do fronty k odeslání Upload the queued QSOs to QRZ.com ... Nahrát QSO ve frontě ... Update cty.csv Aktualizovat cty.csv For updated DX-Entity data, update cty.csv. Aktualizuje DX země, cty csv. Update Satellite Data Aktualizovat Satelity Stats Statistiky Show the statistics of your radio activity. Zobrazit statistiky o aktivitě. &Help &Nápověda Online manual (F1) ... Online nápověda (F1) ... &Tips ... &Typy ... &Debug ... &Ladění ... &About ... &O aplikaci ... About Qt ... O Qt ... Check updates ... Aktualizace ... KLog - LoTW KLog - LoTW All pending QSOs of this log has been marked as queued for LoTW! Všechna čekající QSO z tohoto logu byla zafrontována do LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Vyskytla se chyba v označení všech QSO tohoto logu jako zafrontovaná do LoTW! Your log has been updated with the LoTW downloaded QSOs. Log byl aktualizován na základě stažených dat z LoTW. KLog has updated %1 QSOs from LoTW. KLog aktualizoval %1 QSOs. Your log has not been updated. Log nebyl aktualizován. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. QSO nebyla aktualizována. Mohla to způsobit chyba v souboru nebo jednoduše nebylo co aktualizovat. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Opravdu si přejete označit VŠECHNA čekající QSO k Nahrání. Toto je potřeba udělat POUZE, když jsou QSO nahrávána do LoTW poprvé. All pending QSOs has been marked as queued for LoTW! Všechna čekající QSO byla označena jako zafrontovaná do LoTW! KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL není nainstalovaný nebo KLog ho nemůže najít. Prosím, překontrolujte nastavení. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Chyba #1: Akce byla přerušena uživatelem nebo TQSL není nakonfigurovaný. Žádné QSO nebylo nahráno. Error #2: Upload was rejected by LoTW, please check your data. Chyba #2: Požadavek byl odmítnut LoTW. Prosím, překontrolujte data. Error #3: The TQSL server returned an unexpected response. Chyba #3: Neočekávaná odpověď ze server TQSL. Error #4: There was a TQSL error. Chyba #4: Chyba TQSL. Error #5: There was a TQSLLib error. Chyba #5: Chyba TQSLLib. Error #6: It was not possible to open the input file. Chyba #6: Nepodařilo se otevřít vstupní soubor. Error #7: It was not possible to open the ouput file. Chyba #7: Nepodařilo se otevřít výstupní soubor. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Chyba #8: Nebyla zpracována žádná QSO, protože QSO byla duplicitní nebo mimo časový rozsah. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Chyba #9: Zpracovala se pouze některá QSO, zbytek byl ignorován, protože byly duplicitní nebo mimo časovou dobu. Error #10: Command syntax error. KLog sent a bad syntax command. Chyba #10: Chyba syntaxe. KLog zavolal chybný příkaz. Error #11: LoTW Connection error (no network or LoTW is unreachable). Chyba #11: Chyba připojení k LoTW (chyba síťového připojení nebo LoTW je nedostupný). Error #00: Unexpected error. Please contact the development team. Chyba #00: Neočekávaná chyba. Prosím, kontaktujte vývojový tým. The log that you have selected contains more than just one station callsign. Vybraný log obsahuje více jak jednu značku stanice. Please select the station callsign you want to mark as sent to LoTW: Prosím, vyberte značku stanice, která má být odeslána do LoTW: Station Callsign: Stanice: Define Station Callsign Určete značku stanice You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. Nebyla vybrána žádná značka. KLog doplní QSO bez značky stanice definovanou značkou, kterou zde vyberete. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Zadejte značku stanice, kterou chcete použít pro tento log nebo ji nechte prázdnou pro QSO bez definované volací značky stanice: KLog - No station selected KLog - Nebyla vybrána žádná značka stanice No station callsign has been selected and therefore no log will be marked Nebude označen žádný log, protože nebyla vybrána žádná značka stanice All queued QSOs has been marked as sent to LoTW! Všechna zafrontovaná QSO byla označena jako odeslaná do LoTW! Native Error There was a problem to mark all queued QSOs of this log as sent to LoTW! Nastal problém s označením zafrontovaných QSO jako odeslaných do LoTW! KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Opravdu si přejete označit VŠECHNA QSO v tomto Logu k Nahrání. Toto je potřeba udělat POUZE, když jsou QSO nahrávána do LoTW poprvé. Now you can upload them to LoTW. Nyní je můžete nahrát do LoTW. There was a problem to mark all pending QSOs as queued for LoTW! Vyskytl se problém s označením všech Čekajících QSO do LoTW! All queued QSOs of this log has been marked as sent to LoTW! Všechna QSO ve frontě byla označena jako Odeslána do LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Vyskytl se problém s označením QSO jako Odeslaná do LoTW! About ... O aplikaci... KLog - Update checking result KLog - Výsledek Aktualizace Congratulations! Gratulujeme! You already have the latest version. Nejnovější verzi již máte. You can find the KLog data folder here: KLog adresáře je možné najít: start nastartovat UDP Server error The UDP server failed to %1. start or stop Chyba UDP Serveru Serveru UDP se nepovedlo %1. stop zastavit It seems that there are no QSOs in the database. V databázi nejsou žádná QSO. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Kontaktujte KLog vývojový tým, pokud databáze obsahuje nějaká QSO a KLog je nemůže najít (Nápověda->O aplikaci). Sends the log to LoTW calling TQSL. Odeslání logu to LoTW pomocí TQSL. This function is disabled. Go to the Setup->LoTW tab to enable it. Tato funkce je deaktivována. Aktivace v Nastavení->Nastavení->LoTW. Status of the DX entity. Status DX země. Name of the DX entity. Jméno DX země. QSO QSO QSL QSL eQSL eQSL Comment Poznámka Others Jiné My Data Mé údaje Satellite Satelit Info Info Awards Diplomy Search Hledání Log Log DX-Cluster DX-Cluster DXCC DXCC No QSOs have been exported to ADIF. Nebylo exportováno žádné QSO do ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog exportoval %1 QSO do souboru ADIF: %2 You need to select one station callsign to be able to send your log to LoTW. Je potřeba vybrat jednu značku stanice, abyste mohli odeslat log do LoTW. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL skončil bez chyby. Přejete si označit všechna nahraná QSO jako odeslaná do LoTW? There was an error while updating to Yes the LoTW QSL sent information. Při aktualizaci došlo k chybě. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrání do LoTW bylo úspěšné. KLog vytvořil soubor (%1) v KLog adresáři. Přejete si ho smazat? You need to select one station callsign to be able to send your log to ClubLog. Je potřeba vybrat jednu značku stanice, abyste mohli odeslat log do ClubLog. Do you want to add this QSOs to your ClubLog existing log? Přejete si přidat toto QSO to existujícího ClubLog logu? If you don't agree, this upload will overwrite your current ClubLog existing log. Pokud nesouhlasíte, toto nahrání přepíše existující ClubLog log. You need to select one station callsign to be able to send your log to eQSL.cc. Je potřeba vybrat jednu značku stanice, abyste mohli odeslat log do eQSL. KLog - Select the Station Callsign. KLog - Vyberte značku stanice. Select the Station Callsign to use when quering LoTW: Vyberte značku stanice, která se použije při dotazování do LoTW: Please check the LoTW setup Překontrolujte nastavení LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Nenastavili jste LoTW uživatele ani správnou značku stanice. V Nastavení otevřte kartu LoTW a nakonfigurujte spojení LoTW. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Přejete si opravdu označit všechna QSO pro NAHRÁNÍ? Musí být uděláno POUZE, jestli jde o PRVNÍ NAHRÁNÍ QSO do %1 ClubLog ClubLog The log is ready to be uploaded to ClubLog. Log je připraven na nahrání do ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Všechna spojení v tomto logu byla označena jako Upravená ve stavovém poli ClubLog KLog could not mark the full log to be sent to ClubLog KLog nemohl označit celý log k odeslání do ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Něco zabraňovalo KLogu, aby označil QSO jako upravená. Restartujte KLog a zkuste to znovu, než kontaktujete vývojáře KLog. The log is ready to be uploaded to eQSL.cc. Log je připraven na nahrání do eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Všechna spojení v tomto logu byla označena jako Upravená ve stavovém poli eQSL KLog could not mark the full log to be sent to eQSL KLog nemohl označit celý log k odeslání do eQSL KLog - QRZ.COM KLog - QRZ.COM QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. Log je připraven na nahrání do QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Všechna spojení v tomto logu byla označena jako Upravená ve stavovém poli QRZ.com KLog could not mark the full log to be sent to QRZ.com KLog nemohl označit celý log k odeslání do QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. V Nastavení je potřeba definovat správné API Key pro QRZ.com. Open File Otevřít soubor - Needed for DXMarathon - Potřebné pro DXMarathon Filling QSOs ... Plnění QSO ... Abort filling Přerušení plnění Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Plnění DXCC, CQzone, ITU, Kontinentů v QSO... QSO: Number Počet Date/Time Datum/Čas Callsign Stanice RSTtx RSTtx RSTrx RSTrx Band Pásmo Mode Druh provozu Print Log Tisk logu Printing the log ... Log se tiskne... Abort printing Přerušení tisku Printing the log... QSO: Tisk logu... QSO: KLog - QSO received KLog - Přijato QSO The following QSO data has been received from WSJT-X to be logged: Následující QSO bylo přijato z WSJT-X a bude zalogováno: Freq Frek Time On Čas začátku Time Off Čas konce RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Místní-Grid Station Callsign Stanice Operator Callsign Volací značka Operátora KLog - WSJTX Dupe QSO KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Jedná se o duplicitní QSO. Přejete si jej uložit nebo zamítnout? Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Duplicitní QSO se shoduje s existujícím QSO se stejnou značkou, pásmem, druhem provozu, datem/časem s přihlédnutím k období, které je definováno v nastavení. QSO logged from WSJT-X: QSO přijato z WSJT-X: KLog - Non-supported mode KLog - Nepodporovaný mod A new mode not supported by KLog has been received from an external program or radio: Z externího programu nebo rádia byl přijat nepodporovaný mód: If the received mode is correct, please contact KLog development team and request support for that mode Pokud je přijatý mod správný, kontaktujte vývojový tým KLog a požádejte o podporu pro tento režim Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Přejete si nadále dostávat tato upozornění? (deaktivace těchto upozornění zabrání detekci neplatných režimů) KLog - Duplicated satellite KLog - Duplicitní satelitní A duplicated satellite has been detected in the file and will not be imported. Duplicitní satelit byl detekován v tomto souboru a nebude importován. Please check the satellite information file and ensure it is properly populated. Zkontrolujte soubor informací o satelitu a ujistěte se, že je správně vyplněn. Now you will see a more detailed error that can be used for debugging... Nyní uvidíte podrobnější chybu, kterou lze použít k ladění ... An unexpected error ocurred!! Nastala neočekávaná chyba!! If the problem persists, please contact the developers Kontaktujte vývojáře, pokud problém přetrvává for analysis: pro analýzu: Error in function Chyba ve funkci Error text Text chyby Failed query Neúspěšný dotaz Recommendation: Doporučení: Periodically export your data to ADIF to prevent a potential data loss. Pravidelně exportujte svá data do ADIF, abyste předešli možné ztrátě dat. KLog - Show errors KLog - Zobrazení chyb Do you want to keep showing errors? Přejete si nadále zobrazovat chyby? MainWindowInputComment Comment Poznámka Add a comment for this QSO. Přidat poznámku pro toto QSO. Keep this data Ponechat pro další Data entered in this tab will be copied into the next QSO. Data zadaná na této kartě budou zkopírována do dalšího spojení. MainWindowInputEQSL Date of the ClubLog upload. Datum odeslání do ClubLog. Date of the QRZ.com upload. Datum odeslání do QRZ.com. Date of the eQSL sending. Datum odeslání do eQSL. Date of the eQSL reception. Datum přijetí z eQSL. Date of the LoTW sending. Datum odeslaní do LoTW. Date of the LoTW reception. Datum přijetí z LoTW. Status on ClubLog. Status ClubLog. Status on QRZ.com. Status QRZ.com. Status of the eQSL sending. Status odeslání eQSL. Status of the eQSL reception. Status přijetí eQSL. Status of the LoTW sending. Status odeslání LoTW. Status of the LoTW reception. Status přijetí z LoTW. ClubLog ClubLog QRZ.com QRZ.com eQSL Sent eQSL odesláno eQSL Rec eQSL přijato LoTW Sent LoTW odesláno LoTW Rec LoTW přijato MainWindowInputOthers Primary Div Primární Div Secondary Div Sekundární Div IOTA IOTA Entity Země Propagation mode Druh šíření Others Jiné Keep propagation mode Ponechat způsob šíření Select the primary division for this QSO. Vyberte primární divizi pro QSO. Select the secondary division for this QSO. Vyberte sekundární divizi pro QSO. Select the entity for this QSO. Vyberte zemi pro QSO. Select the propagation mode for this QSO. Vyberte způsob šíření pro QSO. Select the IOTA continent for this QSO. Vyberte IOTA kontinent pro QSO. Select the IOTA reference number for this QSO. Vyberte IOTA referenční číslo pro QSO. Keeps the same propagation mode for next QSO. Zachovat způsob šíření pro další QSO. Select the appropriate ADIF field for this QSO. Vyberte příslušné pole ADIF pro toto QSO. Value for the selected ADIF field. Hodnota pro vybrané pole ADIF. Not Identified Neidentifikován Not - Not Identified Ne - Neidentifikován SOTA Ref SOTA Ref Age Věk VUCC grids MainWindowInputQSL QSL Sent QSL k odeslání QSL Rec QSL přijato QSL Via QSL Via QSL Msg QSL zpráva Status of the QSL sending. Stav odeslání QSL. Status of the QSL reception. Stav přijetí QSL. QSL sending information. Informace odeslání QSL. QSL reception information. Informace příjmu QSL. Date of the QSL sending. Datum odeslání QSL. Date of the QSL reception. Datum přijetí QSL. Message of the QSL. QSL zpráva. QSL via information. Informace QSL via. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX Frekvence v MHz. RX Frequency in MHz. RX Frekvence v MHz. Power used by the contacted station. Výkon použitý protistanicí. Name of the contacted operator. Jméno operátora protistanice. QTH of the contacted station. QTH protistanice. Locator of the contacted station. Lokátor protistanice. Watts W MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Jméno QTH QTH DX Locator DX Lokátor Power(rx) Výkon(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frek TX Freq RX Frek RX DX QTH locator. DX QTH lokátor. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH lokátor. Formát má být IN70AA nanejvýš však 10 znaků. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! MainWindowMyDataTab Watts W Keep this data Ponechat pro další My QTH locator. Můj QTH lokátor. Power Výkon Operator callsign Značka operátora Station Callsign Značka stanice My Locator Můj lokátor My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Můj QTH lokátor. Formát má být IN70AA nanejvýš však 10 znaků. My Rig Můj Rig My Antenna Moje anténa My SOTA_Ref Moje SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Ponechat pro další Data entered in this tab will be copied into the next QSO. Data zadaná na této kartě budou zkopírována do dalšího spojení. Other - Sat not in the list Jiný - Sat není v seznamu Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Jméno satelitu pokud není v seznamu. Vyberte: "%1" aktivovat toto pole. (např. AO-51). Satellite mode used. Použit satelitní režim. Select the satellite you are using. Vyberte satelit, který používáte. UpLink band. Pásmo UpLink. DownLink band. Pásmo DownLink. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokátor DX stanice. Toto pole je synchronizováno s polem Lokátoru v záložce QSO. UpLink UpLink DownLink DownLink Satellite Satelit Mode Druh provozu DX Locator DX Lokátor Other Jiné MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Lokátor DX stanice. Formát má být IN70AA nanejvýš však 10 znaků. Not Sat QSO Není Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. Jméno satelity nebylo rozpoznáno. Pokud má být použito jedno ze jmen známých satelitů, vyberte jej ze seznamu. Případně kontaktujte vývojový tým a přidejte nový název satelitu. The satellite you have in your QSO is: Satelit použit pro: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Pamatujte, že název satelitu nebude uložen, pokud není v seznamu, takže může dojít ke ztrátě informací! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! RX Frequency in MHz. RX Frekvence v MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! TX Frequency in MHz. TX Frekvence v MHz. OnlineMessageWidget The server returned the following error: %1 Not identified Neidentifikováno QObject New One, work it! Nové, ber ho ! Needed, work it! Je potřeba, ber ho! Worked but not confirmed Pracováno, nepotvrzeno Confirmed Potvrzeno Not identified Neidentifikováno Database Error Chyba databáze KLog DB needs to be upgraded. KLog DB potřebuje aktualizovat. Do you want to upgrade it now? Přejete si ji aktualizovat nyní? If DB is not upgraded KLog may not work properly. Jestliže DB nebude aktualizována, KLog nemusí dobře pracovat. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Aktualizace může způsobit problémy. Je dobrý nápad před aktualizací zazálohovat DB. Do you want to backup your DB now? Přejete si nyní zazálohovat DB? The backup finished successfully. Záloha byla provedena. You can find the backup in this file: %1 Zálohu je možné najít v souboru: %1 The backup was not properly done. Záloha se nepovedla. You will be sent back to the starting point. Budete přesměrováni zpět do výchozího bodu. KLog - DB can't be updated automatically KLog - DB nemůže být aktualizována automaticky You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Aktualizace je prováděna z příliš staré verze KLog a proto nemůže být provedena automaticky. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. Možný postup aktualizace je: - Použít starou verzi KLog a vyexportovat logy do ADIF. - Odstranit logbook.dat z adresáře KLog. - Instalovat novou verzi KLog. - Importovat ADIF soubor. KLog se ukončí po stisknutí OK. KLog - DB update KLog - Aktualizace DB KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog zjistil předchozí log v databázi. Všechna data budou migrována do nově vytvořeného logu typu DX. KLog: Enter Station callsign KLog: Vložte značku stanice Enter the station callsign used in this log Vložte značku stanice použitou v tento logu Station Callsign Značka stanice All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Všechna data byla migrována správně. Nyní byste měli jít do Nastavení-> Nastavení-> Logy a zkontrolovat, zda je vše v pořádku. Updating mode information... Aktualizace informací o druhu provozu ... Abort updating Přerušit aktualizaci QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Zrušení této aktualizace způsobí nekonzistence dat a možná ztrátu dat. Opravdu si ji přejete zrušit? Updating bands information... Aktualizace informací o pásmech... Updating bands information in %1 status... Aktualizace informací o pásmech. Stav %1 ... Progress: Progres: Updating mode information in %1 status... Aktualizace informací o druhu provozu. Stav %1 ... Updating DXCC award information... Aktualizace DXCC informací... Updating DXCC Award information... Aktualizace DXCC informací... Updating WAZ award information... Aktualizace WAZ informací... Updating WAZ Award information... Aktualizace WAZ informací... Updating information... Aktualizace informací... Updating DXCC and Continent information... Aktualizace DXCC a kontinentů... KLog is already running. KLog již běží. It is allowed to run only one instance. Je povoleno spustit pouze jednu instanci. Install wizard was canceled before completing... Průvodce instalací byl přerušen před dokončením... Do you want to remove the KLog dir from your disk? Přejete si smazat z disku KLog adresář? Your KLog dir has been removed KLog adresář byl smazán Thank you for running KLog! Děkujeme, že jste spustili KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Nepovedlo se smazat KLog adresář. Pokud ho chcete opravdu smazat, měli byste to udělat ručně. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Nepovedlo se smazat KLog adresář. Pokud ho chcete opravdu smazat, měli byste to udělat ručně. Remember that your KLog dir is on your system... Pamatujte, že adresář KLog je ve vašem systému... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Byla nalezena nesprávná značka: %1. Zadejte novou volací značku nebo potvrďte, že ta aktuální je správná. An empty callsign has been detected. If it is possible, please enter the right call. Byla nalezena prázdná volací značka. Pokud je to možné, prosím, vložte správnou značku. KLog - Not valid callsign found KLog - Nalezena neplatná značka Date Datum Call Stanice RSTtx RSTtx RSTrx RSTrx Band Pásmo Comment Poznámka Mode Druh provozu CQz ITUz DXCC DXCC Address Age Věk County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL odesláno Force Init Freq Frek Freq RX Frek RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW odesláno Max Bursts Multiplier MS Shower My Antenna Moje anténa My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig Můj Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Jméno Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Sent QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Jméno satelitu SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear S&mazat &Export Highlighted &Exportovat vybrané &Select All &Vybrat vše &Search &Hledání All logs Všechny logy Clear the searches. Smazat všechny hledání. Export the search result to an ADIF file. Export výsledku hledání do ADIF. Select/Unselect all the QSOs shown. Vybrat/Zrušit všechna zobrazená QSO. Search in the log. Najít v logu. Search in all logs. Najít ve všech logách. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Zadejte značku, kterou chcete vyhledat. Pro výběr všech spojení použijte '*'...může trvat delší dobu! Select the Station Callsign used to do this QSO. Vyberte značku stanice použitou pro toto QSO. You have requested to delete the QSO with: %1 Bylo požádáno smazat QSO s: %1 Are you sure? Opravdu chcete odstranit QSO? All in log Ve všech Not defined Nedefinováno &Clear selection &Zrušit výběr Save File Uložit soubor SearchWindow Call Stanice Date/Time Datum/Čas Band Pásmo Mode Druh provozu QSL Sent QSL odesláno QSL Rcvd QSL přijato Station Callsign Volací značka ID ID Date/time Datum/Čas Station callsign Stanice QSL Send QSL odesláno &Delete &Smazat Delete a QSO Smazat QSO &Edit QSO &Upravit QSO Edit this QSO Upravit QSO Via &bureau Via &bureau Send this QSL via bureau Odeslat QSL via bureau D&irect D&irect Send this QSL via direct Odeslat QSL via bureau Via bureau Via bureau QSL &received via bureau QSL &přijato via bureau Direct Direct QSL received via direc&t QSL přijato direc&t Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat značku v QRZ.com Check in DXHeat.com Vyhledat v DXHeat.com Check this callsign in DXHeat.com Vyhledat značku v DXHeat.com &Request my QSL &Request my QSL Mark my QSL as requested Označit můj QSL jako vyžádaný Via Direct and mark DX QSL as requested Direct a označit QSL jako vyžádané Send this QSL via direct and mark DX QSL as requested Odeslat QSL direct a označit jako vyžádané Via Bureau and mark DX QSL as requested Via Bureau a označit QSL jako vyžádané Send this QSL via bureau and mark DX QSL as requested Odeslat QSL via Bureau a označit QSL jako vyžádané &Request the QSL &Request QSL Mark the QSL as requested Označit QSL jako vyžádané Via bureau and mark my QSL as requested Via Bureau a označit můj QSL jako vyžádaný QSL received via bureau and mark my QSL as requested QSL přijato via bureau a označit můj QSL jako vyžádaný Direc&t and mark as my QSL requested Direc&t a označit můj QSL jako vyžádaný QSL received via direct and mark my QSL as requested QSL přijat direct a označit můj QSL jako vyžádaný Needed QSO to send the QSL K odeslání QSL je potřeba QSO My QSL requested to be sent Můj vyžádaný QSL bude odeslán DX QSL pending to be received QSL čeká na přijetí SetupDialog User data Uživatel Bands/Modes Pásma/Druhy provozu Log widget D&X-Cluster D&X-Cluster Colors Barvy Misc Různé World Editor Editor zemí Logs Logy eLog eLog WSJT-X WSJT-X Satellites Satelity HamLib HamLib Cancel Zrušit OK OK Settings Nastavení You need to enter at least one log in the Logs tab. Na kartě Logy je nutné zadat alespoň jeden log. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Přejete si přidat log v záložce Log nebo ukončit KLog? (ANO - přidat log nebo NE - opustit) DX-Cluster DX-Cluster World Svět DB has not been moved to new path. DB nebyla přesunuta do nové cesty. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Jdete do karty Různé a klikněte na Přesun DB jinak DB nebude přesunuta do nového adresáře. You need to enter at least a valid callsign. Musíte vložit alespoň platnou značku. Go to the User tab and enter valid callsign. Použijte kartu Uživatel a vložte platnou značku. You have not selected the kind of log you want. Nevybrali jste požadovaný druh logu. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Budete přesměrováni na kartu Log. Přidejte a vyberte druh logu, který chcete použít. SetupEntityDialog Entity Země Name of the Entity. Jméno země. CQ CQ CQ zone. CQ zone. ITU ITU ITU zone. ITU zone. Latitude Zeměpisná šířka Longitude of the Entity. Zeměpisná délka země. Longitude Zeměpisná délka UTC UTC Local time difference to UTC. Rozdíl mezi místním časem a UTC. Main prefix Hlavní prefix Main prefix of the entity. Hlavní prefix země. ARRL ID ARRL ID ARRL ID. ARRL ID. Prefixes Prefixy Comma separated possible prefixes, e.g. EA1, EA2, ... Seznam možných prefixů, e.g. EA1, EA2, ... Date of the deletion. Datum zrušení. Deleted Zrušeno Cancel Zrušit Ok Ok Entity Dialog Země SetupPageBandMode Bands Pásmo Modes Druhy provozu SetupPageColors New One Nové Needed in this band Potřeba na tomto pásmu Worked in this band Navázáno na tomto pásmu Confirmed in this band Potvrzeno na tomto pásmu Default Výchozí WSJT-X palette Paleta WSJT-X Default palette Výchozí paleta Dark Mode Tmavý režim Color when the DXCC is an ATNO (All Time New One). Barva pro ATNO (All Time New One) DXCC. This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... S DXCC bylo navázané spojení na jiném pásmu, ale ne na vybraném pásmu.Může to být nutné pro CQ, ITU, Čtverce, ... Worked DXCC, but not confirmed in this band. Navázáno s DXCC, ale není potvrzené na tomto pásmu. DXCC is confirmed in this band. DXCC potvrzeno na tomto pásmu. Default color. Výchozí barva. Sets a palette of colors similar to the one used in WSJT-X. Barevná paleta podobná barvám, používaných v WSJT-X. Sets the default palette. Nastav výchozí paletu. Sets the Dark Mode Nastavení Tmavého režimu Choose a color Vyberte barvu Light Mode Světlý režim SetupPageDxCluster Add Přidat Delete Smazat Show &HF spots Zobrazovat &HF spoty Show V/&UHF spots Zobrazovat V/&UHF spoty Show W&ARC spots Zobrazovat W&ARC spoty Show &worked spots Zobrazovat již &Navázané Show &confirmed spots Zobrazovat již &Potvrzené Show ANN/&FULL messages Zobrazovat ANN/&FULL zprávy Show WW&V messages Zobrazovat WW&V zprávy Show WC&Y messages Zobrazovat WC&Y zprávy Save DX Cluster activity Ukládat aktivitu DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Ukládat aktivitu DX-Cluster do souboru v KLog adresáři DX Spots DX Spoty Others Jiné Messages Zprávy KLog: Add a DXCluster server KLog: Vložit DXCluster server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Vložte adresu a port Příklad: dxfun.com:8000 Pokud nebude specifikován port, bude použit výchozí port 41112: SetupPageELog ClubLog password Heslo ClubLog email Email Enter the email you used to register in ClubLog. Vložte email, který jste použili při registraci do ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro ClubLog. Upozornění: Heslo je uloženo v otevřené podobně v konfiguračním souboru KLog!! (Pokud si nepřejete heslo uložit, KLog se bude ptát pokaždé, když bude potřeba) Send QSOs in real time Ihned odesílat QSO Activate ClubLog Aktivovat ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Ihned odeslat každé QSO do ClubLog tak jak je vloženo (nebo modifikováno) v KLog. Starts the ClubLog support in KLog. Začít používat ClubLog v KLog. Activate eQSL.cc Aktivovat eQSL.cc Enter your username of eQSL.cc. Vložte uživatelské jméno v eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro eQSL.cc. Upozornění: Heslo je uloženo v otevřené podobně v konfiguračním souboru KLog!! (Pokud si nepřejete heslo uložit, KLog se bude ptát pokaždé, když bude potřeba) eQSL.cc password Heslo eQSL.cc user Uživatelské jméno ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Vložte uživatelské jméno pro QRZ.com. Abyste mohli tuto službu používat, musíte se nejdříve registrovat u QRZ.com. User Uživatelské jméno Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro QRZ.com. Upozornění: Heslo je uloženo v otevřené podobně v konfiguračním souboru KLog!! (Pokud si nepřejete heslo uložit, KLog se bude ptát pokaždé, když bude potřeba) Password Heslo Activate QRZ.com Aktivovat QRZ.com Check automatically Vyhledávat automaticky Check in Qrz.com all Calls as they are entered Vždy vyhledat vloženou stanici v QRZ.com Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LogBook Key pro nahrání QSO. Získáte ho na Vaší stránce QRZ.com. Mějte na paměti, že je potřeba se registrovat. LoTW LoTW Upload Nahrání Download Stažení TQSL path Cesta k TQSL Use TQSL Použít TQSL LoTW password Heslo LoTW user Uživatelské jméno Enter your LoTW user. Vložte LoTW uživatelské jméno. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro LoTW. Upozornění: Heslo je uloženo v otevřené podobně v konfiguračním souboru KLog!! (Pokud si nepřejete heslo uložit, KLog se bude ptát pokaždé, když bude potřeba) Path to the TQSL software. Cesta k aplikaci TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Povolit integraci LoTW s TQSL. Bude potřeba mít nainstalovaný TSQL Select File Vyberte soubor SetupPageHamLib Activate HamLib Používat HamLib Activates the hamlib support that will enable the connection to a radio. Použít hamlib umožňující připojit rádio. Read-Only mode Read-Only režim If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Pokud povoleno, KLog čte frekvenci a druh provozu z rádia, ale neposílá žádné příkazy do rádia. Radio Rádio Select your rig. Vyberte rádio. Serial Network Defines the interval to poll the radio in msecs. Definujte interval dotazování rádia v milisekundách. Poll interval Interval dotazování Test: OK Test: OK Test: NOK Test: NOK Test Test Click to test the connection to the radio Kliknutím se otestuje připojení radia SetupPageLogView Fields SetupPageLogs &New &Nový &Edit &Upravit &Remove &Odstranit Add a new log. Přidat nový log. Edit the selected log. Upravit vybraný log. Remove the selected log. Odstranit vybraný log. KLog KLog Do you really want to remove this log? Opravdu si přejete odstranit tento log? All the QSOs from this log will also be deleted... Budou vymazána také všechna QSO z tohoto logu... Log has not been removed. (#3) Log nebyl vymazán. (#3) Log has not been removed. (#2) Log nebyl vymazán. (#2) Log has not been removed. (#1) Log nebyl vymazán. (#1) ID ID Date Datum Station Callsign Stanice Operators Operátoři Comments Poznámka QSOs QSO The new log could not be created. Nelze vytvořit nový log. An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageLogs KLog - Nastavení Logů SetupPageLogsNew &Date &Datum &Station Callsign &Stanice &Operators &Operátoři Comm&ent &Poznámka &Ok &Ok &Cancel &Zrušit Callsign used for this log. Použitá značka pro tento log. Comma separated list of operators: callsign1, callsign2. Čárkou oddělený seznam operátorů: značka1, značka2. Start date of this log. Počáteční datum logu. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Přidejte komentář k tomuto logu. Pokud je vyplněn, zobrazí se v hlavním okně KLog jako identifikace logu. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je potřeba vložit platnou značku stanice. Log nebude otevřen. SetupPageMisc Check non-valid calls &Imperial system &Imperiální jednotky &Log in real time Použít &skutečný čas &Time in UTC Č&as v UTC &Save ADIF on exit &Ukládat ADIF před ukončení Use this &default filename &Výchozí jméno ADIF souboru Mark &QSO to send QSL when QSL is received Označovat &QSO jako Odeslat QSL při příjmu QSL od protistanice Complete QSO with previous data Kompletovat QSO z předešlých informací Show the Station &Callsign used in the search box Zobrazovat vlastní značku &stanice ve výsledku Hledání &Check for new versions automatically Automaticky &kontroloval aktualizace &Provide Info for statistics &Poskytnout informace pro statistiky Manage DX-Marathon Spravovat DX-Marathon Activate the application debug log Zapnout ladící hlášky Mark sent eQSL && LoTW in new QSO as queued Označovat nová QSO k odeslání do eQSL && LoTW &Delete always temp ADIF file after uploading QSOs Vždy &smazat dočasný ADIF po nahrání QSO Browse Procházet Move DB Přesunout DB In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Zadejte časový interval v sekundách pro zvážení, zda jde o duplicitní spojení, pokud jde o stejnou značku, pásmo a druh provozu. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO budou označena jako nevyřízené (k odeslání) QSL, pokud obdržíte QSL od protistanice a Váš QSL nebyl zatím odeslán. The search box will also show the callsign on the air to do the QSO. Vyhledávací pole zobrazí volací značku pro spojení. Check if there is a new release of KLog available every time you start KLog. Pokud povoleno, KLog kontroluje dostupnou aktualizaci při každém startu. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Pokud je aktivní kontrola aktualizací, KLog bude zasílat vývojářům Vaši značku, KLog verzi a Operační systém pro vylepšení KLogu. Check it for Imperial system (Miles instead of Kilometers). Použijí se Imperiální jednotky (míle místo kilometrů). Select to use real time. Použít skutečný čas. Select to use UTC time. Použít čas v UTC. Select if you want to save to ADIF on exit. Vyberte, pokud požadujete před ukončení aplikace uložit do ADIF. Select to use the following name for the logfile without being asked for it again. Vyberte, chcete-li použít následující název souboru logu, aniž byste o něj byli znovu požádáni. Complete the current QSO with previous QSO data. Pro QSO se použijí informace z předešlých QSO. Select if you want to manage DX-Marathon. Vyberte, pokud si přejete spravovat DX-Marathon. This is the default file where ADIF data will be saved. Toto je výchozí soubor, kam je ADIF ukládán. This is the directory where the database (logbook.dat) will be saved. Toto je adresář, do kterého bude databáze (logbook.dat) uložen. Click to change the default ADIF file. Klikněte pro změnu výchozího ADIF souboru. Click to change the path of the database. Klikněte pro změnu cesty k databázi. Click to move the DB to the new directory. Klikněte pro přesun DB to nového adresáře. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivuje ladící log. Toto může být užitečné v případě, kdy něco nefunguje tak, jak by mělo. Ladící soubor bude vytvořen v KLog adresáři. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Klikněte pro označení Zafrontovat (k odeslání) do eQSL (LoTW a eQSL) pro všechna nová QSO. Delete Always the adif file created after uploading QSOs Vždy smazat ADIF vytvořený při nahrání QSO Dupe time range: Časový interval Duplicit: Open File Otevřít soubor Select Directory Vybrat adresář This is the directory where DB (logbook.dat) will be saved. Toto je adresář, do kterého bude ukládána DB (logbook.dat). Please specify an existing directory where the database (logbook.dat) will be saved. Specifikujte existující adresář, do kterého bude ukládána databáze (logbook.dat). KLog - Move DB KLog - Přesun DB File moved Soubor přesunut File copied Soubor překopírován File already exist. Soubor již existuje. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Cílový soubor již existuje a KLog ho nebude nahrazovat. Odeberte soubor z cílové složky před přesunutím souboru pomocí KLog. File NOT copied Soubor se nezkopíroval The file was not copied due to an unknown problem. Soubor se nepřekopíroval kvůli neznámé chybě. The target directory does not exist. Please select an existing directory. Cílový adresář neexistuje. Vyberte existující adresář. SetupPageSats &New &Nový &Edit &Upravit &Remove &Smazat &Import &Importovat E&xport E&xportovat Add a new satellite. Přidat nový satelit. Edit the selected satellite. Upravit vybraný satelit. Remove the selected satellite. Smazat vybraný satelit. Import a satellites file. It will replace the satellites you have in the current list. Importovat soubor se satelity. Soubor nahradí satelity, které jsou na současném seznamu. Export your current satellites to a file. Exportovat současný seznam satelitů do souboru. Select the sat you want to open. Vyberte satelit, který si přejete otevřít. KLog KLog Do you really want to remove this satellite? Opravdu si přejete odstranit tento satelit? This satellite will no be longer available to be selected ... Tento satelit již nebude možné vybrat ... Sat has not been removed. (#3) Satelit nebyl odstraněn. (#3) Sat has not been removed. (#2) Satelit nebyl odstraněn. (#2) Sat has not been removed. (#1) Satelit nebyl odstraněn. (#1) ID ID Short Krátké Name Jméno Uplink Uplink Downlink Downlink Modes Druhy provozu An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageSats KLog - Nastavení Satelitů Open Satellites File Otevřít satelitní soubor KLog warning KLog upozornění An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Objevila se neočekávaná chyba při importu satelitních dat. To může být způsobeno tím, že soubor nemá požadovaný formát. Please check the format or contact the developer for analysis with the error code: Zkontrolujte prosím formát nebo kontaktujte vývojáře s žádostí o analýzu s kódem chyby: Save Satellites File Uložit satelitní soubor SetupPageSatsNew Short name Krátké jméno Sat name Jméno satelitu UpLink UpLink DownLink DownLink Modes Druhy provozu &Ok &Ok &Cancel &Zrušit Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Zadejte krátký název. Pokuste se použít krátký název LoTW, abyste poté mohli své QSO nahrát do LoTW. Enter the name of the satellite. Zadejte jméno satelitu. Enter the uplink frequencies in this format: 144.300 Zadejte uplink frekvenci v tomto formátu: 144.300 Enter the downlink frequencies in this format: 144.300 Zadejte downlink frekvenci v tomto formátu: 144.300 Enter the modes in this format: USB Zadejte druh provozu v tomto formátu: USB Some of the data you have entered is not correct; the satellite can't be added. Některá z vložených dat jsou chybná; satelit nebude přidán. SetupPageSubdivisionNew &Date &Datum &Station Callsign &Stanice &Operators &Operátoři Comm&ent &Poznámka &Ok &Ok &Cancel &Zrušit Callsign used for this log. Použitá značka pro tento log. Comma separated list of operators: callsign1, callsign2. Čárkou oddělený seznam operátorů: značka1, značka2. Start date of this log. Počáteční datum logu. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Přidejte komentář k tomuto logu. Pokud je vyplněn, zobrazí se v hlavním okně KLog jako identifikace logu. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je potřeba vložit platnou značku stanice. Log nebude otevřen. SetupPageSubdivisions &Remove &Odstranit Import new Importovat nový Import an AWA file with the subdivision details. Import AWA souboru s detaily subdivize. Remove the selected references. Odebrat vybrané reference. Select the references you want to open. Vyberte reference, které si přejete otevřít. KLog KLog Do you really want to remove the data of this entity? Opravdu si přejete odstranit data pro tuto zemi? All the subdivision information for this entity will be deleted... Budou odstraněny všechny subdivize pro tuto zemi... Log has not been removed. (#3) Log nebyl vymazán. (#3) Log has not been removed. (#2) Log nebyl vymazán. (#2) Log has not been removed. (#1) Log nebyl vymazán. (#1) ID ID Name Jméno Short Name Krátké jméno CQ Zone CQ Zone ITU Zone ITU Zone Deleted Smazat Start Date Počáteční datum End Date Koncové datum DXCC DXCC An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageSubdivisions KLog - Nastavení subdivizí SetupPageUDP Start UDP Server Spustit UDP server Automatically log QSOs from WSJT-X Automaticky zapisovat QSO z WSJT-X Allow WSJT-X to send logged QSOs to KLog Povolit WSJT-X logovat QSO QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSO provedená v WSJT-X budou zaslaná KLogu. Klog se zeptá před uložením, pokud není vybráno "%1" KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog automaticky zapíše QSO přijaté z WSJT-X bez jakéhokoliv potvrzení. Update status information from WSJT-X Aktualizuje stavové informace z WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog bude automaticky zobrazovat a aktualizovat příchozí informace z WSJT-X (volací značku, report, druh provozu,...) UDP port number where the UDP Server will listen for packets. Číslo UDP portu, na kterém bude server poslouchat. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Ujistěte se, že stejný port je nastaven i v WSJT-X. Výchozí port je 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP server bude přijímat QSO poslaná i z jiných programů. To umožní zapsat automaticky spojení i z těchto programu. UDP Port UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Síťové rozhraní, na kterém bude poslouchat UDP server. Network interface Síťové rozhraní QSOs notification timeout (milisecs) Čas notifikace QSO (milisekundy) Miliseconds that the notification of QSOs received from WSJTX will be shown. Čas, během kterého bude zobrazena notifikace o přijatém QSO z WSJT-X. SetupPageUserDataPage &Personal data &Osobní informace Station &data &Stanice Enter your name. Zadejte své jméno. Enter your address - 1st line. Zadejte Vaši adresu - 1. řádek. Enter your address - 2nd line. Zadejte Vaši adresu - 2. řádek. Enter your address - 3rd line. Zadejte Vaši adresu - 3. řádek. Enter your address - 4th line. Zadejte Vaši adresu - 4. řádek. Enter your city. Zadejte Vaše město. Enter your zip code. Zadejte Vaše PSČ. Enter your province or state. Zadejte Vaši provincii nebo region. Enter your country. Zadejte Vaše zemi. &Name &Jméno &Address &Adresa Cit&y Měst&o &Zip Code &PSČ Pro&v/State Pro&vincie/region Countr&y &Země Enter your information for rig Vložte informace o rádiu Enter your information for antenna Vložte informace o anténě Enter your power information. Vložte informace o výkonu. &Rig 1 &Rádio 1 R&ig 2 Rád&io 2 Ri&g 3 Rádi&o 3 Antenna &1 Anténa &1 Antenna &2 Anténa &2 Antenna &3 Anténa &3 Po&wer &Výkon Enter the station callsign that will be used for logging. Vložte značku stanice, která bude použita v logu. Enter the operators (comma separated if more than one). Vložte jména operátorů (oddělte je čárkou, pokud je jich víc). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Vložte Váš lokátor. Alternativně, KLog je schopen použít přibližný lokátor v závislosti na Vaší volací značce. &Callsign &Stanice &Operators &Operátoři &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Lokátor &Locator (not valid) &Lokátor (neplatný) SetupPageWorldEditor Add Přidat Delete Smazat Edit Upravit Export World Export zemí Import World Import zemí Still not implemented. Stále není implementováno. Import a new cty.csv file Import nového cty.csv souboru An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. V KLog adresáři byl nalezl soubor s informacemi o zemích (cty.csv) a bude nahrán. No entities information file (cty.csv) has been detected in your KLog folder. Soubor s informacemi o zemích (cty.csv) nebyl nalezen v KLog adresáři. KLog will not be able to show entities information. KLog nebude schopen zobrazit informace o zemích. Prefix Prefix Entity Země ARRL ID ARRL ID Continent Kontinent CQ Zone CQ Zone ITU Zone ITU Zone UTC UTC Latitude Zeměpisná šířka Longitude Zeměpisná délka Deleted Zrušeno Since Date Od To Date Do Open File Otevřít soubor BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informace o zemích byly aktualizovány. Entities information has not been updated. Informace o zemích nebyly aktualizovány. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Tyto QSO jsou ty, která byla potvrzena přes LoTW. Ok Ok DX DX Date/Time Datum/Čas Band Pásmo Mode Druh provozu ShowErrorDialog KLog Message KLog zpráva SoftwareUpdateDialog Ok Ok KLog update Aktualizace KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>Je dostupná nová verze KLog (%1)! </h2></center><br>Existuje nová verze KLogu.<br><br><b>Je možné ji získat na:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Gratulujeme! Your KLog has been updated. KLog byl aktualizován. You already have the latest version. Máte již poslední verzi. StartWizard KLog - The free hamradio logging program KLog = Svobodný staniční log pro radioamatéry Quit Setup Rychlé nastavení Setup is not complete yet. Are you sure you want to quit setup? Nastavení není kompletní. Opravdu si přejete ukončit nastavení? StatisticsWidget QSO per year QSO podle roku DXCC per year DXCC podle roku CQ zones per year CQ zones podle roku QSO per band QSO podle pásma QSO per mode QSO podle druhu provozu QSO per DXCC QSO podle DXCC QSO per Continent QSO podle kontinentu QSO per hour QSO podle hodin QSO per month QSO podle měsíců Worked / Confirmed status Stav Pracoval / Potvrzeno Worked / Sent status Stav Pracoval / Odesláno Sent / Confirmed status Stav Odesláno / Potvrzeno Satellite grid status Stav Sat čtverců Satellite DXCC status Stav Sat DXCC Grids per band status Stav čtverců na pásmo DXCC per band status Stav DXCC na pásmo StatsCQZPerYearBarChartWidget CQ Zones per year CQ Zone podle roku Reading data ... Čtení dat .... Abort reading Ukončení čtení CQ zones CQ zone CQ zones per year CQ zones podle roku Reading data ... Čtení dat .... Years: %1/%2 Roky: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Pouze potvrzené Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Pouze LEO sat Number Počet Callsign Stanice Date Datum Band Pásmo Mode Druh provozu DXCC DXCC Satellite Satelit Confirmed Potvrzeno No Ne StatsEntitiesPerYearBarChartWidget Chart title Název grafu Reading data ... Čtení dat .... Abort reading Přerušit čtení DXCC Entities Země DXCC DXCC Entities per year DXCC země podle roku Reading data ... Čtení dat .... Entities: Země: StatsFieldPerBandWidget All Všechny Mode: Druh provozu: Band Pásmo Worked Navázané Confirmed Potvrzené StatsGridsOnSatsWidget Show confirmed only Pouze potvrzené Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Pouze LEO satelity Number Počet Callsign Stanice Date Datum Band Pásmo Mode Druh provozu Grid Čtverec Satellite Satelit Confirmed Potvrzeno No Ne StatsQSOsPerBandBarChartWidget QSOs per band QSO podle pásma Reading data ... Čtení dat .... Abort reading Přerušit čtení Bands Pásmo QSOs per band distribution QSO podle pásma Reading data ... Čtení dat .... Bands: Pásmo: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO podle kontinentu Reading data ... Čtení dat .... Abort reading Přerušit čtení Continents Kontinent Reading data ... Čtení dat .... Hours: Hodiny: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO podle DXCC Reading data ... Čtení dat .... Abort reading Přerušit čtení Reading data... Čtení dat .... DXCC DXCC Top ten DXCC per QSO TOP10 DXCC podle spojení StatsQSOsPerHourBarChartWidget QSOs per hour QSO podle hodin Reading data ... Čtení dat .... Abort reading Přerušit čtení Hours Hodiny QSOs at hour QSO v hodinách Reading data ... Čtení dat .... Hours: Hodiny: StatsQSOsPerModeBarChartWidget QSOs per mode QSO podle druhu provozu Reading data ... Čtení dat .... Abort reading Přerušit čtení Modes Druhy provozu QSOs per mode distribution QSO podle druhu provozu Reading data ... Čtení dat .... Modes: Druhy provozu: StatsQSOsPerMonthBarChartWidget QSOs per month QSO podle měsíců Reading data ... Čtení dat .... Abort reading Přerušit čtení Jan Led Feb Úno Mar Bře Apr Dub May Kvě Jun Čvn Jul Čvc Aug Srp Sep Zář Oct Říj Nov Lis Dec Pro Months Měsíce QSOs at Month QSO v měsíci Reading data ... Čtení dat .... Months: Měsíce: StatsQSOsPerYearBarChartWidget QSOs per year QSO podle roku Reading data ... Čtení dat .... Abort reading Přerušit čtení QSOs QSO Reading data ... Čtení dat .... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Odesláno - %1 Confirmed - %2 Potvrzeno - %2 Sent / Confirmed status Stav Odesláno / Potvrzeno StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Pracováno, nepotvrzeno - %1 Confirmed - %2 Potvrzeno - %2 Worked / Confirmed status Stav Pracoval / Potvrzeno StatsWorkedSentPieChartWidget Worked - %1 Navázané - %1 Sent - %2 Odesláno - %2 Worked / Sent status Stav Pracoval / Odesláno TipsDialog KLog tips Typy KLogu Next Další Previous Předchozí <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #1:</b><br>Víte, že...<br>můžete použít <a href="#ToolsFillInQSO">Nástroje->Přepoužít QSO data</a> pro automatické vyplnění DXCC, CQ, ITU zones a kontinentu? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #2:</b><br>Víte, že...<br>můžete najít QSL, které je potřeba ještě odeslat v menu <a href="#ToolsSendPendingQSL">Nástroje->QSL...->Najít QSL čekající na odeslání</a>.<bR>Tato volba zobrazí v okně Hledání všechna QSO označená jako QSL k odeslaní <i>Vyžádané</i>. <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #3:</b><br>Víte, že...<br>můžete použít <a href="#ToolsFindQSO2QSL">Nástroje->QSL...->Najít QSO </a> pro nalezení všech QSO, pro která je potřeba ještě odeslat QSL? <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #4:</b><br>Víte, že...<br>při hledání můžete použít '*' k nalezení všech QSO? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #5:</b><br>Víte, že......<br>všechny soubory KLogu, jako jsou Vaše logy, logbook.dat, konfigurační soubor klogrc jsou uloženy v adresáři zobrazeném pomocí menu <a href="#FileOpenKLogFolder">Soubor->KLog adresář</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #6:</b><br>Víte, že...<br>můžete všechna zafrontovaná QSL nahrát do LoTW pomocí TQSL přes menu <a href="#ToolsUploadLoTW">Nástroje->LoTW->Nahrát zafrontovaná QSO do LoTW</a> ?<br><br>Je potřeba mít nastaven TQSL, aby tato volba byla aktivní. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #7:</b><br>Víte, že...<br>můžete zobrazit QSO, které potvrzuje jednu konkrétní zemi DXCC na jednom konkrétním pásmu, když umístíte myš nad toto pásmo v okně DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #8:</b><br>Víte, že...<br>můžete najít všechna QSL, na které čekáte pomocí <a href="#ToolsReceivePendingQSL">Nástroje->QSL...->Najít QSL čekající na potvrzení</a>.<bR>Tato volba zobrazí v okně Hledání všechna QSO označená jako <i>Odeslaná</i>, s tím, že od protistanice nebylo přijato její QSL. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #9:</b><br>Víte, že...<br>můžete najít všechna QSL, na které stále čekáte pomocí <a href="#ToolsReceiveRecPendingQSL">Nástroje->QSL...->Najít požadavky čekající na potvrzení</a>.<bR>Tato volba zobrazí v okně Hledání všechna QSO ve stavu QSL přijetí <i>Vyžádáno</i>, s tím, že od protistanice nebylo zatím přijato její QSL. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #10:</b><br>Víte, že...<br>se můžete přihlásit k odběru <a href=https://t.me/klogchat>English KLog Telegram group</a> - anglické diskuzní skupiny o KLogu? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #11:</b><br>Víte, že...<br>se můžete přihlásit k odběru <a href=https://t.me/KLogES>Spanish Telegram group</a> - španělské diskuzní skupiny o KLogu? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #12:</b><br>Víte, že...<br>se můžete přihlásit na <a href=https://groups.io/g/klog>KLog mailing list</a> a diskutovat zde anglicky o KLogu? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #13:</b><br>Víte, že...<br>můžete sledovat novinky o KLogu přes twitter na <a href=https://twitter.com/_ea4k>EA4K</a>? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #14:</b><br>Víte, že...<br>můžete napsat recenzi na KLog na <a href=https://www.eham.net/reviews/detail/3118>eHam.net</a> a pomoci tím jiným uživatelům najít KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #15:</b><br>Víte, že...<br>se můžete jednoduše připojit k vývojovému týmu kontaktem uvedeným na stránkách <a href=https://www.klog.xyz/contact>KLogu Contact</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #16:</b><br>Víte, že...<br>je mnoho cest, jak přispívat do KLog. Některé z nich jsou uvedeny na stránkách <a href=https://www.klog.xyz/contrib>KLog Contribute</a>? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #17:</b><br>Víte, že...<br>můžete pomoci s překladem KLogu? Více na stránkách <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #18:</b><br>Víte, že...<br>dvojitým kliknutím v tabulce DXCC zemí budou zobrazena v okně Hledání všechna QSO s danou zemí? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #19:</b><br>Víte, že...<br>kliknutím na QSO pravým tlačítkem myši a výběrem <i>Vyhledat v QRZ.com</i> vyhledáte detaily o stanice na QRZ.com? UpdateSatsData Reading Satellites data file... Čtení souboru se satelity... Abort reading Přerušit čtení The Satellites information has been updated. Satelitní informace byly aktualizovány. Open File Otevřít soubor Sat Data Sat Data World Entity Země Continent Kontinent Reading cty.csv... Čtení cty.csv... Abort reading Přerušit čtení WorldMapWidget World map Mapa světa View Ukázat Zoom In(25%) Přiblížit(25%) Zoom Out(25%) Oddálit(25%) Normal Size Běžná velikost Fit to window Přizpůsobit oknu eLogClubLog Host not found! Server nenalezen! Timeout error! Vypršel časový limit! QSO dupe or not existing (#%1)... QSO dupe nebo neexistující (#%1)... KLog - ClubLog KLog - ClubLog We have received an undefined error from Clublog (%1) Byla zaznamenána neznámá chyba Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Tato chyba může být způsobena duplicitním QSO nebo v případě smazání, tak se maže neexistující QSO. Undefined error number (#%1)... Nedefinované číslo chyby (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Zkontrolujte konfiguraci v Nastavení a pokud ji nemůžete opravit, kontaktujte vývojový tým KLog. Nahrávání do ClubLog bude zakázáno. Undefined error... Nedefinovaná chyba... Callsign missing Chybí značka Invalid callsign Neplatná značka Skipping SWL callsign Přeskočit SWL značku Callsign is your own call Je to Vaše vlastní značka Invalid callsign with no DXCC mapping Neplatná značka bez DXCC mapování Updated QSO Aktualizované QSO Invalid ADIF record Neplatný ADIF záznam Missing ADIF record Chybějící ADIF záznam Test mode - parameters ok, no action taken Testovací režim - parametry ok, žádná akce Excessive API Usage Nadměrné používání API Internal Error Interní chyba Rejected Odmítnuto QSO Duplicate Duplicitní QSO QSO Modified Upravené QSO Missing Login Chybějící přihlášení QSO OK QSO OK Upload denied Nahrání zamítnuto No callsign selected Nebyla vybrána žádná značka No match found Shoda nenalezena Dropped QSO Zahozené QSO OK OK Login rejected Přihlášení zamítnuto Rejected: Callsign is your own call Zamítnuto: Značka je Vaše vlastní eLogQrzLog Host not found! Server nenalezen! Timeout error! Vypršel časový limit! Undefined error number (#%1) Nedefinované číslo chyby (#%1) KLog - QRZ.com KLog - QRZ.com We have received the following error from QRZ.com (%1) Byla zaznamenána chyba QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Neplatný KEY Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Nastavte svůj API key z QRZ.com. Najdete jej na webové stránce nastavení logu QRZ.com. Abyste mohli používat tuto funkci, potřebujete registraci na QRZ.com. KLog - QRZ.com password needed KLog - Je vyžadováno heslo QRZ.com Please enter your QRZ.com password: Vložte heslo do QRZ.com: Callsign missing Chybí značka eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL odpovědělo touto zprávou: %1 Host not found! Server nenalezen! Timeout error! Vypršel časový limit! Undefined error number (#%1)... Nedefinované číslo chyby (#%1)... We have received an undefined error from eQSL (%1) Byla zaznamenána neznámá chyba eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Zkontrolujte konfiguraci v Nastavení a pokud ji nemůžete opravit, kontaktujte vývojový tým KLog. Nahrávání do eQSL bude zakázáno. eQSL Error: User or password incorrect eQSL Chyba: Nesprávné uživatelské jméno nebo heslo eQSL Warning: At least one of the uplodaded QSOs is duplicated. Upozornění eQSL: Alespoň jedno z nahrávaných QSO je duplicitní. eQSL: All the QSOs were properly uploaded. eQSL: Všechna QSO byla nahrána. KLog - eQSL.cc password needed KLog - Je vyžadováno heslo eQSL.cc Please enter your eQSL.cc password: Vložte heslo do eQSL.cc: klog-1.8.6/translations/klog_es.ts0000644000175000017500000142135614166020421016166 0ustar develdevel AboutDialog About KLog Acerca de KLog Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Tenga en cuenta que se trata de una versión en desarrollo y puede tener muchos fallos. <br>Haga una copia de seguridad de sus datos antes de usar este programa. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si quiere proporcionar soporte, puede unirse a la <a href="https://groups.io/g/klog">Lista de KLog</a>. Authors Autores By Por Author Autor KLog is a free logbook for hamradio operators. KLog es un software libre de log para radioaficionados. Please provide your review in KLog's eHam review page: Por favor, escriba su crítica en la página de críticas de eHam: Find more information and the latest release at Más información y la última versión en today hoy Main developer Desarrollador principal KLog is developed by a very small team and you are invited to join! ¡KLog está desarrollado por un equipo muy pequeño y está invitado a unirse! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Puede ayudarnos reportando errores o pequeñas contribuciones de código, ideas o cualquier otra cosa que crea que puede mejorar KLog. KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Los desarrolladores de KLog han incluido una función que reporta algunos datos del usuario al servidor de KLog con el único objetivo de saber el número de versiones instaladas y poder centrar el desarrollo en una u otra dirección en función de las necesidades de los usuarios. At present, the data that is provided is the following: Hoy, los datos que se proporcionan son los siguientes: Translators bring KLog into your language. They are really an important part of the KLog development team. Los traductores traen KLog a su idioma. Son una parte realmente importante del equipo de desarrollo de KLog. Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. KLog fue reescrito completamente en su versión 0.6.2 para hacerlo multiplataforma de forma que pudiera ejecutarse en los sistemas operativos principales (GNU/Linux, macOS & Windows) y proveer funcionalidades nuevas que aun no se proveían. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si KLog no está aun en su idioma y quiere ayudarnos, puede contactarnos en la <a href="https://groups.io/g/klog">Lista de KLog</a>. Translators Traductores Privacy advisory Aviso de privacidad Callsign Indicativo KLog version Versión de KLog Operating system Sistema operativo Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Sepa que puede habilitar/deshabilitar esta función en la pestaña de Varios de la página de configuración. KLog KLog Privacy Privacidad AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Por favor seleccione el indicativo de estación que quiere usar para subir el log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Seleccione la fecha de inicio para exportar QSOs. La fecha predeterminada es la fecha del primer QSO con este indicativo de estación. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Seleccione la fecha de fin para exportar QSOs. La fecha predeterminada es la fecha del último QSO con este indicativo de estación. Station callsign Indicativo de estación Start date Fecha de inicio End date Fecha final Ok Ok Cancel Cancelar DX DX Date/Time Fecha/Hora Band Banda Mode Modo Not defined Sin definir All Todos QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - QSOs para enviar a LoTW. This table shows the QSOs that will be sent to LoTW. Esta tabla muestra los QSOs que serán enviados a LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSOs para enviar a ClubLog. This table shows the QSOs that will be sent to ClubLog. Esta tabla muestra los QSOs que se enviarán a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSOs para enviar a eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Esta tabla muestra los QSOs que serán enviados a eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSOs para enviar a QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Esta tabla muestra los QSOs que serán enviados a QRZ.com. This table shows the QSOs that will be exported to ADIF. Esta tabla muestra los QSOs que serán exportados a ADIF. AwardsWidget Recalculate Recalcular Click to recalculate the award status. Pulsar para recalcular el estado de los diplomas. Select the year you want to check. Seleccione el año que quiere comprobar. QSOs QSOs DXCC DXCC CQ CQ Award Diploma Confirmed Confirmado Worked Trabajado WAZ WAZ Score Puntuación Annual Anual Number of confirmed DXCC entities. Número de entidades DXCC confirmadas. Number of worked DXCC entities. Número de entidades DXCC trabajadas. Number of confirmed WAZ zones. Número de zonas WAZ confirmadas. Number of worked WAZ zones. Número de zonas WAZ trabajadas. Number of confirmed QSOs. Número de QSOs confirmados. Number of worked QSOs. Número de QSOs trabajados. Number of QSOs worked in the selected year. Número de QSOs trabajados en el año seleccionado. Number of DXCCs worked in the selected year. Número de entidades DXCC trabajadas en el año seleccionado. Number of CQ Zones worked in the selected year. Número de zonas CQ trabajadas en el año seleccionado. Score for the DXMarathon in the selected year. Puntuación de DXMarathon en el año seleccionado. DX-Marathon DX-Marathon CTYPage Country data download Descargar datos de entidades KLog needs country data... KLog necesita datos de las entidades ... &Download &Descargar &Ignore &Ignorar Country data needed Información de entidades KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog usa el fichero cty.csv de http://www.country-files.com/ para obtener la información del DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Necesita descargar el cty.csv si quiere que KLog muestre información de entidad, locator, ... de los QSOs que haga. Click on Download to download now. Pulse en Descargar para descargar ahora. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No se pudo encontrar la máaquina. Revise su configuración de red y pruebe de nuevo ¿Quiere volverlo a intentar? DXCCStatusWidget Update Actualizar It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Parece que el estado de DXCC no está actualizado y KLog no puede encontrar ninguna información de DXCC. Podemos intentar solucionar esto actualizando el log. Do you want to update your DXCC status? ¿Quiere actualizar el estado de DXCC? Entity Entidad Prefix Prefijo Pref: Pref: CQ: CQ: ITU: ITU: Beam: Azimuth: Entity not worked in this band. Entidad no trabajada en esta banda. DXClusterWidget Connect Conectar Clear Limpiar Click on connect to connect to the DX-Cluster Pulse en conectar para conectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster de KLog Click on Connect to connect to the DX-Cluster server Pulse en Conectar para conectar al servidor de DX-Cluster Trying to connect to the server Intentando conectar con el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conexióon fue rechazada por el servidor. Asegúrese de que el servidor de DXCluster estáa ejecutáandose y compruebe el nombre de máquina y puerto. The following error occurred: %1. El siguiente error ha tenido lugar: %1. Connected to server Conectado al servidor KLog message Kontest message Mensaje de KLog Enter your callsign to connect to the cluster: Introduzca su indicativo para conectar al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduzca su contraseña para conectar al cluster: (pulse enter si no hay contraseña) Not logged on, you may need to enter your callsign again. No identificado, puede introducir su contraseña de nuevo. Enter here the commands to be sent to the DX-Cluster server. Introduzca aquí los comandos a enviar al servidor de DX-Cluster. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! No fue posible abrir el fichero para guardar los avisos de DX. La actividad del DX-Cluster no se guardará. Disconnect Desconectar The host was not found. Please check: No se ha encontrado el servidor. Por favor revise: - your network connection; - the host name and port settings. - la conexión de red; - el nombre de máquina y puerto. Connection closed by the server Conexión cerrada por el servidor Click on Connect to connect to the DX-Cluster server. Pulse en Conectar para conectar al servidor de DX-Cluster. Send Enviar DataProxy_SQLite Software version in DB is null La versión de software de la BBDD es nulo Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Rebote Lunar Sporadic E Esporádica E Internet-assisted Asistido por Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Terrestre, repetidor atmosférico o transpondedor Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satélite Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Todos los QSO se han actualizado con un DXCC y un continente. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Irregularidades alineadas con el Campo (FAI) Query didn't failed No falló ninguna query F2 Reflection Common term in hamradio, do not translate if not sure Reflexión F2 Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ecuatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Conducto troposférico Yes No No Requested Solicitada Ignore/Invalid Ignorar/No válida Validated Validada Queued En cola Uploaded Subida Do not upload No subir Modified Modificado Direct Directa Electronic Electrónica KLog DXCC KLog DXCC KLog - Invalid call detected KLog - Indicativo no válido detectado An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Se ha detectado un indicativo vacío. ¿Quiere exportar este QSO de todas formas (Pulsar en Si) o eliminar este campo del log exportado? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Se ha detectado un indicativo no válido (%1). ¿Quiere exportar este indicativo de todas formas (Pulsar en Si) o eliminar este indicativo del log exportado? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Exportar indicativos erróneos puede traer problemas en las aplicaciones en las que potencialmente importará el log. Puede ser de todas formas un buen indicativo que KLog haya detectado como erróneo. DownLoadCTY Download of cty.csv failed with the following error code: La descarga de cty.csv falló con el siguiente código de error: Download of cty.csv done. Descarga de CTY.CSV finalizada. There is already a cty.csv file in the folder but it will be replaced with the new one. Ya hay un cty.csv en la carpeta pero será reemplazado por el nuevo. Could not open %1 for writing No se puede abrir %1 para escritura FileAwardManager Open Award file Abrir fichero de diplomas Award files (*.awa) Fichero de diplomas (*.awa) Award file not opened Fichero de diplomas no abierto KLog was not able to read the award file KLog no puedo abrir el fichero de diplomas It was not possible to open the file %1 for reading. No fue posible abrir el fichero %1 para su lectura. AWA wrong format Formato AWA erróneo The AWA file does not have the right format El fichero AWA no tiene el formato adecuado AWA file does not have an <EOH> field El fichero AWA no tiene un campo <EOH> KLog - %1 KLog - %1 FileManager Reading ADIF file... Leyendo fichero ADIF... Abort reading Cancelar lectura Writing ADIF file... Escribiendo fichero ADIF... Abort writing Cancelar escritura KLog - Invalid call detected KLog - Indicativo no válido detectado An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Se ha detectado un indicativo vacío. ¿Quiere exportar este QSO de todas formas (Pulsar en Si) o eliminar este campo del log exportado? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Se ha detectado un indicativo no válido (%1). ¿Quiere exportar este indicativo de todas formas (Pulsar en Si) o eliminar este indicativo del log exportado? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Exportar un indicativo erróneo puede traer problemas en las aplicaciones en las que potencialmente importará el log. Puede ser de todas formas un buen indicativo que KLog haya detectado como erróneo. Puede, de todas formas, editar el fichero ADIF tras el proceso de exportación. KLog - User cancelled KLog - Cancelación de usuario The selected callsign (%1) is not valid, please check it again to export the log. El indicativo seleccionado (%1) no es válido, revíselo de nuevo para exportar el log. Writing ADIF file... QSO: Escribiendo fichero ADIF ... QSO: KLog - File not opened KLog - Archivo no abierto It was not possible to open the file %1 for reading. No fue posible abrir el fichero %1 para su lectura. KLog was not able to read the LoTW file KLog no pudo leer el fichero de LoTW Processing LoTW ADIF file... Procesando fichero ADIF de LoTW... Abort processing Cancelar proceso LoTW reading Leyendo LoTW KLog - Add new QSOs? KLog - ¿Añadir QSOs nuevos? Do you want to add non existing QSOs to your local log? ¿Quiere añadir QSOs que no existan en el log local? There are some QSOs in the LoTW log that are not in your local log. Hay algunos QSOs en el log de LoTW que no existen en el log local. Processing LoTW ADIF file...... QSO: %1 / %2 Procesando fichero ADIF de LoTW ... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Ha cancelado el proceso de LoTW. El proceso se parará y puede que su log no se actualice del todo. Reading LoTW file... Leyendo fichero LoTW... Importing LoTW ADIF file... Importando archivo ADIF de LoTW... KLog - Log selection KLog - Selección de log Do you want to add dupe QSOs to your local log? ¿Quiere añadir QSOs duplicados al log local? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Hay algunos QSOs en este fichero de log que pueden ser duplicados al tener el mismo indicativo, banda, modo y una fecha y hora muy próxima. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog ha encontrado un QSO sin Indicativo de Estación. Introduzca el indicativo de estación que fue usado en este QSO con %1 en %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog ha encontrado un QSO sin Indicativo de Estación. Introduzca el indicativo de estación que fue usado en este QSO en %1: You have canceled the file import. The file will be removed and no data will be imported. Ha cancelado la importación del fichero. El fichero se eliminará y no se importará ningún dato. There are no QSOs pending to be exported with that station callsign. No hay QSOs pendientes para exportar con ese indicativo de estación. Export Exportar Exporting ADIF file... QSO: %1 / %2 Exportando fichero ADIF... QSO: %1 / %2 Export progress Progreso de exportado This QSO is not including the minimum data to consider a QSO as valid! ¡Este QSO no incluye la información mínima para considerarse un QSO válido! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Algunos QSOs de este log, (ej: %1) parece que no tienen la información de RST-TX. If you select NO, maybe the QSO will not be imported. Si selecciona No, el QSO puede no ser importado. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Pulsar en Si para añadir un %1 de forma predeterminada para el modo %2 en todos los QSOs con un problema similar. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Algunos QSOs de este log, (ej: %1) parece que no tienen la información de RST-RX. KLog - No Station callsign entered. KLog - Sin indicativo de estación. KLog - Apply to all QSOs in this log? KLog - ¿Aplicar a todos los QSOs de este log? KLog - QSO without Station Callsign KLog - QSO sin Indicativo de Estación KLog - Don't ask again KLog - No preguntar de nuevo Do you want to reuse your answer? ¿Quiere reutilizar la respuesta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog usará automáticamente la respuesta anterior para cualquier ocurrencia similar, sin preguntar de nuevo. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Fecha/hora:</i> %1</li><li>Indicativo: %2</li><li>Banda: %3</li><li>Modo: %4</li></ul> KLog - QSO not found KLog - QSO no encontrado Do you want to add this QSO to the log?: ¿Quiere añadir este QSO al log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Hemos encontrado un QSO llegado de LoTW que no está en el log local. ¿Quiere añadir este QSO al log? KLog - Duplicated QSOs KLog - QSOs duplicados Do you want to continue with the current file? ¿Quiere continuar con el fichero actual? - The band missing and the following call: - La banda inexistente pero el siguiente indicativo: - The mode missing and the following call: - El modo inexistente pero el siguiente indicativo: - The date missing and the following call: - La fecha inexistente pero el siguiente indicativo: - The time missing and the following call: - La hora inexistente pero el siguiente indicativo: You have canceled the file export. The file will be removed and no data will be exported. Ha cancelado la exportación del fichero. El fichero se eliminará y no se exportará ningún dato. KLog - Error KLog - Error The selected log does not exist, please check it again. El log seleccionado no existe, por favor reviselo de nuevo. The file %1 can't be opened. No se pudo abrir el fichero %1 . Do you still want to cancel? ¿Aun quiere cancelar? QSO: QSO: There is more than one log in this logfile. Hay más de un log en este fichero. All logs will be imported into the current log. Todos los logs se importarán en el log actual. Do you want to continue? ¿Quiere continuar? Importing ADIF file... Importando fichero ADIF... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Parece que hay algunos QSO duplicados en el fichero ADIF que está importando. ¿Quiere continuar? (los QSO duplicados no se importarán) Please edit the ADIF file and make sure that it include at least: Por favor, edite el fichero ADIF y asegúrese de que incluye al menos: and y This QSO had: Este QSO tenía: KLog: Not all required data found! KLog: ¡No se encontraron todos los datos necesarios! KLog: No RST TX found! KLog: ¡No se encontró RST TX! KLog: No RST RX found! KLog: ¡No se encontró RST RX! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Introduzca el nombre de máquina o dirección de la radio. Set de network port of the radio. Define el puerto de red de la radio. Host/Address Servidor/Dirección Port Puerto Enter the port of the radio. Introduzca el puerto de la radio. HamLibSerialConfigWidget Bauds Baudios Select the serial port speed. Seleccionar la velocidad del puerto serie. Port Puerto Select the serial port. Only the serial ports that are detected are shown. Seleccione el puerto serie. Sólo se muestran los puertos que se pueden detectar. Scan Buscar Click to identify the serial ports available in your computer. Pulsar para identificar los puertos disponibles en el ordenador. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de datos Select the serial data bits. Seleccionar los bits de datos. None Ninguno Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Control de flujo Select the serial flow control Seleccione el control de flujo del puerto serie. No parity Sin paridad Even Par Odd Impar Space Espacio Mark Marca Parity Paridad Select the serial parity. Seleccione la paridad del puerto serie. Default Predeterminado 1 bit 1 bit 2 bits 2 bits Stop bits Bits de parada Select the serial stop bits. Seleccionar los bits de parada. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Continente Prefix Prefijo CQ CQ ITU ITU Short Path Salto corto Long Path Salto largo Deg Grad Miles Millas Km Km IntroPage Welcome to KLog! Welcome to Kontest! ¡Bienvenido a KLog! Welcome to KLog! - brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Welcome to KLog Bienvenido a KLog This looks like it's the first time you've run KLog on this computer. Parece que es la primera vez que ejecuta KLog en este ordenador. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog es un programa libre de log de radioaficionados que puede correr en Linux, macOS y Windows. It is designed to provide general purpose DX, and contest logging. Está diseñado para proveer de log de propósito general, DX y concursos. It supports QSL management, import and export of ADIF Soporta gestión de QSL, importa y exporta formato ADIF and Cabrillo file formats and many other features... y Cabrillo y otras otras muchas funcionalidades... Before you can start using KLog, you will be asked to: Antes de empezar a usar KLog, se le pedirá que: Acknowledge to the terms of the license. Conocer los térmimos de la licencia. Download the DX entities information. Descargar los datos de entidades DX. Enter your callsign, CQ zone, etc. and main configuration. Introduzca el indicativo, zona CQ, etc y la configuración principal. Enjoy KLog and contact the development team if you have any suggestions! ¡Disfrute de KLog y contacte con el equipo de desarrollo si tiene alguna sugerencia! LicPage KLog License information Información de licencia de KLog Welcome to KLog!- brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Acknowledge Aceptar Be aware that KLog is free software. Sepa que KLog es software libre. LoTWUtilities KLog - LoTW password needed KLog - Contraseña de LoTW requerida Please enter your LoTW password: Introduzca su contraseña de LoTW: There is a file already existing with the name that will be used. Ya hay un fichero existente con el nombre a usar. The file %1 already exist. Do you want to overwrite? El fichero %1 ya existe. ¿Quiere sobreescribirlo? KLog was not able to save the file %1. Error returned: %2 KLog no pudo guardar el fichero %1. Error: #2 Downloading data to file: %1. Descargando datos al fichero: %1. KLog - LoTW download KLog - Descarga de LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Esta es la primera fecha de un QSO con el indicativo %1 en este log. Si piensa que en LoTW debe haber QSOs anteriores, conteste No. Do you want to use this date (%1) as start date? ¿Quiere usar esta fecha (%1) como fecha de inicio? The remote server redirected our connection to %1 El servidor remoto redirigió nuestra conexión a %1 Do you want to follow the redirection? ¿Quiere seguir esa redirección? It was not possible for find the file %1 that has been just downloaded. No es posible encontrar el archivo %1 que acaba de descargarse. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Parece que en LoTW no hay ningún QSO con el indicativo de estación que está usando (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Intentar otra vez y enviar el fichero descargado (%1) a los desarrolladores de KLog para su análisis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog descargó %1 correctamente: ¿Quiere actualizar su log con los datos descargados? Double click on the date that you want to use as the start date for downloading QSOs. Haga doble click en la fecha que quiere usar como fecha de inicio para la descarga de QSOs. KLog - LoTW Station callsign KLog - LoTW Indicativo de estación There is not a single QSO in the log with that station callsign. No hay ningún QSO en el log con ese indicativo de estación. Are you sure that you want to use that station callsign (%1)? ¿Está seguro de usar ese indicativo de estación(%1)? KLog - LoTW File already exists KLog - El fichero de LoTW ya existe KLog - LoTW Can't write the file KLog - No pudo escribirse el fichero de LoTW The file %1 already exists. El fichero %1 ya existe. KLog - LoTW Start date selection KLog - LoTW Fecha de inicio KLog - LoTW Download error KLog - Error de descarga de LoTW There was an error (%1) while downloading the file from LoTW. Hubo un error (%1) al descargar el archivo desde LoTW. The downloading error details are: %1 Los detalles del error de descarga es: %1 KLog - LoTW Redirection found KLog - Redirección encontrada en LoTW KLog - LoTW File not found KLog - Fichero de LoTW no encontrado KLog can't find the downloaded file. KLog no pudo encontrar el fichero descargado. KLog - LoTW user/password error KLog - Error de usuario/contraseña de LoTW LoTW server did not recognized your user/password El servidor de LoTW no reconoció su usuario/contraseña Check your user and password and ensure your are using the right one before trying again. Compruebe su usuario y contraseña y asegúrese de usar el correcto antes de intentarlo de nuevo. KLog - LoTW No QSOs KLog - Sin QSOs en LoTW LoTW sent no QSOs LoTW no envió QSOs KLog - LoTW Unknown error KLog - Error desconocido de LoTW KLog can't recognize the file that has been downloaded from LoTW. KLog no puede reconocer el archivo que ha sido descargado de LoTW. Now KLog will process the downloaded QSO and update your local log. Ahora KLog procesará los QSOs descargados y actualizará su log local. LogWindow QSL Send Enviar QSL QSL Rcvd QSL Recibida &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Edita este QSO Via &bureau Vía &bureau Send this QSL via bureau Envía esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa Via bureau Vía bureau QSL &received via bureau QSL &recibida vía bureau Direct Directa QSL received via direc&t QSL recibida vía direc&ta Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Check in DXHeat.com Consultar en DXHeat.com Check this callsign in DXHeat.com Consulta este indicativo en DXHeat.com. Delete selected QSOs Eliminar QSOs seleccionados Delete the selected QSOs Elimina los QSO seleccionados Export to ADIF Exportar a ADIF Export the selected QSOs to an ADIF file. Exportar los QSOs seleccionados a un fichero ADIF. Upload to LoTW Enviar a LoTW Upload the selected QSOs to LoTW Envía los QSOs seleccionados a LoTW Upload to ClubLog Enviar a ClubLog Upload the selected QSOs to ClubLog Envia los QSOs seleccionados a ClubLog Upload to eQSL.cc Enviar a eQSL.cc Upload the selected QSOs to eQSL.cc Envía los QSOs seleccionados a eQSL.cc Send these QSLs via bureau Enviar estas QSLs via bureau Send these QSLs via direct Enviar estas QSLs via directa QSLs received via bureau QSLs recibidas via bureau QSLs received via direc&t QSLs recibidas vía direc&ta Select none Anular selección Remove all selections Elimina todas las selecciones Select all Seleccionar todo Select all the QSOs Selecciona todos los QSOs MainQSOEntryWidget &Add &Añadir &Clear &Limpiar Callsign of the QSO. Indicativo del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Modo del QSO. Date of the QSO. Fecha del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Añadir QSO al log. Clears the QSO entry. Limpia la entrada de QSO. KLog will show real time if enabled. KLog mostrará tiempo real si se habilita. Real time Tiempo real Stop wsjt-x and hamlib from automatically updating QSO information. Evita que WSJT-X o Hamlib actualicen información de QSO. Manual Mode Manual Callsign Indicativo DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE &Modify &Modificar MainWindow Starting KLog Iniciando KLog DX Entity Entidad DX &Log Window Ventana de &Log KLog KLog Ready Listo An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Ha ocurrido un error inesperado al intentar añadir el QSO al log. Si el problema persiste, contacte con el desarrollador para que lo analice: You have selected an entity: Ha seleccionado la entidad: that is different from the KLog proposed entity: que es distinta de la que propone KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Pulse en el prefijo de la entidad correcta o Cancelar para editar el QSO de nuevo. Click on the prefix of the right entity or Cancel to correct. Pulse en el prefijo de la entidad correcta o Cancelar para corregir. RSTrx RSTrx RSTtx RSTtx KLog - CTY.dat update KLog - Actualización de CTY.dat KLog - Backup KLog - Copia de seguridad KLog - New version detected! KLog - ¡Se ha detectado una versión nueva de KLog! KLog - ClubLog error KLog - Error de ClubLog KLog - eQSL error KLog - Error de eQSL KLog - %1 KLog - %1 Do you really want to exit KLog? ¿Realmente quiere salir de KLog? &File &Archivo Import an ADIF file into the current log. Importar un fichero ADIF al log actual. Export the current log to an ADIF logfile. Exportar ellog actual al un fichero de log ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportar TODOS los QSO a un fichero ADIF, mezclando los QSOs de todos los logs. Print your log. Imprime el log. KLog folder Carpeta KLog Opens the data folder of KLog. Abre la carpeta de datos de KLog. E&xit Sali&r &Tools Herramien&tas Fill in QSO data Completar QSOs Go through the log reusing previous QSOs to fill missing information in other QSOs. Revisar el log, reutilizando datos de QSOs anteriores para completar información que falte en otros QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Muestra QSOs para los que tenga que enviat la QSL y solicitar la QSL del DX. Find My-QSLs pending to send Buscar mis QSL pendientes de envío Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Muestra los QSOs que tienen QSL pendiente de enviar. ¡Debería mantener esta cola vacía! Mark all queued QSOs in this log as sent to LoTW. Marcar como encolados los QSOs de este log como enviados a LoTW. Mark all queued QSOs as sent to LoTW. Marca todos los QSOs encolados como enviados por LoTW. KLog - Update checking result KLog - Resultado de la comprobación de actualizaciones de KLog Sends the log to LoTW calling TQSL. Envía el log a LoTW a través de TQSL. For updated DX-Entity data, update cty.csv. Actualizar cty.csv para actualizar los datos de entidades DX. Stats Estadísticas Show the statistics of your radio activity. Muestra estadísticas de la actividad en radio. &Help &Ayuda KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL no está instalado o KLog no puede encontrarlo. Por favor, revise la confirguración. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #1: El proceso ha sido cancelado por el usuario o TQSL no estaba configurado. No se han subido los QSO. Error #2: Upload was rejected by LoTW, please check your data. Error #2: La subida de QSO fue rechazada por LoTW, por favor revise sus datos. Error #3: The TQSL server returned an unexpected response. Error #3: El servidor TQSL ha devuelto una respuesta inesperada. Error #4: There was a TQSL error. Error #4: Ha habido un error de TQSL. Error #5: There was a TQSLLib error. Error #5: Ha habido un error de TQSLLib. Error #6: It was not possible to open the input file. Error #6: No ha sido posible abrir el fichero de entrada. Error #7: It was not possible to open the ouput file. Error #7: No ha sido posible abrir el fichero de salida. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #8: No se procesaron los QSO ya que algunos de ellos eran duplicados o estaban fuera de rango. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #9: Se procesaron algunos QSO y otros se han ignorado porque eran duplicados o fuera de rango de fecha. Error #10: Command syntax error. KLog sent a bad syntax command. Error #10: Error de sintaxis en los comandos. KLog envió un comando con sintáxis errónea. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #11: Error de conexión a LoTW (no hay red o LoTW no está alcanzable). Error #00: Unexpected error. Please contact the development team. Error #00: Error inesperado. Por favor contacte con el equipo de desarrollo. The log that you have selected contains more than just one station callsign. El log que ha seleccionado contiene más de un sólo indicativo de estación. Please select the station callsign you want to mark as sent to LoTW: Por favor seleccione el indicativo de estación que quiere marcar como enviado a LoTW: Station Callsign: Indicativo de la estación: Define Station Callsign Definir indicativo de estación Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduzca el indicativo de estación para usar en este log o déjelo vacío para poner un QSO sin un indicativo de estación definido: KLog - No station selected KLog - No se ha seleccionado estación No station callsign has been selected and therefore no log will be marked No se ha seleccionado indicativo de estación por lo que no se exportará ningún log Congratulations! ¡Enhorabuena! You already have the latest version. Ya cuenta con la última versión. It seems that there are no QSOs in the database. Parece que no hay QSOs en la base de datos. This function is disabled. Go to the Setup->LoTW tab to enable it. Esta función está deshabilitada. Vaya a Preferencias->LoTW para habilitarla. There was an error while updating to Yes the LoTW QSL sent information. Hubo un error al actualizar a Si la información de envío de QSL por LoTW. You can find the KLog data folder here: Puede encontrar la carpeta de KLog aquí: start arrancar stop parar If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si está seguro de que la base de datos contiene QSOs y KLog no es capaz de encontrarlo, por favor contacte con los desarrolladores (mirar en Acerca de KLog) para obtener ayuda. KLog - File not open KLog - Fichero no abierto It was not possible to open the debug file for writing. No debug log will be saved! No fue posible abrir el fichero de depuración para escritura. No se guardará log de depuración. Your log has been updated with the LoTW downloaded QSOs. Su log ha sido actualizado con los datos de los QSOs descargados de LoTW. KLog has updated %1 QSOs from LoTW. KLog ha actualizado %1 QSOs de LoTW. Download from LoTW ... Descargar de LoTW ... Download the full log from LoTW ... Descargar de LoTW el log completo ... ClubLog tools ... Herramientas de ClubLog ... Upload the queued QSOs to ClubLog ... Envia los QSOs seleccionados a ClubLog ... eQSL tools ... Herramientas de eQSL ... Upload the queued QSOs to eQSL.cc ... Envia los QSOs seleccionados a eQSL.cc ... QRZ.com tools ... Herramientas de QRZ.com ... Upload the queued QSOs to QRZ.com ... Enviar QSOs en cola a QRZ.com ... Update cty.csv Actualizar cty.csv Update Satellite Data Actualizar datos de satélites &Tips ... Conse&jos ... &About ... &Acerca de ... About Qt ... Acerca de Qt ... Check updates ... Comprobar actualizaciones ... About ... Acerca de ... No QSOs have been exported to ADIF. No se han exportado QSOs a ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog ha exportado %1 QSOs al fichero ADIF: %2 You need to select one station callsign to be able to send your log to ClubLog. Necesita seleccionar un indicativo de estación para poder mandar el log a ClubLog. Do you want to add this QSOs to your ClubLog existing log? ¿Quiere añadir estos QSOs a su log de Clublog ya existente? If you don't agree, this upload will overwrite your current ClubLog existing log. Si no acepta, este envío sobreescribirá su log existente en ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. Necesita seleccionar un indicativo de estación para poder mandar el log a eQSL. KLog - Select the Station Callsign. KLog - Seleccione indicativo de estación. Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Rellenando DXCC, CQz, ITUz Continente en los QSOs... QSO: QSO logged from WSJT-X: QSO guardado desde WSJT-X: Status bar ... Barra de estado ... Upload the queued QSOs to LoTW Enviar QSOs en cola a LoTW KLog needs to update the Entities database. KLog necesita actualizar la base de datos de entidades. It seems that you have never done a backup or exported your log to ADIF. Parece que no ha hecho nunca una copia de seguridad o exportado su log a ADIF. It seems that the latest backup you did is older than one month. Parece que la última copia de seguridad que hizo fue hace más de un mes. Log backup recommended! ¡Se recomienda hacer una copia de seguridad! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Hacer copias de seguridad de todo el log de forma regular es una buena práctica para evitar la pérdida de datos en caso de problemas. Una vez se haya exportado el log aun fichero ADIF, ese fichero debería guardarse en un lugar seguro como un disco USB, carpeta en cloud, otro ordenador, ... KLog recordará hacer una copia de seguridad una vez al mes. The backup was done successfully La copia de seguridad se realizó correctamente. KLog will remind you to backup your data again in aprox one month. KLog no le recordará de nuevo, en un mes, que debe realizar la copia de seguridad. The backup was not properly done. La copia de seguridad no se hizo correctamente. It is recommended to backup your data periodically to prevent lose or corruption of your log. Se recomienda hacer una copia de seguridad de forma periódica para prevenir una potencial pérdida de datos. It seems that you are running this version of KLog for the first time. Parece que está ejecutando esta versión de KLog por primera vez. The setup will be open to allow you to do any new setup you may need. Se abrirá la el menú de configuración para que pueda hacer cualquier nueva configuración que pueda necesitar. KLog - Unexpected error KLog - Error inesperado KLog - Not valid call KLog - Indicativo no válido Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Añadir indicativos no válidos al log puede crear problemas al optar a diplomas, exportar ficheros ADIF a otros sistemas o aplicaciones. KLog - Select correct entity KLog - Seleccione la entidad correcta No DXCC NO DXCC None Ninguno This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Esta operación eliminará definitivamente todos los QSOs seleccionados y datos asociados y no será posible recuperarlos de nuevo. You have requested to delete the QSO with: %1 Ha solicitado eliminar un QSO con: %1 Are you sure? ¿Está seguro? Check always the current callsign in QRZ.com Comprobar siempre el indicativo actual en QRZ.com You can update the entities database in Tools->Update cty.csv Puede actualizar la base de datos de entidades en Herramientas->Actualizar cty.csv Do you want to do it now? ¿Quiere hacerlo ahora? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? El indicativo %1 no es un indicativo válido. ¿Quiere realmente añadir este indicativo al log? KLog - Not valid callsign KLog - Indicativo no válido The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? El indicativo %1 no es un indicativo válido. ¿Quiere realmente añadir este indicativo al log? You have requested to delete several QSOs Ha seleccionado eliminar varios QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a ClubLog terminó con un error y es posible que no se haya subido el log. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Por favor, compruebe sus credenciales, su conexión a Internet y su cuenta de Clublog. El error recibido fue: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? ¿Quiere marcar como enviados todos los QSOs enviados a ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de ClubLog ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The file has not been removed. No se ha eliminado el fichero. It seems that there was something that prevented KLog from removing the file You can remove it manually. Nos e pudo eliminar el fichero. Puede eliminarlo manualmente. The eQSL upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a eQSL terminó con un error y es posible que no se haya subido el log. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Por favor, compruebe sus credenciales, su conexión a Internet y su cuenta de eQSL. El error recibido fue: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? ¿Quiere marcar como enviados todos los QSOs enviados a eQSL? There was an error while updating to Yes the eQSL QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a eQSL. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de eQSL ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a QRZ.com terminó con un error y es posible que no se haya subido el log. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? ¿Quiere marcar como enviados todos los QSOs enviados a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a QRZ.com. The QRZ.com upload process has finished successfully El proceso de envio a QRZ.com ha terminado satisfactoriamente. Call not found in QRZ.com Indicativo no encontrado en QRZ.com KLog - QRZ.com error KLog error de QRZ.com KLog has received an error from QRZ.com. KLog ha recibido un error de QRZ.com. You need to activate the %1 service in the eLog preferences. Necesita activar el servicio %1 en las preferencias de eLog. KLog - Exit KLog - Salir The logfile has been modified. Se ha modificado el log. Do you want to save your changes? ¿Quiere guardar los cambios? KLog - ADIF export KLog - Exportado de ADIF It is important to export to ADIF and save a copy as a backup. Es importante exportar a ADIF y guardar una copia de seguridad. Saving the log was done successfully. El proceso de salvado del log ha terminado satisfactoriamente. The ADIF export was not properly done. La exportación a ADIF no terminó correctamente. &Import from ADIF ... &Importar desde ADIF ... Export to ADIF ... Exportar a ADIF ... Export all logs to ADIF ... Exportar todos los logs a ADIF ... &Print Log ... Im&primir Log ... QSL tools ... Herramientas de QSL ... Find QSO to QSL Buscar QSO para enviar QSL Find DX-QSLs pending to receive Buscar QSL DX pendientes de recibir Shows DX-QSLs for which requests or QSLs have been sent with no answer. Muestra las QSLs de estaciones DX que se han solicitado o hemos enviado pero no tenemos respuesta. Find requested pending to receive Buscar solicitadas sin recibir Shows the DX-QSLs that have been requested. Muestra QSLs DX que se han solicitado. LoTW tools ... Herramientas LoTW ... Queue all QSLs from this log to be sent Encolar todas las QSLs de este log para enviar Mark all non-sent QSOs in this log as queued to be uploaded. Marca todos los QSOs de este log como encolados para ser enviados. Queue all QSLs to be sent Poner en la cola de envío todas las QSL Put all the non-sent QSOs in the queue to be uploaded. Pone todos los QSOs mp enviados en la cola para ser enviados. Mark all queued QSOs from this log as sent Marcar todos los QSOs de este log como enviados Mark all queued QSOs as sent Marcar como enviados todos los QSO de la cola Check the current callsign in QRZ.com Comprobar el indicativo actual en QRZ.com Queue all the QSO to be uploaded Marcar todos los QSOs para ser enviados Online manual (F1) ... Manual online (F1) ... &Debug ... &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. ¿Quiere marcar TODOS los QSOs de este log para subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a LoTW. All pending QSOs of this log has been marked as queued for LoTW! Todos los QSO pendientes de este log se han añadido a la cola de LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! ¡Hubo un problema al poner en la cola de LoTW los QSOs pendientes! Your log has not been updated. Su log no ha sido actualizado. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. No se actualizó ningún QSO con los datos llegados de LoTW. Puede ser por errores en el fichero de log o simplemente porque el log ya estaba actualizado. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. ¿Quiere marcar TODOS los QSOs pendientes por subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a LoTW. All pending QSOs has been marked as queued for LoTW! Se han puesto en la cola de LoTW todos los QSOs pendientes. All queued QSOs has been marked as sent to LoTW! ¡Se han marcado como enviados a LoTW todos los QSOs en cola! There was a problem to mark all queued QSOs of this log as sent to LoTW! ¡Hubo un problema al marcar todos los QSO en cola de este log como enviados a LoTW! UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor de UDP falló al %1. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? El proceso de subida de TQSL terminó sin errores. ¿Quiere marcar como enviados todos los QSOs enviados a LoTW? Select the Station Callsign to use when quering LoTW: Seleccione el indicativo de estación a usar cuando se consulte a LoTW: Please check the LoTW setup Por favor revise la configuración de LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. No ha definido un usuario de LoTW o un indicativo de estación adecuado. Abra la pestaña de LoTW en las Preferencias y configure su conexión a LoTW. The log is ready to be uploaded to ClubLog. El log está listo para enviarse a ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a ClubLog. KLog could not mark the full log to be sent to ClubLog KLog no pudo marcar el log completo para ser enviado a ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Algo evitó que KLog pudiera marcar los QSOs como modificados. Reinicie KLog y pruebe de nuevo antes de contactar con el equipo de desarrollo de KLog. The log is ready to be uploaded to eQSL.cc. El log está listo para enviarse a eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a eQSL.cc. KLog could not mark the full log to be sent to eQSL KLog no pudo marcar el log completo para ser enviado a eQSL The log is ready to be uploaded to QRZ.com. El log está listo para enviarse a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a QRZ.com. KLog could not mark the full log to be sent to QRZ.com KLog no pudo marcar el log completo para ser enviado a QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Necesita introducir una clave API (API key) correcta para el libro de guardia de QRZ.com en las preferencias de eLog. Filling QSOs ... Completando QSOs ... Date/Time Fecha/Hora Callsign Indicativo Printing the log ... Imprimiendo el log ... KLog - QSO received KLog - QSO recibido Station Callsign Indicativo de la estación Operator Callsign Operador KLog - WSJTX Dupe QSO KLog - QSO duplicado de WSJTX This QSO seems to be duplicated. Do you want to save or discard it? Este QSO parece duplicado. ¿Quiere guardarlo o descartarlo? KLog - Non-supported mode KLog - Modo no soportado A new mode not supported by KLog has been received from an external program or radio: Se ha recibido un nuevo modo no soportado por KLog desde un programa externo o la radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) ¿Quiere seguir recibiendo estas alertas? (deshabilitar esta alerta evitará que los modos no válidos se detecten) Native Error Error nativo Recommendation: Recomendación: Periodically export your data to ADIF to prevent a potential data loss. Exporte periódicamente los datos a ADIF para prevenir una potencial pérdida de datos. Status of the DX entity. Estado de la entidad DX. Name of the DX entity. Nombre de la entidad DX. QSO QSO QSL QSL eQSL eQSL Comment Comentario Others Otros My Data Mis datos Satellite Satélite DXCC DXCC Info Info Awards Diplomas Search Buscar Log Log DX-Cluster DX-Cluster Save ADIF File Salvar fichero ADIF Queue all the QSOs to be uploaded Marcar todos los QSOs para ser enviados You need to select one station callsign to be able to send your log to LoTW. Necesita seleccionar un indicativo de estación para poder mandar el log a LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de LoTW ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The file has been removed. Se ha eliminado el fichero. You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. No ha seleccionado un indicativo. KLog completará los QSOs sin un indicativo de estación con el indicativo que se introduzca aquí. KLog - LoTW KLog - LoTW KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Log de %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Log de %2 - Estación: %3 - QSOs: %4 KLog - QRZ.com warning KLog - Aviso de QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha devuelto un error de "sin subscripción" por lo que las consultas a QRZ.com se deshabilitarán. Please check your QRZ.com subcription or credentials. Revise su subscripción o credenciales de QRZ.com. Settings ... Ajustes ... Now you can upload them to LoTW. Puede enviarlos ahora a LoTW. There was a problem to mark all pending QSOs as queued for LoTW! ¡Hubo un problema al poner en la cola de LoTW los QSOs pendientes! All queued QSOs of this log has been marked as sent to LoTW! ¡Se han marcado como enviados a LoTW todos los QSOs en cola! There was a problem to mark all queued QSOs as sent to LoTW! ¡Hubo un problema al marcar todos los QSO en cola como enviados a LoTW! Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ¿Quiere marcar TODOS los QSOs para subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a %1. ClubLog ClubLog KLog - QRZ.COM KLog - QRZ.com QRZ.COM QRZ.com Open File Abrir fichero - Needed for DXMarathon - Necesitado para DXMarathon Abort filling Cancelar completado Number Número Band Banda Mode Modo Print Log Imprimir log Abort printing Cancelar impresión Printing the log... QSO: Imprimiendo el log ... QSO: The following QSO data has been received from WSJT-X to be logged: Se ha recibido el siguiente QSO desde WSJT-X para ser guardado: Freq Frec Time On Hora inicio Time Off Hora fin RST TX RST TX RST RX RST RX DX-Grid DX locator Local-Grid Locator local Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Los QSOs duplicados deben coincidir con otro QSO existente en el indicativo, banda, modo, fecha y hora, teniendo en cuenta el periodo que puede ser definido en las preferencias. If the received mode is correct, please contact KLog development team and request support for that mode So el modo recibido es correcto, contacte con el equipo de desarrollo de KLog y solicite soporte para ese modo KLog - Duplicated satellite KLog - Satélite duplicado A duplicated satellite has been detected in the file and will not be imported. Se ha detectado un satélite duplicado en el fichero y no se importará. Please check the satellite information file and ensure it is properly populated. Por favor, revise el fichero de la información de satélites y asegúrese de que está correctamente relleno. Now you will see a more detailed error that can be used for debugging... Ahora verá errores más detallados que pueden ser usados para depurar ... An unexpected error ocurred!! ¡Ha ocurrido un error inesperado! If the problem persists, please contact the developers Si el problema persiste contacte con los desarrolladores for analysis: para que lo analicen: Error in function Error en la función Error text Texto del error Failed query Consulta fallida KLog - Show errors KLog - Mostrar errores Do you want to keep showing errors? ¿Quiere seguir viendo los errores? MainWindowInputComment Comment Comentario Add a comment for this QSO. Añadir un comentario a este QSO. Keep this data Mantener estos datos Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato del envío a ClubLog. Date of the QRZ.com upload. Fecha del envío a QRZ.com. Date of the eQSL sending. Fecha del envío de eQSL. Date of the eQSL reception. Fecha de la recepción de eQSL. Date of the LoTW sending. Fecha del envío de LoTW. Date of the LoTW reception. Fecha de la recepción de LoTW. Status on QRZ.com. Estado en QRZ.com. Status of the LoTW sending. Estado del envío de LoTW. Status of the LoTW reception. Estado de la recepción de LoTW. QRZ.com QRZ.com LoTW Sent Envío LoTW LoTW Rec Recepción LoTW Status on ClubLog. Estado en ClubLog. Status of the eQSL sending. Estado de envío de eQSL. Status of the eQSL reception. Estado de recepción de eQSL. ClubLog ClubLog eQSL Sent Envío eQSL eQSL Rec Recepción eQSL MainWindowInputOthers Primary Div Div principal Secondary Div Div secundaria IOTA IOTA Entity Entidad Propagation mode Modo de propagación Others Otros Keep propagation mode Mantener modo de propagación Select the primary division for this QSO. Seleccionar la división principal de este QSO. Select the secondary division for this QSO. Seleccionar la división secundaria de este QSO. Select the entity for this QSO. Seleccionar la entidad de este QSO. Select the propagation mode for this QSO. Seleccionar el modo de propagación de este QSO. Select the IOTA continent for this QSO. Seleccionar el continente IOTA de este QSO. Select the IOTA reference number for this QSO. Seleccionar la referencia IOTA de este QSO. Keeps the same propagation mode for next QSO. Mantiene el mismo modo de propagación para el siguiente QSO. Select the appropriate ADIF field for this QSO. Seleccione el tipo ADIF adecuado para este QSO. Value for the selected ADIF field. Valor del tipo ADIF seleccionado. Not Identified Sin identificar Not - Not Identified No - Sin identificar SOTA Ref Ref SOTA Age Edad VUCC grids Locators VUCC MainWindowInputQSL QSL Sent QSL Enviada QSL Rec QSL Rec QSL Via QSL Vía QSL Msg Msj QSL Status of the QSL sending. Estado del envío de QSL. Status of the QSL reception. Estado de la recepción de QSL. QSL sending information. Información de envío de QSL. QSL reception information. Información de recepción de QSL. Date of the QSL sending. Fecha del envío de QSL. Date of the QSL reception. Fecha de recepción de QSL. Message of the QSL. Mensaje de la QSL. QSL via information. Información de QSL via. MainWindowInputQSO TX RST. RST enviado. RX RST. RST recibido. TX Frequency in MHz. Frecuencia de TX en MHz. RX Frequency in MHz. Frecuencia de RX en MHz. Power used by the contacted station. Potencia usada por la estación contactada. Name of the contacted operator. Nombre del operador contactado. QTH of the contacted station. QTH de la estación contactada. Locator of the contacted station. Locator de la estación contactada. Watts Vatios MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nombre QTH QTH DX Locator Locator DX Power(rx) Potencia(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frec TX Freq RX Frec RX DX QTH locator. QTH locator de DX. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. QTH locator de DX. ELformato debe ser Maidenhead como en IN70AA hasta 10 caracteres. TX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de TX en MHz. ¡La frecuencia no está en una banda de radioaficionados! RX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de RX en MHz. ¡La frecuencia no está en una banda de radioaficionados! MainWindowMyDataTab Watts Vatios Keep this data Mantener estos datos My QTH locator. Mi QTH locator. Power Potencia Operator callsign Indicativo del operador Station Callsign Indicativo de la estación My Locator Mi locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Mi QTH Locator. El formato debe ser Maidenhead como en IN70AA y hasta 10 caracteres. My Rig Mi equipo My Antenna Mi antena My SOTA_Ref Mi ref SOTA My VUCC_GRIDS Mis locators VUCC MainWindowSatTab Keep this data Mantener estos datos Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nombre del satélite si no está en la lista: Seleccione "%1" para habilitar este cuadro (formato como AO-51). Satellite mode used. Modo usado en el satélite. Select the satellite you are using. Selecciona el satélite que se está usando. UpLink band. Banda de subida (TX de la estación en tierra). DownLink band. Banda de bajada (RX de la estación en tierra). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la estación DX. Este cuadro se sincroniza con el cuadro de locator en la pestaña QSO. UpLink Subida DownLink Bajada Satellite Satélite Mode Modo DX Locator Locator DX Other Otro MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Locator de la estación DX. El formato debe ser Maidenhead como en IN70AA y hasta 10 caracteres. Not Sat QSO QSO sin satélite KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog ha detectado un nombre de satélite no reconocido. Si debería ser uno de los satélites conocidos, por favor seleccionelo de la lista. Alternativamente puede contactar con el equipo de desarrollo para que añadan el nuevo nombre de satélite. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! ¡Tenga en cuenta que el nombre del satélite no se guardará si no está en la lista y puede perder esa información! RX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de RX en MHz. ¡La frecuencia no está en una banda de radioaficionados! RX Frequency in MHz. Frecuencia de RX en MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de TX en MHz. ¡La frecuencia no está en una banda de radioaficionados! TX Frequency in MHz. Frecuencia de TX en MHz. Other - Sat not in the list Otro - Satélite no en la lista Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. The satellite you have in your QSO is: El satélite que tiene en su QSO es: OnlineMessageWidget The server returned the following error: %1 El servidor envió el siguiente error: %1 Not identified No identificado QObject Database Error Error de base de datos KLog DB needs to be upgraded. La BD de KLog necesita actualizarse. Do you want to upgrade it now? ¿Quiere actualizar ahora? If DB is not upgraded KLog may not work properly. Si no actualiza la base de datos es posible que KLog no funcione correctamente. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Actualizar el programa puede, potencialmente, crear problemas. Hacer una copia de seguridad de su base de datos antes de actualizar es siempre una buena idea. Do you want to backup your DB now? ¿Quiere hacer una copia de seguridad de su base de datos ahora? The backup finished successfully. La copia de seguridad se terminó correctamente. You can find the backup in this file: %1 Puede encontrar la copia de seguridad en este fichero: %1 The backup was not properly done. La copia de seguridad no se hizo correctamente. You will be sent back to the starting point. Será enviado al punto de inicio. KLog - DB can't be updated automatically KLog - la BBDD no se puede actualizar automáticamente You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Está actualizando desde una versión de KLog demasiado antigua y esta actualización no puede hacerse automáticamente desde esa versión. KLog - DB update KLog - Actualización BBDD KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha detectado un log anterior en la BD. Todos los datos serán migrados a un log tipo DX creado para usted. KLog: Enter Station callsign KLog: Introduzca indicativo Enter the station callsign used in this log Introduzca el indicativo usado en este log Station Callsign Indicativo de la estación QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Cancelar esta actualización causará inconsistencia de datos y posible pérdida de datos. ¿Quiere cancelar? Progress: Progreso: Updating DXCC award information... Actualizando la información de DXCC ... Updating DXCC Award information... Actualizando la información de DXCC ... Updating WAZ award information... Actualizando la información de WAZ ... Updating WAZ Award information... Actualizando la información de WAZ ... Updating mode information... Actualizando información de modo... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. El proceso es el siguiente: - Usando una versión antigua de KLog exportar el log a un fichero ADIF. - Eliminar el fichero logbook.dat de la carpeta de KLog. - Instalar la nueva version de KLog. - Importar el fichero ADIF. KLog finalizará cuando pulse sobre OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Todos los datos se han migrado de forma correcta. Ahora debería ir a Preferencias->Logs para comprobar que todo está bien. Abort updating Cancelar actualización Updating bands information... Actualizando información de bandas... Updating bands information in %1 status... Actualizando información de bandas en %1... Updating mode information in %1 status... Actualizando información de modos en %1... New One, work it! nNew One, work it! ¡Nuevo, trabájelo! Needed, work it! ¡Necesitado, trabájelo! Worked but not confirmed Trabajado pero no confirmado Confirmed Confirmado Not identified No identificado KLog is already running. KLog ya se está ejecutando. It is allowed to run only one instance. Solo puede ejecutarse una instancia a la vez. Install wizard was canceled before completing... El asistente de instalación fué cancelado antes de terminar... Do you want to remove the KLog dir from your disk? ¿Quiere eliminar la carpeta de KLog de su disco? Your KLog dir has been removed Su directorio de KLog ha sido eliminado I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Remember that your KLog dir is on your system... Recuerde que la carpeta de KLog está en su sistema... Thank you for running KLog! ¡Gracias por usar KLog! Updating information... Actualizando información... Updating DXCC and Continent information... Actualizando la información de DXCC y continente... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Se ha encontrado un indicativo incorrecto: %1. Introduzca el nuevo indicativo o confirme si el actual es correcto. An empty callsign has been detected. If it is possible, please enter the right call. Se ha detectado un indicativo vacío. Si es posible, introduzca el indicativo correcto. KLog - Not valid callsign found KLog - Indicativo no válido encontrado Date Fecha Call Indicativo RSTtx RSTtx RSTrx RSTrx Band Banda Comment Comentario Mode Modo CQz CQz ITUz ITUz DXCC DXCC Address Dirección Age Edad County Pais A_Index A_Index Ant_Az Azimuth Ant_El Elevación Ant_Path Paso ARRL_SECT Sección ARRL Award_Submitted Diploma enviado Award_granted Diploma concedido Band_RX Banda RX CheckContest Comprobacion Concurso Class Clase ClubLog SDate c ClubLog status Estado ClubLog Continent Continente Contacted Op Operador contactado Contest Id Id Concurso Country País Credit Submitted Credit enviado Credit granted Credit otorgado Dark Dok Do not translate if unsure, common hamradio term. DOK de DARC Fists Do not translate if unsure, common hamradio term. FISTS Fists CC Do not translate if unsure, common hamradio term. FISTS CC My Fists Do not translate if unsure, common hamradio term. Mi FISTS Nr bursts Do not translate if unsure, common hamradio term. Ráfagas Nr pings Do not translate if unsure, common hamradio term. Núm «pings» Sat mode Modo Sat SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distancia Email Correo-e EQ_Call EQ_Call eQSL RDate eQSL Fecha rec eQSL SDate eQSL Fecha env eQSL Rcvd eQSL recv eQSL Sent Envío eQSL Force Init Forzar inicialización Freq Frec Freq RX Frec RX Gridsquare Locator Guest OP Op invitado HRDLog SDate HRDLog Fecha env HRDLog status Estado HRDLog IOTA IOTA IOTA Island id Id isla IOTA K Index Índice K Lat Lat Lon Lon LoTW RDate LoTW Fecha rec LoTW SDate LoTW Fecha env LoTW Rcvd Recepción LoTW LoTW Sent Envío LoTW Max Bursts max ráfagas Multiplier Multiplicador MS Shower Lluvia MS My Antenna Mi antena My City Mi ciudad My Cnty My condado My Country Mi país My CQz Mi zona CQ My DXCC Mi DXCC My Gridsquare Mi locator My IOTA Mi IOTA My IOTA island id Mi id isla IOTA My ITUz Mi zona ITU My Lat Mi Lat My Lon Mi Lon My Name Mi nombre My Postal code Mi código postal My Rig Mi equipo My Sig Mi Sig My Sig Info Mi info Sig My SOTA ref Mi ref SOTA My State Mi estado My Street Mi calle My USACA counties Mis condados USACA My VUCC grids Mis locator VUCC Name Nombre Notes Notas Operator Operador Owner Callsign Indicativo del dueño Pfx Pref Points Puntos Precedence Precedencia Prop Mode Modo de propagación Public Key Clave pública QRZcom SDate QRZcom Fecha env QRZcom status Estado en QRZ.com QSL msg Mensaje QSL QSL RDate QSL Fecha rec QSL SDate QSL Fecha env QSL Rcvd QSL Recibida QSL Sent QSL Enviada QSL rcvd via QSL rcvd via QSL sent via QSL enviada via QSL via QSL via QSO complete QSO completo QSO random QSO random QTH QTH Region Región Rig Equipo RX Pwr Potencia RX Sat name Nombre de Sat SFI SFI Sig Sig Sig Info Info de sig Silent key Do not translate if unsure, common hamradio term. Fallecido (SK) SKCC SKCC SOTA Ref Ref SOTA SRX String SRX texto SRX SRX STX String STX texto State Estado Submode Submodo UKSMG UKSMG USACA counties Condados USACA VE prov Provincias VE VUCC grids Locators VUCC TX Pwr Potencia TX Web Web QSO Date off Fecha fin QSO Transmitter id Id transmisor Log number Número de log SearchWidget &Clear &Limpiar &Select All &Seleccionar todos &Search Bu&scar &Export Highlighted &Exportar marcados All logs Todos los logs Clear the searches. Limpiar búsquedas. Export the search result to an ADIF file. Exporta el resultado de la búsqueda a un fichero ADIF. Select/Unselect all the QSOs shown. Selecione/Deseleccione todos los QSOs mostrados. Search in the log. Buscar en el log. Search in all logs. Buscar en todos los logs. Select the Station Callsign used to do this QSO. Seleccione el indicativo de estación usado en este QSO. All in log Todos los logs Not defined Sin definir &Clear selection &Limpiar selección Save File Guardar fichero You have requested to delete the QSO with: %1 Ha solicitado eliminar un QSO con: %1 Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Introduzca el indicativo a buscar. Introduzca '*' para mostrar todos los QSOs... puede ser lento en logs grandes! Are you sure? ¿Está seguro? SearchWindow Date/Time Fecha/Hora Band Banda Mode Modo QSL Sent QSL Enviada QSL Rcvd QSL Recibida Station Callsign Indicativo de la estación ID ID Call Indicativo Date/time Fecha/Hora Station callsign Indicativo de estación QSL Send Enviar QSL &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Editar este QSO Via &bureau Vía &bureau Send this QSL via bureau Envía esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa Via bureau Vía bureau QSL &received via bureau QSL &recibida vía bureau Direct Directa QSL received via direc&t QSL recibida vía direc&ta Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Check in DXHeat.com Consultar en DXHeat.com Check this callsign in DXHeat.com Consulta este indicativo en DXHeat.com. &Request my QSL &Requerir mi QSL Mark my QSL as requested Marcar mi QSL como solicitada Via Direct and mark DX QSL as requested Vía directa y marcar QSL DX como solicitada Send this QSL via direct and mark DX QSL as requested Enviar esta QSL vía directa y marcar QSL DX como solicitada Via Bureau and mark DX QSL as requested Vía Bureau y marcar QSL DX como solicitada Send this QSL via bureau and mark DX QSL as requested Enviar esta QSL vía bureau y marcar QSL DX como solicitada &Request the QSL &Requerir la QSL Mark the QSL as requested Marcar la QSL como solicitada Via bureau and mark my QSL as requested Vía Bureau y marcar mi QSL como solicitada QSL received via bureau and mark my QSL as requested QSL recibida vía bureau y marcar mi QSL como solicitada Direc&t and mark as my QSL requested Direc&ta y marcar mi QSL como solicitada QSL received via direct and mark my QSL as requested QSL recibida vía directa y marcar mi QSL como solicitada Needed QSO to send the QSL QSO al que es necesario enviar la QSL My QSL requested to be sent Se ha solicitado el envío de mi QSL DX QSL pending to be received QSL del DX pendiente de recibir SetupDialog User data Datos de usuario Bands/Modes Bandas/modos DX-Cluster DX-Cluster Colors Colores Misc Varios World Editor Editor de entidades Satellites Satélites HamLib HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) ¿Quiere añadir un log en la pestaña de Logs o salir de KLog? (Pulse Si para añadir un log o No para salir de KLog) DB has not been moved to new path. La base de datos se ha movido a un nuevo destino. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Vaya a la pestaña Varios y pulse sobre Mover BBDD o la base de datos no se moverá a la nueva ubicación. Cancel Cancelar OK OK D&X-Cluster D&X-Cluster Log widget Visor de log eLog eLog WSJT-X WSJT-X Settings Preferencias You need to enter at least one log in the Logs tab. Debe introducir al menos un log en la pestaña de Logs. You need to enter at least a valid callsign. Debe introducir al menos un indicativo válido. Go to the User tab and enter valid callsign. Vaya a la pestaña Usuario e introduzca un indicativo válido. You have not selected the kind of log you want. No ha seleccionado el tipo de log que quiere. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Será redirigido a la pestaña de Log. Añada y seleccione el tipo de log que quiere usar. Logs Logs World Entidades SetupEntityDialog Entity Entidad CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefijo ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Lista separada por comas de prefijos posibles. Ej. EA1, EA2, ... Prefixes Prefijos Name of the Entity. Nombre de la entidad. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de la entidad. Local time difference to UTC. DIferencia entre la hora local y la UTC. Main prefix of the entity. Prefijo principal de la entidad. ARRL ID. ID ARRL - Identificador numérico de la ARRL. Date of the deletion. Fecha de eliminación. Deleted Eliminado Cancel Cancelar Ok OK Entity Dialog Entidad SetupPageBandMode Bands Bandas Modes Modos SetupPageColors New One Nuevo Needed in this band Necesitado en esta banda Worked in this band Trabajado en esta banda Confirmed in this band Confirmed Confirmado en esta banda Default Predeterminado WSJT-X palette Paleta WSJT-X Default palette Paleta predeterminada Dark Mode Modo oscuro Color when the DXCC is an ATNO (All Time New One). Color cuando el DXCC es un ATNO (nuevo en cualquier banda y modo). DXCC is confirmed in this band. DXCC confirmado en esta banda. Default color. Color predeterminado. Sets a palette of colors similar to the one used in WSJT-X. Define una paleta de colores similar a la usada en WSJT-X. Sets the default palette. Define la paleta predeterminada. Light Mode Modo claro This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Este DXCC fue trabajado antes en otra banda pero no en la banda seleccionada. Puede ser necesitado debido a CQ, ITU, locator, ... Worked DXCC, but not confirmed in this band. DXCC trababajado pero no confirmado en esta banda. Sets the Dark Mode Configura el Modo oscuro Choose a color Elija un color SetupPageDxCluster Add Añadir Delete Borrar Show &HF spots Show HF spots Mostrar avisos en &HF Show V/&UHF spots Show V/UHF spots Mostrar avisos en V/&UHF Show W&ARC spots Show WARC spots Mostrar avisos en W&ARC Show &worked spots Show worked spots Mostrar a&visos trabajados Show &confirmed spots Show confirmed spots Mostrar avisos &confirmados Show ANN/&FULL messages Show ANN/FULL messages Mostrar mensajes ANN/&FULL Show WW&V messages Show WWV messages Mostrar mensajes &WWV Show WC&Y messages Show WCY messages Mostrar mensajes WC&Y Save DX Cluster activity Guardar actividad de DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Guarda toda la actividad de DX-Cluster en un fichero en la carpeta de KLog. DX Spots Avisos DX Others Otros Messages Mensajes KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Añadir servidor DX-Cluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Añade la dirección seguida de :puerto Ejemplo: dxfun.com:8000 Si no se especifica puerto se usará 41112 de forma predeterminada: SetupPageELog ClubLog password Contraseña de ClubLog ClubLog email Correo electrónico de ClubLog Enter the email you used to register in ClubLog. Introduzca el correo-e que usó para registrarse en ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de ClubLog. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) Send QSOs in real time Enviar QSOs en tiempo real Activate ClubLog Activar ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envía cada QSO a CLubLog en tiempo real, según se van añadiendo (o modificando) en KLog. Starts the ClubLog support in KLog. Inicia el soporte de ClubLog en KLog. Activate eQSL.cc Activar eQSL.cc Enter your username of eQSL.cc. Introduzca su usuario de eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de eQSL. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) eQSL.cc password Contraseña de eQSL.cc Check in Qrz.com all Calls as they are entered Comprobar en QRZ.com todos los indicativos según se van introduciendo. eQSL.cc user Usuario de eQSL.cc ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Introduzca su usuario de QRZ.com. Necesitará estar subscrito a QRZ.com para usar este servicio. User Usuario Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de QRZ.com. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) Password Contraseña Activate QRZ.com Activar QRZ.com Check automatically Validar automáticamente Paying Subscriber Subscriptor de pago Check it if you are paying for a qrz.com subscription Marque aqui si está pagando una subcripción a QRZ.com LogBook Key Clave del libro de guardia LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Clave del libro de guardia para enviar QSOs. Puede obtener esta clave (LogBook Key) de la página de su libro de guardia en QRZ.com. Recuerde que se necesita una subscripción a QRZ.com para usar esta funcionalidad. LoTW LoTW Upload Subir Download Descargar TQSL path Ubicación de TQSL Use TQSL Usar TQSL LoTW password Contraseña de LoTW LoTW user Usuario LoTW Enter your LoTW user. Introduzca su usuario de LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de LoTW. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria.) Path to the TQSL software. Ruta hasta el ejecutable de TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Habilita la integración de LoTW a traves de TQSL. Necesita tener TQSL instalado. Select File Seleccionar fichero SetupPageHamLib Activate HamLib Activar HamLib Activates the hamlib support that will enable the connection to a radio. Activa el soporte de hamlib que habilitará la conexión a una radio. Read-Only mode Modo solo lectura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Si se habilita, KLog leerá la frecuencia y modo de la radio pero nunca enviará ningún comando a la radio. Radio Radio Select your rig. Seleccionar equipo. Serial Serie Network Red Defines the interval to poll the radio in msecs. Define el intervalo con el que se consulta a la radio en milisegundos. Poll interval Intervalo de actualización Test: OK Test: OK Test: NOK Test: NOK Test Test Click to test the connection to the radio Pulse para probar la conexión a la radio SetupPageLogView Fields Campos SetupPageLogs &New New &Nuevo &Edit &Editar &Remove Elimina&r KLog KLog Do you really want to remove this log? ¿Realmente quiere eliminar este log? Operators Operadores An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: Log has not been removed. (#3) Log no eliminado (#3) Add a new log. Añade un nuevo log. Edit the selected log. Edita el log seleccionado. Remove the selected log. Elimina el log seleccionado. All the QSOs from this log will also be deleted... Todos los QSOs de este log también se eliminarán... Log has not been removed. (#2) Log no eliminado (#2) Log has not been removed. (#1) Log no eliminado (#1) QSOs QSOs The new log could not be created. No pudo crearse el nuevo log. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicativo de la estación Comments Comentarios Date Fecha SetupPageLogsNew &Ok &Ok &Cancel &Cancelar &Date &Fecha &Station Callsign &Indicativo Estación &Operators &Operadores Comm&ent Com&entario Callsign used for this log. Indicativo usado en este log. Comma separated list of operators: callsign1, callsign2. Lista separada por comas de los operadores: indicativo1, indicativo2. Start date of this log. Fecha de inicio de este log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Añadir un comentario sobre el log. Si se rellena, se mostrará como título en la pantalla principal de KLog para identificar el log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Necesita introducir un indicativo válido en el cuadro de Indicativo de estación. El log no se abrirá. SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Log en tiempo real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit Guardar ADIF al &salir Use this &default filename Use this default filename Usar este fichero &de forma predeterminada Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marcar como &QSL por enviar cuando se recibe la QSL Complete QSO with previous data Completar QSO con datos anteriores Manage DX-Marathon Gestionar DX-Marathon Activate the application debug log Activar el log de depuración de la aplicación Move DB Mover BBDD In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. En segundos, introduzca el rango de tiempo a considerar como duplicado si coincide el mismo indicativo, banda y modo. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Si deshabilita este cuadro, KLog no revisará si los indicativos son correctos o no. Check it for Imperial system (Miles instead of Kilometers). Marcar si se desea sistema imperial (millas en vez de kilómetros). Select to use the following name for the logfile without being asked for it again. Seleccione para usar el siguiente nombre de fichero y que no se le pregunte más. Select if you want to manage DX-Marathon. Seleccionar si quiere gestionar DX-Marathon. This is the default file where ADIF data will be saved. Este es el nombre de fichero predeterminado donde se guardará el fichero ADIF. This is the directory where the database (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Click to change the path of the database. Pulse para cambiar la ubicación de la base de datos. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activa el log de depuración de la aplicación. Puede ser útil si algo no funciona como se espera. Se creará un fichero de depuración en la carpeta de KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Habilitar para poner en la cola de envío todas las QSL-e (LoTW & eQSL) en todos los nuevos QSO de forma predeterminada. Dupe time range: Periodo de QSO dupe: Please specify an existing directory where the database (logbook.dat) will be saved. Por favor, especifique un directorio existente donde la base de datos (logbook.dat) se almacenará. This is the directory where DB (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Check non-valid calls Comprobar indicativos válidos Mark sent eQSL && LoTW in new QSO as queued Marcar eQSL y LoTW como en cola en todos los QSO nuevos Click to change the default ADIF file. Pulse para cambiar el nombre predeterminado del fichero ADIF. Click to move the DB to the new directory. Pulse para mover la BBDD al nuevo directorio. Select Directory Seleccionar directorio KLog - Move DB KLog - Movimiento de base de datos File moved Archivo movido File copied Archivo copiado File already exist. El fichero ya existe. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. El fichero destino ya existe y KLog no lo reemplazará. Por favor elimine el archivo de la carpeta destino antes de mover el archivo con KLog para asegurarse de que KLog puede copiar el archivo. File NOT copied Archivo NO copiado The file was not copied due to an unknown problem. El archivo no se copió debido a un problema desconocido. The target directory does not exist. Please select an existing directory. El directorio destino no existe. Por favor, seleccione un directorio existente. Show the Station &Callsign used in the search box Mostrar indicativo usado en el &cuadro de búsqueda &Check for new versions automatically &Comprobar si hay nuevas versiones automáticamente QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Los QSO se marcarán como pendientes de enviar si se recibe la tarjeta del DX y no ha enviado la suya. Check if there is a new release of KLog available every time you start KLog. Comprueba si hay una nueva versión de KLog disponible cada vez que inicia KLog. &Provide Info for statistics &Proporcionar datos para estadísticas The search box will also show the callsign on the air to do the QSO. El cuadro de búsqueda mostrará también el distintivo usado para hacer el QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Si se selecciona el comprobar nuevas versiones, KLog enviará al desarrollador el indicativo, la versión de KLog y el sistema operativo para ayudar a mejorar KLog. Select to use real time. Seleccione para usar tiempo real. Select to use UTC time. Seleccione para usar UTC. Select if you want to save to ADIF on exit. Seleccione si quiere guardar en ADIF al salir. Complete the current QSO with previous QSO data. Completar el QSO actual con datos de QSO anteriores. Browse Buscar Open File Abrir fichero &Delete always temp ADIF file after uploading QSOs Borrar siempre el archivo ADIF &temporal tras subir los QSOs Delete Always the adif file created after uploading QSOs Borrar el archivo ADIF temporal tras subir los QSOs SetupPageSats &New &Nuevo &Edit &Editar &Remove Elimina&r &Import &Importar E&xport E&xportar Add a new satellite. Añadir un nuevo satélite. Edit the selected satellite. Editar el satélite seleccionado. Remove the selected satellite. Eliminar el satélite seleccionado. Export your current satellites to a file. Exportar los satélites actuales a un fichero. Select the sat you want to open. Seleccione el satélite que quiere abrir. KLog KLog Do you really want to remove this satellite? ¿Realmente quiere eliminar este satélite? Import a satellites file. It will replace the satellites you have in the current list. Importa el fichero de satélites. Reemplazará los satélites que tiene ahora configurados. This satellite will no be longer available to be selected ... Este satélite dejara de estar disponible para ser seleccionado ... Sat has not been removed. (#3) El satélite no ha sido eliminado. (#3) Sat has not been removed. (#2) El satélite no ha sido eliminado. (#2) Sat has not been removed. (#1) El satélite no ha sido eliminado. (#1) ID ID Short Corto Name Nombre Uplink Subida Downlink Bajada Modes Modos An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: KLog - SetupPageSats KLog - Configuración de satélites Open Satellites File Abrir fichero de satélites KLog warning Advertencia de KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Ha ocurrido un error inesperado al importar los datos de satélites. Puede haber sido causado que el fichero que está intentando importar no tiene el formato adecuado. Please check the format or contact the developer for analysis with the error code: Por favor, compruebe el formato o contacte con el desarrollador para que analice el código de error: Save Satellites File Guardar fichero de satélites SetupPageSatsNew Short name Nombre corto Sat name Nombre UpLink Subida DownLink Bajada Modes Modos &Ok &Ok &Cancel &Cancelar Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduzca el nombre corto. Trate de usar el nombre corto del LoTW para poder subir los QSO a LoTW después. Enter the name of the satellite. Introduzca el nombre del satélite. Enter the uplink frequencies in this format: 144.300 Introduzca las frecuencias de subida en este formato: 144.300 Enter the downlink frequencies in this format: 144.300 Introduzca las frecuencias de bajada en este formato: 144.300 Enter the modes in this format: USB Introduzca los modos en este formato: USB Some of the data you have entered is not correct; the satellite can't be added. Alguno de los datos introducidos no son correctos, el satélite no puede ser añadido. SetupPageSubdivisionNew &Date &Fecha &Station Callsign &Indicativo Estación &Operators &Operadores Comm&ent Com&entario &Ok &Ok &Cancel &Cancelar Callsign used for this log. Indicativo usado en este log. Comma separated list of operators: callsign1, callsign2. Lista separada por comas de los operadores: indicativo1, indicativo2. Start date of this log. Fecha de inicio de este log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Añadir un comentario sobre el log. Si se rellena, se mostrará como título en la pantalla principal de KLog para identificar el log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Necesita introducir un indicativo válido en el cuadro de Indicativo de estación. El log no se abrirá. SetupPageSubdivisions &Remove Elimina&r Import new Importar nuevo Import an AWA file with the subdivision details. Importa un fichero AWA con la información de subdivisiones. Remove the selected references. Elimina las referencias seleccionadas. Select the references you want to open. Seleccione las referencias que quiere abrir. KLog KLog Do you really want to remove the data of this entity? ¿Quiere realmente eliminar los datos de esta entidad? All the subdivision information for this entity will be deleted... Se eliminará la información de subdivisiones de esta entidad... Log has not been removed. (#3) Log no eliminado (#3) Log has not been removed. (#2) Log no eliminado (#2) Log has not been removed. (#1) Log no eliminado (#1) ID ID Name Nombre Short Name Nombre corto CQ Zone Zona CQ ITU Zone Zona ITU Deleted Eliminado Start Date Fecha de inicio End Date Fecha final DXCC DXCC An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: KLog - SetupPageSubdivisions KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Arrancar servidor UDP Automatically log QSOs from WSJT-X Registrar automáticamente los QSOs recibidos de WSJT-X Allow WSJT-X to send logged QSOs to KLog Permitir a WSJT-X enviar los QSO resgistrados a KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Los QSO hechos en WSJT-X serán enviados a KLog y KLog preguntará antes de guardarlo en KLog salvo que se seleccione "%1" KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog registrará automáticamente cualquier QSO que llegue de WSJT-X sin ninguna confirmación manual. Update status information from WSJT-X Actualizar el estado desde WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog mostrará y actualizará automáticamente lo datos que llegan de WSJT-X (estación DX, reporte, modo,...) UDP port number where the UDP Server will listen for packets. Puerto UDP donde el servidor UDP espera los paquetes. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Asegúrese de que es el mismo puerto al que los otros programas están enviando datos. El puerto predeterminado es el 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP recibirá los QSO enviados desde otros programas como WSJT-X permitiendo registrar en KLog los contactos automáticamente desde esos programas. UDP Port Puerto UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleccione el interterfaz para recibir los datagramas UDP que lleguen de WSJT-X. Network interface Interfaz de red QSOs notification timeout (milisecs) Tiempo de notificación de QSO (milisegundos) Miliseconds that the notification of QSOs received from WSJTX will be shown. Milisegundos que se mostrará la notificación de QSO recibida de WSJTX. SetupPageUserDataPage &Personal data Personal data Datos &personales Station &data Station data &Datos de la estación &Name Name &Nombre &Address Address &Dirección Cit&y City Ci&udad &Zip Code Zip Code Código &postal Pro&v/State Prov/State Pro&v/Estado Countr&y Country Paí&s Enter your information for rig Introduzca la información de su equipo/radio Enter your information for antenna Introduzca la información de su antena Enter your name. Introducir el nombre. Enter your address - 1st line. Introducir la dirección - linea 1. Enter your address - 2nd line. Introducir la dirección - linea 2. Enter your address - 3rd line. Introducir la dirección - linea 3. Enter your address - 4th line. Introducir la dirección - linea 4. Enter your city. Introducir la ciudad. Enter your zip code. Introducir el código postal. Enter your province or state. Introducir la provincia o estado. Enter your country. Introducir el país. Enter your power information. Introducir la información sobre la potencia. &Rig 1 &Equipo 1 R&ig 2 E&quipo 2 Ri&g 3 Eq&uipo 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tencia Enter the station callsign that will be used for logging. Introducir el indicativo de la estación que se usará en el log. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduzca el locator de su estación. De forma alternativa, KLog puede proporcionarle uno aproximado basado en su indicativo. &Callsign Indi&cativo &Operators &Operadores &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Locator &Locator (not valid) &Locator (no válido) Enter the operators (comma separated if more than one). Introduzca los operadores (separados por comas si hay más de uno). SetupPageWorldEditor KLog will not be able to show entities information. KLog no podrá mostrar información de entidades. Prefix Prefijo Entity Entidad An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Se ha detectado un fichero de información de entidades (cty.csv) en su carpeta de KLog y se utilizará. Add Añadir Delete Borrar Edit Editar Export World Exportar mundo Import World Importar mundo Still not implemented. Sin implementar. Import a new cty.csv file Importar un nuevo fichero cty.csv No entities information file (cty.csv) has been detected in your KLog folder. No se ha detectado en su carpeta de KLog ningún fichero de información de entidades (cty.csv). ARRL ID ARRL ID Continent Continente CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Eliminado Since Date Desde fecha To Date Hasta fecha Open File Abrir fichero BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. La información de entidades ha sido actualizada. Entities information has not been updated. La información de entidades no ha sido actualizada. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Lo siguientes QSO son los QSO para los que ha recibido confirmación de LoTW. Ok Ok DX DX Date/Time Fecha/Hora Band Banda Mode Modo ShowErrorDialog KLog Message Mensaje de KLog SoftwareUpdateDialog Ok Ok KLog update Actualización de KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>¡Hay un nueva versión de KLog disponible! (%1)</h2></center><br>Hay una nueva versión de KLOg disponible.<br><br><b>Puede descargar la nueva versión desde:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! ¡Enhorabuena! Your KLog has been updated. Su KLog ha sido actualizado. You already have the latest version. Ya cuenta con la última versión. StartWizard KLog - The free hamradio logging program KLog - El programa libre de log de radioaficionados Quit Setup Salir Setup is not complete yet. Are you sure you want to quit setup? La configuración no está completa. ¿Está seguro de querer salir de la configuración? StatisticsWidget QSO per year QSO por año DXCC per year Entidades DXCC por año CQ zones per year Zonas CQ por año QSO per band QSOs por banda QSO per mode QSOs por modo QSO per DXCC QSOs por DXCC QSO per Continent QSO por Continente QSO per hour QSOs por hora QSO per month QSO por mes Worked / Confirmed status Trabajados / Confirmados Worked / Sent status Trabajados / Enviados Sent / Confirmed status Enviados / Confirmados Satellite grid status Locators en satélites Satellite DXCC status DXCC en satélites Grids per band status Estado de Locators por banda DXCC per band status Estado de DXCC por banda StatsCQZPerYearBarChartWidget CQ Zones per year Zonas CQ por año Reading data ... Leyendo datos ... Abort reading Cancelar lectura CQ zones Zonas CQ CQ zones per year Zonas CQ por año Reading data ... Leyendo datos ... Years: %1/%2 Años: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Sólo confirmados Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Sólo satélites LEO Number Número Callsign Indicativo Date Fecha Band Banda Mode Modo DXCC DXCC Satellite Satélite Confirmed Confirmado No No StatsEntitiesPerYearBarChartWidget Chart title Título del gráfico Reading data ... Leyendo datos ... Abort reading Cancelar lectura DXCC Entities Entidades DXCC DXCC Entities per year Entidades DXCC por año Reading data ... Leyendo datos ... Entities: Entidades: StatsFieldPerBandWidget All Todos Mode: Modo: Band Banda Worked Trabajado Confirmed Confirmado StatsGridsOnSatsWidget Show confirmed only Sólo confirmados Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Sólo satelites LEO Number Número Callsign Indicativo Date Fecha Band Banda Mode Modo Grid Locator Satellite Satélite Confirmed Confirmado No No StatsQSOsPerBandBarChartWidget QSOs per band QSOs por banda Reading data ... Leyendo datos ... Abort reading Cancelar lectura Bands Bandas QSOs per band distribution Distribución de QSO por banda Reading data ... Leyendo datos ... Bands: Bandas: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs por continente Reading data ... Leyendo datos ... Abort reading Cancelar lectura Continents Continentes Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs por DXCC Reading data ... Leyendo datos ... Abort reading Cancelar lectura Reading data... Leyendo datos ... DXCC DXCC Top ten DXCC per QSO Top 10 de DXCC por QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs por hora Reading data ... Leyendo datos ... Abort reading Cancelar lectura Hours Horas QSOs at hour QSO por hora Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs por modo Reading data ... Leyendo datos ... Abort reading Cancelar lectura Modes Modos QSOs per mode distribution Distribución QSO por modo Reading data ... Leyendo datos ... Modes: Modos: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs por mes Reading data ... Leyendo datos ... Abort reading Cancelar lectura Jan Ene Feb Feb Mar Mar Apr Abr May May Jun Jun Jul Jul Sep Sep Oct Oct Nov Nov Dec Dic Aug Ago Months Meses QSOs at Month QSOs en mes Reading data ... Leyendo datos ... Months: Meses: StatsQSOsPerYearBarChartWidget Reading data ... Leyendo datos ... Abort reading Cancelar lectura QSOs QSOs QSOs per year QSOs por año Reading data ... Leyendo datos ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviado - %1 Confirmed - %2 Confirmado - %2 Sent / Confirmed status Enviados / Confirmados StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Trabajados, no confirmados - %1 Confirmed - %2 Confirmado - %2 Worked / Confirmed status Trabajados / Confirmados StatsWorkedSentPieChartWidget Worked - %1 Trabajado - %1 Sent - %2 Enviado - %2 Worked / Sent status Trabajados / Enviados TipsDialog KLog tips Consejos de KLog Next Siguiente Previous Anterior <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Consejo #1:</b><br>¿Sabía que...<br>Puede usar <a href="#ToolsFillInQSO">Herramientas->Completar QSOs</a> para leer automáticamente todo el log y rellenar los campos DXCC, CQ, ITU y continente? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Consejo #3:</b><br>¿Sabía que...<br>Puede usar <a href="#ToolsFindQSO2QSL">Herramientas->Herramientas de QSL ...->Buscar QSO para enviar QSL</a> buscar todos los QSO para los que debería enviar su QSL porque aun necesita confirmar ese DXCC y aun no ha enviado si tarjeta QSL? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Consejo #11:</b><br>¿Sabía que...<br>Puede subscribirse al <a href=https://t.me/KLogES>Grupo de Telegram en español</a> para discutir sobre KLog en español? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Consejo #13:</b><br>¿Sabía que...<br>Puede seguir a <a href=https://twitter.com/_ea4k>EA4K</a> en Twitter para recibir información sobre KLog? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Consejo #8:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que está esperando con <a href="#ToolsReceivePendingQSL">Herramientas->Herramientas de QSL...->Buscar QSL DX pendientes de recibir?</a>.<bR>Esta herramienta le mostrará, en el cuadro de búsqueda, todos los QSO con que tienen la opción de QSL enviada marcada como <i>Enviada</> pero aun no ha recibido la tarjeta del DX. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Consejo #9:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que está esperando con <a href="#ToolsReceiveRecPendingQSL">Herramientas->Herramientas de QSL...->Buscar solicitadas sin recibir</a>?.<bR>Esta herramienta le mostrará, en el cuadro de búsqueda, todos los QSO con que tienen la opción de QSL recibida marcada como <i>Solicitada</> pero aun no ha recibido la tarjeta del DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Consejo #10:</b><br>¿Sabía que...<br>Puede subscribirse al <a href=https://t.me/klogchat>Grupo de Telegram en inglés</a> para discutir sobre KLog en inglés? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Consejo #2:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que necesita mandar con <a href="#ToolsSendPendingQSL">Herramientas->Herramientas de QSL...->Buscar mis QSL pendientes de envío?</a>.<bR>Esta herramienta la mostrará en el cuadro de búsqueda todos los QSO con la opción de enviar QSL como <i>Solicitada</i>. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Consejo #4:</b><br>¿Sabía que ...<br>Puede introducir un '*' en el cuadro de búsqueda para que aparezcan todos los QSO hechos con un indicativo en concreto? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Consejo #5:</b><br>¿Sabía que...<br>Puede el fichero logbook.dat es el fichero con todos sus logs y otras informaciones y el fichero klogrc es el fichero de configuración y se pueden encontrar en la carpeta de KLog, abriendo el menú <a href="#FileOpenKLogFolder">Archivo->Carpeta de KLog</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Consejo #6:</b><br>¿Sabía que...<br>Puede subir los QSOs marcados como en cola a LoTW a través de la aplicación TQSL con <a href="#ToolsUploadLoTW">Herramientas->Herramientas de LoTW ...->Enviar a LoTW</a>?<br><br>Tiene que configurar TQSL en las preferencias para poder usar esta funcionalidad? <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Consejo #7:</b><br>¿Sabía que...<br>Puede ver qué QSO confirma una entidad DXCC en concreto? situando el puntero del ratón sobre la banda en el widget DXCC? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Consejo #12:</b><br>¿Sabía que...<br>Puede subscribirse a la <a href=https://groups.io/g/klog>Lista de KLog</a> para discutir sobre KLog en inglés? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Consejo #14:</b><br>¿Sabía que...<br>Puede escribir su propia <a href=https://www.eham.net/reviews/detail/3118>opinión de KLog en eHam.net</a> para ayudar a otros usuarios a usar KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Consejo #15:</b><br>¿Sabía que..<br>Puede unirse al equipo de desarrollo simplemente <a href=https://www.klog.xyz/contact>Contactando con nosotros</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Consejo #16:</b><br>¿Sabía que...<br>Hay muchas formas de contribuir con KLog y algunas de ellas estan listadas en la página <a href=https://www.klog.xyz/contrib>Contribuir</a> de la web? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Consejo #17:</b><br>¿Sabía que...<br>Puede ayudar a traducir KLog a su idioma? Por favor consulte la página <a href=https://www.klog.xyz/contrib/translations>Traducciones de KLog</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Consejo #18:</b><br>¿Sabía que...<br>Puede hacer doble click en el nombre de una entidad en la tabla de DXCC todos los QSO con esa entidad aparecerán en el cuadro de búsqueda? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Consejo #19:</b><br>¿Sabía que...<br>Puede click con el botón derecho en un QSO y seleccionar <i>Consultar en QRZ.com</i> para consultar ese indicativo en QRZ.com? UpdateSatsData Reading Satellites data file... Leyendo fichero de datos satélites ... Abort reading Cancelar lectura The Satellites information has been updated. Se ha actualizado la información de los satélites. Open File Abrir fichero Sat Data Datos de satélites World Entity Entidad Continent Continente Abort reading Cancelar lectura Reading cty.csv... Leyendo cty.csv... WorldMapWidget World map Mapa del mundo View Ver Zoom In(25%) Acercar (25%) Zoom Out(25%) Alejar(25%) Normal Size Tamaño normal Fit to window Ajustar a ventana eLogClubLog Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Este error puede ser causado por un QSO duplicado o, si estaba eliminando, porque no existiera anteriormente. Undefined error number (#%1)... Error no definido número (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... QSO repetido o no existente (#%1)... We have received an undefined error from Clublog (%1) Hemos recibido un error indefinido de Clublog (%1) Undefined error... Error no definido... Callsign missing Falta indicativo Invalid callsign Indicativo no válido Skipping SWL callsign Saltando indicativo SWL Callsign is your own call Callsign is your ow call El indicativo es su propio indicativo Invalid callsign with no DXCC mapping Indicativo no válido sin correspondencia con DXCC Updated QSO QSO actualizado Invalid ADIF record Registro ADIF no válido Missing ADIF record Falta registro ADIF Test mode - parameters ok, no action taken Modo Test - parámetros OK, sin acción Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Revise su configuración y contacte con el equipo de desarrollo de KLog si no puede solucionarlo. Se deshabilitarán los envios a ClubLog. Excessive API Usage Uso excesivo de API Internal Error Error interno Rejected Rechazado QSO Duplicate QSO duplicado QSO Modified QSO modificado Missing Login Falta login QSO OK QSO OK Upload denied Subida rechazada No callsign selected No se seleccionó indicativo No match found Sin coincidencia Dropped QSO QSO eliminado OK OK Login rejected Login rechazado Rejected: Callsign is your own call Rechazado: El indicativo es su propio indicativo eLogQrzLog Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! Undefined error number (#%1) Error no definido número (#%1)... We have received the following error from QRZ.com (%1) Hemos recibido el siguiente error de QRZ.com (%1) You are not subscribed to QRZ.com. No está subscrito a QRZ.com. Not valid KEY found Clave no valida Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Por favor configure su clave API (API key) de QRZ.com. La encontrará en la pagina de configuración de su libro de guardia en QRZ.com. Necesita una subscripción para usar esta funcionalidad. KLog - QRZ.com password needed KLog - Contraseña de QRZ.com requerida Please enter your QRZ.com password: Introduzca su contraseña de QRZ.com: KLog - QRZ.com KLog - QRZ.com Callsign missing Falta indicativo eQSLUtilities eQSL has sent the following message: %1 eQSL ha enviado el siguiente mensaje: %1 Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! Undefined error number (#%1)... Error no definido número (#%1)... eQSL Error: User or password incorrect KLog - Error de usuario/contraseña de eQSL eQSL Warning: At least one of the uplodaded QSOs is duplicated. Aviso eQSL: Al menos uno de los QSOs enviados está duplicado. eQSL: All the QSOs were properly uploaded. eQSL: Todos los QSOs se enviaron correctamente. KLog - eQSL.cc password needed KLog - Contraseña de eQSL.cc requerida Please enter your eQSL.cc password: Introduzca su contraseña de eQSL.cc: KLog - eQSL KLog - eQSL We have received an undefined error from eQSL (%1) Hemos recibido un error indefinido de eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Revise su configuración y contacte con el equipo de desarrollo de KLog si no puede solucionarlo. Se deshabilitarán los envios a eQSL. klog-1.8.6/translations/klog_ja.ts0000644000175000017500000147131514166020421016151 0ustar develdevel AboutDialog About KLog KLogについて You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. バグレポートやちょっとしたコードを書いて送ってくれたり、他にもアイデアとか KLog をよりよくするとあなたが思うことを何でも送ってくれることで手助けとなります. Authors 作者 By Author 作者 KLog is a free logbook for hamradio operators. KLogはアマチュア無線家のためのフリーなログソフトです. Please provide your review in KLog's eHam review page: eHamのレビューページにKLogのレビューをぜひ投稿してください: Find more information and the latest release at より詳しい情報や、最新のリリースは以下の場所で入手できます.<br> today 現在 Main developer メイン開発者 KLog is developed by a very small team and you are invited to join! KLogはとても小さなチームによって開発されており、あなたの参加が望まれています! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: 今のところ、提供いただく情報は以下のものです: Translators bring KLog into your language. They are really an important part of the KLog development team. 翻訳者はKLogをあなたの言語で使えるようにします. 翻訳者はKLog開発チームの中でもとりわけ重要な役割を担います. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! これは開発版であり、多くのバグが含まれている可能性があることをご了承ください。<br>このソフトウェアを使用する前に、データをバックアップしてください! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. KLogは、0.6.2以降、主要なオペレーティングシステム(GNU/Linux、macOS、Windows)で動作するクロスプラットフォームのアプリケーションを提供し、新しい機能をサポートするために完全に書き換えられました。 If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! 応援してくださる方は、ぜひ<a href="https://groups.io/g/klog">KLogのメーリングリスト</a>にご参加ください! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! KLogがまだあなたの言語に対応しておらず、私たちを助けたいとお考えの場合は、<a href="https://groups.io/g/klog">KLog</a>メーリングリストを通じて私たちにご連絡ください! Translators 翻訳者 Privacy advisory プライバシーについての勧告 Callsign コールサイン KLog version KLogのバージョン Operating system OSの情報 Be aware that you can enable/disable this feature from the Misc tab in the Setup page. この機能は、セットアップページの「Misc」タブで有効/無効を切り替えることができますので、ご注意ください。 KLog KLog Privacy プライバシー AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. ログのアップロードに使用する無線局のコールサインを選択します。 Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. QSOをエクスポートする開始日を選択します。デフォルトの日付は、この局のコールサインで最初のQSOを行った日です。 Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. QSOをエクスポートする終了日を選択します。デフォルトの日付は、この局のコールサインで最後にQSOを行った日です。 Station callsign 無線局のコールサイン Start date 開始日 End date 終了日 Ok OK Cancel キャンセル DX DX Date/Time 日付/時刻 Band バンド Mode モード Not defined 定義されていません All すべてのログ QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - LoTW にアップロードされる QSO。 This table shows the QSOs that will be sent to LoTW. このテーブルは、LoTW に送信される QSOを示します。 KLog - QSOs to be uploaded to ClubLog. KLog - ClubLogにアップロードされるQSO。 This table shows the QSOs that will be sent to ClubLog. この表は、ClubLogに送信されるQSOを示しています。 KLog - QSOs to be uploaded to eQSL.cc. KLog - eQSL.ccにアップロードされるQSO。 This table shows the QSOs that will be sent to eQSL.cc. この表は、eQSL.ccに送信されるQSOを示しています。 KLog - QSOs to be uploaded to QRZ.com. KLog - QRZ.comにアップロードされるQSO。 This table shows the QSOs that will be sent to QRZ.com. この表は、QRZ.comに送信されるQSOを示しています。 This table shows the QSOs that will be exported to ADIF. この表は、ADIFにエクスポートされるQSOを示しています。 AwardsWidget Recalculate 再計算 Click to recalculate the award status. クリックするとアワードステータスが再計算されます。 Select the year you want to check. 確認したい年を選択します。 QSOs QSO総数 DXCC DXCC CQ CQ Award アワード Confirmed コンファーム済 Worked WAZ Score Annual Number of confirmed DXCC entities. 確認されたDXCCエンティティの数。 Number of worked DXCC entities. 活動したDXCCエンティティの数。 Number of confirmed WAZ zones. 確認されたWAZゾーンの数。 Number of worked WAZ zones. 活動したWAZゾーンの数。 Number of confirmed QSOs. 確認されたQSOの数。 Number of worked QSOs. 活動したQSOの数。 Number of QSOs worked in the selected year. 選択した年に活動したQSO数。 Number of DXCCs worked in the selected year. 選択した年に活動したDXCCの数。 Number of CQ Zones worked in the selected year. 選択された年に活動したCQゾーンの数。 Score for the DXMarathon in the selected year. 選択した年のDXMarathonのスコア。 DX-Marathon DX-マラソン CTYPage Country data download エンティティーデータのダウンロード KLog needs country data... KLogではエンティティーデータを利用します... &Download ダウンロード(&D) &Ignore 無視(&I) Country data needed エンティティデータが必要です KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLogでは、https://www.country-files.com/ の cty.csv ファイルを使って DXCC 情報を取得しています。 You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. KLogでQSOした国やロケータなどを表示させたい場合は、cty.csvファイルをダウンロードする必要があります。 Click on Download to download now. ダウンロードを開始するために、「ダウンロード」ボタンをクリックしてください. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? 接続先が見つかりません. ネットワーク接続を確認して、再度トライしてみてください. もう一度行いますか? DXCCStatusWidget Update 更新 It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? あなたのDXCCステータスを更新したいですか? Entity エンティティ Prefix プリフィクス Pref: CQ: ITU: Beam: Entity not worked in this band. このバンドでは活動していないエンティティー。 DXClusterWidget Click on Connect to connect to the DX-Cluster server 接続ボタンをクリックするとDXクラスターに接続します Connect 接続 Clear クリア Click on connect to connect to the DX-Cluster 接続ボタンをクリックするとDXクラスターに接続します Trying to connect to the server サーバーに接続しています KLog DXCluster KLog DXクラスター The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. 接続できませんでした。DXクラスターが稼働していることを確かめてください。また、ホスト名、ポート番号の設定が正しいことを確認してください。 The following error occurred: %1. 次のエラーが発生しました: %1。 Connected to server サーバーに接続しました KLog message KLog メッセージ Enter your callsign to connect to the cluster: DXクラスターに接続するためのコールサインを入力してください: Enter your password to connect to the cluster: (Just hit enter for no password) DXクラスターに接続するためのパスワードを入力してください。 (カラのパスワードについてはエンターだけ押してください。) Not logged on, you may need to enter your callsign again. ログオンしていません. もう一度、コールサインを入力してみてください. Enter here the commands to be sent to the DX-Cluster server. ここでは、DX-Clusterサーバーに送信するコマンドを入力します。 It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! 書き込み用のDX-Spotを保存するファイルを開くことができませんでした。DXクラスターの活動が保存されない! Disconnect 切断 The host was not found. Please check: ホストが見つかりませんでした。ご確認ください: - your network connection; - the host name and port settings. - あなたのネットワーク接続 - ホスト名とポートの設定。 Connection closed by the server サーバーによって接続が切られました Click on Connect to connect to the DX-Cluster server. 接続をクリックして、DX-Clusterサーバーに接続します。 Send 送信 DataProxy_SQLite Software version in DB is null DBのソフトウェアバージョンがNULL Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite サテライト通信 Bureau Common term in hamradio, do not translate if not sure ビューロー Manager Common term in hamradio, do not translate if not sure マネージャー All QSOs have been updated with a DXCC and the Continent. 全てのQSOにはDXCCと大陸が更新されています。 Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes はい No いいえ Requested リクエスト済み Ignore/Invalid 無視/無効 Validated 検証済み Queued 待機中 Uploaded アップロード Do not upload アップロードしない Modified 更新日 Direct ダイレクト Electronic KLog DXCC KLog DXCC KLog - Invalid call detected KLog - 無効なcallが検出されました An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? 空のコールサインが検出されました。このQSOをそのままエクスポートするか([はい]をクリック)、エクスポートしたADIFレコードからフィールドを削除しますか? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? 無効なコールサインが検出されました %1。このコールサインをエクスポートするか([はい]をクリック)、エクスポートしたログから通話を削除しますか? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. 間違ったコールをエクスポートすると、このログファイルをインポートする可能性のある アプリケーションで問題が発生する可能性があります。しかし、良いコールサインがKLogによって有効ではないと誤って認識されている可能性もあります。 DownLoadCTY Download of cty.csv failed with the following error code: cty.csv のダウンロード、失敗. エラーコード: Download of cty.csv done. cty.csv のダウンロード、完了. There is already a cty.csv file in the folder but it will be replaced with the new one. フォルダーにすでに cty.csv ファイルがありますが、最新のもので置き換えます. Could not open %1 for writing 書き込みに%1を開けませんでした FileAwardManager Open Award file アワードファイルを開く Award files (*.awa) アワードファイル(*.awa) Award file not opened アワードファイルが開かれない KLog was not able to read the award file KLogはアワードファイルを読み込めませんでした It was not possible to open the file %1 for reading. 読み込みに%1を開くことができませんでした。 AWA wrong format AWAの間違ったフォーマット The AWA file does not have the right format AWAファイルのフォーマットが正しくない AWA file does not have an <EOH> field AWAファイルに<EOH>フィールド</EOH>がない KLog - %1 KLog - %1 FileManager Writing ADIF file... ADIFファイルを書き込んでいます... Abort writing 書込みの中止 Writing ADIF file... QSO: ADIFファイルを書き込んでいます... QSO: You have canceled the file export. The file will be removed and no data will be exported. ファイルのエクスポートが中断されました. 出力先のファイルは削除され、データはエクスポートされません. Do you still want to cancel? 本当に中止しますか? QSO: Reading ADIF file... ADIFファイルを読みこんでいます... Abort reading 読込みの中止 Reading LoTW file... LoTWのファイルを読む... KLog - Log selection KLog - ログの選択 You have canceled the file import. The file will be removed and no data will be imported. ファイルのインポートをキャンセルしました。ファイルは削除され、データはインポートされません。 Exporting ADIF file... QSO: %1 / %2 ADIF ファイルをエクスポートする... QSO: %1 / %2 Please edit the ADIF file and make sure that it include at least: and This QSO had: Do you want to continue with the current file? 現在のファイルを継続して使用しますか? Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. このログのいくつかのQSO (例: %1) では、RST-TX情報が不足しているようです。 If you select NO, maybe the QSO will not be imported. NOを選択した場合、もしかしたらQSOがインポートされないかもしれません。 - The band missing and the following call: KLog - Error KLog - エラー The selected log does not exist, please check it again. 選択したログが存在しないので、もう一度確認してください。 The file %1 can't be opened. ファイル%1 cを開くことができません。 KLog - Don't ask again KLog - Don't ask again Do you want to reuse your answer? 答えを再利用したいと思いますか? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLogは、同様の事態が発生した場合、再度質問することなく、前回の回答を自動的に使用します。 <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li><i>日付/時間: </i>%1</li><li>コールサイン: %2</li><li>バンド: %3</li><li>モード: %4</li></ul> KLog - QSO not found KLog - QSOが見つかりません Do you want to add this QSO to the log?: このQSOをログに追加しますか? We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? あなたのローカルログにはない、LoTWから来たQSOを発見しました。 KLogにこのQSOをログに追加させますか? KLog - Invalid call detected KLog - 無効なcallが検出されました An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? 空のコールサインが検出されました。このQSOをそのままエクスポートするか(「はい」をクリック)、エクスポートしたログファイルからこのフィールドを削除しますか? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? 無効なコールサインが検出されました %1。このコールサインをエクスポートするか([はい]をクリック)、エクスポートされたログファイルから通話を削除しますか? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. 間違ったコールをエクスポートすると、このログファイルをインポートする可能性のある アプリケーションで問題が発生する可能性があります。しかし、良いコールサインがKLogによって有効ではないと誤って認識されている可能性もあります。ただし、エクスポート処理が終了すると、ADIFファイルを編集することができます。 KLog - User cancelled KLog - ユーザーがキャンセルした The selected callsign (%1) is not valid, please check it again to export the log. 選択されたコールサイン(%1)は有効ではありません。ログをエクスポートするためにもう一度確認してください。 There are no QSOs pending to be exported with that station callsign. その局のコールサインでエクスポートするために保留されているQSOはありません。 Export エクスポート Export progress 輸出の進捗状況 KLog - File not opened KLog - ファイルが開かない It was not possible to open the file %1 for reading. 読み込みに%1を開くことができませんでした。 KLog was not able to read the LoTW file KLogがLoTWファイルを読めなかった Processing LoTW ADIF file... LoTW ADIFファイルの処理... Abort processing 処理を中止する LoTW reading LoTWの読み方 KLog - Add new QSOs? KLog - 新しいQSOを追加しますか? Do you want to add non existing QSOs to your local log? 既存のQSO以外のQSOをローカルログに追加したいですか? There are some QSOs in the LoTW log that are not in your local log. LoTWのログには、あなたのローカルログにはないQSOがあります。 Processing LoTW ADIF file...... QSO: %1 / %2 LoTW ADIFファイルの処理...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. LoTWの処理をキャンセルしました。処理が停止されるため、ログが完全に更新されない場合があります。 Importing LoTW ADIF file... LoTW ADIFファイルのインポート... There is more than one log in this logfile. このログファイルには、複数のログが存在します。 All logs will be imported into the current log. すべてのログが現在のログに取り込まれます。 Do you want to continue? 続行しますか? Do you want to add dupe QSOs to your local log? 自分のローカルログにデュープQSOを追加したいですか? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. このログファイルの中には、コール、バンド、モードが同じで、日付も非常に近いため、ダブっている可能性があるQSOもあります。 Importing ADIF file... ADIFファイルのインポート... KLog - Duplicated QSOs KLog - 重複したQSO Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. 「はい」をクリックすると、同様の問題を抱えるすべてのQSOにデフォルトの%1 forモード%2が追加されます。 KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. このログのいくつかのQSO (例: %1) では、RST-RX情報が不足しているようです。 KLog - Apply to all QSOs in this log? KLog - このログのすべてのQSOに適用しますか? KLog - No Station callsign entered. KLog - ステーションコールサインが入力されていません。 KLog - QSO without Station Callsign KLog - 局のコールサインなしのQSO It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) インポートしているADIFファイルの中に、重複するQSOがあるようです。このまま続けますか?(重複したQSOはインポートされません)。 This QSO is not including the minimum data to consider a QSO as valid! このQSOには、QSOを有効とみなすための最低限のデータが含まれていません! - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: KLog: Not all required data found! KLog; データの不足が見つかりました! KLog: No RST TX found! KLog: RST TXが見つかりません! KLog: No RST RX found! KLog: RST RXが見つかりません! HamLibNetworkConfigWidget Enter the hostname or address of the radio. 無線機のホスト名またはアドレスを入力してください。 Set de network port of the radio. 無線機のネットワークポートを設定します。 Host/Address ホスト/アドレス Port Enter the port of the radio. 無線機のポートを入力します。 HamLibSerialConfigWidget Bauds Select the serial port speed. シリアルポートの速度を選択します。 Port Select the serial port. Only the serial ports that are detected are shown. シリアルポートを選択します。検出されたシリアルポートのみが表示されます。 Scan スキャン Click to identify the serial ports available in your computer. クリックすると、お使いのコンピューターで利用可能なシリアルポートが表示されます。 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None なし Hardware Software XON/XOFF Flow control Select the serial flow control シリアルフローコントロールの選択 No parity Even Odd Space Mark Parity Select the serial parity. Default デフォルト 1 bit 2 bits Stop bits Select the serial stop bits. シリアルストップビットの選択 InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent 大陸名 Prefix プリフィクス CQ CQ ITU Short Path ショートパス Long Path ロングパス Deg Miles マイル Km IntroPage Welcome to KLog! KLogにようこそ! Welcome to KLog! - brought to you under the terms of the GPL! ようこそ、KLogに! - GPL条項にもとづいてお届けします! Welcome to KLog KLog にようこそ KLogにようこそ This looks like it's the first time you've run KLog on this computer. このコンピューターでKLogを実行するのは初めてのようです. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLogは、GNU/Linux、macOS、Windowsで動作するフリーのハムラジオログプログラムです。 It is designed to provide general purpose DX, and contest logging. 一般的なDX、コンテストのロギングができるように設計されています。 It supports QSL management, import and export of ADIF QSL管理、ADIFのインポート・エクスポートをサポートしています and Cabrillo file formats and many other features... またQSLカードの管理など、多くの機能をサポートしています... Before you can start using KLog, you will be asked to: KLogを使い始める前に、以下の質問にお答えください: Acknowledge to the terms of the license. ライセンス条項への同意. Download the DX entities information. DXエンティティの情報をダウンロード Enter your callsign, CQ zone, etc. and main configuration. コールサイン、CQゾーン、その他、多くの設定項目。 Enjoy KLog and contact the development team if you have any suggestions! KLogをお楽しみください. ご提案などがあれば、開発チームにご連絡ください! LicPage KLog License information KLogライセンス情報 Welcome to KLog!- brought to you under the terms of the GPL! ようこそ、KLogに! - GPL条項にもとづいてお届けします! Acknowledge 同意します Be aware that KLog is free software. KLogはフリーソフトウェアです. LoTWUtilities KLog - LoTW password needed KLog - LoTWのパスワードが必要 Please enter your LoTW password: LoTWのパスワードを入力してください Are you sure that you want to use that station callsign (%1)? 本当にその局のコールサイン(%1)を使いたいのですか? There is a file already existing with the name that will be used. 使用される名前のファイルがすでに存在しています。 The file %1 already exist. Do you want to overwrite? ファイル %1 はすでに存在しています。上書きしますか? KLog was not able to save the file %1. Error returned: %2 KLog はファイル %1 を保存できませんでした。 エラーが返されました: %2 Downloading data to file: %1. データをファイルにダウンロードしています。%1. KLog - LoTW download KLog - LoTW ダウンロード This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. これは、このログでコールサイン%1のQSOを行った最初の日付です もし、LoTWでは以前のQSOがあるかもしれないと思うなら、Noと答えてください。 Do you want to use this date (%1) as start date? この日付 (%1) を開始日として使用しますか? The remote server redirected our connection to %1 リモート・サーバが接続を %1 にリダイレクトしました Do you want to follow the redirection? リダイレクションに従いますか? It was not possible for find the file %1 that has been just downloaded. ダウンロードされたばかりのファイル %1 を見つけることができませんでした。 It seems that LoTW has no QSO with the Station Callsign you are using (%1). あなたが使用している局のコールサイン(%1)でのQSOが、LoTWにはないようです。 Try again and send the downloaded file (%1) to the KLog developer for analysis. もう一度試して、ダウンロードしたファイル(%1)をKLog開発者に送って解析してください。 KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog は %1 QSO のダウンロードに成功しました。ダウンロードしたデータでログを更新しますか? KLog - LoTW File already exists KLog - LoTWファイルは既に存在します Double click on the date that you want to use as the start date for downloading QSOs. QSOダウンロードの開始日として使用したい日付をダブルクリックします。 KLog - LoTW Station callsign KLog - LoTWステーションのコールサイン There is not a single QSO in the log with that station callsign. その局のコールサインでのQSOは一度もログに残っていない。 KLog - LoTW Can't write the file KLog - LoTW ファイルの書き込みができない The file %1 already exists. ファイル %1 は既に存在しています。 KLog - LoTW Start date selection KLog - LoTW 開始日選択 KLog - LoTW Download error KLog - LoTW ダウンロードエラー There was an error (%1) while downloading the file from LoTW. LoTWからファイルをダウンロード中にエラー(%1)が発生しました。 The downloading error details are: %1 ダウンロードエラーの詳細は以下の通りです。%1 KLog - LoTW Redirection found KLog - LoTWリダイレクション発見 KLog - LoTW File not found KLog - LoTW ファイルが見つかりません KLog can't find the downloaded file. KLogは、ダウンロードしたファイルを見つけることができません。 KLog - LoTW user/password error KLog - LoTWのユーザー/パスワードエラー LoTW server did not recognized your user/password LoTWサーバーがあなたのユーザー/パスワードを認識しませんでした Check your user and password and ensure your are using the right one before trying again. ユーザー名とパスワードを確認し、正しいものを使用していることを確認した上で、再度お試しください。 KLog - LoTW No QSOs KLog - LoTW No QSOs LoTW sent no QSOs LoTWはQSOを送らなかった KLog - LoTW Unknown error KLog - LoTW Unknownエラー KLog can't recognize the file that has been downloaded from LoTW. KLogは、LoTWからダウンロードしたファイルを認識できません。 Now KLog will process the downloaded QSO and update your local log. これで、KLogはダウンロードしたQSOを処理し、ローカルログを更新します。 LogWindow QSL Send QSLカードの送付 QSL Rcvd QSL受領状況 &Delete 削除(&D) Delete a QSO QSOのレコードを削除します &Edit QSO QSOの編集(&E) Edit this QSO QSOのレコードを編集します Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由で送ります D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトで送ります Via bureau ビューロー経由 QSL &received via bureau QSLカードをビューロー経由で受け取りました。(&r) Direct ダイレクト QSL received via direc&t QSLカードをダイレクトで受け取りました。(&t) Check in QRZ.com QRZ.comでチェック Check this callsign in QRZ.com 新しいバージョンを自動でチェックする (&C) Check in DXHeat.com DXHeat.comにチェックイン Check this callsign in DXHeat.com DXHeat.comでこのコールサインを確認する Delete selected QSOs 選択したQSOの削除 Delete the selected QSOs 選択したQSOの削除 Export to ADIF ADIFへのエクスポート Export the selected QSOs to an ADIF file. 選択したQSOをADIFファイルに書き出す。 Upload to LoTW LoTWへのアップロード Upload the selected QSOs to LoTW 選んだQSOをLoTWにアップロード Upload to ClubLog クラブログへのアップロード Upload the selected QSOs to ClubLog 選んだQSOをClubLogにアップロード Upload to eQSL.cc eQSL.ccへのアップロード Upload the selected QSOs to eQSL.cc 選択したQSOをeQSL.ccにアップロードする Send these QSLs via bureau これらのQSLをビューロー経由で送る Send these QSLs via direct これらのQSLをダイレクトに送る QSLs received via bureau ビューロー経由で受信したQSL QSLs received via direc&t QSLはdirec&tで受信。 Select none 選択解除 Remove all selections すべての選択項目を削除 Select all すべて選択 Select all the QSOs すべてのQSOを選択 MainQSOEntryWidget &Add 追加(&A) &Clear クリア(&C) Callsign of the QSO. QSOのコールサイン Band of the QSO. QSOのバンド Mode of the QSO. QSOのモード。 Date of the QSO. QSOの日付。 Time of the QSO. QSOの時間。 Add the QSO to the log. QSOをログに追加する。 Clears the QSO entry. QSOエントリーをクリアします。 KLog will show real time if enabled. KLogが有効になっていれば、リアルタイムで表示されます。 Real time リアルタイム Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign コールサイン &Modify モディファイ DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog KLogの開始 DX Entity DX エンティティ &Log Window &Logウィンドウ KLog KLog It seems that you have never done a backup or exported your log to ADIF. ログのバックアップやADIFへのエクスポートをしたことがないようですね。 It was not possible to open the debug file for writing. No debug log will be saved! 書き込み用のデバッグファイルを開くことができませんでした。デバッグログは保存されません Status bar ... ステータスバー ... KLog - CTY.dat update KLog - CTY.datの更新 It seems that the latest backup you did is older than one month. あなたが行った最新のバックアップは、1ヶ月よりも古いようです。 Log backup recommended! ログのバックアップを推奨します。 It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. 問題が発生したときにデータが失われないように、フルログを定期的にバックアップすることをお勧めします。 ログをADIFファイルにエクスポートしたら、そのファイルをUSBドライブ、クラウドドライブ、別のコンピューターなど、安全な場所にコピーしてください...。 KLogは毎月バックアップを取るように促してくれます。 KLog - Backup KLog - バックアップ KLog - New version detected! KLog - 新バージョンを検出しました Ready 使用可能 An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: QSOをログに追加しようとしたときに予期せぬエラーが発生しました。それでも問題が解決しない場合は、開発者に連絡して解析を依頼してください。 KLog - Not valid call KLog - 無効な通話 Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. 有効でない通話をログに追加すると、アワードの申請やADIFファイルを他のシステムやアプリケーションにエクスポートする際に問題が発生することがあります。 You have selected an entity: エンティティを選択しました。 that is different from the KLog proposed entity: KLog提案のエンティティとは異なるものです。 Click on the prefix of the correct entity or Cancel to edit the QSO again. 正しいエンティティのプレフィックスをクリックするか、「キャンセル」をクリックしてQSOを再度編集します。 No DXCC DXCCなし None なし Click on the prefix of the right entity or Cancel to correct. 正しいエンティティの接頭辞をクリックするか、修正する場合はキャンセルしてください。 KLog - ClubLog error KLog - ClubLogのエラー KLog - eQSL error KLog - eQSLエラー KLog - %1 KLog - %1 Settings ... 設定 ... Download from LoTW ... LoTWからのダウンロード ... Download the full log from LoTW ... LoTWからフルログをダウンロード ... ClubLog tools ... クラブログツール ... Upload the queued QSOs to ClubLog ... キューイングされたQSOをClubLogにアップロードする ... eQSL tools ... eQSLツール ... Upload the queued QSOs to eQSL.cc ... キューイングされたQSOをeQSL.ccにアップロード ... QRZ.com tools ... QRZ.comのツール ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. 本当にこのログの全てのQSOをアップロードするようにマークしますか?このQSOを初めてLoTWにアップロードする場合のみ、行う必要があります。 Your log has been updated with the LoTW downloaded QSOs. あなたのログには、LoTWダウンロードしたQSOが更新されています。 KLog has updated %1 QSOs from LoTW. KLogは、LoTWからのQSOを%1更新しました。 Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. 本当にすべての保留中のQSOをアップロードするようにマークしますか?初めてLoTWにアップロードする場合のみ行ってください。 There was a problem to mark all pending QSOs as queued for LoTW! 保留中のすべてのQSOをLoTWのキューに入れることに問題がありました。 All queued QSOs of this log has been marked as sent to LoTW! このログのすべてのキューイングされたQSOは、LoTWに送信されたものとしてマークされています。 There was a problem to mark all queued QSOs as sent to LoTW! キューに入っているすべてのQSOをLoTWへの送信としてマークする問題がありました。 No QSOs have been exported to ADIF. ADIFにエクスポートされたQSOはありません。 KLog has exported %1 QSOs to the ADIF file: %2 KLog は、%1 QSO を ADIF ファイルにエクスポートしました。%2 You need to select one station callsign to be able to send your log to LoTW. LoTWにログを送信するためには、1局のコールサインを選択する必要があります。 There was an error while updating to Yes the LoTW QSL sent information. LoTWのQSL送信情報をYesに更新する際にエラーが発生しました。 KLog - Select the Station Callsign. KLog - ステーションのコールサインを選択します。 The log is ready to be uploaded to QRZ.com. これでログをQRZ.comにアップロードする準備が整いました。 All the QSOs in this log has been marked as Modified in the QRZ.com status field このログのすべてのQSOは、QRZ.comのステータス欄に「Modified」と表示されています。 KLog could not mark the full log to be sent to QRZ.com KLogはQRZ.comに送信するフルログをマークできませんでした。 RSTrx 受信RST RSTtx 送信RST Do you really want to exit KLog? 本当にKLogを終了したいのですか? KLog - File not open KLog - ファイルが開かない KLog - Unexpected error KLog - 予期せぬエラー KLog - Select correct entity KLog - 正しいエンティティの選択 KLog - Exit KLog - Exit &File &ファイル Import an ADIF file into the current log. ADIFファイルをカレントログに取り込む。 Export the current log to an ADIF logfile. 現在のログをADIFログファイルにエクスポートします。 Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. すべてのQSOを1つのADIFファイルにエクスポートし、すべてのログのQSOをマージします。 Print your log. ログを印刷する。 KLog folder KLogフォルダ Opens the data folder of KLog. KLogのデータフォルダを開きます。 E&xit 終了(&x) &Tools ツール Fill in QSO data QSOデータの記入 Go through the log reusing previous QSOs to fill missing information in other QSOs. 過去のQSOを再利用して、他のQSOで不足している情報を埋めるために、ログを確認する。 Shows QSOs for which you should send your QSL and request the DX QSL. あなたがQSLを送るべきQSOを表示し、DX QSLを要求します。 Find My-QSLs pending to send 送信待ちのMy-QSLを探す Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! QSL送信のリクエストが保留されているQSOを表示します。このキューは空にしておくべきです! Mark all queued QSOs in this log as sent to LoTW. このログのすべてのキューイングされたQSOを、LoTWへの送信としてマークします。 Mark all queued QSOs as sent to LoTW. キューに入っているすべてのQSOを、LoTWへの送信としてマークします。 Sends the log to LoTW calling TQSL. TQSLを呼んでいるLoTWにログを送信します。 For updated DX-Entity data, update cty.csv. DX-Entityのデータを更新するには、cty.csvを更新してください。 Stats ステータス Show the statistics of your radio activity. あなたのラジオ活動の統計情報を表示します。 &Help ヘルプ Upload the queued QSOs to LoTW キューイングされたQSOをLoTWにアップロードする KLog needs to update the Entities database. KLogはEntitiesデータベースを更新する必要があります。 This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. この操作を行うと、選択したQSOとその関連データがすべて消去され、二度と復元できなくなります。 The QRZ.com upload process has finished with an error and the log was possibly not uploaded. QRZ.comのアップロード処理がエラーで終了してしまい、ログがアップロードされなかった可能性があります。 Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? QRZ.comにアップロードしたすべてのQSOを「アップロード完了」にしますか? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. QRZ.comのQSOアップロード情報をYesに更新する際にエラーが発生しました。 The QRZ.com upload process has finished successfully QRZ.comのアップロード処理が正常に終了しました。 Call not found in QRZ.com コールはQRZ.comでは見つかりません。 KLog - QRZ.com error KLog - QRZ.comのエラー KLog has received an error from QRZ.com. KLogはQRZ.comからエラーが出ました。 Queue all the QSOs to be uploaded アップロードされるすべてのQSOをキューに入れる Queue all the QSO to be uploaded アップロードされるすべてのQSOをキューに入れる KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSLがインストールされていないか、KLogがTQSLを見つけられません。設定を確認してください。 Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. エラー1:ユーザーによって処理がキャンセルされたか、TQSLが設定されていませんでした。QSOはアップロードされませんでした。 Error #2: Upload was rejected by LoTW, please check your data. エラー2:アップロードはLoTWによって拒否されました。データをチェックしてください。 Error #3: The TQSL server returned an unexpected response. エラー3: TQSLサーバが予期せぬレスポンスを返してきました。 Error #4: There was a TQSL error. エラー4:TQSLのエラーがありました。 Error #5: There was a TQSLLib error. エラー5:TQSLLibのエラーが発生しました。 Error #6: It was not possible to open the input file. エラー6:入力ファイルを開くことができませんでした。 Error #7: It was not possible to open the ouput file. エラー7:出力ファイルを開くことができませんでした。 Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. エラー8:いくつかのQSOが重複していたり、日付の範囲外であったため、QSOが処理されませんでした。 Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. エラー9:いくつかのQSOが処理され、いくつかのQSOが重複や日付範囲外のために無視されました。 Error #10: Command syntax error. KLog sent a bad syntax command. エラー10:コマンド構文エラー。KLogは不正な構文のコマンドを送信しました。 Error #11: LoTW Connection error (no network or LoTW is unreachable). エラー11:LoTW 接続エラー(ネットワークがない、または LoTW が到達できない)。 Error #00: Unexpected error. Please contact the development team. エラー#00: 予期せぬエラーが発生しました。開発チームにお問い合わせください。 The log that you have selected contains more than just one station callsign. 選択したログには、1つ以上の局のコールサインが含まれています。 Please select the station callsign you want to mark as sent to LoTW: LoTWへの送信をマークしたい局のコールサインを選択してください。 Station Callsign: 無線局のコールサイン(&S) Define Station Callsign 無線局コールサインの定義 Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: このログに使用する無線局のコールサインを入力するか、無線局のコールサインが定義されていないQSOの場合は空欄にしてください。 You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. コールサインなしを選択しています。KLogは、局のコールサインが定義されていないQSOと、あなたがここで入力したコールサインを持つQSOを完了します。 KLog - No station selected KLog - 選択されていない局 No station callsign has been selected and therefore no log will be marked 無線局のコールサインが選択されていないため、ログが表示されません。 Congratulations! おめでとうございます! You already have the latest version. 最新のバージョンを入手しました. You can find the KLog data folder here: KLogのデータフォルダはこちらにあります。 start スタート stop ストップ If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. データベースにQSOが含まれているのは確かなのに、KLogがそれを見つけられない場合は、開発者(「KLogについて」参照)に問い合わせてください。 TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSLはノーエラーで終了。 LoTWにアップロードされた全てのQSOをSentとしてマークしますか? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 本当にすべての QSO をアップロードするようにマークしたいですか?初めて%1にQSOをアップロードする場合のみ、行う必要があります。 ClubLog KLog - QRZ.COM QRZ.COM KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. 複製されたQSOは、同じコール、バンド、モード、日時の既存のQSOと一致しなければなりませんが、設定で定義できる期間を考慮してください。 QSO logged from WSJT-X: It seems that you are running this version of KLog for the first time. このバージョンのKLogを初めてお使いになるようですね。 The setup will be open to allow you to do any new setup you may need. セットアップは、必要な新しいセットアップができるようにオープンにします。 You have requested to delete the QSO with: %1 Are you sure? 本当によろしいですか? Check always the current callsign in QRZ.com QRZ.comで現在のコールサインを常に確認する。 You can update the entities database in Tools->Update cty.csv エンティティデータベースの更新は、「ツール」→「アップデート cty.csv」 Do you want to do it now? 今すぐにでもやりたいと思いますか? The backup was done successfully バックアップは正常に行われました。 KLog will remind you to backup your data again in aprox one month. KLogは約1ヶ月後にデータのバックアップを促します。 The backup was not properly done. バックアップが適切に行われていなかった。 It is recommended to backup your data periodically to prevent lose or corruption of your log. ログの消失や破損を防ぐため、定期的にデータをバックアップすることをお勧めします。 The callsign %1 is not a valid call. Do you really want to add this callsign to the log? コールサイン %1 は有効なコールではありません。本当にこのコールサインをログに追加しますか? KLog - Not valid callsign KLog - 無効なコールサイン The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? コールサイン %1 は有効なコールサインではありません。本当にこのコールサインをログに追加しますか? You have requested to delete several QSOs いくつかのQSOの削除を要求されました The ClubLog upload process has finished with an error and the log was possibly not uploaded. クラブログのアップロード処理がエラーで終了し、ログがアップロードされなかった可能性があります。 Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 認証情報、インターネット接続、Clublogアカウントを確認してください。受信したエラーコードは次のとおりです: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? ClubLogにアップロードしたすべてのQSOを「アップロード済み」にしますか? KLog - ClubLog KLog - ClubLog KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 There was an error while updating to Yes the ClubLog QSO upload information. ClubLog QSOアップロード情報の更新時にエラーが発生しました。 The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? ClubLogのアップロード処理が終了し、KLogフォルダにファイル(%1)が作成されました。 KLogにそのファイルを削除させますか? The file has not been removed. ファイルは削除されていません。 It seems that there was something that prevented KLog from removing the file You can remove it manually. KLogがファイルを削除するのを妨げる何かがあったようですが 手動で削除することができます。 The eQSL upload process has finished with an error and the log was possibly not uploaded. eQSLのアップロード処理がエラーで終了し、ログがアップロードされなかった可能性があります。 Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 認証情報、インターネット接続、eQSLアカウントを確認してください。受信したエラーコードは次のとおりです: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? eQSLにアップロードしたすべてのQSOを「アップロード済み」にしますか? There was an error while updating to Yes the eQSL QSO upload information. はいeQSL QSOアップロード情報の更新時にエラーが発生しました。 The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? eQSLのアップロード処理が終了し、KLogがKLogフォルダにファイル(%1)を作成しました。 KLogにそのファイルを削除させますか? KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. You need to activate the %1 service in the eLog preferences. eLogの環境設定で%1 sサービスを有効にする必要があります。 The logfile has been modified. ログファイルが変更されました。 Do you want to save your changes? 変更内容を保存しますか? KLog - ADIF export KLog - ADIFエクスポート It is important to export to ADIF and save a copy as a backup. ADIFにエクスポートして、バックアップとしてコピーを保存することが重要です。 Saving the log was done successfully. ログの保存は正常に行われました。 The ADIF export was not properly done. ADIFのエクスポートが適切に行われなかった。 &Import from ADIF ... ADIFからのインポート ... Export to ADIF ... ADIFへのエクスポート ... Export all logs to ADIF ... すべてのログをADIFにエクスポート ... &Print Log ... &Print Log ... QSL tools ... QSLツール ... Find QSO to QSL QSOからQSLを探す Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. DX-QSLのうち、リクエストやQSLを送っても返事がないものを表示します。 Find requested pending to receive 依頼された保留地を探す Shows the DX-QSLs that have been requested. リクエストのあったDX-QSLを表示します。 LoTW tools ... LoTWツール ... Queue all QSLs from this log to be sent このログからのすべてのQSLをキューに入れて送信する Mark all non-sent QSOs in this log as queued to be uploaded. このログのすべての未送信のQSOを、アップロード待ちとしてマークします。 Queue all QSLs to be sent すべてのQSLを送信するためのキュー Put all the non-sent QSOs in the queue to be uploaded. 送信していないQSOをすべてアップロードするためのキューに入れる。 Mark all queued QSOs from this log as sent このログのキューイングされたQSOをすべて送信済みにする Mark all queued QSOs as sent キューに入っているすべてのQSOを送信済みにする Check the current callsign in QRZ.com QRZ.comで現在のコールサインを確認する Upload the queued QSOs to QRZ.com ... キューイングされたQSOをQRZ.comにアップロードする ... Update cty.csv cty.csvの更新 Update Satellite Data 衛星データの更新 Online manual (F1) ... オンラインマニュアル(F1) ... &Tips ... &Tips ... &Debug ... &Debug ... &About ... KLogについて About Qt ... Qtについて ... Check updates ... 更新情報を確認する ... All pending QSOs of this log has been marked as queued for LoTW! このログのすべての保留中のQSOは、LoTWのキューに入っています。 Now you can upload them to LoTW. これで、LoTWにアップロードすることができます。 There was a problem to mark all pending QSOs of this log as queued for LoTW! このログのすべての保留中のQSOをLoTWのキューとしてマークする問題が発生しました。 Your log has not been updated. あなたのログは更新されていません。 No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. LoTWからのデータで更新されたQSOはありません。これは、ログファイルにエラーがあるためか、あるいは単にあなたのログがすでに更新されているためかもしれません。 All pending QSOs has been marked as queued for LoTW! すべての保留中のQSOは、LoTWのためのキューとしてマークされています。 All queued QSOs has been marked as sent to LoTW! キューイングされたすべてのQSOは、LoTWに送信されたものとしてマークされています。 There was a problem to mark all queued QSOs of this log as sent to LoTW! このログのすべてのキューイングされたQSOを、LoTWに送信されたものとしてマークする問題がありました About ... About ... KLog - Update checking result KLog - 更新チェック結果 UDP Server error The UDP server failed to %1. start or stop UDP サーバのエラー UDP サーバが %1 に失敗しました。 It seems that there are no QSOs in the database. データベースにQSOが登録されていないようです。 This function is disabled. Go to the Setup->LoTW tab to enable it. この機能は無効になっています。セットアップ->LoTWタブで有効にしてください。 Status of the DX entity. DXエンティティのステータス Name of the DX entity. DXエンティティの名称。 QSO QSO QSL QSL eQSL eQSL Comment コメント Others その他 My Data 自局の情報 Satellite サテライト通信 You need to select one station callsign to be able to send your log to ClubLog. ClubLogにログを送信するためには、1局のコールサインを選択する必要があります。 Do you want to add this QSOs to your ClubLog existing log? このQSOをClubLogの既存のログに追加したいですか? If you don't agree, this upload will overwrite your current ClubLog existing log. 同意しない場合、このアップロードは現在のClubLogの既存のログを上書きします。 KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. eQSL.ccにログを送信するためには、1局のコールサインを選択する必要があります。 Select the Station Callsign to use when quering LoTW: LoTWを利用する際に使用するステーションのコールサインを選択します。 Please check the LoTW setup LoTWの設定をご確認ください。 You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. LoTWのユーザーが定義されていないか、ステーションのコールサインが適切でない。 SetupのLoTWタブを開いて、LoTWの接続を設定してください。 The log is ready to be uploaded to ClubLog. ログをClubLogにアップロードする準備が整いました。 All the QSOs in this log has been marked as Modified in the ClubLog status field このログのすべてのQSOは、ClubLogのステータス欄に「Modified」と表示されています。 KLog could not mark the full log to be sent to ClubLog KLogがClubLogに送信するフルログをマークできなかった Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. 何らかの原因でKLogがQSOを修正済みとしてマークできませんでした。KLogの開発者に連絡する前に,KLogを再起動してもう一度試してみてください. The log is ready to be uploaded to eQSL.cc. このログはeQSL.ccにアップロードする準備ができています。 All the QSOs in this log has been marked as Modified in the eQSL.cc status field このログのすべてのQSOは、eQSL.ccのステータス欄に「Modified」と表示されています。 KLog could not mark the full log to be sent to eQSL KLogはeQSLに送信するフルログをマークできなかった You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. eLogの環境設定で、QRZ.comログブック用の適切なAPIキーを定義する必要があります。 Filling QSOs ... QSOを埋める... Date/Time 日付/時刻 Callsign コールサイン Printing the log ... ログの印刷 ... Station Callsign 無線局のコールサイン Operator Callsign オペレーターのコールサイン KLog - WSJTX Dupe QSO KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? このQSOは重複しているようです。保存しますか、破棄しますか? KLog - Non-supported mode KLog - 非対応モード A new mode not supported by KLog has been received from an external program or radio: KLogがサポートしていない新しいモードを外部の番組やラジオから受信した。 Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) このアラートを受信し続けますか?(これらのアラートを無効にすると、無効なモードが検出されなくなります) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. 定期的にデータをADIFにエクスポートすることで、データ損失の可能性を防ぐことができます。 DXCC DXCC Info Awards Search Log DX-Cluster DXクラスター Save ADIF File ADIFファイルの保存 The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? LoTWのアップロード処理が終了し、KLogのフォルダにファイル(%1)が作成されました。 KLogにそのファイルを削除させますか? The file has been removed. ファイルは削除されました。 KLog - LoTW KLog - LoTW Open File ファイルを開く - Needed for DXMarathon Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Band バンド Mode モード Print Log Abort printing 印刷を中止する Printing the log... QSO: The following QSO data has been received from WSJT-X to be logged: WSJT-Xから以下のQSOデータを受信しましたので、記録します。 Freq 周波数 Time On Time Off RST TX RST RX DX-Grid Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode 受信したモードが正しい場合は、KLog開発チームに連絡し、そのモードのサポートを要求してください。 KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. ファイル内に重複した衛星が検出されたため、インポートされません。 Please check the satellite information file and ensure it is properly populated. 衛星情報ファイルを確認し、正しく入力されていることを確認してください。 Now you will see a more detailed error that can be used for debugging... これで、デバッグに使えるより詳細なエラーが表示されるようになりました...。 An unexpected error ocurred!! 想定外のエラーが発生しました!! If the problem persists, please contact the developers それでも問題が解決しない場合は、開発者にお問い合わせください。 for analysis: Error in function Error text Failed query KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment コメント Add a comment for this QSO. Keep this data このデータを保持 Data entered in this tab will be copied into the next QSO. このタブで入力したデータは、次のQSOにコピーされます。 MainWindowInputEQSL Date of the ClubLog upload. ClubLogにアップロードした日付 Date of the QRZ.com upload. QRZ.comアップロードの日付。 Date of the eQSL sending. eQSLを送付した日付 Date of the eQSL reception. eQSLを受領した日付 Date of the LoTW sending. LoTWの送信日。 Date of the LoTW reception. LoTW受信の日付。 Status on QRZ.com. QRZ.comでのステータス Status of the LoTW sending. LoTWの送信状況。 Status of the LoTW reception. LoTW受信の状態。 QRZ.com QRZ.com LoTW Sent LoTW送信 LoTW Rec LoTW Rec Status on ClubLog. ClubLogの状況 Status of the eQSL sending. eQSLの送付状況 Status of the eQSL reception. eQSLの受領状況 ClubLog eQSL Sent eQSL送付 eQSL Rec eQSL受領 MainWindowInputOthers Primary Div Secondary Div IOTA Entity エンティティ Propagation mode 伝播モード Others その他 Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. 今回のQSOのエンティティを選択します。 Select the propagation mode for this QSO. 今回のQSOの伝搬モードを選択します。 Select the IOTA continent for this QSO. 今回のQSOで使用するIOTA大陸を選択します。 Select the IOTA reference number for this QSO. このQSOのIOTA参照番号を選択します。 Keeps the same propagation mode for next QSO. 次のQSOでも同じ伝搬モードを維持します。 Select the appropriate ADIF field for this QSO. このQSOに適したADIFフィールドを選択します。 Value for the selected ADIF field. 選択されたADIFフィールドの値。 Not Identified 不明 Not - Not Identified Not - 不明 SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL送付 QSL Rec QSL受領 QSL Via QSL Msg Status of the QSL sending. QSLカードの送付状況 Status of the QSL reception. QSLカードの受領状況 QSL sending information. QSLカードの送付先の情報 QSL reception information. QSLカードの受領元の情報 Date of the QSL sending. QSLカードを送付した日付 Date of the QSL reception. QSLカードを受領した日付 Message of the QSL. QSLカードのメッセージ QSL via information. QSLカード経由先などの情報 MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. TX周波数(MHz)。 RX Frequency in MHz. RX周波数(MHz)。 Power used by the contacted station. 接触したステーションが使用する電力 Name of the contacted operator. 繋がったオペレーターの名前 QTH of the contacted station. 連絡を受けた局のQTH。 Locator of the contacted station. 接触した局のロケーター Watts MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name 名前 QTH DX Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX DX QTH locator. DX QTHロケーター。 DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TXの周波数(MHz)です。 周波数はハムラジオのバンドではありません。 RX Frequency in MHz. Frequency is not in a hamradio band! RXの周波数(MHz)です。 周波数はハムラジオのバンドではありません。 MainWindowMyDataTab Watts Keep this data このデータを保持 My QTH locator. 自局QTHのグリッドロケーター Power 送信出力 Operator callsign オペレーターのコールサイン Station Callsign 無線局のコールサイン My Locator 自局のグリッドロケーター My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig 私のリグ My Antenna 私のアンテナ My SOTA_Ref 私のSOTA_Ref My VUCC_GRIDS 私のVUCC_GRIDS MainWindowSatTab Keep this data このデータを保持 Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). リストにない場合はサテライトの名前。を選択してください。"%1 "を選択すると、このボックスが有効になります。(AO-51のようなフォーマット)。 Satellite mode used. 使用したサテライトモード Select the satellite you are using. お使いの衛星を選択してください。 UpLink band. アップリンクバンド。 DownLink band. ダウンリンクバンド。 Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. DXステーションのロケーター。このボックスは、QSOタブのロケーターボックスと同期しています。 UpLink アップリンク DownLink ダウンリンク Satellite サテライト通信 Mode モード DX Locator Other その他 MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO 衛星QSOではない KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. 識別不可能な衛星の名称が入力されているのを発見しました. 別の名称でも呼ばれており、その名称がリストにあるならば、その名称を使ってください. もしくは開発チームにこの新しい衛星の名称を加えるよう連絡してください. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! リストにない場合は衛星名が保存されないため、情報が失われる可能性がありますのでご注意ください。 RX Frequency in MHz. Frequency is not in a hamradio band! RXの周波数(MHz)です。 周波数はハムラジオのバンドではありません。 RX Frequency in MHz. RX周波数(MHz)。 TX Frequency in MHz. Frequency is not in a hamradio band! TXの周波数(MHz)です。 周波数はハムラジオのバンドではありません。 TX Frequency in MHz. TX周波数(MHz)。 Other - Sat not in the list その他、リストにない衛星 Data entered in this tab will be copied into the next QSO. このタブで入力したデータは、次のQSOにコピーされます。 The satellite you have in your QSO is: QSO情報に記録された衛星の名称は以下のものです: OnlineMessageWidget The server returned the following error: %1 サーバから次のエラーが返されました: %1 Not identified 不明 QObject Database Error データベース エラー KLog DB needs to be upgraded. KLog DBを更新する必要があります. Do you want to upgrade it now? いま更新しますか? If DB is not upgraded KLog may not work properly. DBを更新しないとKLogは正しく動作しない可能性があります. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. ソフトウェアをアップグレードすると、問題が発生する可能性があります。アップグレードする前に、DBをバックアップしておくことをお勧めします。 Do you want to backup your DB now? 今すぐDBをバックアップしますか? The backup finished successfully. バックアップは正常に終了しました。 You can find the backup in this file: %1 バックアップはこのファイルで確認できます。%1 The backup was not properly done. バックアップが適切に完了しなかった。 You will be sent back to the starting point. スタート地点に戻されます。 KLog - DB can't be updated automatically KLog - DBが自動更新されない You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. 古すぎるKLogのバージョンからアップグレードしており、このアップグレードはそのバージョンから自動的にアップグレードすることができません。 KLog - DB update KLog - DBアップデート KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. DBの中に以前のバージョンのログを発見しました。すべてのデータを新しく作成されるDXタイプのログに移行します。 KLog: Enter Station callsign KLog: 無線局のコールサインを入力してください Enter the station callsign used in this log このログで使用する無線局のコールサインを入力してください Station Callsign 無線局のコールサイン QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? 更新を中止するとデータに矛盾が生じたり、データが失われる可能性があります.  更新を中止しますか? Progress: 進捗状況: Updating DXCC award information... DXCCアワード情報の更新... Updating DXCC Award information... DXCCアワード情報の更新... Updating WAZ award information... WAZアワード情報の更新... Updating WAZ Award information... WAZアワード情報の更新... Updating mode information... モードの情報を更新しています... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. アップグレードの手順は以下の通りです。 - 古いKLogのバージョンを使って、ログをADIFにエクスポートする。 - KLogフォルダからlogbook.datファイルを削除します。 - 新しい KLog バージョンをインストールします。 - ADIFファイルをインポートします。 OKをクリックすると、KLogが終了します。 All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. すべてのデータが正しく移行されました。ここで、セットアップ->設定->ログに移動して、すべてが問題ないことを確認してください。 Abort updating 更新の中止 Updating bands information... バンドの情報を更新しています... Updating bands information in %1 status... %1 用のバンドの情報を更新しています... Updating mode information in %1 status... %1 用のモードの情報を更新しています... New One, work it! New Oneです. 交信すべし! Needed, work it! 交信すべし! Worked but not confirmed 交信済だけど未コンファーム Confirmed コンファーム済 Not identified 不明 KLog is already running. KLogはすでに起動しています。 It is allowed to run only one instance. 1つのインスタンスのみを実行することができます。 Install wizard was canceled before completing... インストールウィザードは操作完了前に中断されました... Do you want to remove the KLog dir from your disk? KLog ディレクトリーをディスクドライブから削除しますか? Your KLog dir has been removed KLog ディレクトリは削除されました I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーが削除できませんでした. ハードディスクから削除したい場合は手動で削除してください. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーが削除できませんでした. ハードディスクから削除したい場合は手動で削除してください. Remember that your KLog dir is on your system... KLog ディレクトリーはシステム中に残ったままです... Thank you for running KLog! KLogを使用してくださりありがとうございます! Updating information... 情報を更新する... Updating DXCC and Continent information... DXCCと大陸情報の更新... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. 間違ったコールサインが見つかりました: %1。新しいコールサインを入力するか、現在のコールサインが正しいことを確認してください。 An empty callsign has been detected. If it is possible, please enter the right call. 空のコールサインが検出されました。可能であれば、正しいコールを入力してください。 KLog - Not valid callsign found KLog - 有効なコールサインが見つかりません。 Date 日付 Call RSTtx 送信RST RSTrx 受信RST Band バンド Comment コメント Mode モード CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent 大陸名 Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL送付 Force Init Freq 周波数 Freq RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW送信 Max Bursts Multiplier MS Shower My Antenna 私のアンテナ My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig 私のリグ My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name 名前 Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL受領状況 QSL Sent QSL送付 QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH Region Rig RX Pwr Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear クリア(&C) &Select All すべて選択(&S) &Search 検索(&S) &Export Highlighted 選択した項目をエクスポート(&E) All logs すべてのログ Clear the searches. 検索結果をクリアします. Export the search result to an ADIF file. 検索結果をADIFファイルにエクスポートします. Select/Unselect all the QSOs shown. 表示されたQSOすべてを選択・選択解除します. Search in the log. ログを検索します. Search in all logs. すべてのログを検索します. You have requested to delete the QSO with: %1 Select the Station Callsign used to do this QSO. このQSOを行うために使用した局のコールサインを選択します。 Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! 検索するコールサインを入力します。すべてのQSOを表示するには「*」を入力してください...大きなログでは遅いかもしれません! All in log Not defined 定義されていません &Clear selection 選択をクリア(&C) Save File ファイルに保存 Are you sure? 本当に削除しますか? SearchWindow Date/Time 日付/時刻 Band バンド Mode モード QSL Sent QSL送付 QSL Rcvd QSL受領状況 Station Callsign 無線局のコールサイン ID Call Date/time 日付/時刻 Station callsign 無線局のコールサイン QSL Send QSLカードの送付 &Delete 削除(&D) Delete a QSO QSOのレコードを削除します &Edit QSO QSOの編集(&E) Edit this QSO QSOのレコードを編集します Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由で送ります D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトで送ります Via bureau ビューロー経由 QSL &received via bureau QSLカードをビューロー経由で受け取りました。(&r) Direct ダイレクト QSL received via direc&t QSLカードをダイレクトで受け取りました。(&t) Check in QRZ.com QRZ.comでチェック Check this callsign in QRZ.com QRZ.comでこのコールサインをチェック Check in DXHeat.com DXHeat.comにチェックイン Check this callsign in DXHeat.com DXHeat.comでこのコールサインを確認する &Request my QSL 自分のQSLカードがリクエストされた (&R) Mark my QSL as requested QSLカードがリクエストされているとマークします Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL QSLカードがリクエストされた (&R) Mark the QSL as requested QSLカードがリクエストされていることをマークします Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSLカード送付の必要があるQSO My QSL requested to be sent 自分のQSLカードがリクエストされている DX QSL pending to be received 相手局のQSLカードをまだ受け取っていない SetupDialog Bands/Modes バンドとモード DX-Cluster DXクラスター Colors 表示色 Misc その他 World Editor ワールドエディター Logs ログ Satellites HamLib Cancel キャンセル eLog OK OK User data ユーザー情報 Log widget D&X-Cluster D&Xクラスター WSJT-X Settings You need to enter at least one log in the Logs tab. 「ログ」タブで少なくともひとつログを入力してください. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Logsタブに1つのログを追加するか、KLogを終了しますか? (ログを追加する場合はYesを、KLogを終了する場合はNoをクリックしてください) World ワールド DB has not been moved to new path. DBは新しいパスに移動していません。 Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. 「その他」タブを開き、「Move DB」をクリックする をクリックしないと、DBが新しい場所に移動されません。 You need to enter at least a valid callsign. 少なくとも有効なコールサインを入力する必要があります。 Go to the User tab and enter valid callsign. ユーザー」タブを開き、有効なコールサインを入力します。 You have not selected the kind of log you want. ログの種類が選択されていません. You will be redirected to the Log tab. Please add and select the kind of log you want to use. この後、「ログ」タブに誘導されます. 使用したいログの種類を選択・追加してください. SetupEntityDialog Entity エンティティ CQ CQ ITU Latitude 緯度 Longitude 経度 UTC Main prefix 主なプリフィクス ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... その他の使用される可能性のあるプリフィクスをコンマで区切って入力. 例 JA1, JA2,... Prefixes その他のプリフィクス Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted 消滅 Cancel キャンセル Ok OK Entity Dialog エンティティ設定ウィンドウ SetupPageBandMode Bands バンド Modes モード SetupPageColors New One Needed in this band このバンドで未交信 Worked in this band このバンドで交信済 Confirmed in this band このバンドでコンファーム済 Default デフォルト WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... このDXCCは他のバンドで以前に運用されていたが、選択したバンドでは運用されていない。CQ、ITU、グリッドなどの関係で必要になることがあります。 Worked DXCC, but not confirmed in this band. DXCCの活動を行いましたが、このバンドでは確認できませんでした。 Sets the Dark Mode Choose a color 色の選択 SetupPageDxCluster Add 追加 Delete 削除 Show &HF spots Show HF spots &HFスポット情報を表示 Show V/&UHF spots Show V/UHF spots V/&UHFスポット情報を表示 Show W&ARC spots Show WARC spots W&ARCスポット情報を表示 Show &worked spots Show worked spots 交信済のスポット情報を表示(&w) Show &confirmed spots Show confirmed spots コンファーム済のスポット情報を表示(&c) Show ANN/&FULL messages Show ANN/FULL messages ANN/&FULLメッセージを表示 Show WW&V messages Show WWV messages WW&Vメッセージを表示 Show WC&Y messages Show WCY messages WC&Yメッセージを表示 Save DX Cluster activity DX Cluster活動の保存 Saves all the DX-Cluster activity to a file in the KLog folder すべてのDX-Cluster活動をKLogフォルダ内のファイルに保存する DX Spots DXスポット Others その他 Messages メッセージ KLog: Add a DXCluster server KLog: DXクラスターサーバーを追加 Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: アドレスとポート番号を指定 例: dxfun.com: 8000 ポート番号の指定がないときは、デフォルトで41112を使用 SetupPageELog ClubLog password ClubLogのパスワード ClubLog email ClubLogのメール Enter the email you used to register in ClubLog. ClubLogに登録したemailを入力してください. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードを入力する ClubLog はこちら警告。パスワードはKLog設定ファイルのクリア時に保存されます!!!(パスワードを入力したくない場合は、必要になったときにKLogが聞いてきます) Send QSOs in real time リアルタイムでのQSO送信 Activate ClubLog ClubLogを起動する Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. KLogで追加(修正)された各QSOをリアルタイムでClubLogに送信します。 Starts the ClubLog support in KLog. KLogのClubLog対応を開始します。 Activate eQSL.cc eQSL.ccをアクティベートする Enter your username of eQSL.cc. eQSL.ccのユーザー名を入力してください。 Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードeQSL.ccをここに入力してください。警告。パスワードはKLogの設定ファイルのクリア時に保存されます!!!(パスワードを入力したくない場合は、パスワードが必要になったときにKLogが聞いてきます) eQSL.cc password eQSL.ccパスワード eQSL.cc user eQSL.ccユーザー ClubLog eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. あなたのQRZ.comアカウントのユーザーを入力してください。このサービスを利用するには、QRZ.comに加入している必要があります。 User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードを入力してください QRZ.comはこちら警告。パスワードはKLogの設定ファイルのクリア時に保存されます!(パスワードを入力したくない場合は、必要になったときにKLogが聞いてきます。) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. QSOアップロード用のログブックキーです。このキーは、QRZ.comのログブックのウェブページで入手できます。この機能を使用するには、QRZ.comの契約が必要であることを覚えておいてください。 LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) ここにパスワードLoTWを入力してください。警告。パスワードはKLogの設定ファイルのクリア時に保存されます!!!!(パスワードを入力したくない場合は、パスワードが必要になったときにKLogが聞いてきます) Path to the TQSL software. TQSLソフトウェアへのパス。 Enable the LoTW integration with TQSL. You will need to have TQSL installed TQSLとのLoTW連携を有効にします。TQSLがインストールされている必要があります。 Select File ファイル選択 SetupPageHamLib Activate HamLib HamLibの起動 Activates the hamlib support that will enable the connection to a radio. 無線機との接続を可能にするhamlibサポートを有効にします。 Read-Only mode Read-Onlyモード If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. 有効にすると、KLogは無線機からFreq/Modeを読み取りますが、無線機にコマンドを送信することはありません。 Radio Select your rig. リグを選択してください。 Serial Network Defines the interval to poll the radio in msecs. 無線機をポーリングする間隔をmsec単位で定義します。 Poll interval ポールインターバル Test: OK Test: NOK Test Click to test the connection to the radio クリックして無線機への接続をテストする SetupPageLogView Fields SetupPageLogs &New New 新規ログ(&N) &Edit 編集(&E) &Remove 削除(&R) KLog KLog Do you really want to remove this log? このログを本当に削除しますか? Operators オペレータ An error has occurred showing the following error code: 次のエラーコードが発生しました: Log has not been removed. (#3) ログが削除されませんでした(#3) Log has not been removed. (#2) ログが削除されませんでした(#2) Log has not been removed. (#1) ログが削除されませんでした(#1) QSOs QSO総数 The new log could not be created. 新しいログを作成できませんでした。 KLog - SetupPageLogs Date 日付 Add a new log. 新しいログを追加します。 Edit the selected log. 選択したログを編集します。 Remove the selected log. 選択したログを削除します。 All the QSOs from this log will also be deleted... ID Station Callsign 無線局のコールサイン Comments コメント SetupPageLogsNew &Ok &Cancel キャンセル(&C) &Date 日付(&D) &Station Callsign 無線局のコールサイン(&S) &Operators オペレーター(&O) Comm&ent コメント(&e) Callsign used for this log. Comma separated list of operators: callsign1, callsign2. コンマで区切られたオペレーターのリスト: callsign1, callsign2. {1,?} Start date of this log. このログの開始日。 Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. このログに関するコメントを追加します。記入された場合、ログを識別するためにKLogのメインタイトルに表示されます。 You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Station Callsign」の欄に有効なコールサインを入力する必要があります。 この場合、ログは開きません。 SetupPageMisc &Imperial system Imperial system インチ・ヤード表記(&I) &Log in real time Log in real time 現在時刻でログを記録(&L) &Time in UTC Time in UTC 時刻のUTC表記(&T) &Save ADIF on exit Save ADIF on exit 終了時にADIFを保存(&S) Use this &default filename Use this default filename 次のデフォルトのファイル名を使用(&d) Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received &QSLカード受領時に発送にマークする Complete QSO with previous data 以前のデータを使ってQSOの項目を埋める Manage DX-Marathon DX-Marathonの管理 Activate the application debug log アプリケーションデバッグログの有効化 &Delete always temp ADIF file after uploading QSOs QSOをアップロードした後、常に一時的なADIFファイルを削除する。 In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. 同じコール、バンド、モードが入力された場合に重複とみなす時間範囲を秒単位で入力します。 If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. The search box will also show the callsign on the air to do the QSO. 検索ボックスには、QSOを行うためのコールサインも表示されます。 If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. 新しいバージョンのチェックが選択された場合、KLogは開発者にあなたのコールサイン、KLogのバージョン、オペレーティングシステムを送信し、KLogの改善に役立てます。 Check it for Imperial system (Miles instead of Kilometers). インペリアル方式(キロメーターではなくマイル)になっているか確認してください。 Select to use the following name for the logfile without being asked for it again. ログファイルには次のファイル名を用い、以後、尋ねられないようにするには、チェックをいれてください. Select if you want to manage DX-Marathon. DX-Marathonの管理を行うかどうかを選択します。 This is the default file where ADIF data will be saved. ADIF形式でファイルを保存するときのデフォルトのファイル名. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. アプリケーションのデバッグログを有効にします。この機能は、何かが期待通りに動作しない場合に役立ちます。KLogディレクトリにデバッグファイルが作成されます。 Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. クリックすると、すべての新規QSOにおけるすべてのeQSL(LoTWとeQSL)がデフォルトでQueued(送信予定)になります。 Delete Always the adif file created after uploading QSOs QSOのアップロード後に作成されたadifファイルを常に削除する Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. データベース (logbook.dat) が保存される既存のディレクトリーを指定してください. Show the Station &Callsign used in the search box 検索結果に使用した無線局のコールサインも表示する(&C) &Check for new versions automatically 新しいバージョンを自動でチェックする (&C) QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. 相手局のQSLカードを受領して、かつ自分のQSLカードを送付していなければ、QSLカードの送付待ちとしてマークをします. Check if there is a new release of KLog available every time you start KLog. KLogの起動時に新しいバージョンがリリースされているかをチェックします. &Provide Info for statistics 統計情報を提供する (&P) Mark sent eQSL && LoTW in new QSO as queued Move DB DBを移動 Select to use real time. 現在時刻のログ記入を行う場合、チェックをいれてください Select to use UTC time. 時刻のUTC表記を行う場合、チェックを入れてください Select if you want to save to ADIF on exit. 終了時にADIF形式で保存したい場合、チェックをいれてください Complete the current QSO with previous QSO data. 現在のQSOの各項目を埋めるのに、以前のQSOのデータを使用します. This is the directory where the database (logbook.dat) will be saved. このディレクトリーにデータベース (logbook.dat) が保存されます. Click to change the path of the database. データベースのパスを変更するにはクリック. This is the directory where DB (logbook.dat) will be saved. このディレクトリーにDB (logbook.dat) が保存されます. Click to change the default ADIF file. デフォルトのADIFファイルを変更するにはクリックしてください. Check non-valid calls Click to move the DB to the new directory. DBを新しいディレクトリーに移動するにはクリックしてください. Select Directory ディレクトリーを選択 KLog - Move DB File moved ファイルを移動しました File copied ファイルをコピーしました File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied ファイルがコピーされませんでした The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. 移動先のディレクトリーが存在しません. 既存のディレクトリーを指定してください. Browse 参照 Open File ファイルを開く SetupPageSats &New 新規ログ(&N) &Edit 編集(&E) &Remove 削除(&R) &Import E&xport Add a new satellite. 新しい衛星を追加します。 Edit the selected satellite. 選択した衛星を編集します。 Remove the selected satellite. 選択した衛星を削除します。 Export your current satellites to a file. 現在の衛星をファイルに書き出すことができます。 Select the sat you want to open. 開きたい衛星を選択します。 KLog KLog Do you really want to remove this satellite? 本当にこの衛星を削除したいのですか? Import a satellites file. It will replace the satellites you have in the current list. 衛星ファイルをインポートします。現在のリストに入っているサテライトが置き換えられます。 This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name 名前 Uplink Downlink Modes モード An error has occurred showing the following error code: 次のエラーコードが発生しました: KLog - SetupPageSats Open Satellites File 衛星ファイルを開く KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. 衛星データのインポート時に予期せぬエラーが発生しました。 インポートしようとしているファイルの形式が正しくないことが原因のようです。 Please check the format or contact the developer for analysis with the error code: フォーマットを確認するか、エラーコードで開発者に解析を依頼してください。 Save Satellites File 衛星ファイルの保存 SetupPageSatsNew Short name Sat name UpLink アップリンク DownLink ダウンリンク Modes モード &Ok &Cancel キャンセル(&C) Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. ショートネームを入力します。QSOの後にLoTWにアップロードできるように、LoTWのショートネームを使うようにしてください。 Enter the name of the satellite. 衛星の名前を入力してください。 Enter the uplink frequencies in this format: 144.300 アップリンクの周波数をこのフォーマットで入力してください:144.300 Enter the downlink frequencies in this format: 144.300 ダウンリンクの周波数をこのフォーマットで入力してください:144.300 Enter the modes in this format: USB この形式でモードを入力します:USB Some of the data you have entered is not correct; the satellite can't be added. 入力したデータの一部が正しくないため、衛星を追加することができません。 SetupPageSubdivisionNew &Date 日付(&D) &Station Callsign 無線局のコールサイン(&S) &Operators オペレーター(&O) Comm&ent コメント(&e) &Ok &Cancel キャンセル(&C) Callsign used for this log. Comma separated list of operators: callsign1, callsign2. コンマで区切られたオペレーターのリスト: callsign1, callsign2. {1,?} Start date of this log. このログの開始日。 Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. このログに関するコメントを追加します。記入された場合、ログを識別するためにKLogのメインタイトルに表示されます。 You need to enter a valid callsign in the Station Callsign box. The log will not be opened. 無線局コールサインの欄に有効なコールサインを入力する必要があります。 この場合、ログは開きません。 SetupPageSubdivisions &Remove 削除(&R) Import new Import an AWA file with the subdivision details. Remove the selected references. 選択したリファレンスを削除します。 Select the references you want to open. 開きたいリファレンスを選択します。 KLog KLog Do you really want to remove the data of this entity? 本当にこのエンティティのデータを削除したいのですか? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) ログが削除されませんでした(#3) Log has not been removed. (#2) ログが削除されませんでした(#2) Log has not been removed. (#1) ログが削除されませんでした(#1) ID Name 名前 Short Name CQ Zone CQゾーン ITU Zone ITUゾーン Deleted 消滅 Start Date End Date DXCC DXCC An error has occurred showing the following error code: 次のエラーコードが発生しました: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server UDPサーバーの起動 Automatically log QSOs from WSJT-X WSJT-XからのQSOを自動的に記録する Allow WSJT-X to send logged QSOs to KLog WSJT-XがログしたQSOをKLogに送信できるようにする。 QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected WSJT-Xに記録されたQSOはKLogに送信され、KLogは"%1 "が選択されない限り、KLogにログインする前に尋ねてきます。 KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLogは、WSJT-XからのQSOを、手動で確認することなく、自動的に記録します。 Update status information from WSJT-X WSJT-Xからのステータス情報の更新 KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLogは、WSJT-Xからのデータ(DXコールサイン、レポート、モードなど)を自動的に表示・更新します。 UDP port number where the UDP Server will listen for packets. UDPサーバーがパケットをリッスンするUDPポート番号。 Make sure it is the same port that the other programs are sending the data to. Default port is 2237. 他のプログラムがデータを送信しているのと同じポートであることを確認してください。デフォルトのポートは2237です。 UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDPサーバーは、WSJT-Xなどの他のプログラムから送信されたQSOを受信し、それらのプログラムから自動的にKLogにログインすることができます。 UDP Port UDPポート Select the interface to listen for UDP datagrams coming from WSJT-X. WSJT-Xから送られてくるUDPデータグラムをリッスンするインターフェースを選択します。 Network interface ネットワークインターフェース QSOs notification timeout (milisecs) QSOs通知タイムアウト(ミリ秒) Miliseconds that the notification of QSOs received from WSJTX will be shown. WSJTXから受信したQSOの通知が表示されるミリ秒。 SetupPageUserDataPage &Personal data Personal data 個人の情報(&P) Station &data Station data 無線局の情報(&d) &Name Name 名前(&N) &Address Address 住所(&A) Cit&y City 市町村(&y) &Zip Code Zip Code 郵便番号(&Z) Pro&v/State Prov/State 厳密にはProv/Stateじゃないですけど 都道府県(&v) Countr&y Country 国(&y) Enter your information for rig リグの情報を入力してください Enter your information for antenna アンテナの情報を入力してください Enter your name. 名前を入力してください。 Enter your address - 1st line. 住所を入力 - 1行目 Enter your address - 2nd line. 住所を入力-2行目 Enter your address - 3rd line. 住所を入力 - 3行目 Enter your address - 4th line. 住所を入力 - 4行目 Enter your city. 都市名を入力してください。 Enter your zip code. 郵便番号を入力してください。 Enter your province or state. 都道府県名を入力してください。 Enter your country. あなたの国を入力してください。 Enter your power information. 出力を入力してください。 &Rig 1 リグ 1(&R) R&ig 2 リグ 2(&i) Ri&g 3 リグ 3(&g) Antenna &1 アンテナ &1 Antenna &2 アンテナ &2 Antenna &3 アンテナ &3 Po&wer 送信出力(&w) Enter the station callsign that will be used for logging. ロギングに使用する局のコールサインを入力します。 Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. 自局のグリッドロケーターを入力してください. 入力されなければKLogはコールサインの情報をもとにグリッドロケーターを推測して表示します. &Callsign コールサイン &Operators オペレーター(&O) &CQ Zone CQゾーン(&C) &ITU Zone ITUゾーン(&I) &Locator グリッドロケーター(&L) &Locator (not valid) グリッドロケーター(不適合)(&L) Enter the operators (comma separated if more than one). オペレーター名を入力してください。(複数の場合はコンマで区切って入力してください。) SetupPageWorldEditor Add 追加 Delete 削除 Edit Export World Import World Still not implemented. まだ実装されていません。 Import a new cty.csv file 新しい cty.csv ファイルの読み込み An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. DXCC情報取得のファイル (cty.csv) がKLogフォルダーに見つかりました. ファイルをロードします. No entities information file (cty.csv) has been detected in your KLog folder. DXCC情報取得のファイル (cty.csv) がKLogフォルダーに見つかりません. KLog will not be able to show entities information. KLogはDXCC情報の表示ができません. Prefix プリフィクス Entity エンティティ ARRL ID Continent 大陸名 CQ Zone CQゾーン ITU Zone ITUゾーン UTC Latitude 緯度 Longitude 経度 Deleted 消滅 Since Date 交信有効期間はじめ To Date 交信有効期間おわり Open File ファイルを開く BigCTY (*.csv) Entities information has been updated. DXCC情報が更新されました. Entities information has not been updated. DXCC情報が更新されませんでした. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. 以下のQSOは、あなたがLoTWの確認を受けたQSOです。 Ok OK DX DX Date/Time 日付/時刻 Band バンド Mode モード ShowErrorDialog KLog Message KLog メッセージ SoftwareUpdateDialog Ok OK KLog update KLogの更新 <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>KLogの新バージョン(%1)が公開されました。 </h2></center><br>KLogの新バージョンがあります。<br><br><b>から新バージョンを入手することができます。<br><br><center>&lt;a href=https://www.klog.xyz&gt;https://www.klog.xyz</a></center> Congratulations! おめでとうございます! Your KLog has been updated. お使いの KLog は更新されました. You already have the latest version. 最新のバージョンを入手しました. StartWizard KLog - The free hamradio logging program フリーなアマチュア無線用ログソフト KLog Quit Setup 設定の中止 Setup is not complete yet. Are you sure you want to quit setup? 設定は完了していません。本当に設定を中止しますか? StatisticsWidget QSO per year 年間QSO DXCC per year 年間のDXCC CQ zones per year 年間のCQゾーン QSO per band バンドごとのQSO QSO per mode モードごとのQSO QSO per DXCC DXCCごとのQSO QSO per Continent 大陸ごとのQSO QSO per hour 時間あたりのQSO QSO per month 月あたりのQSO Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year 1年あたりのCQ Zone Reading data ... データの読み込み ... Abort reading 読込みの中止 CQ zones CQ zones per year 1年あたりのCQ Zone Reading data ... データの読み込み ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign コールサイン Date 日付 Band バンド Mode モード DXCC DXCC Satellite サテライト通信 Confirmed コンファーム済 No いいえ StatsEntitiesPerYearBarChartWidget Chart title Reading data ... データの読み込み ... Abort reading 読込みの中止 DXCC Entities DXCC Entities per year Reading data ... データの読み込み ... Entities: エンティティ: StatsFieldPerBandWidget All すべてのログ Mode: Band バンド Worked Confirmed コンファーム済 StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign コールサイン Date 日付 Band バンド Mode モード Grid Satellite サテライト通信 Confirmed コンファーム済 No いいえ StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... データの読み込み ... Abort reading 読込みの中止 Bands バンド QSOs per band distribution バンドごとのQSO数の分布 Reading data ... データの読み込み ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent 大陸ごとのQSO Reading data ... データの読み込み ... Abort reading 読込みの中止 Continents 大陸 Reading data ... データの読み込み ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC DXCCごとのQSO Reading data ... データの読み込み ... Abort reading 読込みの中止 Reading data... データの読み込み... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour 1時間あたりのQSO数 Reading data ... データの読み込み ... Abort reading 読込みの中止 Hours QSOs at hour Reading data ... データの読み込み ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode モードあたりのQSO Reading data ... データの読み込み ... Abort reading 読込みの中止 Modes モード QSOs per mode distribution モード別QSO数分布 Reading data ... データの読み込み ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month 月間QSO数 Reading data ... データの読み込み ... Abort reading 読込みの中止 Jan 1月 Feb 2月 Mar 3月 Apr 4月 May 5月 Jun 6月 Jul 7月 Sep 9月 Oct 10月 Nov 11月 Dec 12月 Aug 8月 Months QSOs at Month 月間QSO数 Reading data ... データの読み込み ... Months: StatsQSOsPerYearBarChartWidget Reading data ... データの読み込み ... Abort reading 読込みの中止 QSOs QSO総数 QSOs per year 年間QSO数 Reading data ... データの読み込み ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next 次へ Previous 前へ <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>ヒント1</b><br>知っていますか...<br> <a href="#ToolsFillInQSO">ツール」→「QSOデータの入力</a>」を使うと、自動的にログ全体を読み込んで、DXCC、CQ、ITUゾーン、大陸を入力することができます。</br> <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>ヒントその3。</b><br>知っていますか...<br> <a href="#ToolsFindQSO2QSL">ツール」→「QSLツール」...→「QSLするQSOを探す</a>」を使うと、DXCCを確認する必要があるのにQSLカードをまだ送っていないためにQSLを送るべきQSOをすべて探すことができます。</br> <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>ヒント2:</b><br>知っていますか...<br> <a href="#ToolsSendPendingQSL">ツール-&gt;QSLツール...-&gt;Find My-QSLs pending to send</a>で、まだ送らなければならないQSLを見つけることができます。<bR>このツールは、「QSL-Sent」が<i>「Requested</i>」となっているすべてのQSOを検索ボックスに表示します。</bR></br> <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>ヒントその4。</b><br>知っていますか...<br>検索窓の検索ボックスに「*」を入力すると、ある特定の局のコールサインで行われたすべてのQSOを検索できることを?</br> <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>ヒントその5。</b><br>あなたは知っていますか...<br> <a href="#FileOpenKLogFolder">ファイル」→「KLog」フォルダの</a>メニューを開くと、KLogフォルダの中に、すべてのログやその他の情報を含むファイル「logbook.dat」と、KLogの設定ファイルを含む「klogrc」ファイルがあるのを?</br> <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>ヒント6</b><br>知っていますか...<br> <a href="#ToolsUploadLoTW">Tools-&gt;LoTW tools ...-&gt;Sends the log to LoTW calling TQSL</a>で、キューイングとマークされたQSOをTQSL経由でLoTWにアップロードすることができます。?<br><br>この機能を使用するには、環境設定でTQSLを設定する必要があります。</br></br></br> <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>ヒントその7。</b><br>知っていますか...<br>DXCCウィジェットで特定のバンドにマウスを置くと、そのバンドで特定のDXCCエンティティを確認したQSOを見ることができます。</br> <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>ヒント8</b><br>知っていますか...<br> <a href="#ToolsReceivePendingQSL">ツール-&gt;QSLツール...-&gt;Find DX-QSLs pending to receive</a>を使えば、まだ待っているQSLを見つけることができます。<bR>このツールは、QSL-Sentが<i>Sent</i>としてマークされているが、まだDXからQSLカードを受け取っていない全てのQSOを検索ボックスにリストアップしてくれます。</bR></br> <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>ヒント9</b><br>知っていますか...<br> <a href="#ToolsReceiveRecPendingQSL">ツール-&gt;QSLツール...-&gt;Find requested pending to receive</a>で、まだ待っているQSLを見つけることができます。<bR>このツールは、QSL-Recが<i>Requested</i>となっているが、まだDXからQSLカードを受け取っていないすべてのQSOを検索ボックスにリストアップします。</bR></br> <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>ヒント10</b><br>あなたは知っていますか...<br><a>&lt;a href=https://t.me/klogchat&gt;英語版KLog Telegramグループに登録し</a>て、英語でKLogについて議論する<a>ことができ</a>ますか?</br> <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>ヒント #11</b><br>あなたは知っていますか...<br><a>あなたは、&lt;a href=https://t.me/KLogES&gt;スペイン語Telegramグループに登録し</a>て、スペイン語でKLogについて議論する<a>ことができ</a>ますか?</br> <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>ヒント#12</b><br>あなたは知っていますか...<br><a>&lt;a href=https://groups.io/g/klog&gt;KLogメーリングリスト&lt;/a&gt;に登録</a>すると、KLogについて英語で電子メールを使って議論することができます。</br> <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>ヒント #13</b><br>あなたは知っていますか...<br><a>あなたは、&lt;a href=https://twitter.com/_ea4k&gt;follow EA4K on twitter</a>to get updates about KLog?</br> <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>ヒント #14</b><br>あなたは知っていますか...<br>あなたは、他のユーザーがKLogの使用を決定するのを助けるために、<a>KLogについてeHam.netにあなた自身の&lt;a href=https://www.eham.net/reviews/detail/3118&gt;レビューを書くことができ</a>ますか?</br> <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>ヒント #15</b><br>あなたは知っていますか...<br><a>あなたは、単に&lt;a href=https://www.klog.xyz/contact&gt;お問い合わせ&lt;/a&gt;開発チームに参加することができ</a>ますか?</br> <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>ヒント #16</b><br>知っていますか...<br><a>KLogに貢献する方法はたくさんあり、そのうちのいくつかは&lt;a href=https://www.klog.xyz/contrib&gt;KLog Contribute</a>&lt;/a&gt;のページ<a>に掲載さ</a>れています。</br> <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>ヒント #17</b><br>あなたは知っていますか...<br><a>KLogのあなたの言語への翻訳をサポートすることができます。&lt;a href=https://www.klog.xyz/contrib/translations&gt;KLog 翻訳</a>ページ&lt;/a&gt;<a>をご覧ください</a>。</br> <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>ヒント #18</b><br>知っていますか...<br>DXCCテーブルのエンティティ名をダブルクリックすると、そのDXCCエンティティを使用したすべてのQSOが検索ボックスに表示されることを?</br> <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>ヒント #19</b><br>知っていますか...<br>QSOの上で右クリックして<i>「QRZ.comで確認</i>」を選択すると、そのコールサインをQRZ.comで確認することができます。</br> UpdateSatsData Reading Satellites data file... 衛星データファイルの読み込み... Abort reading 読込みの中止 The Satellites information has been updated. サテライトの情報を更新しました。 Open File ファイルを開く Sat Data 衛星データ World Entity エンティティ Continent 大陸名 Abort reading 読込みの中止 Reading cty.csv... cty.csvを読みこんでいます… WorldMapWidget World map 世界地図 View 表示 Zoom In(25%) ズームイン(25%) Zoom Out(25%) ズームアウト(25%) Normal Size 通常サイズ Fit to window ウィンドウにフィット eLogClubLog Host not found! ホストが見つかりません! Timeout error! タイムアウトエラー! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. このエラーは、QSOが重複している場合や、削除する場合は存在しないQSOを削除しようとした場合に発生します。 Undefined error number (#%1)... 未定義のエラー番号(#%1)... KLog - ClubLog KLog - ClubLog QSO dupe or not existing (#%1)... QSOのダブりや存在しない(#%1)... We have received an undefined error from Clublog (%1) Clublog (%1) から未定義のエラーを受け取りました。 Undefined error... 未定義のエラー... Callsign missing コールサインがない Invalid callsign 正しくないコールサイン Skipping SWL callsign SWLナンバーをスキップ Callsign is your own call コールサインが自分自身のコールサイン Invalid callsign with no DXCC mapping DXCCで割り当てされていないコールサイン Updated QSO 更新されたQSO Invalid ADIF record 正しくないADIFレコード Missing ADIF record ADIFレコードがない Test mode - parameters ok, no action taken テストモード - パラメータはOK.、動作は行われません Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. セットアップで設定を確認し、解決できない場合はKLog開発チームまでご連絡ください。ClubLogのアップロードができなくなります。 Excessive API Usage API呼び出しが過剰 Internal Error 内部エラー Rejected 拒否 QSO Duplicate QSOが重複 QSO Modified QSO内容が変更 Missing Login ログインしていない QSO OK QSO OK Upload denied アップロードが拒否 No callsign selected コールサインが選択されていない No match found 一致するものが見つからない Dropped QSO ドロップアウトしたQSO OK OK Login rejected ログインが拒否 Rejected: Callsign is your own call 拒否: コールサインが自分自身のコールサイン eLogQrzLog Host not found! ホストが見つかりません! Timeout error! タイムアウトエラー! Undefined error number (#%1) 未定義のエラー番号(#%1) We have received the following error from QRZ.com (%1) QRZ.com (%1) から以下のエラーを受け取りました。 You are not subscribed to QRZ.com. Not valid KEY found 無効なKEYが見つかりました。 Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. QRZ.comのAPIキーを設定してください。このキーはQRZ.comログブックの設定ページで見つけることができます。 この機能を使用するには、QRZ.comの契約が必要です。 KLog - QRZ.com password needed KLog - QRZ.comのパスワードが必要です Please enter your QRZ.com password: QRZ.comのパスワードを入力してください。 KLog - QRZ.com KLog - QRZ.com Callsign missing コールサインがない eQSLUtilities Host not found! ホストが見つかりません! Timeout error! タイムアウトエラー! Undefined error number (#%1)... 未定義のエラー番号(#%1)... KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSLは、以下のメッセージを送信しました。 %1 We have received an undefined error from eQSL (%1) eQSL (%1) から未定義のエラーを受け取りました。 Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. セットアップでの設定を確認し、修正できない場合はKLog開発チームに連絡してください。eQSLのアップロードができなくなります。 eQSL Error: User or password incorrect eQSLエラー。ユーザー名またはパスワードが正しくありません。 eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL警告。アップロードされたQSOのうち、少なくとも1つは重複しています。 eQSL: All the QSOs were properly uploaded. eQSL:すべてのQSOが正しくアップロードされました。 KLog - eQSL.cc password needed KLog - eQSL.ccのパスワードが必要です。 Please enter your eQSL.cc password: eQSL.ccのパスワードを入力してください。 klog-1.8.6/translations/klog_hr.ts0000644000175000017500000140235214166020421016163 0ustar develdevel AboutDialog About KLog O KLogu You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Također nam možete pomoći šaljući izvješća o greškama ili malih doprinosa u programskom kodu ili bilo što što mislite da može unaprijediti KLog. Authors Autori By Od Author Autor KLog is a free logbook for hamradio operators. KLog je slobodna dnevnička aplikacija za radio-amatere operatere. Please provide your review in KLog's eHam review page: Molimo ocijenite KLog na eHamovoj stranici za ocjene: Find more information and the latest release at Potražite više informacija i najnoviju inačicu na today danas Main developer Glavni razvijatelj programa KLog is developed by a very small team and you are invited to join! Klog razvija vrlo mali tim i pozvani ste da se pridružite! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. KLog razvijatelji programskog koda razvili su opciju koja šalje neke korisničke podatke na KLogov poslužitelj kojima je osnovna svrha identificiranje broja instaliranih inačica, kako bi razvoj mogao biti usmjeren u jednom ili drugom smijeru, uzevši u obzir korisničke potrebe. At present, the data that is provided is the following: Trenutno, podaci koji se šalju su: Translators bring KLog into your language. They are really an important part of the KLog development team. Prevoditelji donose KLog u vaš jezik. Oni su važan dio tima koji razvija KLog. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Budite svjesni da je ovo razvojna inačica i da može imati puno programskih grešaka.<br>Napravite sigurnosnu kopiju vaših podataka prije korištenja ovog softvera! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Prevoditelji Privacy advisory Upozorenje o privatnosti Callsign Pozivni znak KLog version Inačica KLoga Operating system Operacijski sustav Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Ova opcija može biti omogućena/onemogućena iz izbornika Razno na stranici Postavke. KLog KLog Privacy Privatnost AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Izaberite pozivni znak koji želite koristiti za učitavanje dnevnika. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Izaberite početni datum za izvoz QSOa. Zadani datum je datum prvog QSOa sa ovim pozivnim znakom. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Izaberite krajnji datum za izvoz QSOa. Zadani datum je datum posljednjeg QSOa sa ovim pozivnim znakom. Station callsign Pozivni znak postaje Start date Početni datum End date Krajnji datum Ok Ok Cancel Poništi DX DX Date/Time Datum/Vrijeme Band Pojas Mode Način rada Not defined Nije definiran All Svi QSOs: QSOi: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. Ova tablica prikazuje sve QSOe koji će biti poslani u LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. Ova tablica prikazuje sve QSOe koji će biti izvezeni u ADIF. AwardsWidget Recalculate Preračunaj Click to recalculate the award status. Kliknite za preračunavanje statusa priznanja. Select the year you want to check. Izaberite godinu koju želite provjeriti. QSOs QSOi DXCC DXCC CQ CQ Award Priznanje Confirmed Potvrđeno Worked Rađeno WAZ WAZ Score Zbroj Annual Godišnje Number of confirmed DXCC entities. Broj potvrđenih DXCC entiteta. Number of worked DXCC entities. Broj rađenih DXCC entiteta. Number of confirmed WAZ zones. Broj potvrđenih WAZ zona. Number of worked WAZ zones. Broj rađenih WAZ zona. Number of confirmed QSOs. Broj potvrđenih QSOa. Number of worked QSOs. Broj rađenih QSOa. Number of QSOs worked in the selected year. Broj QSOa rađenih u izabranoj godini. Number of DXCCs worked in the selected year. Broj DXCCa rađenih u izabranoj godini. Number of CQ Zones worked in the selected year. Broj CQ zona rađenih u izabranoj godini. Score for the DXMarathon in the selected year. Zbroj za DXMarathon u izabranoj godini. DX-Marathon DX-Marathon CTYPage Country data download Preuzmi podatke o zemljama KLog needs country data... KLog treba podatke o zemljama... &Download &Preuzmi &Ignore &Zanemari Country data needed Potrebni su potaci o zemljama KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog koristi cty.csv datoteku s http://www.country-files.com/ za dobivanje DXCC informacija. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Trebate preuzeti cty.csv datoteku ako želite da vam KLog prikaže zemlje, lokator, itd. QSOa koje radite. Click on Download to download now. Kliknite na Preuzmi za trenutno preuzimanje. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Ne mogu naći stroj. Molim provjerite mrežu i pokušajte ponovo Želite li probati ponovo? DXCCStatusWidget Update Ažuriraj It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entitet Prefix Prefiks Pref: Pref: CQ: CQ: ITU: ITU: Beam: Snop: Entity not worked in this band. Entitet nije rađen na ovom pojasu. DXClusterWidget Connect Spoji Clear Izbriši Click on connect to connect to the DX-Cluster Kliknite spoji za spajanje na DX-Cluster Trying to connect to the server Pokušavam se spojiti na poslužitelj KLog DXCluster Kontest DXCluster KLog DXCluster Click on Connect to connect to the DX-Cluster server Kliknite Spoji za spajanje na DX-Cluster poslužitelj The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Stroj odbija spajanje. Osigurajte da DXCluster poslužitelj radi i provjerite jesu li ime stroja i port ispravni. The following error occurred: %1. Dogodila se greška: %1. Connected to server Spojen na poslužitelj KLog message Kontest message Poruka KLoga Enter your callsign to connect to the cluster: Unesite pozivni znak za spajanje na klaster: Enter your password to connect to the cluster: (Just hit enter for no password) Unesite zaporku za spajanje na klaster: (samo Enter ako nemate zaporke) Not logged on, you may need to enter your callsign again. Niste prijavljeni, možda ćete trebati ponovo unijeti svoj pozivni znak. Enter here the commands to be sent to the DX-Cluster server. Unesite naredbu za poslati DX-Clusteru. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Nije bilo moguće otvoriti datoteku za spremanje DX zapažanja za pisanje. Aktivnost na DX-Clusteru neće biti spremljena! Disconnect Odspoji The host was not found. Please check: Poslužitelj nije pronađen. Molim provjerite: - your network connection; - the host name and port settings. - vaš spoj na mrežu; - ime poslužitelja i port. Connection closed by the server Poslužitelj je prekinuo vezu Click on Connect to connect to the DX-Cluster server. Kliknite Spoji za spajanje na DX-Cluster poslužitelj. Send Pošalji DataProxy_SQLite Software version in DB is null Inačica softvera u bazi je null Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Earth-Moon-Earth Sporadic E Sporadic E Internet-assisted Potpomognuto Internetom Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Zemaljski ili zračni repetitor ili transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satelit Bureau Common term in hamradio, do not translate if not sure Biro Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Svi QSOi su bili nadopunjeni DXCCom i kontinentom. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed Does this mean the query succeeded? Upit nije neuspio F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Da No Ne Requested I've opted for neutral gender but whether this is correct depends on the context in which this word is used. Zatraženo Ignore/Invalid Zanemari/Nevaljalo Validated Provjereno Queued Poredano Uploaded Učitano Do not upload Ne učitavaj Modified Ažurirano Direct Izravno Electronic Elektronički KLog DXCC KLog DXCC KLog - Invalid call detected KLog - Otkriven nevaljani pozivni znak An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Preuzimanje cty.csv je neuspjelo s kodom greške: Download of cty.csv done. Preuzimanje cty.csv završeno. There is already a cty.csv file in the folder but it will be replaced with the new one. Postojeća cty.csv datoteka u mapi bit će zamijenjena s novom. Could not open %1 for writing Nisam mogao otvoriti %1 za pisanje FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. Nije bilo moguće otvoriti datoteku %1 za čitanje. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Reading ADIF file... Čitam ADIF datoteku... Abort reading Prekini čitanje Writing ADIF file... Zapisujem ADIF datoteku... Abort writing Prekini pisanje KLog - Don't ask again KLog - Ne pitaj ponovo Do you want to reuse your answer? Želite li iskoristiti vaš odgovor? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog će automatski koristiti vaš prijašnji odgovor za sva slična pitanja, ako ih bude, bez da vas ponovo pita. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Datum/Vrijeme:</i> %1</li><li>Pozivni znak: %2</li><li>Frekvencijski pojas: %3</li><li>Način rada: %4</li></ul> KLog - QSO not found KLog - QSO nije pronađen Do you want to add this QSO to the log?: Želite li dodati ovaj QSO u dnevnik: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Pronašli smo QSO koji dolazi iz LoTWa a koji nije u vašem lokalnom dnevniku. Želite li da KLog doda ovaj QSO u dnevnik? KLog - Invalid call detected KLog - Otkriven nevaljani pozivni znak An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Otkriven je prazan pozivni znak. Želite li svejedno izvesti ovaj QSO (kliknite na Da) ili odstraniti polje iz izvezene dnevničke datoteke? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Otkriven je nevaljali pozivni znak %1. Želite li svejedno izvesti ovaj pozivni znak (kliknite na Da) ili odstraniti pozivni znak iz izvezene dnevničke datoteke? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Izvoz nevaljalih pozivnih znakova može izazvati probleme u aplikacijama u koje ćete možda uvesti ovu dnevničku datoteku. No, to može biti i valjani pozivni znak koji je KLog pogrešno identificirao kao nevaljali. Svakako možete urediti ADIF datoteku nakon što je proces izvoza završen. The selected callsign (%1) is not valid, please check it again to export the log. Izabrani pozivni znak (%1) nije valjan, molim provjerite još jednom kako bi izvezli datoteku. There are no QSOs pending to be exported with that station callsign. Nema QSOa sa tim pozivnim znakom za koje je izvoz u tijeku. Export Izvoz Export progress Napredak izvoza Writing ADIF file... QSO: Zapisujem ADIF datoteku ... QSO: KLog - File not opened KLog - Datoteka nije otvorena It was not possible to open the file %1 for reading. Nije bilo moguće otvoriti datoteku %1 za čitanje. KLog was not able to read the LoTW file KLog nije mogao pročitati LoTW datoteku Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Čitam LoTW datoteku... Importing LoTW ADIF file... Uvozim LoTW datoteku... You have canceled the file import. The file will be removed and no data will be imported. Prekinuli ste uvoz datoteke. Datoteka će biti izbrisana i nijedan podatak neće biti uvezen. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. This QSO is not including the minimum data to consider a QSO as valid! Ovaj QSO ne sadrži minimalne podatke da bi se smatrao valjanim QSOom! Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog je našao jedan QSO bez pozivnog znaka postaje. Unesite pozivni znak postaje pod kojim je urađen ovaj QSO sa %1 na %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog je našao jedan QSO bez pozivnog znaka postaje. Unesite pozivni znak postaje pod kojim je urađen ovaj QSO na %1: Do you want to continue with the current file? Želite li nastaviti s trenutnom datotekom? Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Nekim QSOima u ovoj datoteci, (npr.: %1) izgleda nedostaje RST-TX informacija. If you select NO, maybe the QSO will not be imported. Ako izaberete Ne, QSO možda neće biti uvezen. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Nekim QSOima u ovoj datoteci, (npr.: %1) izgleda nedostaje RST-RX informacija. KLog - Apply to all QSOs in this log? KLog - Primjeni na sve QSOe u ovom dnevniku? - The band missing and the following call: - Frekvencijski pojas nedostaje i sljedeći pozivni znak: - The mode missing and the following call: - Način rada nedostaje i sljedeći pozivni znak: - The date missing and the following call: - Datum nedostaje i sljedeći pozivni znak: - The time missing and the following call: - Vrijeme nedostaje i sljedeći pozivni znak: You have canceled the file export. The file will be removed and no data will be exported. Prekinuli ste izvoz datoteke. Datoteka će biti izbrisana i podaci neće biti izvezeni. Do you still want to cancel? Želite li još uvijek prekinuti? QSO: QSO: KLog - Log selection KLog - Izbor dnevnika There is more than one log in this logfile. U ovoj dnevničkoj datoteci nalazi se više od jednog dnevnika. All logs will be imported into the current log. Svi dnevnici bit će uvezeni u trenutni dnevnik. Do you want to continue? Želite li nastaviti? Importing ADIF file... Uvozim ADIF datoteku... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Izgleda da imate duplikate QSOa u ADIF datoteci koju uvozite. Želite li nastaviti? (Duplicirani QSOi neće biti uvezeni) KLog - Error KLog - Pogreška The selected log does not exist, please check it again. Izabrani dnevnik ne postoji, molim provjerite još jednom. The file %1 can't be opened. Datoteka %1 ne može biti otvorena. KLog - User cancelled KLog - Korisnik poništio Exporting ADIF file... QSO: %1 / %2 Izvozim ADIF datoteku... QSO: %1 / %2 KLog - Duplicated QSOs KLog - Duplicirani QSOi Please edit the ADIF file and make sure that it include at least: Molim uredite ADIF datoteku tako da uključuje barem: and i This QSO had: Ovaj QSO je imao: KLog: Not all required data found! KLog: Nisu pronađeni svi obavezni podaci! KLog: No RST TX found! KLog: Nije nađen RST TX! KLog: No RST RX found! KLog: Nije nađen RST RX! KLog - No Station callsign entered. KLog - pozivni znak nije unešen. KLog - QSO without Station Callsign KLog - QSO bez pozivnog znaka stanice HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauda Select the serial port speed. Izaberite brzinu serijskog porta. Port Port Select the serial port. Only the serial ports that are detected are shown. Izaberi setijski port. Samo detektirani portovi su prikazani. Scan Pretraži Click to identify the serial ports available in your computer. Kliknite da bi označili raspoložive serijske portove na vašem računalu. 5 bits 5 bita 6 bits 6 bita 7 bits 7 bita 8 bits 8 bita Data bits Podatkovnih bitova Select the serial data bits. Izaberite broj serijskih podatkovnih bitova. None Nijedan Hardware Sklopovlje Software XON/XOFF Softverski XON/XOFF Flow control Kontrola toka Select the serial flow control Izaberite kontrolu serijskog toka No parity Bez pariteta Even Paran Odd Neparan Space Space Mark Mark Parity Paritet Select the serial parity. Izaberite paritet serijskog porta. Default Zadano 1 bit 1 bit 2 bits 2 bita Stop bits Stop bita Select the serial stop bits. Izaberite broj serijskih stop bita. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Kontinent Prefix Prefiks CQ CQ ITU ITU Short Path Kratki put Long Path Dugi put Deg Stu Miles Milje Km Km IntroPage Welcome to KLog! Welcome to Kontest! Dobrodošli u KLog! Welcome to KLog! - brought to you under the terms of the GPL! Dobrodošli u KLog! - vama pružen pod odredbama GPLa! Welcome to KLog Dobrodošli u KLog This looks like it's the first time you've run KLog on this computer. Izgleda da je ovo prvi put da ste pokrenuli KLog na ovom računalu. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Namijenjen je općenitom, DX i zapisivanju kontesta. It supports QSL management, import and export of ADIF Podržava baratanje QSLima, uvoz i izvoz ADIF and Cabrillo file formats and many other features... i Cabrilo datotečnih formata i mnoge druge funkcije... Before you can start using KLog, you will be asked to: Prije nego počnete koristiti KLog bit ćete upitani da: Acknowledge to the terms of the license. Prihvatite uvjete licence. Download the DX entities information. Preuzmete listu DX entiteta. Enter your callsign, CQ zone, etc. and main configuration. Unesete vaš pozivni znak, CQ zonu, itd. i glavnu konfiguraciju. Enjoy KLog and contact the development team if you have any suggestions! Uživajte u KLogu i javite se razvojnom timu ako imate kakvih prijedloga! LicPage KLog License information KLog podaci o licenci Welcome to KLog!- brought to you under the terms of the GPL! Dobrodošli u KLog! - vama pružen pod odredbama GPLa! Acknowledge Prihvati Be aware that KLog is free software. Uzmite u obzir da je KLog slobodan softver. LoTWUtilities KLog - LoTW password needed KLog - trebam LoTW zaporku Please enter your LoTW password: Molim unesite vašu LoTW zaporku: There is a file already existing with the name that will be used. Datoteka sa tim imenom već postoji. The file %1 already exist. Do you want to overwrite? Datoteka %1 već postoji. Želite li je prebrisati? KLog was not able to save the file %1. Error returned: %2 KLog nije mogao spremiti datoteku %1. Greška: %2 Downloading data to file: %1. Preuzimam podatke u datoteku: %1. KLog - LoTW download KLog - preuzimanje LoTW datoteke This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Server je preusmjerio našu vezu na %1 Do you want to follow the redirection? Želite li slijediti preusmjeravanje? It was not possible for find the file %1 that has been just downloaded. Nije bilo moguće pronaći datoteku %1 koja je bila upravo preuzeta. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Izgleda da LoTW nema niti jedan QSO sa pozivnim znakom koji koristite (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Pokušajte ponovo i pošaljite spremljenu datoteku (%1) razvijatelju KLoga na analizu. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? Klog je uspješno spremio %1 QSOa. Želite li ažurirati vaš dnevnik sa preuzetim podatcima? Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. Are you sure that you want to use that station callsign (%1)? KLog - LoTW File already exists KLog - LoTW Can't write the file The file %1 already exists. Datoteka %1 već postoji. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog ne može pronaći preuzetu datoteku. KLog - LoTW user/password error KLog - Pogreška sa LoTW korisničkim imenom/zaporkom LoTW server did not recognized your user/password LoTW poslužitelj nije prepoznao vaše korisničko ime/zaporku Check your user and password and ensure your are using the right one before trying again. Provjerite korisničko ime i zaporku prije nego ponovo pokušate. KLog - LoTW No QSOs KLog - Nema QSOa u LoTWu LoTW sent no QSOs LoTW nije poslao niti jedan QSO KLog - LoTW Unknown error KLog - Nepoznata LoTW pogreška KLog can't recognize the file that has been downloaded from LoTW. KLog ne može prepoznati datoteku preuzetu s LoTWa. Now KLog will process the downloaded QSO and update your local log. KLog će sada obraditi preuzeti QSO i ažurirati vaš lokalni dnevnik. LogWindow QSL Send QSL Poslana QSL Rcvd QSL Primljena &Delete Iz&briši Delete a QSO Izbriši QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau Pošalji ovu QSL preko biroa D&irect &Izravno Send this QSL via direct Pošalji ovu QSL izravno Via bureau Preko biroa QSL &received via bureau QSL p&rimljena preko biroa Direct Izravno QSL received via direc&t QSL primljena &izravno Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com Check in DXHeat.com Provjeri u DXHeat.com Check this callsign in DXHeat.com Provjeri ovaj pozivni znak u DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Učitaj u LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Dodaj &Clear &Izbriši Callsign of the QSO. Band of the QSO. Frekvencijski pojas QSOa. Mode of the QSO. Način rada QSOa. Date of the QSO. Datum QSOa. Time of the QSO. Vrijeme QSOa. Add the QSO to the log. Dodaj QSO u dnevnik. Clears the QSO entry. Izbriši unos QSOa. KLog will show real time if enabled. KLog će pokazati stvarno vrijeme ako je omogućeno. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Pozivni znak DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPLI &Modify &Promijeni MainWindow Starting KLog Pokrećem KLog DX Entity DX entitet &Log Window &Dnevnički prozor KLog KLog It seems that you have never done a backup or exported your log to ADIF. Izgleda da nikad niste napravili sigurnosnu kopiju ili izvezli vaš dnevnik u ADIF. KLog - File not open KLog - Datoteka nije otvorena It was not possible to open the debug file for writing. No debug log will be saved! Nije bilo moguće otvoriti datoteku za pomoć pri otkrivanju greški za pisanje. Datoteka za pomoć pri otkrivanju greški neće biti spremljena! Status bar ... Traka statusa ... KLog - CTY.dat update It seems that the latest backup you did is older than one month. Izgleda da je vaša posljednja sigurnosna kopija podataka starija od mjesec dana. Log backup recommended! Sigurnosne kopije dnevnika su preporučene! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Dobra praksa je napraviti sigurnosnu kopiju vašeg cijelog dnevnika redovno kako bi izbjegli gubitak podataka u slučaju nekog problema. Jednom kad izvezete vaš dnevnik u ADIF datoteku, kopirajte tu datoteku na sigurno mjesto, kao na primjer USB disk, cloud disk, drugo računalo, ... KLog će vas potsjetiti da napravite sigurnosnu kopiju svakog mjeseca. KLog - Backup KLog - New version detected! Ready Spreman KLog - Unexpected error KLog - Neočekivana pogreška An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Dogodila se neočekivana pogreška prilikom dodavanja QSOa u vaš dnevnik. Ako se ovaj problem opetuje, molim kontaktirajte razvijatelje softvera radi analize: KLog - Not valid call KLog - Nevaljali pozivni znak Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Dodavanje nevaljalih pozivnih znakova u dnevnik vam može izazvati probleme prilikom apliciranja za nagrade, izvoza ADIF datoteka za druge sustave ili aplikacije. KLog - Select correct entity KLog - Izaberite ispravan entitet You have selected an entity: Izabrali ste entitet: that is different from the KLog proposed entity: koji se razlikuje od entiteta predloženog u KLogu: Click on the prefix of the correct entity or Cancel to edit the QSO again. Kliknite na prefiks ispravnog entiteta ili Poništi kako bi ponovo uređivali QSO. No DXCC Translated in a sense "it is not a DXCC". If the context is "there is no DXCC" the translation should say "Nema DXCCa". Nije DXCC None Nijedan Click on the prefix of the right entity or Cancel to correct. "right" translated as in "correct"/"valid" (rather than "to the right of") Kliknite na prefiks ispravnog entiteta ili Poništi za ispravku. KLog - ClubLog error KLog - eQSL error KLog - %1 RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Želite li zaista izaći iz KLoga? &File &Datoteka Import an ADIF file into the current log. Uvezi ADIF datoteku u trenutni dnevnik. Export the current log to an ADIF logfile. Izvezi trenutni dnevnik u ADIF dnevničku datoteku. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Izvezi SVE QSOe u jednu ADIF datoteku, ujedinjujući QSOe iz svih datoteka. Print your log. Ispišite vaš dnevnik. KLog folder KLog mapa Opens the data folder of KLog. Otvara mapu s KLog podacima. E&xit &Izlaz &Tools &Alati Fill in QSO data Popuni QSO podatke Go through the log reusing previous QSOs to fill missing information in other QSOs. Prođi kroz dnevnik i iskoristi prijašnje QSOe kako bi popunio podatke koji nedostaju u drugim QSOima. Shows QSOs for which you should send your QSL and request the DX QSL. Prikazuje QSOe za koje trebate poslati vašu QSLku i zatražiti DX QSLku. Find My-QSLs pending to send Nađi Moje-QSL za koje je slanje neodlučeno Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Prikazuje QSOe sa neodlučenim zahtjevima za slanje QSLke. Trebali biste ovaj red držati prazim! Your log has not been updated. Vaš dnevnik nije bio ažuriran. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Niti jedan QSO nije bio ažuriran sa podacima iz LoTWa. To može biti zbog pogrešaka u dnevničkoj datoteci ili jednostavno zato što ste već ažurirali vaš dnevnik. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL Upload the queued QSOs to LoTW KLog needs to update the Entities database. The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. Spremanje sigurnosne kopije nije bilo uspješno. It is recommended to backup your data periodically to prevent lose or corruption of your log. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog has received an error from QRZ.com. You need to activate the %1 service in the eLog preferences. KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Find requested pending to receive LoTW tools ... Queue all the QSOs to be uploaded Queue all the QSO to be uploaded Online manual (F1) ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! KLog - Update checking result TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? You need to select one station callsign to be able to send your log to eQSL.cc. Select the Station Callsign to use when quering LoTW: Izaberite pozivni znak koji želite koristiti prilikom upita u LoTW: Please check the LoTW setup Molim provjerite LoTW postavke You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Niste definirali LoTW korisnika ili valjani pozivni znak. Otvorite LoTW sekciju u Postavke i konfigurirajte podatke za LoTW. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL KLog - QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Datum/Vrijeme Printing the log ... KLog - QSO received Station Callsign Pozivni znak postaje Operator Callsign Pozivni znak operatera KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode KLog - Način rada nije podržan A new mode not supported by KLog has been received from an external program or radio: Novi način rada koji nije podržan u KLogu primljen je iz vanjskog softvera: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Želite li nastaviti primati ovu obavijest? (ako onemogućite ovu obavijest nećete moći otkriti nevažeće načine rada) Native Error Recommendation: Preporuka: Periodically export your data to ADIF to prevent a potential data loss. Povremeno izvezite podatke u ADIF kako bi spriječili potencijalni gubitak podataka. Mark all queued QSOs in this log as sent to LoTW. Označi sve poredane QSOe u ovom dnevniku kao poslane u LoTW. Mark all queued QSOs as sent to LoTW. Označi sve poredane QSOe kao poslane u LoTW. Sends the log to LoTW calling TQSL. Šalje devnik u LoTW izvršavanjem TQSLa. Shows DX-QSLs for which requests or QSLs have been sent with no answer. Prikazuje DX QSL za koje je QSL bio zatražen ili je bio poslan ali odgovor nije stigao. Shows the DX-QSLs that have been requested. Prikaži DX QSLke koje su zatražene. Queue all QSLs from this log to be sent Stavi sve QSLe iz ovog dnevnika u red za slanje Mark all non-sent QSOs in this log as queued to be uploaded. Označi sve ne-poslane QSOe u ovom dnevniku kao poredane za učitavanje. Queue all QSLs to be sent Poredaj sve QSLke za slanje Put all the non-sent QSOs in the queue to be uploaded. Stavi sve neposlane QSOe u red za učitavanje. Mark all queued QSOs as sent Označi sve poredane QSOe kao poslane For updated DX-Entity data, update cty.csv. Za osvježene podatke o DX entitetima, osvježite cty.csv. Stats Statistike Show the statistics of your radio activity. Prikazuje statistike vaše radio aktivnosti. &Help &Pomoć Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL nije instaliran ili ga KLog ne može naći. Molim provjerite konfiguraciju. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Greška #1: Korisnik je prekinuo proces ili TQSL nije bio konfiguriran. Nijedan QSO nije bio učitan. Error #2: Upload was rejected by LoTW, please check your data. Greška #2: LotW je odbio učitavanje, molim provjerite vaše podatke. Error #3: The TQSL server returned an unexpected response. Greška #3: TQSL poslužitelj odgovorio je neočekivanim odgovorom. Error #4: There was a TQSL error. Greška #4: Dogodila se TQSL greška. Error #5: There was a TQSLLib error. Greška #5: Dogodila se TQSLLib greška. Error #6: It was not possible to open the input file. Greška #6: Nije bilo moguće otvoriti ulaznu datoteku. Error #7: It was not possible to open the ouput file. Greška #7: Nije bilo moguće otvoriti izlaznu datoteku. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Greška #8: Nijedan QSO nije bio obrađen jer su neki QSOi bili duplikati ili izvan granica nadnevaka. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Greška #9: Neki QSOi su bili obrađeni, a neki ignorirani zbog toga što su bili duplikati ili izvan granica nadnevaka. Error #10: Command syntax error. KLog sent a bad syntax command. Greška #10: Greška sintakse naredbe. KLog je poslao naredbu sa pogrešnom sintaksom. Error #11: LoTW Connection error (no network or LoTW is unreachable). Greška #11: Greška spajanja na LoTW (mreža nije dostupna ili LoTW nije dostupan). Error #00: Unexpected error. Please contact the development team. Greška #00: Neočekivana greška. Molimo kontaktirajte razvijatelje programa. The log that you have selected contains more than just one station callsign. Dnevnik koji ste izabrali sadrži više od samo jednog pozivnog znaka. Please select the station callsign you want to mark as sent to LoTW: Molim izaberite pozivni znak postaje za koju želite označiti kao poslano u LoTW: Station Callsign: Pozivni znak postaje: Define Station Callsign Odrediti pozivni znak postaje Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Unesite pozivni znak za ovaj dnevnik ili ga ostavite praznim za QSO bez definiranog pozivnog znaka postaje: KLog - No station selected KLog - Nijedna postaja nije izabrana No station callsign has been selected and therefore no log will be marked Niti jedan pozivni znak nije izabran i kao takav niti jedan dnevnik neće biti označen Congratulations! Čestitke! You already have the latest version. Već imate najnoviju inačicu. This function is disabled. Go to the Setup->LoTW tab to enable it. Ova funkcija je onemogućena. Idite u Postavke->LoTW karticu i omogućite je. There was an error while updating to Yes the LoTW QSL sent information. Dogodila se greška prilikom postavljanja LoTW QSL poslana podatka na Da. You can find the KLog data folder here: KLog mapa s podacima je ovdje: start pokrenuti stop zaustaviti If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Ako ste sigurni da baza podataka sadrži QSOe i KLog ih nije uspio pronaći, molimo kontaktirajte razvijatelje programa (vidite O Klogu) za pomoć. Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data &Tips ... &About ... About Qt ... Check updates ... About ... No QSOs have been exported to ADIF. Nijedan QSO nije bio izvezen u ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog je izvezao %1 QSOa u ADIF datoteku: %2 You need to select one station callsign to be able to send your log to LoTW. Trebate izabrati jedan pozivni znak postaje kako biste mogli poslati vaš dnevnik u LoTW. KLog - Select the Station Callsign. KLog - Izaberitie pozivni znak postaje. You have requested to delete the QSO with: %1 Zatražili ste da izbrišete QSO sa: %1 Are you sure? Jeste li sigurni? You have requested to delete several QSOs Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv Do you want to do it now? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog - Exit KLog - Izlaz Mark all queued QSOs from this log as sent Check the current callsign in QRZ.com &Debug ... All pending QSOs of this log has been marked as queued for LoTW! Svi QSOi u tijeku u ovom dnevniku označeni su kao poredani za LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Nastao je problem prilikom označavanja svih porednih QSOa u ovom dnevniku kao poredanih za LoTW! Your log has been updated with the LoTW downloaded QSOs. Vaš dnevnik je ažuriran podacima QSOa preuzetih iz LoTWa. KLog has updated %1 QSOs from LoTW. KLog je ažurirao %1 QSOa iz LOTWa. All pending QSOs has been marked as queued for LoTW! Svi poredani QSOi su označeni kao poredani za LoTW! All queued QSOs has been marked as sent to LoTW! Svi QSOi u tijeku su označeni kao poslani u LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Nastao je problem prilikom označavanja svih porednih QSOa u ovom dnevniku kao poslanih u LoTW! It seems that there are no QSOs in the database. Izgleda da u ovoj bazi podataka nema nijednog QSOa. Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Popunjavam DXCC, CQz, ITUz, Kontinent u QSOima... QSO: Callsign Pozivni znak QSO logged from WSJT-X: QSO zabilježen iz WSJT-X: It seems that you are running this version of KLog for the first time. Izgleda da izvršavate ovu inačicu KLoga po prvi put. The setup will be open to allow you to do any new setup you may need. Postavke će biti otvotene kako biste imali priliku da podesite sve što biste mogli trebati. The logfile has been modified. Dnevnička datoteka je bila izmijenjena. Do you want to save your changes? Želite li spremiti svoje izmjene? UDP Server error The UDP server failed to %1. start or stop Greška UDP poslužitelja UDP poslužitelj nije %1. Status of the DX entity. Status DX entiteta. Name of the DX entity. Ime DX entiteta. QSO QSO QSL QSL eQSL eQSL Comment Komentar Others Drugi My Data Moji podaci Satellite Satelit DXCC DXCC Info Podaci Awards Priznanja Search Traži Log Dnevnik DX-Cluster DX-Cluster Save ADIF File Spremi ADIF datoteku The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? LoTW učitavanje je završeno i KLog je napravio datoteku (%1) u vašoj KLog mapi. Želite li da KLog izbriše tu datoteku? The file has been removed. Datoteka je izbrisana. KLog - LoTW KLog - LoTW Open File Otvori datoteku - Needed for DXMarathon - Potrebno za DXMarathon Abort filling Prekini ispunjavanje Number Broj Band Pojas Mode Način rada Print Log Ispiši dnevnik Abort printing Prekini ispis Printing the log... QSO: Ispisujem dnevnik... QSO: The following QSO data has been received from WSJT-X to be logged: QSO sa slijedećim podacima je primljen iz WSJT-Xa kako bi bilo zapisan u dnevnik: Freq Frekv Time On Vrijeme početka Time Off Vrijeme kraja RST TX RST TX RST RX RST RX DX-Grid DX koordinata Local-Grid Lokalna koordinata Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. If the received mode is correct, please contact KLog development team and request support for that mode Ako je ovaj način rada valjan, molimo javite razvijateljima KLoga i zatražite podršku za ovaj način rada KLog - Duplicated satellite KLog - Dupliciran satelit A duplicated satellite has been detected in the file and will not be imported. Duplicirani satelit je otkriven u datoteci i neće biti uvezen. Please check the satellite information file and ensure it is properly populated. Molim provjerite datoteku s podacima o satelitima i osigurajte da je ispravno popunjena. Now you will see a more detailed error that can be used for debugging... Sada ćete vidjeti detaljnije greške koje možete koristiti za otklanjanje neispravnosti... An unexpected error ocurred!! Dogodila se nepredviđena greška!! If the problem persists, please contact the developers Ako problem i dalje traje, molimo javite razvijateljima programa for analysis: za analizu: Error in function Greška u funkciji Error text Tekst greške Failed query Neuspio upit KLog - Show errors KLog - Prikaži pogreške Do you want to keep showing errors? Želite li nastaviti viđati greške? MainWindowInputComment Comment Komentar Add a comment for this QSO. Dodaj komentar za ovaj QSO. Keep this data Spremiti ove podatke Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. MainWindowInputEQSL Date of the ClubLog upload. Datum ClubLog učitavanja. Date of the QRZ.com upload. Date of the eQSL sending. Datum slanja eQSLa. Date of the eQSL reception. Datum prijema eQSLa. Date of the LoTW sending. Datum slanja LoTWa. Date of the LoTW reception. Datum prijema LoTWa. Status on QRZ.com. Status of the LoTW sending. Status slanja LOTWa. Status of the LoTW reception. Status prijema LoTWa. QRZ.com LoTW Sent LoTW Posl LoTW Rec LoTW Prim Status on ClubLog. Status u ClubLogu. Status of the eQSL sending. Status eQSL slanja. Status of the eQSL reception. Status eQSL prijema. ClubLog ClubLog eQSL Sent eQSL poslana eQSL Rec eQSL primljena MainWindowInputOthers Primary Div Primarni Pod Secondary Div Sekundarni Pod IOTA IOTA Entity Entitet Propagation mode Propagacijski mod Others Drugi Keep propagation mode Select the primary division for this QSO. Izaberi primarnu podjelu za ovaj QSO. Select the secondary division for this QSO. Izaberi sekundrnu podjelu za ovaj QSO. Select the entity for this QSO. Izaberi entitet za ovaj QSO. Select the propagation mode for this QSO. Izaberi propagaciju za ovaj QSO. Select the IOTA continent for this QSO. Izaberi IOTA kontinent za ovaj QSO. Select the IOTA reference number for this QSO. Izaberi IOTA referentni broj za ovaj QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nije identificiran Not - Not Identified Nije - Nije identificiran SOTA Ref Age VUCC grids MainWindowInputQSL QSL Sent QSL Poslana QSL Rec QSL Prim QSL Via QSL Preko QSL Msg QSL Por Status of the QSL sending. Status slanja QSLa. Status of the QSL reception. Status prijema QSLa. QSL sending information. Informacija slanja QSLa. QSL reception information. Informacija prijema QSLa. Date of the QSL sending. Datum slannja QSLa. Date of the QSL reception. Datum prijema QSLa. Message of the QSL. QSL poruka. QSL via information. QSL preko podaci. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX frekvencija u MHz. RX Frequency in MHz. RX frekvencija u MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Wata MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Ime QTH QTH DX Locator DX lokator Power(rx) Snaga(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frekv TX Freq RX Frekv RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! RX Frequency in MHz. Frequency is not in a hamradio band! RX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! MainWindowMyDataTab Watts Wata Keep this data Spremiti ove podatke My QTH locator. Moj QTH lokator. Power Snaga Operator callsign Station Callsign Pozivni znak postaje My Locator Moj lokator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Moj QTH lokator. Format bi trebao biti Maidenhead kao IN70AA do 10 znakova. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Spremiti ove podatke Other - Sat not in the list Drugo - Satelit nije na listi Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Ime satelita ako nije na popisu. Odaberite "%1" kako bi omogućili ovu opciju (formata kao AO-51). Satellite mode used. Satelitski način rada korišten. Select the satellite you are using. Izaberite satelit koji koristite. UpLink band. UpLink frekvencijski pojas. DownLink band. DownLink frekvencijski pojas. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokator DX postaje. Ova kućica sinkronizirana je sa kućicom Lokator u QSO odjeljku. UpLink UpLink DownLink DownLink Satellite Satelit Mode Način rada DX Locator DX lokator Other Drugo MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Lokator DX postaje. Format bi trebao biti Maidenhead kao npr. IN70AA do 10 znakova. Not Sat QSO Nije satelitski QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog je otkrio satelit čije ime ne poznaje. Ako je riječ o nekom od poznatih satelita, molim izaberite ga s liste. Inače, molim kontaktirajte razvojni tim da dodaju ime novog satelita. The satellite you have in your QSO is: Satelit kojeg imate u QSOu je: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Pripazite na to da ime satelita neće biti spremljeno ako nije na popisu, tako da informacija može biti izgubljena! RX Frequency in MHz. Frequency is not in a hamradio band! RX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! RX Frequency in MHz. RX frekvencija u MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! TX Frequency in MHz. TX frekvencija u MHz. OnlineMessageWidget The server returned the following error: %1 Not identified Nije identificiran QObject Database Error Greška baze podataka KLog DB needs to be upgraded. Klog baza treba se nadograditi. Do you want to upgrade it now? Želite li nadograditi sada? If DB is not upgraded KLog may not work properly. Ako baza podataka nije nadograđena KLog možda neće ispravno raditi. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Nadogradnja softvera može potencijalno izazvati probleme. Spremanje sigurnosne kopije vaše datoteke prije nadogradnje je uvijek dobra ideja. Do you want to backup your DB now? Želite li spremiti sigurnosnu kopiju vaše baze podataka sad? The backup finished successfully. Spremanje sigurnosne kopije je bilo uspješno. You can find the backup in this file: %1 Sigurnosnu kopiju možete naći u datoteci: %1 The backup was not properly done. Spremanje sigurnosne kopije nije bilo uspješno. You will be sent back to the starting point. Bit ćete poslani na početak. KLog - DB can't be updated automatically KLog - Baza podataka ne može biti automatski nadograđena You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Nadograđujete KLog iz inačice koja je prestara i ova nadogradnja se ne može izvršiti automatski iz te inačice. KLog - DB update KLog - ažuriranje baze podataka KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog je otkrio prijašnji dnevnik u bazi. Svi podaci bit će prenešeni u novi dnevnik DX tipa. KLog: Enter Station callsign KLog: Unesite pozivni znak postaje Enter the station callsign used in this log Unesite pozivni znak koji će biti korišten u ovom dnevniku Station Callsign Pozivni znak postaje QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Prekid ove nadogradnje proizvest će nekonzistentne podatke i mogući gubitak podataka. Želite li još uvijek prekinuti? Progress: Napredak: Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating mode information... Ažuriram podatke o načinu rada... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. Proces nadogradnje je: - Koristeći staru inačicu KLoga izvezite datoteku u ADIF. - Izbrišite logbook.dat datoteku iz vaše KLog mape. - Instalirajte novu inačicu KLoga. - Uvezite vašu ADIF datoteku. KLog će izaći kad kliknete na OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Svi podaci su ispravno prenešeni. Idite u Postavljanje->Postavke->Dnevnici i provjerite da je sve u redu. Abort updating Prekini ažuriranje Updating bands information... Ažuriram podatke o frekvencijskim pojasevima... Updating bands information in %1 status... Ažuriram podatke o frekvencijskim pojasevima za %1 status... Updating mode information in %1 status... Ažuriram podatke o načinu rada za %1 status... New One, work it! nNew One, work it! Novi, odradite! Needed, work it! Treba, odradite! Worked but not confirmed Rađen ali nije potvrđen Confirmed Potvrđeno Not identified Nije identificiran KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Instalacijski čarobnjak prekinut je prije kraja... Do you want to remove the KLog dir from your disk? Želite li izbrisati KLog mapu s vašeg diska? Your KLog dir has been removed Vaša KLog mapa je uklonjena I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Nisam mogao ukloniti vašu KLog mapu. Izbrišite je ručno ako je želite ukloniti s vašeg čvrstog diska. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Vaša KLog mapa nije mogla biti izbrisana. Učinite to ručno ako je želite ukloniti s vašeg čvrstog diska. Remember that your KLog dir is on your system... Podsjetite se da je vaša KLog mapa na vašem sustavu... Thank you for running KLog! Hvala što koristite KLog! Updating information... Ažuriram podatke... Updating DXCC and Continent information... Ažuriram podatke o DXCC i kontinentima... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. Otkriven je prazan pozivni znak. Ako ste u mogućnosti, molim unesite ispravan pozivni znak. KLog - Not valid callsign found KLog - Pronađen nevaljali pozivni znak Date Datum Call Znak RSTtx RSTtx RSTrx RSTrx Band Pojas Comment Komentar Mode Način rada CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contacted Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL poslana Force Init Freq Frekv Freq RX Frekv RX Gridsquare Guest OP HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW Posl Max Bursts Multiplier MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Ime Notes Operator Owner Callsign Pfx Points Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Primljena QSL Sent QSL Poslana QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Ime satelita SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Transmitter id Log number SearchWidget &Clear &Izbriši &Select All Označi &sve &Search &Traži &Export Highlighted Izv&ezi označeno All logs Svi dnevnici Clear the searches. Očisti potrage. Export the search result to an ADIF file. Izvezi rezultat potraga u ADIF datoteku. Select/Unselect all the QSOs shown. Označi/neoznači sve prikazane QSOe. Search in the log. Traži u dnevniku. Search in all logs. Traži u svim dnevnicima. Select the Station Callsign used to do this QSO. Unesite pozivni znak korišten za ovaj QSO. All in log Sve u dnevniku Not defined Nije definiran &Clear selection &Izbriši selekciju Save File Spremi Datoteku You have requested to delete the QSO with: %1 Zatražili ste da izbrišete QSO sa: %1 Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Are you sure? Jeste li sigurni? SearchWindow Date/Time Datum/Vrijeme Band Pojas Mode Način rada QSL Sent QSL Poslana QSL Rcvd QSL Primljena Station Callsign Pozivni znak postaje ID ID Call Znak Date/time Datum/vrijeme Station callsign Pozivni znak postaje QSL Send Pošalji QSL &Delete Iz&briši Delete a QSO Izbriši QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau Pošalji ovu QSL preko biroa D&irect &Izravno Send this QSL via direct Pošalji ovu QSL izravno Via bureau Preko biroa QSL &received via bureau QSL p&rimljena preko biroa Direct Izravno QSL received via direc&t QSL primljena &izravno Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com Check in DXHeat.com Provjeri u DXHeat.com Check this callsign in DXHeat.com Provjeri ovaj pozivni znak u DXHeat.com &Request my QSL Za&traži moju QSL Mark my QSL as requested Označi moju QSL kao zatraženu Via Direct and mark DX QSL as requested Izravno i označi DX QSL kao zatraženu Send this QSL via direct and mark DX QSL as requested Pošalji ovu QSL izravno i označi DX QSL kao zatraženu Via Bureau and mark DX QSL as requested Preko biroa i označi DX QSL kao zatraženu Send this QSL via bureau and mark DX QSL as requested Pošalji ovu QSL preko biroa i označi DX QSL kao zatraženu &Request the QSL Za&traži QSL Mark the QSL as requested Označi QSL zatraženom Via bureau and mark my QSL as requested Preko biroa i označi moju QSL kao zatraženu QSL received via bureau and mark my QSL as requested QSL primljena preko biroa i označi moju QSL kao zatraženu Direc&t and mark as my QSL requested &Izravno i označi moju QSL kao zatraženu QSL received via direct and mark my QSL as requested QSL primljena izravno i označi moju QSL kao zatraženu Needed QSO to send the QSL QSO za koji treba poslati QSL My QSL requested to be sent Moja QSL zatražena za slanje DX QSL pending to be received Prijem DX QSLa u tijeku SetupDialog User data Korisnički podaci Bands/Modes Frekvencijski pojasevi/Načini rada DX-Cluster DX-Cluster Colors Boje Misc Razno World Editor Urednik svijeta Satellites Sateliti HamLib HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Želite li dodati jednu dnevničku datoteku u kartici Dnevnici ili izići iz KLoga? (Kliknite da za dodavanje datoteke ili Ne za izlaz iz KLoga) DB has not been moved to new path. Baza podataka nije bila pomaknuta u novu putanju. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Idite u karticu Razno i kliknite na Makni bazu ili baza podataka neće biti pomaknuta na novu lokaciju. Cancel Poništi OK OK D&X-Cluster D&X-Cluster Log widget eLog WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Trebate unijeti barem jedan dnevnik na kartici Dnevnici. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. Niste izabrali kakvu vrstu dnevnika želite. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Bit ćete preusmjereni na karticu Dnevnici. Izaberite vrstu dnevnika kakvu želite koristiti. Logs Dnevnici World Svijet SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Zemljopisna širina Longitude Zemljopisna dužina UTC UTC Main prefix Glavni prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Mogući prefiksi odvojeni zarezom, npr. EA1, EA2, ... Prefixes Prefiksi Name of the Entity. Ime entiteta. CQ zone. CQ Zona. ITU zone. ITU Zona. Longitude of the Entity. Zemljopisna dužina entiteta. Local time difference to UTC. Razlika lokalnog vremena od UTCa. Main prefix of the entity. Primarni prefiks entiteta. ARRL ID. ARRL ID. Date of the deletion. Datum brisanja. Deleted Izbrisan Cancel Poništi Ok Ok Entity Dialog Dialog entiteta SetupPageBandMode Bands Frekvencijski pojasevi Modes Načini rada SetupPageColors New One Novi Needed in this band Potrebno na ovom frekvencijskom pojasu Worked in this band Rađen na ovom frekvencijskom pojasu Confirmed in this band Confirmed Potvrđeno na ovom frekvencijskom pojasu Default Zadano WSJT-X palette WSJT-X paleta Default palette Uobičajena paleta Dark Mode Color when the DXCC is an ATNO (All Time New One). Boja kad je DXCC ATNO (All Time New One). DXCC is confirmed in this band. DXCC je potvrđen na ovom pojasu. Default color. Uobičajena boja. Sets a palette of colors similar to the one used in WSJT-X. Postavlja paletu boja sličnu onoj korištenoj u WSJT-X. Sets the default palette. Postavlja uobičajenu paletu. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... DXCC je već urađena na drugom frekvencijskom pojasu. Možda je potrebna zbog CQ, ITU, lokatora, ... Worked DXCC, but not confirmed in this band. DXCC odrađen, ali nije potvrđen na ovom opsegu. Sets the Dark Mode Choose a color Izaberite boju SetupPageDxCluster Add Dodaj Delete Izbriši Show &HF spots Show HF spots Prikazati &HF zapažanja Show V/&UHF spots Show V/UHF spots Prikazati V/&UHF zapažanja Show W&ARC spots Show WARC spots Prikazati W&ARC zapažanja Show &worked spots Show worked spots Prikazati od&rađena zapažanja Show &confirmed spots Show confirmed spots Prikazati p&otvrđena zapažanja Show ANN/&FULL messages Show ANN/FULL messages Prikazati ANN/&FULL poruke Show WW&V messages Show WWV messages Prikatati &WWV poruke Show WC&Y messages Show WCY messages Prikazati WC&Y poruke Save DX Cluster activity Spremi aktivnost na DX klasteru Saves all the DX-Cluster activity to a file in the KLog folder Sprema svu aktivnost na DX klasteru u datuteku u KLogovoj mapi DX Spots DX zapažanja Others Drugi Messages Poruke KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Dodaj DX-Cluster poslužitelj Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Dodaj adresu iza koje je :port Primjer: dxfun.com:8000 Ako ne dodate port, 41112 se podrazumijeva: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Unesite e-mail s kojim ste registrirani u ClubLogu. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Šalji svaki QSO u ClubLog u realnom vremenu, kako su dodavani (ili mijenjani) u KLogu. Starts the ClubLog support in KLog. Pokreće ClubLog podršku u KLogu. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW LoTW Upload Download TQSL path Use TQSL Koristi TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Unesite zaporku za LoTW. Upozorenje: Zaporka će biti spremljena nešifrirana u KLog-ovoj datoteci s postavkama! (Ako ne želite unijeti zaporku, KLog će vas pitati kad je bude trebao.) Path to the TQSL software. Putanja do TQSL programa. Enable the LoTW integration with TQSL. You will need to have TQSL installed Omogući LoTW integraciju preko TQSLa. Morate imati TQSL instaliran Select File Izaberite datoteku SetupPageHamLib Activate HamLib Aktiviraj HamLib Activates the hamlib support that will enable the connection to a radio. Aktivira hamlib podršku koja omogućava spajanje na radio. Read-Only mode Samo čitaj If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Ako je omogućeno, KLog će čitati frekvenciju i način rada od radija ali mu nikad neće slati nikakvu naredbu. Radio Radio Select your rig. Izaberite vaš uređaj. Serial Network Defines the interval to poll the radio in msecs. Definira interval provjere radio uređaja u milisekundama. Poll interval Interval provjere Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New New &Novo &Edit Ur&edi &Remove Izb&risati KLog KLog Do you really want to remove this log? Želite li zaista ukloniti ovaj dnevnik? Operators Operateri An error has occurred showing the following error code: Nastupila je greška sa sljedećim kodom: Log has not been removed. (#3) Dnevnik nije bio izbrisan (#3) Add a new log. Dodaj novi dnevnik. Edit the selected log. Uredi izabrani dnevnik. Remove the selected log. Izbriši izabrani dnevnik. All the QSOs from this log will also be deleted... Svi QSOi iz ovog dnevnika će biti izbrisani... Log has not been removed. (#2) Dnevnik nije bio izbrisan (#2) Log has not been removed. (#1) Dnevnik nije bio izbrisan (#1) QSOs QSOi The new log could not be created. Nije bilo moguće otvoriti novi dnevnik. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Pozivni znak postaje Comments Komentari Date Datum SetupPageLogsNew &Ok &Ok &Cancel &Poništi &Date &Datum &Station Callsign Pozivni znak po&staje &Operators &Operateri Comm&ent Kom&entar Callsign used for this log. Pozivni znak korišten za ovaj dnevnik. Comma separated list of operators: callsign1, callsign2. Lista operatera odvojenih zarezom: pozivni1, pozivni2. Start date of this log. Datum početka ovog dnevnika. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Unesite komentar o ovom dnevniku. Ako je unešen, bit će prikazan u KLogu za identifikaciju dnevnika. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system Imperial system &Imperialni sustav &Log in real time Log in real time &Dnevnik u stvarnom vremenu &Time in UTC Time in UTC Vrijeme u U&TC &Save ADIF on exit Save ADIF on exit &Spremi ADIF Datoteku pri izlasku Use this &default filename Use this default filename Koristi ovu &podrazumijevanu datoteku Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Označi &QSO za slanje QSL kad je QSL primljena Complete QSO with previous data Popuni QSO prijašnjim podacima Manage DX-Marathon Upravljanje DX Marathonom Activate the application debug log Aktivirajte poruke za otkrivanje greški u aplikaciji &Delete always temp ADIF file after uploading QSOs Move DB Makni bazu podataka In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Označite za imperijalni sustav (milje umjesto kilometara). Select to use the following name for the logfile without being asked for it again. Označite za korištenje sljedećeg imena za dnevničku datoteku bez da ste za to ponovo upitani. Select if you want to manage DX-Marathon. Označite ako želite upravljati DX Marathonom. This is the default file where ADIF data will be saved. Ovo je zadana datoteka u koju će se spremati ADIF podaci. This is the directory where the database (logbook.dat) will be saved. Ovo je mapa u koju će se spremiti baza podataka (logbook.dat). Click to change the path of the database. Kliknite za promjenu putanje baze podataka. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivira poruke za otkrivanje greški u aplikaciji. Ovo može biti korisno ako nešto ne radi kako treba. Datoteka će biti zapisana u KLogovoj mapi. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Kliknite kako bi uobičajeno označili kao poredane (za slanje) sve eQSL (LoTW i eQSL) u svim novim QSOima. Delete Always the adif file created after uploading QSOs Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. Molim odaberite postojeću mapu gdje će baza podataka (logbook.dat) biti spremljena. This is the directory where DB (logbook.dat) will be saved. Ovo je mapa u koju će baza podataka (logbook.dat) biti spremljena. Check non-valid calls Mark sent eQSL && LoTW in new QSO as queued Označite poslane eQSL i LoTW u novim QSOima kao poredane Click to change the default ADIF file. Kliknite za promjenu zadane ADIF datoteke. Click to move the DB to the new directory. Kliknite za micanje baze podataka u novu mapu. Select Directory Izaberite mapu KLog - Move DB KLog - Pomakni bazu podataka File moved Datoteka maknuta File copied Datoteka kopirana File already exist. Datoteka već postoji. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Odredišna datoteka već postoji i KLog je neće prebrisati. Molim izbrišite odredišnu datoteku prije micanja datoteke u KLogu kako biste osigurali da KLog može kopirati datoteku. File NOT copied Datoteka NIJE kopirana The file was not copied due to an unknown problem. Datoteka nije kopirana uslijed nepoznatog problema. The target directory does not exist. Please select an existing directory. Ciljna mapa ne postoji. Molim izaberite postojeću mapu. Show the Station &Callsign used in the search box Pokazati pozivni znakl &postaju korištenu u kućici za pretraživanje &Check for new versions automatically &Provjeri za nove verzije automatski QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSOi će biti označeni kao neriješeni za slanje QSLke ako primite DX QSLku a niste poslali vašu. Check if there is a new release of KLog available every time you start KLog. Provjeri je li dostupna nova inačica KLoga svaki put kad pokreneš KLog. &Provide Info for statistics &Pruži podatke za statistiku The search box will also show the callsign on the air to do the QSO. Polje za pretraživanje će također pokazati pozivnu oznaku u eteru za uraditi QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Ako označite provjeru nove inačice, KLog će razvijatelju progama poslati vašu pozivnu oznaku, inačicu KLoga i operacijski sustav u svrhu unaprijeđivanja KLoga. Select to use real time. Označite da koristite stvarno vrijeme. Select to use UTC time. Izaberite za korištenje UTC vremena. Select if you want to save to ADIF on exit. Označite ako želite snimiti u ADIF formatu prije izlaska. Complete the current QSO with previous QSO data. Popuni trenutni QSO podacima prijašnjeg QSOa. Browse Razgledavanje Open File Otvori datoteku SetupPageSats &New &Novo &Edit Ur&edi &Remove Izb&risati &Import &Uvoz E&xport &Izvoz Add a new satellite. Dodaj novi satelit. Edit the selected satellite. Uredi izabrani satelit. Remove the selected satellite. Izbriši izabrani satelit. Export your current satellites to a file. Izvezite vaše trenutne satelite u datoteku. Select the sat you want to open. Izaberite satelit koji želite otvoriti. KLog KLog Do you really want to remove this satellite? Želite li zaista izbrisati ovaj satelit? Import a satellites file. It will replace the satellites you have in the current list. Uvezi datoteku sa satelitima. To će zamijeniti satelite koje trenutno imate na listi. This satellite will no be longer available to be selected ... Ovaj satelit više neće moći biti izabran ... Sat has not been removed. (#3) Satelit nije bio izbrisan (#3) Sat has not been removed. (#2) Satelit nije bio izbrisan (#2) Sat has not been removed. (#1) Satelit nije bio izbrisan (#1) ID ID Short Kratko Name Ime Uplink Leaving original here makes more sense Uplink Downlink Leaving original here makes more sense Downlink Modes Načini rada An error has occurred showing the following error code: Nastupila je greška sa sljedećim kodom: KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Otvori datoteku sa satelitima KLog warning Klog upozorenje An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Dogodila se neočekivana pogreška prilikom uvoza podataka o satelitima. Moguće je da datoteka koju pokušavate uvesti nije u ispravnom obliku. Please check the format or contact the developer for analysis with the error code: Molim provjerite format ili kontaktirajte razvijatelja za analizu koda greške: Save Satellites File Spremi datoteku sa satelitima SetupPageSatsNew Short name Kratko ime Sat name Ime satelita UpLink UpLink DownLink DownLink Modes Načini rada &Ok &Ok &Cancel &Poništi Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Unesite kratko ime. Pokušajte koristiti kratko ime sa LoTWa kako biste poslije mogli učitati QSOe u LoTW. Enter the name of the satellite. Unesite ime satelita. Enter the uplink frequencies in this format: 144.300 Unesite uplink frekvenciju u ovom formatu: 144.300 Enter the downlink frequencies in this format: 144.300 Unesite downlink frekvenciju u ovom formatu: 144.300 Enter the modes in this format: USB Unesite načine rada u ovom formatu: USB Some of the data you have entered is not correct; the satellite can't be added. Neki od podataka koje ste unijeli nije valjan; satelit ne može biti dodan. SetupPageSubdivisionNew &Date &Datum &Station Callsign Pozivni znak po&staje &Operators Comm&ent Kom&entar &Ok &Ok &Cancel &Poništi Callsign used for this log. Pozivni znak korišten za ovaj dnevnik. Comma separated list of operators: callsign1, callsign2. Lista operatera odvojenih zarezom: pozivni1, pozivni2. Start date of this log. Datum početka ovog dnevnika. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Unesite komentar o ovom dnevniku. Ako je unešen, bit će prikazan u KLogu za identifikaciju dnevnika. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Izb&risati Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Dnevnik nije bio izbrisan (#3) Log has not been removed. (#2) Dnevnik nije bio izbrisan (#2) Log has not been removed. (#1) Dnevnik nije bio izbrisan (#1) ID ID Name Ime Short Name CQ Zone CQ Zona ITU Zone ITU Zona Deleted Start Date End Date DXCC DXCC An error has occurred showing the following error code: Nastupila je greška sa sljedećim kodom: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Pokreni UDP poslužitelj Automatically log QSOs from WSJT-X Automatski zapisuj QSOe iz WSJT-X Allow WSJT-X to send logged QSOs to KLog Dozvoli WSJT-X da šalje QSOe za zapisivanje u KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSOi zapisani u WSJT-X biti će poslani u KLog i KLog će pitati prije upisivanja u KLog osim ako je "%1" označeno KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Klog će automatski zapisivati nadolazeće QSOe iz WSJT-X bez ikakve ručne potvrde. Update status information from WSJT-X Obnovi informaciju o statusu iz WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog će automatski prikazati i ažurirati podatke koji dolaze iz WSJT-X (DX pozivni znak, izvještaj, način rada...) UDP port number where the UDP Server will listen for packets. UDP port na kojem će UDP poslužitelj slušati za pakete. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Budite sigurni da je isto port na koji i ostali programi šalju podatke. Uobičajeni port je 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP poslužitelj će primiti QSOe poslane iz drugih programa kao na primjer WSJT-X što će vam omogućiti automatsko zapisivanje iz tih programa u KLog. UDP Port UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Istek QSO obavijesti (milisekunde) Miliseconds that the notification of QSOs received from WSJTX will be shown. Milisekunde za koje će obavijest QSOa pristiglih iz QSJTX biti prikazana. SetupPageUserDataPage &Personal data Personal data Osobni &podaci Station &data Station data Podaci &postaje &Name Name &Ime &Address Address &Adresa Cit&y City &Grad &Zip Code Zip Code &Poštanski kod Pro&v/State Prov/State Županija/&Regija Countr&y Country &Zemlja Enter your information for rig Unesite podatke o vašoj postaji Enter your information for antenna Unesite podatke o vašoj anteni Enter your name. Unesite vaše ime. Enter your address - 1st line. Unesite vašu adresu - 1. red. Enter your address - 2nd line. Unesite vašu adresu - 2. red. Enter your address - 3rd line. Unesite vašu adresu - 3. red. Enter your address - 4th line. Unesite vašu adresu - 4. red. Enter your city. Unesite vaš grad. Enter your zip code. Unesite vaš poštanski kod. Enter your province or state. In Croatian language both "country" and "state" translate to "država", there is no concept similar to that of US states as being parts of the country. Unesite vašu pokrajinu ili županiju. Enter your country. Unesite vašu državu. Enter your power information. Unesite potatke o vašoj snazi. &Rig 1 &Radio uređaj 1 R&ig 2 R&adio uređaj 2 Ri&g 3 Ra&dio uređaj 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer &Snaga Enter the station callsign that will be used for logging. Unesite pozivni znak postaje koji će biti korišten za zapisivanje dnevnika. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Unesite lokator vaše postaje. Alternativno, KLog može koristiti približan lokator na osnovu vašeg pozivnog znaka. &Callsign &Operators &Operatori &CQ Zone &CQ Zona &ITU Zone &ITU Zona &Locator &Lokator &Locator (not valid) &Lokator (neispravan) Enter the operators (comma separated if more than one). Unesite operatere (odvojene zarezom ako je više od jednog). SetupPageWorldEditor KLog will not be able to show entities information. KLog neće moći prikazati podatke o entitetima. Prefix Prefiks Entity Entitet An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Datoteka s podacima o entitetima (cty.csv) pronađena u vašoj KLog mapi bit će učitana. Add Dodaj Delete Izbriši Edit Uredi Export World Izvezi svijet Import World Uvezi svijet Still not implemented. Još neimplementirano. Import a new cty.csv file Uvezi novu cty.csv datoteku No entities information file (cty.csv) has been detected in your KLog folder. Datoteka s podacima o entitetima (cty.csv) ne postoji u vašoj KLog mapi. ARRL ID ARRL ID Continent Kontinent CQ Zone CQ Zona ITU Zone ITU Zona UTC UTC Latitude Širina Longitude Dužina Deleted Izbrisano Since Date Od datuma To Date Do datuma Open File Otvori datoteku BigCTY (*.csv) VelikiCTY (*.csv) Entities information has been updated. Podaci o entitetima su ažurirani. Entities information has not been updated. Podaci o entitetima nisu ažurirani. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Za ove QSOe ste primili LoTW potvrdu. Ok Ok DX DX Date/Time Datum/Vrijeme Band Pojas Mode Način rada ShowErrorDialog KLog Message KLog poruka SoftwareUpdateDialog Ok Ok KLog update KLog nadogradnja <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Čestitke! Your KLog has been updated. Vaš KLog je ažuriran. You already have the latest version. Već imate najnoviju inačicu. StartWizard KLog - The free hamradio logging program KLog - slobodna dnevnička aplikacija za radio-amatere Quit Setup Izađi iz postavljanja Setup is not complete yet. Are you sure you want to quit setup? Postavljanje nije završeno. Jeste li sigurni da želite izaći iz postavljanja? StatisticsWidget QSO per year QSOi po godini DXCC per year DXCC po godini CQ zones per year CQ zone po godini QSO per band QSOi po frekv. pojasu QSO per mode QSOi po načinu rada QSO per DXCC QSOi po DXCCu QSO per Continent QSOi po kontinentu QSO per hour QSOi po satu QSO per month QSOi po mjesecu Worked / Confirmed status Odrađen / potvrđen status Worked / Sent status Odrađen / poslan status Sent / Confirmed status Poslan / potvrđen status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ zona po godini Reading data ... Učitavam podatke ... Abort reading Prekini čitanje CQ zones CQ zone CQ zones per year CQ zone po godini Reading data ... Učitavam podatke ... Years: %1/%2 Godine: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Broj Callsign Pozivni znak Date Datum Band Pojas Mode Način rada DXCC DXCC Satellite Satelit Confirmed Potvrđeno No Ne StatsEntitiesPerYearBarChartWidget Chart title Naslov dijagrama Reading data ... Učitavam podatke ... Abort reading Prekini čitanje DXCC Entities DXCC Entiteti DXCC Entities per year DXCC Entiteti po godini Reading data ... Učitavam podatke ... Entities: Entiteti: StatsFieldPerBandWidget All Svi Mode: Band Pojas Worked Rađeno Confirmed Potvrđeno StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Broj Callsign Pozivni znak Date Datum Band Pojas Mode Način rada Grid Satellite Satelit Confirmed Potvrđeno No Ne StatsQSOsPerBandBarChartWidget QSOs per band QSOi po pojasu Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Bands Pojasevi QSOs per band distribution Raspodjela QSOa po opsezima Reading data ... Učitavam podatke ... Bands: Pojasevi: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOi po kontinentu Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Continents Kontinenti Reading data ... Učitavam podatke ... Hours: Sati: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOa po DXCC Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Reading data... Učitavam podatke ... DXCC DXCC Top ten DXCC per QSO Gornjih deset DXCCa po QSOu StatsQSOsPerHourBarChartWidget QSOs per hour QSOa po satu Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Hours Sati QSOs at hour QSOa na sat Reading data ... Učitavam podatke ... Hours: Sati: StatsQSOsPerModeBarChartWidget QSOs per mode QSOi po načinu rada Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Modes Načini rada QSOs per mode distribution Raspodjela QSOa po načinu rada Reading data ... Učitavam podatke ... Modes: Načini rada: StatsQSOsPerMonthBarChartWidget QSOs per month QSOa po mjesecu Reading data ... Učitavam podatke ... Abort reading Prekini čitanje Jan Sij Feb Velj Mar Ožu Apr Tra May Svi Jun Lip Jul Srp Sep Ruj Oct Lis Nov Stu Dec Pro Aug Kol Months Mjeseci QSOs at Month QSOi na mjesec Reading data ... Učitavam podatke ... Months: Mjeseci: StatsQSOsPerYearBarChartWidget Reading data ... Učitavam podatke ... Abort reading Prekini čitanje QSOs QSOi QSOs per year QSOi po godini Reading data ... Učitavam podatke ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Poslano - %1 Confirmed - %2 Potvrđeno - %2 Sent / Confirmed status Poslan / potvrđen status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Odrađeno, nije potvrđeno - %1 Confirmed - %2 Potvrđeno - %2 Worked / Confirmed status Odrađen / potvrđen status StatsWorkedSentPieChartWidget Worked - %1 Rađeno - %1 Sent - %2 Poslano - %2 Worked / Sent status Odrađen / poslan status TipsDialog KLog tips KLog savjeti Next Idući Previous Prethodni <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Savjet #1:</b><br>Znate li...<br>Možete koristiti <a href="#ToolsFillInQSO">Alati->Popuni QSO podatke</a>kako bi automatski pročitali cijeli dnevnik i popunili DXCC, CQ, ITU zone i kontinent? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Savjet #3:</b><br>Znate li...<br>Možete koristiti <a href="#ToolsFindQSO2QSL">Alati->Nađi QSO za QSL</a> za pronalaženje svih QSOa za koje bi trebali poslati vašu QSLku jer još uvijek trebate potvrditi taj DXCC a još uvijek niste poslali vašu QSL kartu? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Savjet #7:</b><br>Znate li...<br>Možete naći QSLe koje još uvijek trebate poslati korištenjem <a href="#ToolsSendPendingQSL">Alati->QSL alati...->Nađi Moje-QSL za koje je slanje neodlučeno</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Poslana označenim kao <i>Zatražena</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Savjet #5:</b><br>Znate li...<br>Možete unijeti '*' u polje za pretragu, u prozoru za pretragu kako biste našli sve QSOe sa određenom postajom? {4:?} <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Savjet #6:</b><br>Znate li...<br>Možete naći datoteku koja sadrži vaš dnevnik i ostale podatke u datoteci logbook.dat i klogrc datoteku, koja sadrži KLog konfiguraciju u KLog mapi otvarajući izbornik <a href="#FileOpenKLogFolder">Datoteka->KLog mapa</a>? {5:?} <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Savjet #20:</b><br>Jeste li znali...<br>Možete vidjeti QSO koji potvrđuje određeni DXCC entitet na određenom frekvencijskom pojasu držeći miša iznad tog frekvencijskog pojasa u DXCC alatki? {7:?} <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Savjet #8:</b><br>Znate li...<br>Možete naći QSLke koje još uvijek očekujete korištenjem <a href="#ToolsReceivePendingQSL">Alati->QSL alati...->Nađi DX-QSL za koje je prijem neodlučen</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Poslana označene kao <i>Poslana</i> za koje još niste primili QSL karticu od DX postaje. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Savjet #9:</b><br>Znate li...<br>Možete naći QSLke koje još uvijek očekujete korištenjem <a href="#ToolsReceiveRecPendingQSL">Alati->QSL alati...->Nađi zatražene neodlučene za prijem</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Primljena označene kao <i>Zatražena</i> za koje još niste primili QSL karticu od DX postaje. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Savjet #10:</b><br>Znate li...<br>Možete se pretplatiti na <a href=https://t.me/klogchat>englesku KLog Telegram grupu</a> za diskusije o KLogu na engleskom jeziku? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Savjet #11:</b><br>Znate li...<br>Možete se pretplatiti na <a href=https://t.me/KLogES>španjolsku KLog Telegram grupu</a> za diskusije o KLogu na španjolskom jeziku? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Savjet #13:</b><br>Znate li...<br>Možete <a href=https://twitter.com/_ea4k>pratiti EA4K na twitteru</a> kako bi dobili obavijesti o KLogu? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Savjet #14:</b><br>Znate li..<br>Možete napisati vlastitu <a href=https://www.eham.net/reviews/detail/3118>recenziju o KLogu na eHam.net</a> kako bi pomogli drugim korisnicima odlučiti da koriste KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Savjet #15:</b><br>Znate li...<br>Možete se pridružiti razvojnom timu jednostavno tako da nas <a href=https://www.klog.xyz/contact>Kontaktirate</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Savjet #16:</b><br>Znate li...<br>Postoji mnogo načina na koje možete doprinijeti KLogu a neki od njih navedeni su na <a href=https://www.klog.xyz/contrib>KLog Doprinesi</a> stranici? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Savjet #17:</b><br>Znate li...<br>Možete pomoći prijevodu KLoga na vaš jezik? Molim pogledajte <a href=https://www.klog.xyz/contrib/translations>KLog Prijevodi</a> stranicu. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Savjet #18:</b><br>Znate li...<br>Možete dvostruko kliknuti na ime entiteta u DXCC tablici i svi QSOi s tim DXCC entitetom bit će prikazani u kućici za pretraživanje? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Savjet #19:</b><br>Jeste li znali...<br>Možete napraviti desni klik na QSO i izabrati <i>Provjeri na QRZ.com</i> kako biste provjerili taj pozivni znak na QRZ.com? UpdateSatsData Reading Satellites data file... Učitavam podatke o satelitima... Abort reading Prekini čitanje The Satellites information has been updated. Podatci o satelitima su ažurirani. Open File Otvori datoteku Sat Data Sat podaci World Entity Entitet Continent Kontinent Abort reading Prekini čitanje Reading cty.csv... Čitam cty.csv... WorldMapWidget World map Karta svijeta View Pogled Zoom In(25%) Povećaj(25%) Zoom Out(25%) Umanji(25%) Normal Size Izvorna veličina Fit to window Prilagodi prozoru eLogClubLog Host not found! Stroj nije nađen! Timeout error! Greška prekoračenja vremena! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Undefined error... Nedefinirana pogreška... Callsign missing Nedostaje pozivni znak Invalid callsign Nevaljali pozivni znak Skipping SWL callsign Preskačem SWL pozivni znak Callsign is your own call Callsign is your ow call Pozivni znak je vaš vlastiti pozivni znak Invalid callsign with no DXCC mapping Nevaljali pozivni znak bez DXCC veze Updated QSO QSO ažuriran Invalid ADIF record Nevaljali ADIF zapis Missing ADIF record Nedostajeći ADIF zapis Test mode - parameters ok, no action taken Test način rada - parametri su u redu, nikakva akcija nije poduzeta Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Excessive API Usage Prekomjereno korištenje APIa Internal Error Interna pogreška Rejected I am not sure about the context, this is the masculine version of "rejected" Odbačen QSO Duplicate Duplicirani QSO QSO Modified QSO ažuriran Missing Login Nedostaje Login QSO OK QSO OK Upload denied Snimanje podataka na poslužitelj odbijeno No callsign selected Niti jedan pozivni znak nije označen No match found Ništa podudarajuće nije nađeno Dropped QSO Ispušten QSO OK OK Login rejected Login odbijen Rejected: Callsign is your own call Odbijeno: pozivni znak je vaš vlastiti pozivni znak eLogQrzLog Host not found! Stroj nije nađen! Timeout error! Greška prekoračenja vremena! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Nedostaje pozivni znak eQSLUtilities Host not found! Stroj nije nađen! Timeout error! Greška prekoračenja vremena! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-1.8.6/tipsdialog.cpp0000644000175000017500000003114714166020407014313 0ustar develdevel/*************************************************************************** tipsdialog.cpp - description ------------------- begin : sept 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "tipsdialog.h" #include #include #include #include #include #include TipsDialog::TipsDialog(QWidget *parent): QDialog(parent) { //qDebug() << "TipsDialog::TipsDialog" << QT_ENDL; logSeverity = Info; //7 Debug /0=emergency or no debug emit debugLog (Q_FUNC_INFO, "Start", Debug); tipTextQLabel = new QLabel; //tipTextEdit = new QTextEdit; //tipTextEdit->setReadOnly(true); //tipTextEdit->setWordWrapMode(QTextOption::WordWrap); tipId = 1; tipMax = 19; //QPixmap pixmap(":/img/klog_256x256.png"); setWindowTitle(tr("KLog tips")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); //description = tr("KLog is a free logbook for hamradio operators.") ; //tipTextEdit->setHtml(description); //tipTextQLabel->setText(description); tipTextQLabel->setWordWrap(true); tipTextQLabel->setOpenExternalLinks(false); tipTextQLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); tipTextQLabel->setTextFormat(Qt::RichText); setTip(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); QPushButton *nextButton = new QPushButton; QPushButton *prevButton = new QPushButton; nextButton->setText(tr("Next")); prevButton->setText(tr("Previous")); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); buttonBox->addButton(prevButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::ActionRole)); buttonBox->addButton(nextButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::ActionRole)); //connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())) ; connect(prevButton, SIGNAL(clicked()), this, SLOT(slotPrevButtonClicked() ) ); connect(nextButton, SIGNAL(clicked()), this, SLOT(slotNextButtonClicked() ) ); connect(tipTextQLabel, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString))); //QLabel *logoLabel = new QLabel; //logoLabel->setPixmap(pixmap); tip = new QWidget; QGridLayout *layout1 = new QGridLayout; //layout1->addWidget(logoLabel , 0, 0, 1, 1); layout1->addWidget(tipTextQLabel, 0, 1, 4, 4); tip->setLayout(layout1); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(tip); layout->addWidget(buttonBox); //layout->setSizeConstraint(QLayout::SetNoConstraint); setLayout(layout); //qDebug() << "TipsDialog::TipsDialog - END" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } TipsDialog::~TipsDialog(){} void TipsDialog::slotPrevButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); if (tipId>1) { tipId--; } else { tipId = tipMax; } setTip(tipId); emit debugLog (Q_FUNC_INFO, "END", Debug); } void TipsDialog::slotNextButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); if (tipIdsizeHint(); //qDebug() << "TipsDialog::setTip: Height: " << QString::number(_t) <Fill in QSO data description = tr("Tip #1:
Do you know...
You can use Tools->Fill in QSO data to automatically read the full log to fill the DXCC, CQ, ITU zones and continent?"); break; case 2: //: Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data description = tr("Tip #2:
Do you know...
You can find the QSLs that you still need to send with Tools->QSL tools...->Find My-QSLs pending to send.
This tool will list you in the search box all the QSOs with the QSL-Sent marked as Requested."); break; case 3: //: Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL description = tr("Tip #3:
Do you know...
You can use Tools->QSL tools...->Find QSO to QSL to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card?"); break; case 4: //: Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... description = tr("Tip #4:
Do you know...
You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign?"); break; case 5: description = tr("Tip #5:
Do you know...
You can find the file containing all your log and other information in the logbook.dat " "file and the klogrc file, containing the KLog config file in the KLog folder by opening the" " File->KLog folder menu?"); break; case 6: //: Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder description = tr("Tip #6:
Do you know...
You can upload your QSO marked as queued to LoTW via TQSL with Tools->LoTW tools ...->Sends the log to LoTW calling TQSL. ?

You have to configure TQSL in the preferences to be able to use this functionality."); break; case 7: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send description = tr("Tip #7:
Do you know...
You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget?"); break; case 8: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive description = tr("Tip #8:
Do you know...
You can find the QSLs that you are still waiting for with Tools->QSL tools...->Find DX-QSLs pending to receive.
This tool will list you in the search box all the QSOs with the QSL-Sent marked as Sent but you have still not received the QSL card from the DX."); break; case 9: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive description = tr("Tip #9:
Do you know...
You can find the QSLs that you are still waiting for with Tools->QSL tools...->Find requested pending to receive.
This tool will list you in the search box all the QSOs with the QSL-Rec marked as Requested but you have still not received the QSL card from the DX."); break; case 10: description = tr("Tip #10:
Do you know...
You can subscribe to the English KLog Telegram group to discuss about KLog in English?"); break; case 11: description = tr("Tip #11:
Do you know...
You can subscribe to the Spanish Telegram group to discuss about KLog in Spanish?"); break; case 12: description = tr("Tip #12:
Do you know...
You can subscribe to KLog mailing list to discuss via email about KLog in English?"); break; case 13: description = tr("Tip #13:
Do you know...
You can follow EA4K on twitter to get updates about KLog?"); break; case 14: description = tr("Tip #14:
Do you know...
You can write your own review in eHam.net about KLog to help other users to decide to use KLog?"); break; case 15: description = tr("Tip #15:
Do you know...
You can join the development team by simply Contacting us?"); break; case 16: description = tr("Tip #16:
Do you know...
That there are many ways to contribute to KLog and some of them are listed in the KLog Contribute page?"); break; case 17: description = tr("Tip #17:
Do you know...
You can support translating KLog into your language? Please check KLog Translations page."); break; case 18: description = tr("Tip #18:
Do you know...
You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box?"); break; case 19: description = tr("Tip #19:
Do you know...
You can right-click on a QSO and select Check in QRZ.com to check that callsign in QRZ.com?"); break; default: //description = tr("TIP-Default: Text"); description = ""; break; } //tipTextEdit->setHtml(description); tipTextQLabel->setText(description); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "TipsDialog::setTip: END" << QT_ENDL; } void TipsDialog::slotLinkActivated(const QString &_link) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "TipsDialog::slotLinkActivated: " << _link << QT_ENDL; //Comprobar el enalce y activar el menu correspondiente if (_link == "#ToolsFillInQSO") { emit fillInQSOSignal(); } else if (_link == "#ToolsFindQSO2QSL") { emit fillInDXCCSignal(); } else if (_link == "#ToolsFillInDXCC") { emit findQSL2QSOSignal(); } else if (_link == "#FileExportQSLADIFToPrint") { emit fileExportToPrintSignal(); } else if (_link == "#FileExportLoTWADIF") { //emit fileExportForLoTWSignal(); } else if (_link == "#FileOpenKLogFolder") { emit fileOpenKLogFolderSignal(); } else if (_link == "#ToolsSendPendingQSL") { emit toolSendPendingQSLSignal(); } else if (_link == "#ToolsReceivePendingQSL") { emit toolRecPendingQSLSignal(); } else if (_link == "#ToolsReceiveRecPendingQSL") { emit toolRecRecPendingQSLSignal(); } else if (_link == "#ToolsUploadLoTW") { emit toolsUploadLoTWSignal(); } emit debugLog (Q_FUNC_INFO, "END", Debug); } klog-1.8.6/elogqrzlog.cpp0000644000175000017500000006564214166020421014344 0ustar develdevel/*************************************************************************** elogqrzlog.cpp - description ------------------- begin : nov 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "elogqrzlog.h" #include #include #include #include //#include eLogQrzLog::eLogQrzLog(DataProxy_SQLite *dp, const QString &_parentFunction, const QString &_klogVersion) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _parentFunction; #endif klogVersion = _klogVersion; dataProxy = dp; errorWhileSendingLog = false; sendingQSO = false; lastQSO = false; subscriptionOK = true; qsos.clear(); sessionkey = QString(); logbookkey = QString(); onlineMessage = new OnlineMessageWidget; currentQSO = -1; manager = new QNetworkAccessManager(this); managerLog = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotManagerFinished(QNetworkReply*))); connect(managerLog, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotManagerLogFinished(QNetworkReply*))); uploadingFile = false; logged = false; util = new Utilities; serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); //serviceUrl = QUrl("https://xmldata.qrz.com/xml/1.31/ "); //qDebug()<< "eLogQrzLog::eLogQrzLog - END" << QT_ENDL; } eLogQrzLog::~eLogQrzLog() { showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::showDebugLog(const QString &_func, const QString &_log) { #ifdef QT_DEBUG //qDebug() << _func << ": " << _log; #else #endif } void eLogQrzLog::setLogBookKey(const QString &_key) { //qDebug()<< "eLogQrzLog::setLogBookKey: " << _key << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: key: " + _key); if (_key.length()>0) { logbookkey = _key; } showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::parseNetworkError(QNetworkReply::NetworkError _error) { showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(_error)); QString text; switch (_error) { case QNetworkReply::NoError: break; case QNetworkReply::HostNotFoundError: text = "QRZ.com: " + tr("Host not found!"); break; case QNetworkReply::TimeoutError: text = "QRZ.com: " + tr("Timeout error!"); break; default: text = "QRZ.com: " + tr("Undefined error number (#%1)").arg(_error); } //return text; QMessageBox::warning(nullptr, tr("KLog - QRZ.com"), tr("We have received the following error from QRZ.com (%1)").arg(result) + "\n" + text, QMessageBox::Ok); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotManagerLogFinished(QNetworkReply *data) { //qDebug()<< "eLogQrzLog::slotLogManagerFinished" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start"); sendingQSO = false; result = data->error(); //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result) << QT_ENDL; const QByteArray sdata = data->readAll(); //qDebug() << "eLogQrzLog::slotManagerLogFinished: Received: " << sdata; QString text = QString(); //qDebug() << "eLogQrzLog::slotManagerLogFinished - 00010" << QT_ENDL; if (result == QNetworkReply::NoError) { QString dataReply(sdata); //parseAppAnswer(1, dataReply); parseAppAnswer(dataReply); showDebugLog (Q_FUNC_INFO, "No error"); //qDebug()<< "eLogQrzLog::slotManageLogFinished - NO ERROR" << QT_ENDL; } else { parseNetworkError(result); //emit disableQRZAction(true); } if (lastQSO) { lastQSO = false; sendSignal(result, qsos); } //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result) << QT_ENDL; //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result Text = " << text << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Text: " + text); emit showMessage(text); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::parseXMLAnswer(QXmlStreamReader &xml) { //qDebug() << Q_FUNC_INFO << xml.text(); showDebugLog (Q_FUNC_INFO, "Start: " + xml.text()); QString tdata = QString(); while (!xml.atEnd()) { tdata.clear(); QXmlStreamReader::TokenType t = xml.readNext(); if (t == QXmlStreamReader::StartDocument) { //qDebug() << Q_FUNC_INFO << " - quick read version: " << xml.documentVersion().toString() << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - quick read encoding: " << xml.documentEncoding().toString() << QT_ENDL; } if (t == QXmlStreamReader::StartElement) { QString name = xml.name().toString(); //qDebug() << Q_FUNC_INFO << " - quick read name: " << name << QT_ENDL; if (name == "QRZDatabase" || name == "Session" || name == "Callsign") { //qDebug() << Q_FUNC_INFO << " - No data: " << name << QT_ENDL; } else if (name == "Key") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - API-Key: " << tdata << QT_ENDL; if (tdata.length()>0) { sessionkey = tdata; logged = true; } continue; } else if (name == "call") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - CALL: " << tdata << QT_ENDL; } continue; } else if (name == "Error") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Error: " << tdata << QT_ENDL; if (tdata == "Username/password incorrect ") { pass = QString(); } emit dataFoundSignal("error", tdata); continue; } else if (name == "Message") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Message: " << tdata << QT_ENDL; emit dataFoundSignal("message", tdata); continue; } else if (name == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << Q_FUNC_INFO << " - Name: " << tdata << QT_ENDL; } continue; } else if (name == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << Q_FUNC_INFO << " - addr1: " << tdata << QT_ENDL; } continue; } else if (name == "addr2") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qth", tdata); //qDebug() << Q_FUNC_INFO << " - addr2: " << tdata; } continue; } else if (name == "grid") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - grid: " << tdata; emit dataFoundSignal("grid", tdata); } continue; } else if (name == "qslmgr") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - qslmgr: " << tdata; emit dataFoundSignal("qslmgr", tdata); } continue; } else if (name == "Remark") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Remark: " << tdata ; if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << tdata << QT_ENDL; } continue; } else if ((xml.readElementText() == "non-subscriber") && (subscriptionOK)) { //qDebug() << Q_FUNC_INFO << " - Not Subscribed QRZ.com user"; showDebugLog (Q_FUNC_INFO, "Non Subscribed"); emit showMessage(tr("You are not subscribed to QRZ.com.")); //emit disableQRZAction(true); subscriptionOK = false; } else { //qDebug() << Q_FUNC_INFO << " - ELSE quick read data: " << xml.readElementText() << QT_ENDL; } } } if (xml.hasError()) { showDebugLog (Q_FUNC_INFO, "Error: " + xml.errorString()); //qDebug() << Q_FUNC_INFO << " - ERROR: " << xml.errorString() << QT_ENDL; } else if (xml.atEnd()) { //qDebug() << Q_FUNC_INFO << " - XML END" << QT_ENDL; } /* QString tname, tdata; while(!xml.atEnd() && !xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer - 00012" << QT_ENDL; QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartDocument) { //qDebug() << "eLogQrzLog::parseXMLAnswer - StartDocument" << QT_ENDL; continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer - 00014" << QT_ENDL; if (token == QXmlStreamReader::StartElement) { tname = xml.name().toString(); //qDebug() << "eLogQrzLog::parseXMLAnswer - tname = " << tname << QT_ENDL; if (tname == "Key") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: API-Key: " << tdata << QT_ENDL; if (tdata.length()>0) { sessionkey = tdata; logged = true; } continue; } if (tname == "Error") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Error: " << tdata << QT_ENDL; emit dataFoundSignal("error", tdata); } if (tname == "Message") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Message: " << tdata << QT_ENDL; emit dataFoundSignal("message", tdata); } if (tname == "call") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: CALL: " << tdata << QT_ENDL; } continue; } if (tname == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: Name: " << tdata << QT_ENDL; } continue; } if (tname == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr1: " << tdata << QT_ENDL; } continue; } if (tname == "addr2") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qth", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr2: " << tdata << QT_ENDL; } continue; } if (tname == "grid") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("grid", tdata); } continue; } if (tname == "qslmgr") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qslmgr", tdata); } continue; } if (tname == "Remark") { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << QT_ENDL; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << tdata << QT_ENDL; } continue; } if (tname == "Session") { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " << QT_ENDL; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " << tdata << QT_ENDL; } continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer: Unknown: " << tname << QT_ENDL; } } if (xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML error: " << "XML error: " << xml.errorString() << QT_ENDL; } else if (xml.atEnd()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML END: " << "Reached end, done" << QT_ENDL; } */ //qDebug() << "eLogQrzLog::parseXMLAnswer: END of token while" << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - NO ERROR" ; showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotManagerFinished(QNetworkReply *data) { //qDebug() << Q_FUNC_INFO; showDebugLog (Q_FUNC_INFO, "Start"); result = data->error(); //qDebug() << Q_FUNC_INFO << " - Result = " << QString::number(result) << QT_ENDL; const QByteArray sdata = data->readAll(); //qDebug() << Q_FUNC_INFO << " - Received: " << sdata; QString text = QString(); //qDebug() << Q_FUNC_INFO << " - 00010" << QT_ENDL; if (result == QNetworkReply::NoError) { //QXmlStreamReader reader(sdata); reader = new QXmlStreamReader(sdata); parseXMLAnswer(*reader); } else { sendSignal(result, qsos); //parseNetworkError(result); } //qDebug() << Q_FUNC_INFO << " - Result = " << QString::number(result) << QT_ENDL; //qDebug() << Q_FUNC_INFO << " - Result Text = " << text << QT_ENDL; emit showMessage(text); showDebugLog (Q_FUNC_INFO, "Text: " + text); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eLogQrzLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(received) +"/"+QString::number(total)); //qDebug()<< received << total; emit actionShowProgres(received, total); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eLogQrzLog::slotErrorManagement: " << QString::number(networkError) << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(networkError)); result = networkError; if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogQrzLog::slotErrorManagement: Host not found" << QT_ENDL; } else { //qDebug()<< "eLogQrzLog::slotErrorManagement: ERROR!" << QT_ENDL; } //actionError(result); showDebugLog (Q_FUNC_INFO, "END"); } bool eLogQrzLog::canConnect() { showDebugLog (Q_FUNC_INFO, "Start"); if (!logged) { //qDebug() << Q_FUNC_INFO << " - 10"; login(); if (!logged) { //qDebug() << Q_FUNC_INFO << " - Not logged"; showDebugLog (Q_FUNC_INFO, "END-false-1"); return false; } } if (sessionkey.length()<1) { //qDebug() << Q_FUNC_INFO << " - API not valid"; showDebugLog (Q_FUNC_INFO, "END-false-2"); return false; } showDebugLog (Q_FUNC_INFO, "END-true"); return true; } void eLogQrzLog::fetchData() { //qDebug() << Q_FUNC_INFO; showDebugLog (Q_FUNC_INFO, "Start"); if (!canConnect()) { showDebugLog (Q_FUNC_INFO, "END- can't connect"); return; } QUrlQuery params; params.addQueryItem("action", "fetch"); params.addQueryItem("option", "all"); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::checkQRZ(const QString &_qrz) { showDebugLog (Q_FUNC_INFO, "Start: " + _qrz); if (!util->isValidCall(_qrz)) { //qDebug()<< "eLogQrzLog::checkQRZ: CALL not valid" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "CALL not valid"); return; } serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); if (!canConnect()) { showDebugLog (Q_FUNC_INFO, "END-can't connect"); return; } //qDebug() << Q_FUNC_INFO << " - Preparing the query" << QT_ENDL; QUrlQuery params; params.addQueryItem("s", sessionkey); params.addQueryItem("callsign", _qrz); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); showDebugLog (Q_FUNC_INFO, "END"); } int eLogQrzLog::sendQSOs(QList _qsos) { //qDebug()<< "eLogQrzLog::sendQSOs: QSOs: " << QString::number(_qsos.length()) << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start"); errorWhileSendingLog = false; if (logbookkey.length()<1) { //qDebug()<< "eLogQrzLog::sendQSOs: No valid KEY (-2)" << QT_ENDL; QMessageBox::warning(nullptr, tr("KLog - QRZ.com"), tr("Not valid KEY found") + "\n" + tr("Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage.\nYou need a QRZ.com subscription to use this feature."), QMessageBox::Ok); showDebugLog (Q_FUNC_INFO, "END-2"); return -2; } qsos.clear(); qsos << _qsos; lastQSO = false; foreach (int i, _qsos) { sendQSO(i); if (i == _qsos.last()) { lastQSO = true; } } showDebugLog (Q_FUNC_INFO, "END"); return 1; } int eLogQrzLog::sendQSO(const int _qsoID) { //qDebug() << "eLogQrzLog::sendQSO: " << QString::number(_qsoID) << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(_qsoID)); QString adifQSO = dataProxy->getADIFQSO(_qsoID); //qDebug()<< "eLogQrzLog::sendQSO: (ADIF) :" << adifQSO << QT_ENDL; //qDebug()<< "eLogQrzLog::sendQSO: (KEY) :" << logbookkey << QT_ENDL; QUrlQuery params; params.addQueryItem("KEY", logbookkey); params.addQueryItem("ACTION", "INSERT"); params.addQueryItem("ADIF",adifQSO); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); //qDebug() << "eLogQrzLog::sendQSO: END" << QT_ENDL; QByteArray postData; postData = params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); QNetworkRequest requestLog(QUrl("https://logbook.qrz.com/api")); requestLog.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); showDebugLog (Q_FUNC_INFO, "postData: " + QString(postData)); //qDebug()<< "eLogQrzLog::sendQSO: postData: " << postData << QT_ENDL; while (sendingQSO) { //qDebug() << "eLogQrzLog::sendQSO: sending QSO... just wait!" << QT_ENDL; } managerLog->post(requestLog, postData); showDebugLog (Q_FUNC_INFO, "END"); return 1; } bool eLogQrzLog::hasLogBookKey() { showDebugLog (Q_FUNC_INFO, "Start"); if (logbookkey.length()>0) { showDebugLog (Q_FUNC_INFO, "END-true"); return true; } else { showDebugLog (Q_FUNC_INFO, "END-false"); return false; } } void eLogQrzLog::login() { //qDebug()<< "eLogQrzLog::login" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start"); if (logged) { //qDebug()<< "eLogQrzLog::login Already logged!" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "END-1"); return; } //bool savePassword = true; if (pass.length()<1) { //savePassword = false; bool ok; pass = QInputDialog::getText(nullptr, tr("KLog - QRZ.com password needed"), tr("Please enter your QRZ.com password: "), QLineEdit::Password, "", &ok); if (!ok) { //qDebug() << "eLogQrzLog::login - END 1" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "END-2"); return; } } if ((user.length()<1) || (pass.length()<1)) { //qDebug()<< "eLogQrzLog::login error 2" << QT_ENDL; //if (!savePassword) //{// We delete the password as soon as possible if the user is not willing to save it // pass = QString(); //} return; } QUrlQuery params; params.addQueryItem("username", user); params.addQueryItem("password", pass); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); //if (!savePassword) //{// We delete the password as soon as possible if the user is not willing to save it // pass = QString(); //} //qDebug()<< "eLogQrzLog::login - END" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "END"); } int eLogQrzLog::sendDataParams(const QUrlQuery &_params) { //qDebug()<< "eLogQrzLog::sendDataParams: Params: " << _params.query(QUrl::FullyEncoded).toUtf8() << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start"); QByteArray postData; QUrlQuery params; postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); postData = params.query(QUrl::FullyEncoded).toUtf8(); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //qDebug()<< "eLogQrzLog::sendDataParams: postData: " << postData << QT_ENDL; manager->post(request, postData); //qDebug()<< "eLogQrzLog::sendDataParams - END" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "END"); return -1; } void eLogQrzLog::setCredentials(const QString &_user, const QString &_pass) { //qDebug()<< "eLogQrzLog::setCredentials: user: " << _user << " / Pass: " << _pass << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + _user + "/" + _pass); user = _user; pass = _pass; showDebugLog (Q_FUNC_INFO, "END"); } QString eLogQrzLog::prepareToTranslate(const QString &_m) { //qDebug()<< "eLogQrzLog:: = prepareToTranslate" << _m << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + _m); if (_m == "Callsign missing") { return tr("Callsign missing"); } else { return _m; } } void eLogQrzLog::parseAppAnswer (const QString &_m) { //qDebug()<< "eLogQrzLog::parseAppAnswer: " << _m << QT_ENDL; showDebugLog (Q_FUNC_INFO, "Start: " + _m); QStringList response; response.clear(); response << _m.split('&'); QString responseType = response.at(0).split('=').at(0); QString responseResult = response.at(0).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: responseType: " << responseType << QT_ENDL; //qDebug()<< "eLogQrzLog::parseAppAnswer: responseResult: " << responseResult << QT_ENDL; if ((responseType == "STATUS") && (responseResult == "OK")) { //qDebug()<< "eLogQrzLog::parseAppAnswer: OK" << QT_ENDL; } else if ((responseType == "STATUS") && (responseResult == "FAIL")) { errorWhileSendingLog = true; if (response.at(1).split('=').at(0) == "REASON") { QString reason = response.at(1).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: " << reason << QT_ENDL; } } else if ((responseType == "STATUS") && (responseResult == "AUTH")) { errorWhileSendingLog = true; if (response.at(1).split('=').at(0) == "REASON") { QString reason = response.at(1).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: " << reason << QT_ENDL; //onlineMessage->showMessage(QNetworkReply::NoError, QRZ, Fail, Other, reason); } } } void eLogQrzLog::sendSignal(QNetworkReply::NetworkError _error, QList _qsos) { showDebugLog (Q_FUNC_INFO, "Error: " + QString::number(_error) + " - List: " + QString::number(_qsos.length ())); errorWhileSendingLog = false; emit signalLogUploaded(_error, _qsos); } void eLogQrzLog::setSubcription(const bool _ok) { //showDebugLog (Q_FUNC_INFO, util->boolToQString (_ok)); subscriptionOK = _ok; } bool eLogQrzLog::getSubscription() { showDebugLog (Q_FUNC_INFO, util->boolToQString (subscriptionOK)); return subscriptionOK; } klog-1.8.6/utilities.h0000644000175000017500000001547014166020421013631 0ustar develdevel#ifndef UTILITIES_H #define UTILITIES_H /*************************************************************************** utilities.h - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ /* This class implements general use utilities that can be used from any other class Anything that is not directly related with a class itself and could be used from different classes should be here */ #include #include #include #include #include "locator.h" #include #include "klogdefinitions.h" class Utilities { public: Utilities(); ~Utilities(); void setDarkMode(const QString &_dm); bool isDarkMode(); void setCallValidation(const bool _b); int getProgresStepForDialog(int totalSteps); bool trueOrFalse(const QString &_s); // reads a String and return true if s.upper()== TRUE :-) QChar boolToCharToSQLite(const bool _b); QString boolToQString(const bool _b); QString checkAndFixASCIIinADIF(const QString &_data); QString getAgent(const QString &_klogversion); QString getGlobalAgent(const QString &_klogversion); //QOperatingSystemVersion getOS(); //Devel or debug functions - Not adding any feature to the user void printQString(const QStringList &_qs); QString getKLogDBFile(); QString getKLogDBBackupFile(); //QString getKLogDatabaseFile(const QString &_file); bool isDBFileExisting(); bool isDBFileExisting(const QString &_file); QString getTQSLsFileName(); QString getTQSLsPath(); // Depending on the OS where are usually installed the executables QString getHomeDir(); QString getCfgFile(); QString getCTYFile(); QString getDebugLogFile(); QString getSaveSpotsLogFile(); QString getBackupADIFile(); QString getClubLogFile(); QString getEQSLFile(); QString getLoTWAdifFile(); QString getClearSQLi(QString _s); void setVersion(const QString &_v); QString getVersion(); double getVersionDouble(); QDate getDefaultDate(); QString getDefaultRST(const QString &_m); QStringList getDefaultLogFields(); int getNormalizedDXCCValue(const int _dxcc); // Validations bool isValidDate(const QDate _d); bool isValidDateTime(const QString &_d); bool isValidCall(const QString &_c); bool isSameFreq(const double fr1, const double fr2); bool isValidBandId(const int _b); bool isValidModeId(const int _m); bool isValidFreq(const QString &_b); bool isValidGrid(const QString &_b); bool isValidVUCCGrids(const QString &_b); bool isValidRST(const QString &_b); bool isValidPower(const QString &_b); bool isValidComment(const QString &_b); bool isValidName(const QString &_b); bool isValidADIFField(const QString &_b); bool isValidQSL_Rcvd(const QString &c); bool isValidQSL_Sent(const QString &c); bool isValidUpload_Status(const QString &c); bool isValidTimeFromString(const QString &_s); bool isValidDateFromString(const QString &_s); bool isValidDateTimeFromString(const QString &_s); bool isValidDXCC(const int _d); QStringList getValidADIFFieldAndData(const QString &_b); QString getAValidCall (const QString &_wrongCall); QString getPrefixFromCall(const QString &_c); //QString getPrefixFromFullCall(const QString &_c); // Write DATE/TIME to DB QString getDateTimeSQLiteStringFromDateTime(const QDateTime &_d); QString getDateSQLiteStringFromDate(const QDate &_d); // Read from DB QDateTime getDateTimeFromSQLiteString(const QString &_s); QTime getTimeFromSQLiteString(const QString &_s); QDate getDateFromSQliteString(const QString &_s); // Translate the LOG table fields into human readable QString getLogColumnName(const QString &_column); // Creates the ADIF DATE & TIME formats QString getADIFDateFromQDateTime(const QDateTime &_d); // Will produce the ADIF DATE format: "YYYYMMDD" QString getADIFDateFromQDate(const QDate &_d); // Will produce the ADIF DATE format: "YYYYMMDD" QString getADIFTimeFromQDateTime(const QDateTime &_d); // Will produce the ADIF TIME format: "HHMMSS" // Parse Date & Time from ADIF QDate getDateFromADIFDateString(const QString &_s); // Expects an ADIF DATE format string: "YYYYMMDD" QTime getTimeFromADIFTimeString(const QString &_s); // Expects and ADIF TIME format String "HHMMSS" or "HHMM" // Parse date fromLoTW QDate getDateFromLoTWQSLDateString(const QString &_s); // Creates the Cabrillo DATE & TIME (http://wwrof.org/cabrillo/) QString getCabrilloDateFromQDate(const QDate &_d); // Will produce the Cabrillo DATE format: "YYYY-MM-DD" QString getCabrilloTimeFromQDateTime(const QDateTime &_d); // Will produce the Cabrillo TIME format: "HHMM" QString getOnlineServiceName(OnLineProvider _service); //QPalette getPalete(bool _ok); private: void init(); bool processConfigLine(const QString &_line); QString getKLogDefaultDatabaseFile(); bool isCountrySuffix (const QString &_c); int isAPrefix(const QString &_c); bool isValidSubCall(const QString &_c); //QPair getCallParts(const QString &_c); bool darkMode;//, callValidation; QString dbPath; QString softwareVersion; //QPalette palRed, palBlack; }; #endif // UTILITIES_H klog-1.8.6/gpl-3.0-standalone.html0000644000175000017500000011022114166020407015533 0ustar develdevel GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

  • a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
  • b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
  • c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
  • d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

  • a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
  • b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
  • c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
  • d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
  • e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.

“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

  • a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
  • b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
  • c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
  • d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
  • e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
  • f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

klog-1.8.6/dxcluster.h0000644000175000017500000001173014166020407013632 0ustar develdevel#ifndef DXCLUSTER_H #define DXCLUSTER_H /*************************************************************************** dxcluster.h - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include "awards.h" #include "world.h" #include "utilities.h" #include "dataproxy_sqlite.h" class QWidget; class QTcpSocket; class DXClusterWidget : public QWidget { Q_OBJECT public: DXClusterWidget(DataProxy_SQLite *dp, QWidget *parent ); DXClusterWidget(DataProxy_SQLite *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent ); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ); void setDXClusterServer(const QString &clusterToConnect, const int portToConnect); void setCurrentLog(const int _log); bool isConnected(); void setMyQRZ(const QString &_qrz); void setDXMarathon (const bool _enable); void setSaveSpots (const bool _enable); //void sendSpotToCluster(const QString &_dx, const QString &_freq); ~DXClusterWidget(); private slots: void slotClusterDisplayError(QAbstractSocket::SocketError socketError); void slotClusterDataArrived(); void slotClusterSocketConnected(); void slotClusterSocketConnectionClosed(); void slotClusterSendToServer(); void slotClusterClearLineInput(); void slotClusterInputTextChanged(); void slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ); void slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item); void slotClusterDXClusterWidgetItemSelected(); signals: void dxspotclicked(const QStringList &_qs); // DXSpotCall, DX-Freq, doubleClicked //void dxspot(const QString &_spot); // The text string to be saved private: //void TESTADDSPOT(); // Just a test spot void initClass(); void connectToDXCluster(); QStringList readItem(QListWidgetItem * item); bool checkIfNeedsToBePrinted(const QString &_DXEntity, const int _band, const int _mode); void saveSpot (const QString &_spot); bool openFile(); void addData(); //TO BE DELETED, JUST FOR TESTING PURPOSES QTcpSocket *tcpSocket; QListWidget *dxClusterListWidget; QLineEdit *inputCommand; QPushButton *sendButton; QPushButton *clearButton; bool dxClusterConnected; bool dxClusterAlreadyConnected; QString server; quint16 port; quint16 blockSize; QColor dxSpotColor; World *world; Awards *awards; DataProxy_SQLite *dataProxy; Utilities *util; bool showhf, showvhf, showwarc, showworked, showconfirmed, showann, showwwv, showwcy; bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; bool showDxMarathon; QString myQrz; int currentLog; int constrid; // Just an id for the constructor to check who is being executed at one specific time QFile *saveSpotsFile; bool saveSpots; // write/save the spots to a file }; class dxClusterSpotItem : public QListWidgetItem { public: dxClusterSpotItem( QListWidget* parent, const QString& spot, const QColor& color ); ~dxClusterSpotItem(); protected: QColor spotColor; }; #endif // DXCLUSTER_H klog-1.8.6/dxccstatuswidget.cpp0000644000175000017500000010425014166020421015535 0ustar develdevel/*************************************************************************** dxccstatuswidget.cpp - description ------------------- begin : feb 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dxccstatuswidget.h" //#include /* TODO: Adjust the header columns TODO: Add some color to the texts depending on C, W or - TODO: Call the creation of this depending on the bands that the user is using */ DXCCStatusWidget::DXCCStatusWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { #ifdef QT_DEBUG //qDebug() << "DXCCStatusWidget::DXCCStatusWidget from: " << _parentFunction << QT_ENDL; #else #endif dataProxy = dp; locator = new Locator(); awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-1" << QT_ENDL; world = new World(dataProxy,Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-2" << QT_ENDL; dxccView = new QTableWidget; //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-3" << QT_ENDL; dxccView->setMouseTracking(true); dxccView->setSortingEnabled(true); numberOfColumns = 0; logNumber = -1; // -1 means that ALL the logs will be used (if showAllLogsButton is not checked) tempLog = -1; // -1 means that ALL the logs will be used loc = QString(); refreshButton = new QPushButton; bandNames.clear(); validBands.clear(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-4" << QT_ENDL; //setDefaultBands(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-5" << QT_ENDL; createUI(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget - END" << QT_ENDL; } DXCCStatusWidget::~DXCCStatusWidget() { delete(locator); delete(world); delete(awards); } void DXCCStatusWidget::createUI() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::createUI " << QT_ENDL; // We remove the vertical header hv = dxccView->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = dxccView->horizontalHeader(); //qDebug() << "DXCCStatusWidget::createUI-10" << QT_ENDL; refreshButton->setText(tr("Update")); //qDebug() << "DXCCStatusWidget::createUI-11" << QT_ENDL; dxccView->setContextMenuPolicy(Qt::CustomContextMenu); //qDebug << "DXCCStatusWidget::createUI-12 - setting column count: " << QString::number(numberOfColumns) << QT_ENDL; dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::createUI-13" << QT_ENDL; dxccView->horizontalHeader()->setStretchLastSection(true); //qDebug() << "DXCCStatusWidget::createUI-14" << QT_ENDL; dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::createUI-20" << QT_ENDL; QHBoxLayout *bottonLineLayout = new QHBoxLayout; bottonLineLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); bottonLineLayout->addWidget(refreshButton); QVBoxLayout *tabLayout = new QVBoxLayout; tabLayout->addWidget(dxccView); tabLayout->addLayout(bottonLineLayout); setLayout(tabLayout); //qDebug() << "DXCCStatusWidget::createUI-30" << QT_ENDL; dxccView->resizeColumnsToContents(); dxccView->resizeRowsToContents(); //qDebug() << "DXCCStatusWidget::createUI-90" << QT_ENDL; connect(refreshButton, SIGNAL(clicked()), this, SLOT(slotRefreshButtonClicked() ) ); //qDebug() << "DXCCStatusWidget::createUI-91" << QT_ENDL; connect(dxccView, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(slotItemDoubleClicked(QTableWidgetItem *) ) ); //qDebug() << "DXCCStatusWidget::createUI-92" << QT_ENDL; connect(dxccView, SIGNAL(itemEntered(QTableWidgetItem *)), this, SLOT(slotItemEntered(QTableWidgetItem *) ) ); //connect(dxccView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButton( const QPoint& ) ) ); //qDebug() << "DXCCStatusWidget::createUI-93" << QT_ENDL; //dxccView->setSortingEnabled(false); //qDebug() << "DXCCStatusWidget::createUI-END" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::update() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //int entities = world->getHowManyEntities(); int entities = dataProxy->getMaxEntityID(false); if (!awards->updateDXCCBandsStatus (-1)) // We update all { //qDebug() << Q_FUNC_INFO << "awards->updateDXCCBandsStatus returned FALSE"; // It may be the case that DXCC field in the table is not defined. // It should be updated. QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(tr("It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log.")); msgBox.setInformativeText(tr("Do you want to update your DXCC status?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: //qDebug() << Q_FUNC_INFO << " - emitting fillInQSOSignal()"; emit fillInQSOSignal(); return; break; case QMessageBox::No: // No was clicked return; break; default: // should never be reached break; } } else { //qDebug() << Q_FUNC_INFO << "awards->updateDXCCBandsStatus returned TRUE"; } //qDebug() << Q_FUNC_INFO << "AFTER awards->updateDXCCBandsStatus returned"; QList bandIds; bandIds.clear(); QString aux; foreach (aux, bandNames) { bandIds.append (dataProxy->getIdFromBandName (aux)); } //qDebug() << "DXCCStatusWidget::update: " << QString::number(entities) << " entities to update" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; QList list; //qDebug() << "DXCCStatusWidget::update: -1" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; list.clear(); //qDebug() << "DXCCStatusWidget::update: -2" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //QString prefix; //qDebug() << "DXCCStatusWidget::update: -3" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; if (dxccView->columnCount()>0) { dxccView->clearContents(); //qDebug() << "DXCCStatusWidget::update pre FOR" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; for (int i=1; i<=entities; i++) { //qDebug() << "DXCCStatusWidget::update in FOR " << QString::number(i) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; list.clear(); //if (aux.length()>2) // Not all integers refers to an entity. //{ list.append (i); list.append (bandIds); addEntity(list); //} } } emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "DXCCStatusWidget::update END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; } void DXCCStatusWidget::addEntity(const QList &_ent) { emit debugLog (Q_FUNC_INFO, "Start", Debug); // _ent.at(0) = dxcc column of Entity Table (considering big numbers, like 2248 for IT9!) // _ent.at(1) until number of Columns are just the bandnames //qDebug() << "DXCCStatusWidget::addEntity: " << QString::number(_ent.at(0)) << "/" <getEntiNameISOAndPrefixFromId(_dxcc); if (data.length ()!=3) { //qDebug() << "DXCCStatusWidget::addEntity: Wrong Entity Name and Prefix - END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } QString prefix = data.at(0); QString entName = data.at(1); QString isoName = data.at(2); if ((entName.length()<2) || (prefix.length ()<1) || (isoName.length ()<2)) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: entname too short!" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } QString flagSt; flagSt.clear(); if (isoName.length()>1) { //flagSt = ":/" + isoName + ".png"; flagSt = ":/flags/" + isoName + ".png"; } else { flagSt.clear(); } //flagSt = ":/flags/" + isoName + ".png"; QIcon flagIcon(flagSt); //qDebug() << "DXCCStatusWidget::addEntity: Name: " << entName << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //qDebug() << "DXCCStatusWidget::addEntity: Prefix: " << prefix << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //qDebug() << "DXCCStatusWidget::addEntity: Flag: " << flagSt << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->insertRow(dxccView->rowCount()); //qDebug() << "DXCCStatusWidget::addEntity: rowCount: " << QString::number(dxccView->rowCount()) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; QTableWidgetItem *newItemID = new QTableWidgetItem(prefix); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); for (int i=1; i < _ent.length(); i++) { //qDebug() << Q_FUNC_INFO << ": " << prefix << " - i = " << QString::number(i) << "/" << _ent.at(i); int bandid = _ent.at(i); QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand(_dxcc, bandid)); //QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand2(_dxcc, bandid, tempLog)); newItem->setTextAlignment(Qt::AlignCenter); newItem->setFlags(Qt::ItemIsEnabled); //qDebug() << Q_FUNC_INFO << ": C/W/- : " << newItem->text(); if (newItem->text()=="C") { newItem->setForeground (QBrush(Qt::blue)); //newItem->setTextColor(Qt::blue); newItem->setBackground(QBrush(Qt::green)); status = 1; } else if (newItem->text()=="W") { if (status < 0) { status = 0; } newItem->setForeground (QBrush(Qt::red)); newItem->setBackground(QBrush(Qt::yellow)); } else { } dxccView->setItem(dxccView->rowCount()-1, i+1, newItem); //qDebug() << "DXCCStatusWidget::addEntity: rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; } QTableWidgetItem *newItemPref = new QTableWidgetItem(prefix); newItemPref->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemPref->setFlags(Qt::ItemIsEnabled); QTableWidgetItem *newItemName = new QTableWidgetItem(entName); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(flagIcon); if (status == 1) { newItemName->setForeground (QBrush(Qt::blue)); newItemName->setBackground(QBrush(Qt::green)); } else if (status == 0) { newItemName->setForeground(QBrush(Qt::darkRed)); newItemPref->setForeground(QBrush(Qt::darkRed)); } else { newItemName->setForeground(QBrush(Qt::red)); newItemPref->setForeground(QBrush(Qt::red)); } dxccView->setItem(dxccView->rowCount()-1, 0, newItemPref); dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << "DXCCStatusWidget::addEntity: END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::addEntity2(const QStringList &_ent) { emit debugLog (Q_FUNC_INFO, "Start", Debug); // _ent.at(0) = dxcc column of Entity Table (considering big numbers, like 2248 for IT9!) // _ent.at(1) until number of Columns are just the bandnames //qDebug() << Q_FUNC_INFO; // DXCC id, Entity Name, bandName1, bandName2, ... //QString au = "New Line "; //foreach (QString a, _ent) //{ // au = au + " - " + a; //} //qDebug() << Q_FUNC_INFO << ": " << au << " - " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL;; if (_ent.length() != numberOfColumns-1) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: in number of columns" << QString::number(_ent.length()) << "/" << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } int status = -1; //qDebug() << "DXCCStatusWidget::addEntity: ent = " << _ent << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; int _dxcc = _ent.at(0).toInt(); QStringList data; data.clear(); data << dataProxy->getEntiNameISOAndPrefixFromId(_dxcc); if (data.length ()!=3) { //qDebug() << "DXCCStatusWidget::addEntity: Wrong Entity Name and Prefix - END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } //au = "data: "; //foreach (QString a, data) //{ // au = au + " - " + a; //} //qDebug() << Q_FUNC_INFO << ": " << au; QString prefix = data.at(0); QString entName = data.at(1); QString isoName = data.at(2); if ((entName.length()<2) || (prefix.length ()<1) || (isoName.length ()<2)) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: entname too short!" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } QString flagSt; flagSt.clear(); if (isoName.length()>1) { flagSt = ":/" + isoName + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + isoName + ".png"; QIcon flagIcon(flagSt); //qDebug() << "DXCCStatusWidget::addEntity: Name: " << entName << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //qDebug() << "DXCCStatusWidget::addEntity: Prefix: " << prefix << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //qDebug() << "DXCCStatusWidget::addEntity: Flag: " << flagSt << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->insertRow(dxccView->rowCount()); //qDebug() << "DXCCStatusWidget::addEntity: rowCount: " << QString::number(dxccView->rowCount()) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; QTableWidgetItem *newItemID = new QTableWidgetItem(prefix); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); awards->updateDXCCBandsStatus (tempLog); for (int i=1; i < _ent.length(); i++) { //qDebug << Q_FUNC_INFO << ": " << prefix << " - i = " << QString::number(i) << "/" << _ent.at(i); int bandid = dataProxy->getIdFromBandName(_ent.at(i)); QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand(_dxcc, bandid)); //QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand2(_dxcc, bandid, tempLog)); newItem->setTextAlignment(Qt::AlignCenter); newItem->setFlags(Qt::ItemIsEnabled); if (newItem->text()=="C") { newItem->setForeground (QBrush(Qt::blue)); //newItem->setTextColor(Qt::blue); newItem->setBackground(QBrush(Qt::green)); status = 1; } else if (newItem->text()=="W") { if (status < 0) { status = 0; } newItem->setForeground (QBrush(Qt::red)); newItem->setBackground(QBrush(Qt::yellow)); } else { } dxccView->setItem(dxccView->rowCount()-1, i+1, newItem); //qDebug() << "DXCCStatusWidget::addEntity: rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; } QTableWidgetItem *newItemPref = new QTableWidgetItem(prefix); newItemPref->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemPref->setFlags(Qt::ItemIsEnabled); QTableWidgetItem *newItemName = new QTableWidgetItem(entName); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(flagIcon); if (status == 1) { newItemName->setForeground (QBrush(Qt::blue)); newItemName->setBackground(QBrush(Qt::green)); } else if (status == 0) { newItemName->setForeground(QBrush(Qt::darkRed)); newItemPref->setForeground(QBrush(Qt::darkRed)); } else { newItemName->setForeground(QBrush(Qt::red)); newItemPref->setForeground(QBrush(Qt::red)); } dxccView->setItem(dxccView->rowCount()-1, 0, newItemPref); dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << "DXCCStatusWidget::addEntity: END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::setBands(const QString &_callingFunc, QStringList const &_ent, const bool _creating) {// Receives the list of band names and defines the columns //qDebug() << Q_FUNC_INFO << "(" << _callingFunc << ")" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //foreach(QString aux, _ent) //{ // //qDebug << Q_FUNC_INFO << ": " << aux; //} emit debugLog (Q_FUNC_INFO, "Start", Debug); QStringList qs; qs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 01" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; qs << dataProxy->sortBandNamesBottonUp(_ent); //qDebug() << "DXCCStatusWidget::setBands - 02: Lenght qs: " << QString::number(qs.size()) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; if (qs.length()<0) { //qDebug() << "DXCCStatusWidget::setBands no bands received here " << QTime::currentTime().toString("HH:mm:ss") << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; return; } QString testBand; testBand.clear(); bandNames.clear(); //qDebug() << "DXCCStatusWidget::setBands - 03 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; validBands.clear(); validBands = dataProxy->getBandNames(); //qDebug() << "DXCCStatusWidget::setBands - 04 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->clearSelection(); dxccView->clear(); for (int i = 0; isetColumnCount(0); numberOfColumns = dxccView->columnCount(); while(dxccView->columnCount()>0) { //qDebug() << "DXCCStatusWidget::setBands: Still pending: " << QString::number(dxccView->columnCount()) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->removeColumn(0); } numberOfColumns = dxccView->columnCount(); //qDebug() << "DXCCStatusWidget::setBands: -6 All removed: " << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; numberOfColumns = 2 + bandNames.length(); //Prefix, Entity Name //qDebug() << "DXCCStatusWidget::setBands - 7.1 - columnCount: " << QString::number(dxccView->columnCount()) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; //qDebug() << "DXCCStatusWidget::setBands - 7.1 - numberOfColumns: " << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::setBands - 7.2 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::setBands - 7.3 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; QStringList headerqs; //qDebug() << "DXCCStatusWidget::setBands - 7.4 " << QTime::currentTime()).toString("HH:mm:ss") << QT_ENDL; headerqs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 7.5 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; headerqs << tr("Prefix") << tr("Entity") << bandNames; //qDebug() << "DXCCStatusWidget::setBands - 8 " << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; dxccView->setHorizontalHeaderLabels(headerqs); //qDebug() << "DXCCStatusWidget::setBands - 9 PRE-END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; if (_creating) { //qDebug() << "DXCCStatusWidget::setBands: 9.1 !_creating so updating!" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; update(); } //qDebug() << "DXCCStatusWidget::setBands: END" << QTime::currentTime().toString("HH:mm:ss") << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", Debug); } void DXCCStatusWidget::setDefaultBands() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setDefaultBands" << QT_ENDL; /* Default bands: 160M 80M 40M 30M 20M 17M 15M 12M 10M 6M 4M 2M 70CM 28 27 25 24 23 22 21 12 19 18 17 16 14 */ bandNames.clear(); //bandNames << "160M" << "80M" << "40M" << "30M" << "20M" << "17M" << "15M" << "12M" << "10M" << "6M" << "4M" << "2M" << "70CM"; bandNames << "160M" << "80M" << "40M" << "30M" << "20M" << "17M" << "15M" << "12M" << "10M"; setBands(Q_FUNC_INFO, bandNames, false); //qDebug << "DXCCStatusWidget::setDefaultBands - END" << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotRefreshButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::slotRefreshButtonClicked" << QT_ENDL; //TODO: Define a way to show the status of the selected log or all the logs in the DB if (dxccView->rowCount()<1) { //qDebug() << "DXCCStatusWidget::slotRefreshButtonClicked - rowcount <1" << QT_ENDL; return; } QStringList _bands = bandNames; setBands(Q_FUNC_INFO, _bands, true); //emit updateAwards(); //update(); //qDebug << Q_FUNC_INFO << " - END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::refresh() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::refresh" << QT_ENDL; //update(); slotRefreshButtonClicked(); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::setCurrentLog(const int _logN) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setCurrentLog: " << QString::number(_logN) << QT_ENDL; if (dataProxy->doesThisLogExist(_logN)) { logNumber = _logN; } else { logNumber = -1; } emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotItemEntered(QTableWidgetItem * item ) { //qDebug << "DXCCStatusWidget::slotItemEntered: " << ((item->data(0)).toString()).simplified() << QT_ENDL; //qDebug << "DXCCStatusWidget::slotItemEntered: " << item->text() << QT_ENDL; //qDebug << "DXCCStatusWidget::slotItemEntered: " << QT_ENDL; emit debugLog (Q_FUNC_INFO, "Start", Debug); if (dxccView->rowCount()<1) { return; } QString tip; tip.clear(); //int row = -1; //int bandi = -1; //QString band = QString(); if (item) { // row = dxccView->row(item); int column = dxccView->column(item); //qDebug() << "DXCCStatusWidget::slotItemEntered: row: " << QString::number(row) << QT_ENDL; //qDebug() << "DXCCStatusWidget::slotItemEntered: hrow: " << dxccView->verticalHeaderItem(row)->text() << QT_ENDL; // row = (dxccView->item(row,0)->text()).toInt(); int entiID = dataProxy->getEntityIdFromMainPrefix(dxccView->item(dxccView->row(item),0)->text()); if (entiID<0) { // Some prefix are shown with a * in the begining that is removed to show the real prefix entiID = dataProxy->getEntityIdFromMainPrefix("*" + dxccView->item(dxccView->row(item),0)->text()); } //qDebug() << "DXCCStatusWidget::slotItemEntered: entiID: " << QString::number(entiID) << QT_ENDL; if ((column == 0) || (column == 1)) { //tip = tr("Pref: ") + (dxccView->item(row, 1))->text() + " - "; tip = tr("Pref: ") + dataProxy->getEntityMainPrefix(entiID) + " - "; tip = tip + tr("CQ: ") + QString::number(dataProxy->getCQzFromEntity(entiID)) + " - "; tip = tip + tr("ITU: ") + QString::number(dataProxy->getITUzFromEntity(entiID)) + " - "; QString dxLoc = locator->getLocator(dataProxy->getLongitudeFromEntity(entiID), dataProxy->getLatitudeFromEntity(entiID)) ; tip = tip + tr("Beam: ") + QString::number(locator->getBeamBetweenLocators(loc, dxLoc)); } else if (column >= 2) { if (item->text() == "-") { tip = tr("Entity not worked in this band."); } else { QString band = dxccView->horizontalHeaderItem(column)->text(); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << band << QT_ENDL; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << QString::number(bandi) << QT_ENDL; if (item->text() == "C") { tip = awards->getQSOofAward(entiID, bandi, logNumber, true); } else { tip = awards->getQSOofAward(entiID, bandi, logNumber, false); } //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip << QT_ENDL; if (tip.length()>3) { tip = "QSO: " + tip; } else { //tip = tr("Text TBD."); tip = tr(""); } } } else { //tip = tr("ADD: Pref: Bearing, CQ & ITU."); tip = ""; // TODO define a text to be shown when no band column is selected (maybe Continent and bearing or a link to wikipedia or whatever!) } item->setToolTip(tip); //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip << QT_ENDL; } //qDebug() << "DXCCStatusWidget::slotItemEntered: END " << QT_ENDL; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotItemDoubleClicked(QTableWidgetItem * item ) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << ((item->data(0)).toString()).simplified() << QT_ENDL; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << item->text() << QT_ENDL; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked - start" << QT_ENDL; if (dxccView->rowCount()<1) { return; } int row = -1; //int column = -1; //int bandi = -1; int columns = dxccView->columnCount(); int _entiNumb = -1; //Read the Entity number that the user is selecting. //QString band = QString(); QList qsos; qsos.clear(); QTableWidgetItem * it = new QTableWidgetItem(0); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - Columns: " << QString::number(columns) << QT_ENDL; if (item) { row = dxccView->row(item); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - row: " << QString::number(row) << QT_ENDL; _entiNumb= dataProxy->getEntityIdFromMainPrefix(dxccView->item(dxccView->row(item),0)->text()); if (_entiNumb<0) { // Some prefix are shown with a * in the begining that is removed to show the real prefix _entiNumb= dataProxy->getEntityIdFromMainPrefix("*" + dxccView->item(dxccView->row(item),0)->text()); } //_entiNumb = ((dxccView->item(row,0))->text()).toInt(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - EntityNumber: " << QString::number(_entiNumb) << QT_ENDL; for (int i = 2; i < columns; ++i) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column: " << QString::number(i) << QT_ENDL; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column header: " << (dxccView->horizontalHeaderItem(i))->text() << QT_ENDL; //entityName = (dxccView->item(row,i))->text() ; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - item: " << QT_ENDL; it->setText(dxccView->item(row,i)->text()); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column-txt: " << it->text() << QT_ENDL; QString band = dxccView->horizontalHeaderItem(i)->text(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << band << QT_ENDL; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << QString::number(bandi) << QT_ENDL; int qsoId = -1; if (item->text() == "C") { qsoId = awards->getQSOIdofAward(_entiNumb, bandi, logNumber, true); } else { qsoId = awards->getQSOIdofAward(_entiNumb, bandi, logNumber, false); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: QSOid: " << QString::number(qsoId) << QT_ENDL; if (qsoId>0) { qsos.append(qsoId); } } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of for" << QT_ENDL; if (qsos.length()>0) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - qsos.length = " << QString::number(qsos.length()) << QT_ENDL; emit showQsos(qsos); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of column == 1" << QT_ENDL; } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: END " << QT_ENDL; } void DXCCStatusWidget::setMyLocator(const QString &_loc) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setMyLocator: " << _loc << QT_ENDL; QString l = _loc; if ( locator->isValidLocator(l.toUpper()) ) { loc = l.toUpper(); } } /* void DXCCStatusWidget::slotRightButton(const QPoint& pos) { //qDebug() << "DXCCStatusWidget::slotRighButton" << QT_ENDL; int row = (dxccView->indexAt(pos)).row(); showDXCCWikipediaAct = new QAction(tr("&Wikipedia"), this); showDXCCWikipediaAct->setShortcut(Qt::CTRL + Qt::Key_W); showDXCCWikipediaAct->setStatusTip(tr("Show this DXCC in Wikipedia")); connect(showDXCCWikipediaAct, SIGNAL(triggered()), this, SLOT(slotWikipedia())); righButtonFromLogMenu(row); } void DXCCStatusWidget::slotWikipedia() { //qDebug() << "DXCCStatusWidget::slotWikipedia: " << (showDXCCWikipediaAct->data()).toString() << QT_ENDL; //TODO: To be added to the DXCCStatusWidget and create an action that emist the QSO id //int QSOid = ((logModel->index((showDXCCWikipediaAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "DXCCStatusWidget::slotQsoDeleteFromLog (id): " << QString::number(QSOid) << QT_ENDL; } void DXCCStatusWidget::righButtonFromLogMenu(const int trow) { //qDebug() << "DXCCStatusWidget::slotshowRighButtonFromLogMenu: " << QString::number(trow) << QT_ENDL; //int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "DXCCStatusWidget::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID) << QT_ENDL; QMenu menu(this); menu.addAction(showDXCCWikipediaAct); showDXCCWikipediaAct->setData(trow); menu.exec(QCursor::pos()); } */ klog-1.8.6/tips-for-devel.txt0000644000175000017500000000045114166020407015043 0ustar develdevelSQLite http://www.w3schools.com/sql/default.asp Transfer or populate sqlite table to another table INSERT INTO TABLE2 (COL1, COL2, COL3) SELECT COL1, COL4, COL7 FROM TABLE1 Select only different DXCC select count (distinct dxcc) from log DELETED ENTITIES: http://www.ng3k.com/Dxcc/dxccde.html klog-1.8.6/softwareupdatedialog.h0000644000175000017500000000435314166020407016035 0ustar develdevel#ifndef SOFTWAREUPDATEDIALOG_H #define SOFTWAREUPDATEDIALOG_H /*************************************************************************** softwareupdatedialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class SoftwareUpdateDialog: public QDialog { Q_OBJECT public: SoftwareUpdateDialog(); ~SoftwareUpdateDialog(); void setVersion(const QString tversion, const bool updateNeeded); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QString _version; }; #endif // SOFTWAREUPDATEDIALOG_H klog-1.8.6/TODO0000644000175000017500000004543314166020407012143 0ustar develdevelBUG: KLog needs to update the Entity DB is shown on every start KLog should update ALWAYS when receiving from LoTW the QSL_LOTW_rcvd or add the QSO if not in local log. Review the process after Setup TODO: Integrate HAMQTH https://www.hamqth.com/developers.php TODO:- New feature: Regional Award support: #include "setuppages/setuppagesubdivisions.h" TODO: Stat More frequently worked calls: "select log.call, count(log.call) from log group by log.call ORDER BY count(log.call) DESC" TODO: Stat Number of different callsigns TODO: Find "duplicated" QSOs QUERY=> SELECT call, bandid, modeid, substr(qso_date, 1, 15), COUNT(*) c FROM log GROUP BY call, bandid, modeid, substr(qso_date, 1, 15) HAVING c>1 TODO: Find duplicate queries: select call, qso_date from log where datetime('2007-07-22 09:45:00', '-5 minutes')< datetime(qso_date) AND datetime('2007-07-22 09:49:00', '+5 minutes') > datetime(qso_date) select call, qso_date, bandid, modeid, COUNT(*) c from log where datetime('2010-10-31 19:20:00', '-5 minutes')< datetime(qso_date) AND datetime('2010-10-31 19:20:00', '+5 minutes') > datetime(qso_date) group by call having c>1 RC-BUGS: TODO: Check if dxccStatusWidget in logwindow is useful and remove it if not. NONE TODO: New feature: KLog can now control a rotator through PSTRotator. TODO: UI: Added a DXCC summary obtained from the Tools menu. TBD - 0.9.8 Hamlib: COMports in Windows must follow the format: \\.\com14 for ports highet than 9 but it works also for lower so ALL should be managed that way. For next release: TODO: - Some warnings removed from compilation time. TODO: - The log can be now updated with a LoTW ADIF file import. TODO: - Isolate the Awards tab and create a widget with it. TODO: - ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing. TODO: Rework the band & mode hash tables to optimize queries (not sql queries) TODO: Rework the DXCC & WAZ hash table sto optimize queries (not SQL queries) TODO: Import LOTW (MainWindow::slotADIFImport) TODO: Remove the Querys from void SetupPageLogs:: TODO: Create a Widget with the WAZ status (copying the DXCC Status widget) Working: TODO: ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing TODO: Check how to implement qInstallMessageHandler SAT DB: https://db.satnogs.org/api/ This is a kind of roadmap for KLog development. It is not fixed... new features may be prioritized or not added without any notice ;-) Feel free to request any roadmap change if you have any suggestion. TODO: To add the support to import/export the following ADIF fields that are already existing in DB AWARD_SUBMITTED AWARD_GRANTED DARC_DOK FISTS FISTS_CC GUEST_OP "hrdlog_qso_upload_date VARCHAR(10)," "hrdlog_qso_upload_status VARCHAR(1)," "my_antenna VARCHAR," "my_dxcc INTEGER, " "my_fists INTEGER, " "my_itu_zone INTEGER ," "my_postal_code VARCHAR ," "my_sota_ref VARCHAR, " "my_usaca_counties VARCHAR, " "my_vucc_grids VARCHAR, " "silent_key VARCHAR(1), " "region VARCHAR, " "qrzcom_qso_upload_date VARCHAR(10), " "qrzcom_qso_upload_status VARCHAR(1), " "skcc VARCHAR, " "sota_ref VARCHAR, " "uksmg INTEGER, " "usaca_counties VARCHAR, " "ve_prov VARCHAR, " "vucc_grids VARCHAR, " TODO: Add a warning or periodically ADIF export so data is backup TODO: Create a function to look for QSO without a DXCC and ask the user to confirm the DXCC. TODO: Isolate the QSO input tab and create a widget with it. TODO: Isolate the Main QRZ box and create a widget with it. TODO: Isolate the Awards tab and create a widget with it. TODO: Add an option to save the DXCluster data to a file (file based on name or so) TODO: Think if it is possible to create a function in the Widgets(i.e. MainWindowInputQSL) to read the data and enter it in the DB automatically when the user clicks on "enter" It would help to "isolate" it and make it more "independant" TODO: Review the color management in MainWindowInputOthers::setIOTA (and maybe others) (completewithPrevious of MainWindow) TODO: Check if in mainwindow (read formUI and modify the eQSL/LOTW REC/SENT values are correct TODO: If no QSL sent via or rec via are defined, KLog shows as direct? It should be bureau TODO: Add a cheking to the list of bureaus and propose the bureau for QSL via when there is an existing one and propose direct when no bureau is existing. (http://www.iaru.org/qsl-bureaus.html) TODO: Define band limits for CW/SSB/RTTY... so when a click on the cluster is done, the right mode is proposed. TODO: Add in the setup/Band/mode a combobox showing all the active band/modes so the user can select the default band/mode from that list. BUG: Potential bug Double click on a QSO in the log on the Mode/Band... you can modifify the value. As it is a double click, the QSO goes to edit and ... Check if: - Only selected modes can be shown there. - If double click on the log we only "quick modify" directly in the log, without editing. BUG: (TNX JL3OXR) The DB is not storing if the time is stored in UTC or local so that info is lost. If a user changes the configuration from time to time, the user will loose the real time when the QSO was made. Solution: - Consider the DB is only storing UTC QSO. - Read config from user (or simply ask) and convert all the DB to UTC if needed (only one time when new version is installed to upgrade the DB) Always: - When entering data from the UI, check the user config and store only UTC time. - TODO: Think how to show the data in the log or search box as data is stored in UTC and showed directly (specially log widget) - Solution: Maybe changing the header to UTC may solve this and provide the info to the user that UTC is being used for storage It may be weird for the user to see the log in UTC when working in local time... in the rest of the functions... TODO: void DXCCStatusWidget::slotRefreshButtonClicked()//TODO: Define a way to show the status of the selected log or all the logs in the DB BUG: Optimize the KLog start BUG: If logbook.dat is not existing but klogrc it is, KLog does not start. TODO: Add a tip on the DXCC Status showing some info: bearing, DXCC status (worked or not...) TODO: Add a link or action on DXCCStatus items to doubleclick and search the QSOs that provide such status. TODO: Show the flag of the worked QRZ on the top right,close to the Entity Name TODO: Add the flags to the DXCluster TODO: Click on an Entity name will select all the QSO of that Entity on the search box Debian: Time in UTC: (not to be fixed) https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=654325 BUG: Check the options that are marked in QSL when rightbutton. i.e.: Is myQSL sent marked as requested when it should be the DX-QSL? TODO GUI: To add the CQ/ITU box or make them editable TODO: checkIfNewBandOrMode() is not being used. Code should be removed... BUG: Clublog: void MainWindow::slotQRZReturnPressed() _x = elogClublog->deleteQSO(clublogPrevQSO); _x = elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)) It runs so fast and not serialized that at the end sometimes the QSO is deleted but not created afterwards TODO: Add the possibility to the user to select from the setup a call to be used in clublog or use the one comming from the station callsign lineedit TODO: In slotQsoUploadFinished, if QSO is not uploaded. mark it as not uploaded in the log If qsoToEdit, nothing is modified and OK. (Clublog returns QSO DUPE) Again qsoToEdit, nothing is modified and OK (Clublogs returns QSO DROPPED, and QSO is dropped!) TODO: Check the values that clublog is returning to manage errors and show messages to the user TODO: To add the possibility to upload a modified QSO to clublog. TODO: If there is an error in password/username or whatever, disable clublog in KLog TODO: Upload a logfile to clublog // Ideas: https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.h // https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.cpp TODO: Define a maximum QSO upload rate to clublog to avoid excesive API usage. KLog 0.9.4 TODO: Some Entities are not recognized by ARRL (I, IG9, IT9 are the same ARRL id entities but different ones). Maybe I should not be working with ARRLid or maybe I should detect special ones and "id+10000" so >10000 ids are special ones. KLog 0.9.3 TODO: Support CQ WW SSB (Including Cabrillo Import/Export) TODO: Support CQ WW CW (Including Cabrillo Import/Export) KLog 0.9.4 TODO: Hamlib support (Linux). KLog 0.9.5 TODO: Support CQ WPX SSB (Including Cabrillo Import/Export) TODO: Support CQ WPX CW (Including Cabrillo Import/Export) KLog 0.9.6 WORLDEDITOR Dialog TODO: WorldEditor is not updated when the CTY.CSV file is updated TODO: World Editor: Create a way to add an entity. TODO: World Editor: Create a way to remove an entity. TODO: World Editor: Create a way to edit an entity. KLog 0.9.7 TODO: Integrate with www.clublog.org (http://www.clublog.org/docs/pages/viewpage.action?pageId=1638482) KLog 0.9.8 TODO: Integrate with eqsl.cc https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm KLog 0.9.9 TODO: Server to log all the QSO in real time (through the network) from N1MM http://n1mm.hamdocs.com/tiki-index.php?page=UDP+Broadcasts&structure=N1MM+Logger+Documentation KLog 0.9.10 TODO: Integrate with FLIGI real time logging (req by AA5VI) KLog 0.9.11 - Cluster release TODO: DXCluster: Add flags to the DXCluster widget TODO: DXCluster: UI: Modify the DX-Cluster tab to show the data in a table?: DX de/Freq/DX/Comment/Time/Loc TODO: DXCluster: Add the DXMarathon information to the spots TODO: DXCLuster: Create a band map (including a "to-be-worked") TODO: Working on the dxCluster: Tool to save the DXCluster in a file (for further analysis). KLog 0.9.12 TODO: Add the awards functionality (to manage awa files, TPEA, WAS, ...) KLog 0.9.13 TODO: Mobile interface. Create a mobile UI. TODO: Check if the data has been modified (only memory) and save the data! TODO BUG: When modifying allow deleting data (as in KLog 0.5.8) DONE BUG: Worked DXCC and WAZ are not updated until confirmed :-? TODO: When importing an ADIF file with several logs, create automatically the logs as detected. TODO: HelpHelpDialog TODO: HelpAboutDialog TODO: setuppagelogs.cpp TODO: Remove references to DataBase from all classes except DataProxySQLite TODO: DXCluster: Lines that are not a DX should not be in another color than default. TODO: Add a default DX Cluster server TODO: Make a tool to mark and export QSO from the right button. (i.e. To mark several QSO to print and export the ADIF file with just those QSO) TODO: Add all the Entity Info to the slotClear to clear everything. TODO: Add a list of previous QSO with the same station, if any. (Done in the search box) TODO: Create something like a void Awards::setAwardsOfAllQSO to read ALL QSO and set the Awards at once instead of adding one QSO per QSO KLOG TODO: TODO: To create a function tha runs the log and marks "N" if QSL has not been sent or received. TODO: Create a setup page to configure a default prop_mode per band (ie 6m = ES) TODO: CTY.DAT update TODO: Award tabs: center/bold tabs TODO: Add export to cabrillo to the logfile SETUP: TODO: Show progress when doing actions TODO: Open this file when opening TODO: DXCLuster: Show HF activity TODO: DXCLuster: Show WARC TODO: DXCLuster: Show VHUF TODO: DXCLuster: Show confirmed TODO: DXCLuster: Show SSB TODO: DXCLuster: Show CW TODO: DXCLuster: Show Ann/full TODO: DXCLuster: Show WCY TODO: DXCLuster: Show WWV TODO: DXCLuster: Double click on a spot, add it to log TODO: DXCLuster: Add Cluster servers DONE: TODO: Colors: Confirmed, Worked, Needed band, New, Default TODO: Require mandatory fields in all QSO TODO: Awards: Add Award TODO: Awards: Remove Award ===================== TODO: Sats: Create a way to update the list of supported satellites. Maybe another tab in the setup dialog as the World Editor TODO: Sats: https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm TODO: Sats: https://lotw.arrl.org/lotw/faq#sats TODO: Sat Modes: http://www.amsat.org/amsat/intro/sats_faq.html#RTFToC5 http://www.sckans.edu/~sireland/radio/amsat.html A - This mode requires a 2 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. B - This mode requires a 70 cm SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. Some satellites also support RTTY and SSTV in this mode. J -> V Uplink and U downlink JA - This mode stands for J Analog and requires a 2 meter SSB/CW transmitter and a 70 cm SSB/CW receiver and supports CW, voice. JD - This mode stands for J Digital and requires a 2 meter FM transmitter and a 70 cm SSB/CW receiver and supports packet. K - This mode requires a 15 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. This mode is unique in that it can be done with a simple HF rig. S - This mode requires a 70 cm SSB/CW transmitter and a 2.4 GHz SSB/CW receiver and supports CW and voice. Many people use a 2.4 GHz to 2 meter converter with a 2 meter SSB/CW receiver instead of buying a 2.4 GHz SSB/CW receiver. T - This mode requires a 15 meter SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. KT, KA, BS, Some satellites have dual modes that operate simultaneously. For example, AO-13 can operate in mode BS which means that it can do both mode B and mode S simultaneously. Other common dual modes are KT and KA. Mode V Mode U Mode U/V -> B TODO: Code a way to sort the bands/modes in the "setuppagebandsmodes.cpp TODO: Create an "updateKLog" class to manage all the release updates so there is a way to detect the version of KLog and upgrade the DB to the latest. TODO: The following fields may add information, even if the qsl has not been rcvd/sent B B TODO: showStatusOfDXCC should be executed when band change. TODO: Add color support: messages for slotQRZTextChanged TODO: SetupPageColors: Check the style in the buttons as the rounds are lost when I change the color!! TODO: MainWindow::processConfigLine: add support for the cluster data. TODO: Check when to connect the DXCluster and when no, it tries twice or more... TODO: Awards: make a function to calculate the total. TODO: Color support: Add needed, worked, confirmed, neutral colors to the configuration dialog. TODO: Color support: Support the bar when a QRZ is entered. TODO: Color support: Calculate a color for the log. TODO: World::getDXStatus: Calculate the algorithm to know the different status for a DXCC (confirmed, worked, confirmed in another band, ,...) TODO: World:: Maybe the color should be returned from the World class TODO: Check the readDataFromUI. QSO are not added when in contest. TODO: Check that New Log, Open, ... somewhere the log table is removed from the DB! TODO: The confirmed WAZ number is not properly calculated. TODO: GUI: Add in the input box a combobox to change the CQZ TODO: GUI: Add in the input box a combobox to change the ITUZ TODO: In CQWWSSB, when editing QSO the SRX, Points, multiplier, ... are not sent to the edit so after "OK", those data are lost. TODO: MainWindow::slotQsoDeleteFromLog: Add the CALL to the message before detele a QSO. TODO: Search GUI: add multi-selection QSO to do the same actions inmultiple QSO. TODO: When importing ADIF, update the logview sometimes... just to show the progress. TODO: When importing ADIF: Only shows the ProgresDialog when the number is low >1000 <14000 investigate TODO: Import Cabrillo TODO: To check how can I order the columns in the log or in the search QTableView. Now the order depends only on the order of the SQL table. TODO: When modifying a cell directly in the log, it is possible to select a mode/band that is not actually active in the configuration. TODO: Slot: If (only)eqsl/lotw is sent/rec, the QSL_RCVD_VIA should be E TODO: Code a Tool to get statistcs for the contests, some kind of post contest tool. http://www.qsl.net/3v4-002/Contests/2011%20CQ-WW-SSB%203V8SS/index.htm TODO: Be able to send scores to: http://www.cqcontest.ru/help/developers.jsp TODO: Create an update CTY.DAT without overwriting the current data. Just Adding and correcting (asking) if data is already there but different. TODO: Create an export CTY.DAT file to create a CTY.DAT file with ALL the data in the current "world". FILEMANAGER TODO: adifLogExportToFile: Count the marked QSO and adjust the numberOfQsos TODO: FileManager::adifReadLog: Optimize the dialog (maybe updating only each 100 or as in KLog) TODO: FileManager::adifReadLog: Add a semaphore/lock or similar to avoid running the same method twice or more at the same time... or at least the same file. It seems that now it "serializes" the import... TODO: Check that FileManager::adifLogExportToFile is exporting ALL the DB fields. TODO: FileManager::adifLogExportToFile code a progress dialog for exporting. TODO: When importing ADIF: Check if all the QSO have all the mandatory fields and warn the user if not. Optimization: The ADIF import is very slow. Optimization is recommended. IMPROVEMENT: Improve the result of the log printing. DONE: TODO: Working on the DB version update functions DONE: MainWindow::showAwards Remove "empty CQZ" when counting to avoid having 41 CQ zones DONE: Code the color configuration for status of an entity (needed/worked/confirmed). DONE: Color support: Calculate a color for the search results. DONE: Color support: Calculate a color for the DXCluster. DONE: TODO: Colors: Reconfigure the colors needs KLog to be restarted. DONE: Working on the dxCluster: Color support, identify the different kind of lines... DX de, normal spots, comments, ... DONE: Working on setAwardDXCC: When adding if a pair is already entered but we are going to add a confirmed status, modify it. DONE: Right click on log to show a to edit QSO. DONE: Right click on log to show a QSL received. DONE: Right click on log to remove a QSO. DONE: Right click on log to show a QSL sent. TODO: Right click on search to remove a QSO. DONE: Right click on search to show a QSL reception. DONE: Right click on search to show a QSL sent. DONE: Right click on search to show to edit QSO. DONE: Added a select/unselect all button to the search QSO tab. DONE: Search QSO to send DONE: Add a button to export to ADIF the content of searchResultsTreeWidget DONE: When importing ADIF, if the CQZ/ITUZ/DXCC is empty, calculate and add it. DONE: Not export ADIF fields if "N": DONE: Print the log. DONE: TODO: Time in UTC DONE: TODO: Log in real time DONE: Double click on cluster to select DONE: TODO: When double clicking on a DX-Spot, frequency should be also copied to inputbox DONE: TODO: When a DX-Spot is selected, the DX-Entity and status should be shown. DONE: TODO: DXCluster: Connect, disconnect and connect again does not work DONE: TODO: Add a field in Mainwindow to manage RX_PWR DONE: TODO: slotclearbuttons->Colors to default DONE: GUI: Add in the input box a combobox to change the DXCC klog-1.8.6/searchmodel.h0000644000175000017500000000567114166020407014112 0ustar develdevel#ifndef SEARCHMODEL_H #define SEARCHMODEL_H /*************************************************************************** searchmodel.h - description ------------------- begin : sep 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "awards.h" #include "dataproxy_sqlite.h" class SearchModel : public QSqlRelationalTableModel { Q_OBJECT public: SearchModel(DataProxy_SQLite *dp, QObject *parent); void createSearchModel(const int _i); void setFilterString(const QString &_st); void setStationCallsignInHeader(const bool _s); void update(); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setDXCCColumn(const int _i); void setBandIdColumn(const int _i); void setModeIdColumn(const int _i); void setLogNColumn(const int _i); private: //void setColumnsToDX(); //QSqlRelationalTableModel *SearchModel; QVariant data(const QModelIndex &index, int role) const; Awards *award; DataProxy_SQLite *dataProxy; bool stationCallsignInHeader; int dxcc, bandid, modeid, logn; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // SEARCHMODEL_H klog-1.8.6/searchmodel.cpp0000644000175000017500000001662014166020407014441 0ustar develdevel/*************************************************************************** searchmodel.cpp - description ------------------- begin : sep 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchmodel.h" SearchModel::SearchModel(DataProxy_SQLite *dp, QObject *parent):QSqlRelationalTableModel(parent) { //qDebug() << "SearchModel::SearchModel " << QT_ENDL; dataProxy = dp; stationCallsignInHeader = true; setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); dxcc = -1; bandid = -1; modeid = -1; logn = -1; award = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "SearchModel::SearchModel: Rows obtained: " << QString::number(rowCount()) << QT_ENDL; //qDebug() << "SearchModel::SearchModel - END" << QT_ENDL; } void SearchModel::setDXCCColumn(const int _i) { dxcc = _i; } void SearchModel::setBandIdColumn(const int _i) { bandid = _i; } void SearchModel::setModeIdColumn(const int _i) { modeid = _i; } void SearchModel::setLogNColumn(const int _i) { logn = _i; } void SearchModel::createSearchModel(const int _i) { /* Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 setRelation ( int column, const QSqlRelation & relation ) model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); The setRelation() call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. */ /* This should be coherent with the treeview */ //qDebug() << "SearchModel::createSearchModel: log: " << QString::number(_i) << QT_ENDL; //QString contestMode = dataProxy->getLogTypeOfUserLog(_i); QString stringQuery = QString("lognumber='%1'").arg(_i); QSqlQuery query(stringQuery); setFilter(stringQuery); //setColumnsToDX(); select(); } void SearchModel::setStationCallsignInHeader(const bool _s) { stationCallsignInHeader = _s; } /* void SearchModel::setColumnsToDX() { //qDebug() << "SearchModel::setColumnsToDX" << QT_ENDL; QSqlQuery q; //QString stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, id FROM log LIMIT 1"); QString stringQuery = QString("SELECT * FROM log _dateLIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; bool sqlOK = q.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().nativeErrorCode(), q.lastQuery()); } q.next(); rec = q.record(); // Number of columns //qDebug() << "SearchModel::createSearchModel - query: " << q.lastQuery() << QT_ENDL; //qDebug() << "SearchModel::createSearchModel - columns: " << QString::number(rec.count()) << QT_ENDL; nameCol = rec.indexOf("bandid"); setRelation(nameCol, QSqlRelation("band", "id", "name")); nameCol = rec.indexOf("modeid"); setRelation(nameCol, QSqlRelation("mode", "id", "submode")); nameCol = rec.indexOf("qso_date"); setHeaderData(nameCol, Qt::Horizontal, tr("Date/Time")); nameCol = rec.indexOf("call"); setHeaderData(nameCol, Qt::Horizontal,tr("Call")); nameCol = rec.indexOf("bandid"); setHeaderData(nameCol, Qt::Horizontal, tr("Band")); nameCol = rec.indexOf("modeid"); setHeaderData(nameCol, Qt::Horizontal, tr("Mode")); nameCol = rec.indexOf("qsl_sent"); setHeaderData(nameCol, Qt::Horizontal, tr("QSL Sent")); nameCol = rec.indexOf("qsl_rcvd"); setHeaderData(nameCol, Qt::Horizontal, tr("QSL Rcvd")); if (stationCallsignInHeader) { nameCol = rec.indexOf("station_callsign"); setHeaderData(nameCol, Qt::Horizontal, tr("Station Callsign")); } nameCol = rec.indexOf("id"); //setHeaderData(nameCol, Qt::Horizontal, tr("ID")); setSort(nameCol, Qt::AscendingOrder); } */ void SearchModel::setFilterString(const QString &_st) { //qDebug() << "SearchModel::setFilterString: " << _st << QT_ENDL; setFilter(_st); select(); //qDebug() << "SearchModel::setFilterString: SelectStatement: " << selectStatement () << QT_ENDL; } void SearchModel::update() { select(); } void SearchModel::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; // Just to pass the colors to the awards class award->setColors(_newOne, _needed, _worked, _confirmed, _default); } QVariant SearchModel::data( const QModelIndex &index, int role ) const { if ( index.isValid() && role == Qt::ForegroundRole ) { if ( index.column() == 2 ) { //QString _qrz = data(index, Qt::DisplayRole).toString(); //From Search QSO to QSL: q << _call << bandid << _mode << QString::number(currentLog); QString _dxcc = index.siblingAtColumn(dxcc).data().toString(); QString _bandid = index.siblingAtColumn(bandid).data().toString(); QString _modeid = index.siblingAtColumn(modeid).data().toString(); QString _log = index.siblingAtColumn(logn).data().toString(); QStringList qs; qs.clear(); qs << _dxcc << QString::number(dataProxy->getIdFromBandName(_bandid)) << "-1" << _log ; //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); //qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; return QVariant( award->getQRZDXStatusColor(qs) ); // return QVariant( QColor( Qt::red ) ); } return QVariant( QColor( Qt::black ) ); } return QSqlRelationalTableModel::data( index, role ); } klog-1.8.6/udpserver.h0000644000175000017500000001121514166020407013632 0ustar develdevel#ifndef UDPSERVER_H #define UDPSERVER_H /*************************************************************************** udpserver.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "utilities.h" enum Type { Heartbeat, Status, Decode, Clear, Reply, QSOLogged, Close, Replay, HaltTx, FreeText, WSPRDecode, Location, LoggedADIF, HighlightCallsign, SwitchConfiguration, Configure, maximum_message_type_ // ONLY add new message types // immediately before here }; class UDPServer : public QObject { Q_OBJECT public: explicit UDPServer(QObject *parent = nullptr); bool start(); bool stop(); bool isStarted(); void setLogging(const bool _t); void setRealTimeUpdate(const bool _t); //void setAddress(const QString &_address); void setPort(const int _port); void setNetworkInterface(const QString &_t); private: void readPendingDatagrams(); void parse(const QByteArray &msg); void adifParse(QByteArray &msg); void leaveMultiCastGroup(); void joinMultiCastGroup(); bool startNow(quint16 _port, QHostAddress const& _multicast_group_address); QNetworkInterface networkInterface; QUdpSocket *socketServer; QHostAddress groupAddress; //QString address; int port; bool logging, realtime; bool haveNetworkInterface; Utilities *util; #if QT_VERSION >= 0x050400 static quint32 constexpr schema_number {3}; #elif QT_VERSION >= 0x050200 static quint32 constexpr schema_number {2}; #else // Schema 1 (Qt_5_0) is broken #error "Qt version 5.2 or greater required" #endif signals: void status_update (const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString report, const QString de_call, const QString de_grid, const QString dx_grid, const QString sub_mode); //void logged_qso (const int _type, const QString &_dxcall, const double _freq, const QString &_mode, // const QString &_dx_grid, const QString &_time_off, const QString &_report_sent, const QString &_report_rec, // const QString &_tx_power, const QString &_comments, const QString &_name, const QString &_time_on, const QString &_de_call, const QString &_de_grid); void logged_qso (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &rstTX, const QString &rstRX, const QString &comment, const QString &stationcallsign, const QString &name, const QString &_operator, const QDateTime datetime, const QDateTime datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_txpwr); void clearSignal(); private slots: void slotReadPendingDatagrams(); }; #endif // UDPSERVER_H klog-1.8.6/statisticswidget.cpp0000644000175000017500000001324614166020407015552 0ustar develdevel/*************************************************************************** statisticswidget.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statisticswidget.h" StatisticsWidget::StatisticsWidget(DataProxy_SQLite *dp, QWidget *parent): QWidget(parent) { dataProxy = dp; statisticToShowComboBox = new QComboBox(); logComboBox = new QComboBox(); barChartStats = new BarChartStats(dp, this); //donutChartStats = new DonutChartStats(dp, this); //chartView = new QChartView(this); //graphWidget = new QWidget(this); statisticsToShowList.clear(); createUI(); connect(statisticToShowComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChartComboBoxChanged() ) ) ; connect(logComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLogComboBoxChanged() ) ) ; //barChartStats->prepareChart(1); } StatisticsWidget::~StatisticsWidget() { } void StatisticsWidget::clear() { //qDebug() << "StatisticsWidget::clear()" << QT_ENDL; } void StatisticsWidget::closeEvent(QCloseEvent *event) { //qDebug() << "StatisticsWidget::closeEvent" << QT_ENDL; //barChartStats->clear(); event->accept(); } void StatisticsWidget::showEvent(QShowEvent *event) { //qDebug() << "StatisticsWidget::showEvent" << QT_ENDL; //barChartStats->clear(); fillLogCombo(); event->accept(); } void StatisticsWidget::slotChartComboBoxChanged() { //qDebug() << "StatisticsWidget::slotChartComboBoxChanged: " << statisticToShowComboBox->currentText() << QT_ENDL; updateChart(); statisticToShowComboBox->setFocus(); } void StatisticsWidget::slotLogComboBoxChanged() { updateChart(); logComboBox->setFocus(); } void StatisticsWidget::updateChart() { QString text = statisticToShowComboBox->currentText(); text.truncate(2); //int log = ((logComboBox->currentText()).left((logComboBox->currentText()).indexOf('-')+1)).toInt(); int log = ((logComboBox->currentText()).section('-', 0, 0)).toInt(); //qDebug() << Q_FUNC_INFO << " Text : " << logComboBox->currentText() << QT_ENDL; //qDebug() << Q_FUNC_INFO << " Log : " << QString::number(log) << QT_ENDL; //barChartStats = new BarChartStats(dataProxy, this); barChartStats->prepareChart(text.toInt(), log); } void StatisticsWidget::createUI() { statisticsToShowList << "01-" + tr("QSO per year"); statisticsToShowList << "02-" + tr("DXCC per year"); statisticsToShowList << "03-" + tr("CQ zones per year"); statisticsToShowList << "04-" + tr("QSO per band"); statisticsToShowList << "05-" + tr("QSO per mode"); statisticsToShowList << "06-" + tr("QSO per DXCC"); statisticsToShowList << "07-" + tr("QSO per Continent"); statisticsToShowList << "08-" + tr("QSO per hour"); statisticsToShowList << "09-" + tr("QSO per month"); statisticsToShowList << "10-" + tr("Worked / Confirmed status"); statisticsToShowList << "11-" + tr("Worked / Sent status"); statisticsToShowList << "12-" + tr("Sent / Confirmed status"); statisticsToShowList << "13-" + tr("Satellite grid status"); statisticsToShowList << "14-" + tr("Satellite DXCC status"); statisticsToShowList << "15-" + tr("Grids per band status"); statisticsToShowList << "16-" + tr("DXCC per band status"); statisticToShowComboBox->addItems(statisticsToShowList); fillLogCombo(); QHBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(statisticToShowComboBox); hLayout->addWidget(logComboBox); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(hLayout); layout->addWidget(barChartStats); setLayout(layout); resize(420,300); } void StatisticsWidget::fillLogCombo() { QStringList ids; ids.clear(); ids << dataProxy->getListOfManagedLogs(); QStringList logs; logs.clear(); for (int i = 0; i < ids.size(); ++i) { //cout << fonts.at(i).toLocal8Bit().constData() << QT_ENDL; logs<< ids.at(i) + "-" + dataProxy->getLogDateFromLog((ids.at(i)).toInt()) + "-" + dataProxy->getStationCallSignFromLog((ids.at(i)).toInt()); } logComboBox->clear(); logComboBox->addItems(logs); } klog-1.8.6/qso.cpp0000644000175000017500000005136714166020407012764 0ustar develdevel/*************************************************************************** qso.cpp - description ------------------- begin : may 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "qso.h" QSO::QSO() { clear(); } QSO::~QSO() { clear(); } void QSO::clear() { //qDebug() << Q_FUNC_INFO; qsoId = -1; logId = -1; backup = false; callsign = QString(); stationCallsign = QString(); operatorCall = QString(); band = QString(); mode = QString(); qsl_rcvd = QString(); qsl_sent = QString(); QSLRDate = QDate(); QSLSDate = QDate(); qslSenVia = QString(); qslRecVia = QString(); qslVia = QString(); qslMsg = QString(); clublog_status = QString(); clublogDate = QDate(); eqsl_qsl_sent = QString(); eqsl_qsl_rcvd = QString(); eQSLRDate = QDate(); eQSLSDate = QDate(); QRZCom_status = QString(); QRZComDate = QDate(); lotw_qsl_sent = QString(); lotw_qsl_rcvd = QString(); gridsquare = QString(); myGridsquare = QString(); my_sota_ref = QString(); my_rig = QString(); my_antenna = QString(); my_vucc_grids= QString(); vucc_grids= QString(); qth = QString(); name = QString(); freq_tx = -1.0; freq_rx = -1.0; age = -1.0; sota_ref = QString(); pwr_rx = 0.0; RST_rx = QString(); RST_tx = QString(); dxcc = -1; propMode = QString(); iota = QString(); QSLLoTWRDate = QDate(); QSLLoTWSDate = QDate(); qso_dateTime = QDateTime(); lotwUpdating = false; realTime = false; comment = QString(); satName = QString(); satMode = QString(); keepComment = false; keepMyData = false; keepOther = false; keepSat = false; modifying = false; } void QSO::setBackup(const bool _rt) { backup = _rt; } bool QSO::getBackup() { return backup; } void QSO::setModifying(const bool _mod) { modifying = _mod; } bool QSO::getModifying() { return modifying; } bool QSO::setQSOid(const int _i) { if (_i >0) { qsoId = _i; return true; } else { return false; } } int QSO::getQSOid() { return qsoId; } bool QSO::setLogId(const int _i) { if (_i >0) { logId = _i; return true; } else { return false; } } int QSO::getLogId() { return logId; } bool QSO::isValid() { //qDebug() << "QSO::isValid: " << callsign << QT_ENDL; if ( (callsign.length()>0)) { //qDebug() << "QSO::isValid: TRUE" << QT_ENDL; return true; } else { //qDebug() << "QSO::isValid: FALSE" << QT_ENDL; return false; } } bool QSO::setCall(const QString &_c) { //qDebug() << "QSO::setCall: " << _c << QT_ENDL; if (util->isValidCall(_c)) { //qDebug() << "QSO::setCall: Valid Call" << QT_ENDL; callsign = _c; return true; } else { //qDebug() << "QSO::setCall: NOT valid Call" << QT_ENDL; return false; } } QString QSO::getCall() { return callsign; } bool QSO::setBand(const QString &_c) { //qDebug() << "QSO::setBand: "<< _c << QT_ENDL; if (_c.length()>0) { band = _c; return true; } else { band = QString(); return false; } } QString QSO::getBand() { return band; } bool QSO::setBandRX(const QString &_c) { //qDebug() << "QSO::setBandRX: "<< _c << QT_ENDL; if (_c.length()>0) { band = _c; return true; } else { band = QString(); return false; } } QString QSO::getBandRX() { return band; } bool QSO::setMode(const QString &_c) { //int i = dataProxy->getIdFromModeName(_c); if (_c.length()>0) { mode = _c; return true; } else { mode = QString(); return false; } } QString QSO::getMode() { return mode; } bool QSO::setDate(const QDate &_c) { //qDebug() << "QSO::setDate: " << util->getDateSQLiteStringFromDate(_c) << QT_ENDL; if (_c.isValid()) { //qDebug() << "QSO::setDate: VALID" << QT_ENDL; qso_dateTime.setDate(_c); return true; } else { //qDebug() << "QSO::setDate: NOT VALID" << QT_ENDL; qso_dateTime.setDate(QDate()); return false; } } QDate QSO::getDate() { return qso_dateTime.date(); } bool QSO::setTimeOn(const QTime &_c) { //qDebug() << "QSO::setQSLTime: " << _c.toString("mmhhss") << QT_ENDL; if (_c.isValid()) { //qDebug() << "QSO::setQSLTime: VALID" << QT_ENDL; qso_dateTime.setTime(_c); return true; } else { //qDebug() << "QSO::setQSLTime: NOT VALID" << QT_ENDL; qso_dateTime.setTime(QTime()); return false; } } QTime QSO::getTimeOn() { return qso_dateTime.time(); } QDateTime QSO::getDateTimeOn() { return qso_dateTime; } bool QSO::setDateTimeOn(const QDateTime &_c) { if (_c.isValid()) { qso_dateTime = _c; return true; } else { return false; } } void QSO::setRealTime(const bool _rt) { realTime = _rt; } bool QSO::getRealTime() { return realTime; } double QSO::setFreqTX(const double _f) { if (_f>0) { freq_tx = _f; return true; } else { return false; } } bool QSO::setFreqRX(const double _f) { if (_f>0) { freq_rx = _f; return true; } else { return false; } } double QSO::getFreqTX() { return freq_tx; } double QSO::getFreqRX() { return freq_rx; } // eQSL Tab bool QSO::setClubLogStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { clublog_status = _c; return true; } else { return false; } } QString QSO::getClubLogStatus() { return clublog_status; } bool QSO::setClubLogDate(const QDate &_c) { if (_c.isValid()) { clublogDate = _c; return true; } else { clublogDate = QDate(); return false; } } QDate QSO::getClubLogDate() { return clublogDate; } bool QSO::setQRZCOMStatus(const QString &_c) { { if (util->isValidUpload_Status (_c)) { QRZCom_status = _c; return true; } else { return false; } } } QString QSO::getQRZCOMStatus() { return QRZCom_status; } bool QSO::setQRZCOMDate(const QDate &_c) { if (_c.isValid()) { clublogDate = _c; return true; } else { clublogDate = QDate(); return false; } } QDate QSO::getQRZCOMDate() { return QRZComDate; } bool QSO::setEQSLQSL_RCVD(const QString &_c) { if (util->isValidQSL_Rcvd(_c)) { eqsl_qsl_rcvd = _c; return true; } else { return false; } } QString QSO::getEQSLQSL_RCVD() { return eqsl_qsl_rcvd; } bool QSO::setEQSLQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent(_c)) { eqsl_qsl_sent = _c; return true; } else { return false; } } QString QSO::getEQSLQSL_SENT() { return eqsl_qsl_sent; } bool QSO::setEQSLQSLRDate(const QDate &_c) { if (_c.isValid()) { eQSLRDate = _c; return true; } else { eQSLRDate = QDate(); return false; } } QDate QSO::getEQSLQSLRDate() { return eQSLRDate; } bool QSO::setEQSLQSLSDate(const QDate &_c) { if (_c.isValid()) { eQSLSDate = _c; return true; } else { eQSLSDate = QDate(); return false; } } QDate QSO::getEQSLQSLSDate() { return eQSLSDate; } bool QSO::setLoTWQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent(_c)) { lotw_qsl_sent = _c; return true; } else { return false; } } QString QSO::getLoTWQSL_SENT() { return lotw_qsl_sent; } bool QSO::setLoTWQSLSDate(const QDate &_c) { //qDebug() << Q_FUNC_INFO; if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << " - valid"; QSLLoTWSDate = _c; return true; } else { //qDebug() << Q_FUNC_INFO << " - NOT valid"; QSLLoTWSDate = QDate(); return false; } } QDate QSO::getLoTWQSLSDate() { return QSLLoTWSDate; } bool QSO::setLoTWQSL_RCVD(const QString &_c) { //qDebug() << "QSO::setLoTWQSL_RCVD: " << _c << QT_ENDL; if (util->isValidQSL_Rcvd(_c)) { //qDebug() << "QSO::setLoTWQSL_RCVD: VALID " << QT_ENDL; lotw_qsl_rcvd = _c; return true; } else { //qDebug() << "QSO::setLoTWQSL_RCVD: NOT valid " << QT_ENDL; return false; } } QString QSO::getLoTWQSL_RCVD() { return lotw_qsl_rcvd; } bool QSO::setLoTWQSLRDate(const QDate &_c) { //qDebug() << "QSO::setLoTWQSLRDate: " << _c.toString("yyyy-MM-dd") << QT_ENDL; if (_c.isValid()) { //qDebug() << "QSO::setLoTWQSLRDate: TRUE" << QT_ENDL; QSLLoTWRDate = _c; return true; } else { //qDebug() << "QSO::setLoTWQSLRDate: FALSE" << QT_ENDL; QSLLoTWRDate = QDate(); return false; } } QDate QSO::getLoTWQSLRDate() { return QSLLoTWRDate; } // QSL TAB bool QSO::setQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent (_c)) { qsl_sent = _c; return true; } else { return false; } } QString QSO::getQSL_SENT() { return qsl_sent; } bool QSO::setQSLSDate(const QDate &_c) { if (_c.isValid()) { QSLSDate = _c; return true; } else { QSLSDate = QDate(); return false; } } QDate QSO::getQSLSDate() { return QSLSDate; } bool QSO::setQSL_RCVD(const QString &_c) { if (util->isValidQSL_Rcvd(_c)) { qsl_rcvd = _c; return true; } else { return false; } } QString QSO::getQSL_RCVD() { return qsl_rcvd; } bool QSO::setQSLSenVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslSenVia = _qs; return true; } else { return false; } } QString QSO::getSentVia() { return qslSenVia; } bool QSO::setQSLRecVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslRecVia = _qs; return true; } else { return false; } } QString QSO::getRecVia() { return qslRecVia; } bool QSO::setQSLVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslVia = _qs; return true; } else { return false; } } QString QSO::getQSLVia() { return qslVia; } bool QSO::setQSLRDate(const QDate &_c) { if (_c.isValid()) { QSLRDate = _c; return true; } else { QSLRDate = QDate(); return false; } } QDate QSO::getQSLRDate() { return QSLRDate; } bool QSO::setQSLMsg(const QString &_qs) { if (!_qs.isEmpty ()) { qslMsg = _qs; return true; } else { return false; } } QString QSO::getQSLMsg() { return qslMsg; } void QSO::setLoTWUpdating(bool _lotw) { lotwUpdating = _lotw; } bool QSO::setGridSquare(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (util->isValidGrid(_c)) { gridsquare = _c; return true; } else { return false; } } QString QSO::getGridSquare() { //qDebug() << Q_FUNC_INFO << ": " << gridsquare; return gridsquare; } bool QSO::setQTH(const QString &_c) { if (!_c.isEmpty ()) { qth = _c; return true; } else { return false; } } QString QSO::getQTH() { return qth; } bool QSO::setName(const QString &_c) { if (!_c.isEmpty ()) { name = _c; return true; } else { return false; } } QString QSO::getName() { return name; } bool QSO::setRSTRX(const QString &_c) { if (!_c.isEmpty ()) { RST_rx = _c; return true; } else { return false; } } QString QSO::getRSTRX() { return RST_rx; } bool QSO::setRSTTX(const QString &_c) { if (!_c.isEmpty ()) { RST_tx = _c; return true; } else { return false; } } QString QSO::getRSTTX() { return RST_tx; } bool QSO::setRXPwr(const double _f) { if (_f>0) { pwr_rx = _f; return true; } else { return false; } } double QSO::getRXPwr() { return pwr_rx; } // Comment Tab bool QSO::setComment(const QString &_c) { if (!_c.isNull ()) { comment = _c; return true; } else { return false; } } QString QSO::getComment() { return comment; } bool QSO::setKeepComment(bool _k) { keepComment = _k; return true; } bool QSO::getKeepComment() { return keepComment; } // Other Tab bool QSO::setDXCC(const int _i) { if (util->isValidDXCC(_i)) { dxcc = _i; return true; } return false; } int QSO::getDXCC() { return dxcc; } bool QSO::setPropMode(const QString &_c) { if (_c.length()>0) { propMode = _c; return true; } else { propMode = QString(); return false; } } QString QSO::getPropMode() { return propMode; } bool QSO::setSOTA_REF(const QString &_c) { if (_c.length ()>1) { sota_ref = _c; return true; } return false; } QString QSO::getSOTA_REF() { return sota_ref; } bool QSO::setMySOTA_REF(const QString &_c) { if (_c.length ()>1) { my_sota_ref = _c; return true; } return false; } QString QSO::getMySOTA_REF() { return my_sota_ref; } bool QSO::setMyRig(const QString &_c) { if (_c.length ()>1) { my_rig = _c; return true; } return false; } bool QSO::setVUCCGrids(const QString &_c) { if (util->isValidVUCCGrids (_c)) { vucc_grids = _c; return true; } else { return false; } } QString QSO::getVUCCGrids() { return vucc_grids; } bool QSO::setMyVUCCGrids(const QString &_c) { if (util->isValidVUCCGrids (_c)) { my_vucc_grids = _c; return true; } else { return false; } } QString QSO::getMyVUCCGrids() { return my_vucc_grids; } QString QSO::getMyRig() { return my_rig; } bool QSO::setMyAntenna(const QString &_c) { if (_c.length ()>1) { my_antenna = _c; return true; } return false; } QString QSO::getMyAntenna() { return my_antenna; } double QSO::setAge(const double _c) { if ((0 <= _c) && (_c <= 120)) { age = _c; return true; } return false; } double QSO::getAge() { return age; } bool QSO::setIOTA(const QString &_c) { if (_c.length()>0) { iota = _c; return true; } else { iota = QString(); return false; } } QString QSO::getIOTA() { return iota; } bool QSO::setKeepOthers(bool _k) { keepOther = _k; return true; } bool QSO::getKeepOthers() { return keepOther; } // My Data bool QSO::setTXPwr(const double _f) { if (_f>0) { pwr_tx = _f; return true; } else { return false; } } double QSO::getTXPwr() { return pwr_tx; } bool QSO::setOperatorCallsign(const QString &_c) { if (util->isValidCall(_c)) { operatorCall = _c; return true; } else { return false; } } QString QSO::getOperatorCallsign() { return operatorCall; } bool QSO::setStationCallsign(const QString &_c) { if (util->isValidCall(_c)) { stationCallsign = _c; return true; } else { return false; } } QString QSO::getStationCallsign() { return stationCallsign; } bool QSO::setMyGridSquare(const QString &_c) { if (util->isValidGrid(_c)) { myGridsquare = _c; return true; } else { return false; } } QString QSO::getMyGridSquare() { return myGridsquare; } bool QSO::setKeepMyData(bool _k) { keepMyData = _k; return true; } bool QSO::getKeepMyData() { return keepMyData; } // Satellite Tab bool setKeepSatTab(bool _k); bool getKeepSatTab(); bool QSO::setSatName(const QString &_c) { if (_c.length()>0) { satName = _c; return true; } else { satName = QString(); return false; } } QString QSO::getSatName() { return satName; } bool QSO::setSatMode(const QString &_c) { if (_c.length()>0) { satMode = _c; return true; } else { satMode = QString(); return false; } } QString QSO::getSatMode() { return satMode; } bool QSO::setKeepSatTab(bool _k) { keepSat = _k; return true; } bool QSO::getKeepSatTab() { return keepSat; } // SET DATA bool QSO::setData(const QString &_adifPair) { //qDebug() << "QSO::setData: " << _adifPair << QT_ENDL; QStringList d; d.clear(); d << util->getValidADIFFieldAndData(_adifPair); if (d.length()!=2) { //qDebug() << "QSO::setData: NOT VALID ADIF: " << _adifPair << QT_ENDL; return false; } //qDebug() << "QSO::setData: " << d.at(0) << "/" << d.at(1) << QT_ENDL; QString field = d.at(0).toUpper(); QString data = d.at(1); if (field == "CALL") { setCall(data); } else if (field == "BAND") { setBand(data); } else if (field == "MODE") { setMode(data); } else if (field == "TIME_ON") { setTimeOn(util->getTimeFromADIFTimeString(data)); } else if (field == "QSO_DATE") { //qDebug() << "QSO::setData: QSO_DATE: " << data << QT_ENDL; setDate(util->getDateFromADIFDateString(data)); } else if (field == "FREQ") { setFreqTX (data.toDouble()); } else if (field == "FREQ_RX") { setFreqRX(data.toDouble()); } else if (field == "QSLRDATE") { setQSLRDate(util->getDateFromADIFDateString(data)); } else if (field == "QSL_RCVD") { setQSL_RCVD(data); } else if (field == "SAT_MODE") { setSatMode(data); } else if (field == "SAT_NAME") { setSatName(data); } else if (field == "PROP_MODE") { setPropMode(data); } else if (field == "LOTW_QSL_RCVD") { setLoTWQSL_RCVD(data); } else if (field == "LOTW_QSL_SENT") { setLoTWQSL_SENT(data); } else if (field == "STATION_CALLSIGN") { setStationCallsign(data); } else if (field == "OPERATOR") { setOperatorCallsign (data); } else if (field == "GRIDSQUARE") { setGridSquare(data); } else if (field == "MYGRIDSQUARE") { setMyGridSquare(data); } else if (field == "APP_LOTW_RXQSL") { //qDebug() << "QSO::setData: APP_LOTW_RXQSL: " << data << QT_ENDL; setLoTWQSL_RCVD("Y"); setLoTWQSLRDate(util->getDateFromLoTWQSLDateString(data)); } else if (field == "APP_LOTW_RXQSO") { //qDebug() << "QSO::setData: APP_LOTW_RXQSO: " << data << QT_ENDL; setLoTWQSL_SENT("Y"); setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } else if (field == "APP_LOTW_QSO_TIMESTAMP") { //qDebug() << "QSO::setData: APP_LoTW_QSO_TIMESTAMP: " << data << QT_ENDL; setLoTWQSL_SENT("Y"); setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } return true; } klog-1.8.6/klog.qrc0000644000175000017500000002171214166020407013110 0ustar develdevel img/klog_512x512.png img/klog_256x256.png img/klog_logo.png img/klog.ico img/stop.svg img/play.svg flags/ad.png flags/ae.png flags/af.png flags/ag.png flags/ai.png flags/al.png flags/am.png flags/an.png flags/ao.png flags/ar.png flags/as.png flags/at.png flags/au.png flags/aw.png flags/ax.png flags/az.png flags/ba.png flags/bb.png flags/bd.png flags/be.png flags/bf.png flags/bg.png flags/bh.png flags/bi.png flags/bj.png flags/bm.png flags/bn.png flags/bo.png flags/bq.png flags/br.png flags/bs.png flags/bt.png flags/bv.png flags/bw.png flags/by.png flags/bz.png flags/ca.png flags/canary.png flags/cc.png flags/cd.png flags/cf.png flags/cg.png flags/ch.png flags/ci.png flags/ck.png flags/cl.png flags/cm.png flags/cn.png flags/co.png flags/cr.png flags/cs.png flags/cu.png flags/cv.png flags/cw.png flags/cx.png flags/cy.png flags/cz.png flags/de.png flags/dj.png flags/dk.png flags/dm.png flags/do.png flags/dz.png flags/ec.png flags/ee.png flags/eg.png flags/eh.png flags/england.png flags/southbritish.png flags/er.png flags/es.png flags/balear.png flags/ceuta.png flags/et.png flags/europeanunion.png flags/fam.png flags/fi.png flags/fj.png flags/fk.png flags/fm.png flags/fo.png flags/fr.png flags/ga.png flags/gb.png flags/gd.png flags/ge.png flags/gf.png flags/gh.png flags/gi.png flags/gl.png flags/gm.png flags/gn.png flags/gp.png flags/gq.png flags/gr.png flags/gs.png flags/gt.png flags/gu.png flags/gw.png flags/gy.png flags/hk.png flags/hm.png flags/hn.png flags/hr.png flags/ht.png flags/hu.png flags/id.png flags/ie.png flags/il.png flags/in.png flags/io.png flags/iq.png flags/ir.png flags/is.png flags/it.png flags/jm.png flags/jo.png flags/jp.png flags/ke.png flags/kg.png flags/kh.png flags/ki.png flags/km.png flags/kn.png flags/kp.png flags/kr.png flags/kw.png flags/ky.png flags/kz.png flags/la.png flags/lb.png flags/lc.png flags/li.png flags/lk.png flags/lr.png flags/ls.png flags/lt.png flags/lu.png flags/lv.png flags/ly.png flags/ma.png flags/marquesas.png flags/mc.png flags/md.png flags/me.png flags/mg.png flags/mh.png flags/mk.png flags/ml.png flags/mm.png flags/mn.png flags/mo.png flags/mp.png flags/mq.png flags/mr.png flags/ms.png flags/mt.png flags/mu.png flags/mv.png flags/mw.png flags/mx.png flags/my.png flags/mz.png flags/na.png flags/nc.png flags/ne.png flags/nf.png flags/ng.png flags/ni.png flags/nl.png flags/no.png flags/northernireland.png flags/np.png flags/nr.png flags/nu.png flags/nz.png flags/om.png flags/pa.png flags/pe.png flags/pf.png flags/pg.png flags/ph.png flags/pk.png flags/pl.png flags/pm.png flags/pn.png flags/pr.png flags/ps.png flags/pt.png flags/pw.png flags/py.png flags/qa.png flags/re.png flags/ro.png flags/rs.png flags/ru.png flags/rw.png flags/sa.png flags/sardinia.png flags/sb.png flags/sc.png flags/scotland.png flags/sd.png flags/se.png flags/sg.png flags/sh.png flags/si.png flags/sj.png flags/sk.png flags/sl.png flags/sm.png flags/sn.png flags/so.png flags/sr.png flags/ss.png flags/st.png flags/sv.png flags/sy.png flags/sz.png flags/tc.png flags/td.png flags/tf.png flags/tg.png flags/th.png flags/tj.png flags/tk.png flags/tl.png flags/tm.png flags/tn.png flags/to.png flags/tr.png flags/tt.png flags/tv.png flags/tw.png flags/tz.png flags/ua.png flags/ug.png flags/um.png flags/un.png flags/us.png flags/uy.png flags/uz.png flags/va.png flags/vc.png flags/ve.png flags/vg.png flags/vi.png flags/vn.png flags/vu.png flags/wales.png flags/wf.png flags/ws.png flags/xk.png flags/ye.png flags/yt.png flags/za.png flags/zm.png flags/zw.png flags/shm.png klog-1.8.6/fileawardmanager.cpp0000644000175000017500000002413114166020407015440 0ustar develdevel/*************************************************************************** fileawardmanager.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "fileawardmanager.h" FileAwardManager::FileAwardManager(DataProxy_SQLite *dp, const QString &_parentFunction) { dataProxy = dp; util = new Utilities; world = new World(dataProxy, Q_FUNC_INFO); } bool FileAwardManager::importNewAwardFile() { //qDebug() << "FileAwardManager::importNewAwardFile" << QT_ENDL; QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << "FileAwardManager::importNewAwardFile - file: " << fileName << QT_ENDL; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileAwardManager::importNewAwardFile File not found" << fileName << QT_ENDL; showError(tr("Award file not opened"), tr("KLog was not able to read the award file"), QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName)); return false; } else { //qDebug() << "FileAwardManager::importNewAwardFile File opened" << QT_ENDL; } QString line = QString(); int number = 0; bool hasEOH = false; // id / name / shortname / prefix / regionalgroup / regionalid / dxcc / cqz / ituz / start_date / end_date / deleted QString sub_name = QString(); QString sub_shortname = QString(); QString sub_prefix = QString(); QString sub_regionalGroup = QString(); int sub_regionalID = -1; int sub_dxcc = -1; int sub_cqz = -1; int sub_ituz = -1; QDate sub_startDate = QDate(); QDate sub_endDate = QDate(); bool sub_deleted = false; qint64 pos; //Position in the file pos = file.pos(); while ( !file.atEnd() ) { // KLog first read the full file, to detect potential format errors and counting the number of references //qDebug() << "FileAwardManager::importNewAwardFile: First read, counting and looking for errors: " << line << QT_ENDL; line = file.readLine().trimmed().toUpper(); //qDebug() << "FileAwardManager::importNewAwardFile: " << line << QT_ENDL; number = number + line.count("EOR>"); if ((line.count("")>0) ) { hasEOH = true; } //qDebug() << " //FileAwardManager::importNewAwardFile in the while, end of loop" << QT_ENDL; } //qDebug() << "FileAwardManager::importNewAwardFile: While finished " << QT_ENDL; if (!hasEOH) { showError(tr("AWA wrong format"), tr("The AWA file does not have the right format"), QString(tr("AWA file does not have an field") )); return false; } file.seek(pos); bool haveAll = false; QStringList fields; QString aux; aux.clear(); hasEOH = false; while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); fields.clear(); fields << line.split("<", QT_SKIP); if (!hasEOH) { // Lets read the HEADER // IF EOH if (line.contains("")) { hasEOH = true; } foreach (aux, fields) { //qDebug() << "FileAwardManager::importNewAwardFile: Reading header: " << aux << QT_ENDL; aux = aux.trimmed(); aux = "<" + aux; QStringList adifField; adifField.clear(); adifField << util->getValidADIFFieldAndData(aux); if (adifField.length()==2) { if (adifField.at(0) == "SUBDIV_ENTITY" ) { sub_dxcc = world->getQRZARRLId(adifField.at(1)); } else if (adifField.at(0) == "SUBDIV_REFERENCES") { //regionalAward->addRegionalAwardNumberOfReferences(adifField.at(1).toInt()); } else if (adifField.at(0) == "SUBDIV_VERSION") { //regionalAward->addRegionalAwardVersion(adifField.at(1).toInt()); } else if (adifField.at(0) == "SUBDIV_SPONSOR") { //regionalAward->addRegionalAwardSponsor(adifField.at(1)); } else if (adifField.at(0) == "SUBDIV_NAME") { //regionalAward->addRegionalAwardName(adifField.at(1)); } else { //qDebug() << "FileAwardManager::importNewAwardFile: Invalid AWA field found HEADER" << adifField.at(0) << QT_ENDL; } } aux.clear(); } } else { // NOT in EOH // Read line, MODIFY AWARD //qDebug() << "FileAwardManager::importNewAwardFile: Parsing : " << line << QT_ENDL; foreach (aux, fields) { aux = aux.trimmed(); aux = "<" + aux; QStringList adifField; adifField.clear(); adifField << util->getValidADIFFieldAndData(aux); //qDebug() << "FileAwardManager::importNewAwardFile: Length: " << QString::number(adifField.count()) << QT_ENDL; if (adifField.count()==2) { //qDebug() << "FileAwardManager::importNewAwardFile: Parsing : (" << adifField.at(0) << "/" << adifField.at(1) << ")" << QT_ENDL; if (adifField.at(0) == "SUBDIV_REFNUMBER" ) { sub_regionalID = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_DXCC" ) { sub_dxcc = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_CQ" ) { sub_cqz = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_ITU" ) { sub_ituz = adifField.at(1).toInt(); } else if (adifField.at(0) == "SUBDIV_PREF") { sub_prefix = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_SHORT") { sub_shortname = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_NAME") { sub_name = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_GROUP") { sub_regionalGroup = adifField.at(1); } else if (adifField.at(0) == "EOR") {// END OF REGISTRY //qDebug() << "FileAwardManager::importNewAwardFile: EOR FOUND!\nLet's add the reference." << QT_ENDL; QStringList _subDiv; dataProxy->addDXCCEntitySubdivision(sub_name, sub_shortname, sub_prefix, sub_regionalGroup, sub_regionalID, sub_dxcc, sub_cqz, sub_ituz, sub_startDate, sub_endDate, sub_deleted); sub_name = QString(); sub_shortname = QString(); sub_prefix = QString(); sub_regionalGroup = QString(); sub_regionalID = -1; sub_dxcc = -1; sub_cqz = -1; sub_ituz = -1; sub_startDate = QDate(); sub_endDate = QDate(); sub_deleted = false; } else { //qDebug() << "FileAwardManager::importNewAwardFile: Invalid AWA field found in BODY" << adifField.at(0) << QT_ENDL; } }} } } return false; } void FileAwardManager::showError(const QString &_header, const QString &_msg, const QString &_detailedMsg) { //qDebug() << "FileAwardManager::showError: " << _msg << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - %1").arg(_header)); msgBox.setText(_msg); msgBox.setInformativeText(_detailedMsg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); } klog-1.8.6/logmodel.h0000644000175000017500000000544614166020407013426 0ustar develdevel#ifndef LOGMODEL_H #define LOGMODEL_H /*************************************************************************** logmodel.h - description ------------------- begin : june 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" class LogModel : public QSqlRelationalTableModel { Q_OBJECT public: LogModel(DataProxy_SQLite *dp, QObject *parent); void createlogModel(const int _i); void setColumns(const QStringList &_columns); private: //void showColumn(const QString &_columnName); //QSqlRelationalTableModel *logModel; DataProxy_SQLite *dataProxy; Utilities *util; QStringList columns; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // LOGMODEL_H /* class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(QObject *parent); int rowCount(const QModelIndex &parent = QModelIndex()) const ; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; }; */ klog-1.8.6/dataproxy_sqlite.h0000644000175000017500000003773114166020407015222 0ustar develdevel#ifndef DATAPROXY_SQLITE_H #define DATAPROXY_SQLITE_H /*************************************************************************** dataproxy_sqlite.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "database.h" #include "qso.h" #include "klogdefinitions.h" //#include "regionalaward.h" //Class QSO; enum { CQZones = 40, ITUZones = 90, DXCCEntities = 521 // http://www.adif.org/adif302.htm#Country%20Codes }; class DataProxy_SQLite : public QObject { Q_OBJECT public: DataProxy_SQLite(const QString &_parentFunction, const QString &_softVersion="0.0"); ~DataProxy_SQLite(); QString getSoftVersion(); QString getDBVersion(); bool reconnectDB(); void createLogModel(); void createLogPanel(); bool haveAtLeastOneLog(); QStringList getColumnNamesFromTableLog(); int getIdFromModeName(const QString& _modeName); int getIdFromBandName(const QString& _bandName); int getSubModeIdFromSubMode(const QString &_subModeName); int getModeIdFromSubModeId(const int _sm); QStringList getFields(); QStringList getBands(); QStringList getModes(); QStringList sortBandNamesBottonUp(const QStringList _qs); QStringList getBandIDs(); QStringList getModesIDs(); QStringList getBandsInLog(const int _log); QStringList getModesInLog(const int _log); int getMostUsedBand(const int _log); int getMostUsedMode(const int _log); QString getNameFromBandId (const int _id); QString getNameFromModeId (const int _id); QString getNameFromSubModeId (const int _id); QString getSubModeFromId (const int _id); QString getNameFromSubMode (const QString &_sm); // Checks if a submode is deprecated TODO: CHeck if really needed //QString getNameFromSubMode (const QString &_sm); // DEPRECATED bool isModeDeprecated (const QString &_sm); QString getFreqFromBandId(const int _id); int getBandIdFromFreq(const double _n); QString getBandNameFromFreq(const double _n); double getLowLimitBandFromBandName(const QString &_sm); double getLowLimitBandFromBandId(const int _sm); double getUpperLimitBandFromBandName(const QString &_sm); bool isThisFreqInBand(const QString &_band, const QString &_fr); int getLastQSOid(); QDate getFirstQSODateFromCall (const QString &_call); // If the callsign provided is not valid it provides the date of the first QSO QDate getLastQSODateFromCall (const QString &_call); // If the callsign provided is not valid it provides the date of the last QSO bool addQSOFromWSJTX (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_sRX, const QString &_sTX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_operator, const QDateTime &_datetime, const QDateTime &_datetime_off, const double txpower, const int _dxcc, const int _logNumber, bool _sendQSL = true); int addQSOFromLoTW(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate, const QString &_stationcallsign, const int _logn); int addQSO(QSO &_qso); bool deleteQSO(const int _qsoId); int isWorkedB4(const QString &_qrz, const int _currentLog); QList isThisQSODuplicated(const QString &_callingFunc, const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs); int getDuplicatedQSOId(const QString &_qrz, const QDateTime &_datetime, const int _band, const int _mode); bool isDXCCConfirmed(const int _dxcc, const int _currentLog); bool isQSLReceived(const int _qsoId); bool isQSLLoTWReceived(const int _qsoId); bool isQSOConfirmed(const int _qsoId, const bool _checkPaper, const bool _checkLoTW); bool isQSLSent(const int _qsoId); bool qslSentViaDirect(const int _qsoId, const QDate &_updateDate); bool qslSentViaBureau(const int _qsoId, const QDate &_updateDate); bool qslRecViaBureau(const int _qsoId, const QDate &_updateDate); bool qslRecViaBureau(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL); bool qslRecViaDirect(const int _qsoId, const QDate &_updateDate); bool qslRecViaDirect(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL); bool qslSentAsRequested(const int _qsoId, const QDate &_updateDate); bool qslRecAsRequested(const int _qsoId, const QDate &_updateDate); bool setClubLogSent(const int _qsoId, const QString &_st, const QDate &_updateDate); bool setLoTWQSLRec (const int _qsoId, const QString &_st, const QDate &_updateDate); bool isHF(const int _band); bool isWARC(const int _band); bool isVHF(const int _band); bool isUHF(const int _band); int getBandFromId(const int _qsoId); int getModeFromId(const int _qsoId); int getDXCCFromId(const int _qsoId); int getCQZFromId(const int _qsoId); QList getBandModeDXCCCQZlogIDFromId(const int _qsoId); QString getCallFromId(const int _qsoId); QStringList getClubLogRealTimeFromId(const int _qsoId); // Complete with previous QString getNameFromQRZ(const QString &_call); QString getQTHFromQRZ(const QString &_call); QString getLocatorFromQRZ(const QString &_call); QString getIOTAFromQRZ(const QString &_call); QString getQSLViaFromQRZ(const QString &_call); // /Complete with previous bool updateAwardDXCC(); bool updateAwardWAZ(); // QRZ.com bool QRZCOMModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to QRZ.com bool QRZCOMSentQSOs(const QList &_qsos); // Mark as uploaded // QRZ.com //EQSL bool eQSLModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to eQSL bool eQSLSentQSOs(const QList &_qsos); // Mark as uploaded //EQSL //CLUBLOG bool clublogSentQSOs(const QList &_qsos); // Mark as uploaded bool clublogModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to CLubLog // CLUBLOG //LOTW bool lotwSentQueue(const QDate &_updateDate, const int _currentLog); // Mark LOTW QSL SENT as Q (Queued) bool lotwSentYes(const QDate &_updateDate, const int _currentLog, const QString &_station); // Update LOTW QSL SENT marked as Q as Y (Queued) bool lotwSentQSOs(const QList &_qsos); int lotwUpdateQSLReception (const QString &_call, const QDateTime &_dateTime, const QString &_band, const QString &_mode, const QDate &_qslrdate); QList getQSOsListLoTWToSend(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true, int _logN = -1); //QStringList getQSOsListLoTWNotSent2(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true); QStringList getQSODetailsForLoTWDownload(const int _id); QList getQSOsListeQSLNotSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true); QList getQSOsListClubLogToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true, int _logN = -1); QList getQSOsListEQSLToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true); QList getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true); QList getQSOsListToBeExported(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate); int getContinentIdFromContinentShortName(const QString &_n); QString getContinentShortNameFromEntity(const int _n); int getContinentIdFromEntity(const int _n); QStringList getContinentShortNames(); bool isValidContinentShortName(const QString &_n); bool isValidDXCC(const int _e); QStringList filterValidFields(const QStringList &_fields); int getCQzFromPrefix(const QString &_p); int getCQzFromEntity(const int _n); int getITUzFromEntity(const int _n); int getITUzFromPrefix(const QString &_p); QString getEntityNameFromId(const int _n); int getEntityIdFromName(const QString &_e); QString getEntityMainPrefix(const int _entityN); QStringList getEntiNameISOAndPrefixFromId(const int _dxcc); int getEntityIdFromMainPrefix(const QString &_e); bool isNewCQz(int _c); bool isNewEntity(int _e); double getLongitudeFromEntity(const int _e); double getLatitudeFromEntity(const int _e); int getDXCCFromPrefix(const QString &_p); QString getEntityPrefixes(const int _enti); QStringList getEntitiesNames(); QStringList getEntitiesIds(); int getHowManyEntities(); int getMaxEntityID(bool limit = true); // limit = true implies that it will only shouw ARRL valid DXCC (i.e. will not count Sicily) QStringList getOperatingYears(const int _currentLog); void compressDB(); bool unMarkAllQSO(); // Unmarks all the marked QSO bool clearLog(); // Stats int getQSOonYear(const int _year, const int _logNumber); int getDXCConYear(const int _year, const int _logNumber); int getCQzonYear(const int _year, const int _logNumber); int getQSOsWithDXCC(const int _dxcc, const int _logNumber); int getQSOsAtHour(const int _hour, const int _log); int getQSOsAtHourOnBand(const int _hour, const int _band ,const int _log); int getQSOsOnMonth(const int _month, const int _log); int getHowManyQSOInLog(const int _log); int getHowManyConfirmedQSLInLog(const int _log); int getHowManyQSLSentInLog(const int _log); int getQSOsWithContinent(const QString &_cont, const int _logNumber); int getQSOsInBand(const QString &_band, const int _log); int getQSOsInMode(const QString &_mode, const int _log); QList> getTop10QSOPerDXCC(const int _log); // Stats - end bool updateQSONumberPerLog(); bool newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); QStringList getContestNames(); QStringList getContestCat(const int _catn); QStringList getContestOverlays(); //int getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo); //QStringList getDataFromContestType(const int _n); //int getLogTypeNumber(const QString &_logType); //QString getLogTypeName(const int _logType); //QString getLogTypeOfUserLog(const int _logN); int getLogNumberFromQSOId(const int _qsoId); QStringList getBandNames(); QStringList getPropModeList(); bool clearSatList(); bool addSatellite(const QString &_arrlId, const QString &_name, const QString &_downLink, const QString &_upLink, const QString &_mode, int id = -1); int getDBSatId(const QString &_arrlId); QStringList getSatellitesList(); QString getSatelliteUplink(const QString &_sat); QString getSatelliteDownlink(const QString &_sat); QString getSatelliteMode(const QString &_sat); QString getSatelliteFullUplink(const QString &_sat); QString getSatelliteFullDownlink(const QString &_sat); QString getSatelliteFullMode(const QString &_sat); QString getSatelliteName(const QString &_sat); QString getSateliteArrlIdFromId(const int _id); QStringList getQSLRcvdList(); QStringList getQSLSentList(); QStringList getClubLogStatusList(); QStringList getQSLViaList(); int getHowManyQSOPerPropMode(const QString &_p, const int _logn); //QStringList getValidCatOptions(const int _currentCat, const int _lowerCa); bool fillEmptyDXCCInTheLog(); int getNumberOfManagedLogs(); QStringList getListOfManagedLogs(); int getMaxLogNumber(); QString getStationCallSignFromLog(const int _log); QStringList getStationCallSignsFromLog(const int _log); QString getOperatorsFromLog(const int _log); QString getCommentsFromLog(const int _log); QString getLogDateFromLog(const int _log); //QString getLogTypeNFromLog(const int _log); bool addNewLog (const QStringList _qs); bool doesThisLogExist(const int _log); bool updateISONames(); // Update the entities ISO 3166names for the flags QString getISOName(const int _n); bool setDXCCAwardStatus(const int _qsoId); bool setWAZAwardStatus(const int _qsoId); //bool addRegionalAward(RegionalAward _regionalAward); bool addDXCCEntitySubdivision(const QString &_name, const QString &_short, const QString &_pref, const QString &_group, const int _regId, const int _dxcc, const int _cq, const int _itu, const QDate &_startDate, const QDate &_endDate, const bool _deleted); //void getFoundInLog(const QString &_txt, const int _log=-1); QString getADIFQSO(const int _qsoId); bool showInvalidCallMessage(const QString &_call); QList getSatGridStats(int _log=-1); QList getGridStats(int _log=-1); QList getSatDXCCStats(int _log=-1); int getFieldInBand(ValidFieldsForStats _field, const QString &_band, bool confirmedOnly, QString _mode = "ALL", int _log=-1); //bool queryPrepare(const QString &_query); //bool queryBind(const QString &_field, const QString &value); //bool queryExec(); private: bool dbCreated; DataBase *db; QStringList sortBandIdBottonUp(const QStringList _qs); double getFreqFromRange(QString _fr); //May even receive: 145.900-146.00 and should return the mid in the range (145.950) QStringList getColumnNamesFromTable(const QString &_tableName); int getPrefixId(const QString &_qrz); QString changeSlashAndFindPrefix(const QString &_qrz); QSO *qso; bool searching; int executionN; Utilities *util; //QSqlQuery preparedQuery; //QSqlRelationalTableModel *logModel; private slots: void slotCaptureDebugLogs(const QString &_func, const QString &_msg, const DebugLogLevel _level=Info); signals: void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void debugLog(QString functionFailed, QString errorCode, DebugLogLevel level); // emitted as the KLog application log }; #endif //DATAPROXY_SQLITE_H klog-1.8.6/statisticswidget.h0000644000175000017500000000531414166020407015214 0ustar develdevel#ifndef STATISTICSWIDGET_H #define STATISTICSWIDGET_H /*************************************************************************** statisticswidget.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include "dataproxy_sqlite.h" //#include #include "charts/barchartstats.h" //#include "charts/donutchartstats.h" class StatisticsWidget : public QWidget { Q_OBJECT public: explicit StatisticsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatisticsWidget(); void clear(); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotChartComboBoxChanged(); void slotLogComboBoxChanged(); private: void createUI(); void fillLogCombo(); void updateChart(); // void paintQSOperOtherBarChart(const int _i); DataProxy_SQLite *dataProxy; //QWidget *graphWidget; //QChartView *chartView; BarChartStats *barChartStats; //DonutChartStats *donutChartStats; QComboBox *statisticToShowComboBox, *logComboBox; QStringList statisticsToShowList; }; #endif // STATISTICSWIDGET_H klog-1.8.6/dxccstatuswidget.h0000644000175000017500000000763514166020407015217 0ustar develdevel#ifndef DXCCSTATUSWIDGET_H #define DXCCSTATUSWIDGET_H /*************************************************************************** dxccstatuswidget.h - description ------------------- begin : feb 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include "awards.h" #include "world.h" #include "dataproxy_sqlite.h" #include "locator.h" #include "klogdefinitions.h" //TODO: Creating the widget to show the DXCC status class DXCCStatusWidget : public QWidget { Q_OBJECT public: explicit DXCCStatusWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~DXCCStatusWidget(); void update(); //void awardsUpdated(); void setBands(const QString &_callingFunc, const QStringList &_ent, const bool _creating = false); // Receives the list of bandIDs void setCurrentLog(const int _logN); void setMyLocator(const QString &_loc); void refresh(); signals: //void showQso(const int _qsoid); // identified QSO double clicking on DXCC void showQsos(QList _qsos); void fillInQSOSignal(); void debugLog (QString _func, QString _msg, DebugLogLevel _level); //void updateAwards(); public slots: //void slotSearchLineEditTextChanged(); void slotRefreshButtonClicked(); private slots: //void slotRightButton(const QPoint& pos); //void slotWikipedia(); void slotItemEntered(QTableWidgetItem * item ); void slotItemDoubleClicked(QTableWidgetItem * item ); private: void createUI(); void setDefaultBands(); void addEntity(const QList &_ent); // DXCC id, bandid, bandid, ... void addEntity2(const QStringList &_ent); // DXCC id, bandid, bandid, ... // void showMenuRightButtonFromLogCreateActions(); // void righButtonFromLogMenu(const int trow); QTableWidget *dxccView; Awards *awards; World *world; DataProxy_SQLite *dataProxy; Locator *locator; QHeaderView *hv, *hh; //QLineEdit *searchLineEdit; QPushButton *refreshButton; //QCheckBox *showAllLogsButton; int numberOfColumns; // Columns will be number Of Bands + 2 (Id + Name) QStringList bandNames, validBands; int logNumber, tempLog; // log in use in the log / log to be used in the widget QString loc; // The locator of the user. QAction *showDXCCWikipediaAct; int currentLog; }; #endif // DXCCSTATUSWIDGET_H klog-1.8.6/eqslutilities.cpp0000644000175000017500000002435214166020407015054 0ustar develdevel/*************************************************************************** eqslutilities.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "eqslutilities.h" #include #include #include #include //#include eQSLUtilities::eQSLUtilities(const QString &_parentFunction) { //qDebug()<< "eQSLUtilities::eQSLUtilities" << QT_ENDL; #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _parentFunction; #else #endif user = QString(); pass = QString(); qsos.clear(); currentQSO = -1; manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); stationCallsign = QString(); uploadingFile = false; util = new Utilities; //qDebug()<< "eQSLUtilities::eQSLUtilities - END" << QT_ENDL; } eQSLUtilities::~eQSLUtilities() { //qDebug()<< "eQSLUtilities::~eQSLUtilities" << QT_ENDL; } void eQSLUtilities::setUser(const QString &_call) { //qDebug() << "eQSLUtilities::setUser: " << _call << QT_ENDL; user = _call; //qDebug() << "eQSLUtilities::setUser: END" << QT_ENDL; } void eQSLUtilities::setPass(const QString &_pass) { //qDebug() << "eQSLUtilities::setPass: " << _pass << QT_ENDL; pass = _pass; //qDebug() << "eQSLUtilities::setPass: END" << QT_ENDL; } void eQSLUtilities::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished" << QT_ENDL; QStringList parsedAnswer; parsedAnswer.clear(); result = data->error(); //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - Result = " << QString::number(result) << QT_ENDL; const QByteArray sdata = data->readAll(); QString text = QString(); if (result == QNetworkReply::NoError) { parsedAnswer << prepareToTranslate(sdata); if (parsedAnswer.at(0).contains("Error")) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - error detected" << QT_ENDL; QMessageBox::warning(nullptr, tr("KLog - eQSL"), tr("eQSL has sent the following message:\n%1").arg(parsedAnswer.at(1)), QMessageBox::Ok); qsos.clear(); return; } else { } //qDebug()<< sdata; //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - NO ERROR" << QT_ENDL; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(QNetworkReply::NoError, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - Result = Host Not found! = " << QString::number(result) << QT_ENDL; text = "eQSL: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - Result = Time out error! = " << QString::number(result) << QT_ENDL; text = "eQSL: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } else { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - Result = UNDEFINED = " << QString::number(result) << QT_ENDL; text = "eQSL: " + tr("Undefined error number (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - eQSL"), tr("We have received an undefined error from eQSL (%1)").arg(result) + "\n" + tr("Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled."), QMessageBox::Ok); //TODO: Mark the previous QSO as not sent to clublog } //qDebug()<< "eQSLUtilities::slotQsoUploadFinished - Result = " << QString::number(result) << QT_ENDL; //emit done(); emit signalFileUploaded(result, qsos); emit showMessage(text); } void eQSLUtilities::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eQSLUtilities::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; //qDebug()<< received << total; emit actionShowProgres(received, total); } void eQSLUtilities::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: " << QString::number(networkError) << QT_ENDL; result = networkError; if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: Host not found" << QT_ENDL; } else { //qDebug()<< "eQSLUtilities::slotErrorManagement: ERROR!" << QT_ENDL; } //actionError(result); } void eQSLUtilities::setCredentials(const QString &_user, const QString &_pass, const QString &_defaultStationCallsign) { //qDebug()<< "eQSLUtilities::setCredentials: user: " << _user << " / Pass: " << _pass << " / StationCallsign: " << _defaultStationCallsign << QT_ENDL; stationCallsign = _defaultStationCallsign; user = _user; pass = _pass; } QStringList eQSLUtilities::prepareToTranslate(const QString &_m) { //qDebug()<< "eQSLUtilities:: = prepareToTranslate" << _m << QT_ENDL; QString msg = _m; QStringList result; result.clear(); if (_m.contains("Error: No match on eQSL_User/eQSL_Pswd")) { result << QString("Error"); result << QString(tr("eQSL Error: User or password incorrect")); pass = QString(); } else if ( (_m.contains("Warning:")) && (_m.contains("Bad record: Duplicate") ) ) { result << QString("Warning"); result << QString(tr("eQSL Warning: At least one of the uplodaded QSOs is duplicated.")); } else if ((_m.contains("Result:")) && (_m.contains("records added
")) && (!_m.contains("Warning:")) ) { result << QString("OK"); result << QString(tr("eQSL: All the QSOs were properly uploaded.")); } else { result << "Unknown" << "Unknown"; } //qDebug()<< "eQSLUtilities:: = prepareToTranslate returning... " << QT_ENDL; return result; } void eQSLUtilities::sendLogFile(const QString &_file, QList _qso) { //qDebug()<< "eQSLUtilities::sendLogFile: " << _file << QT_ENDL; qsos.clear(); qsos.append(_qso); QUrl serviceUrl; serviceUrl = QUrl("https://www.eQSL.cc/qslcard/ImportADIF.cfm"); QByteArray postData; QUrlQuery params; // FIRST PARAMS is the file QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QByteArray blob; QFile *file = new QFile(_file); if (file->open(QIODevice::ReadOnly)) /* Flawfinder: ignore */ { blob = file->readAll(); //qDebug()<< "eQSLUtilities::sendLogFile: FILE OPEN: " << blob << QT_ENDL; } else { //qDebug()<< "eQSLUtilities::sendLogFile: ERROR File not opened" << QT_ENDL; return; } file->close(); // The rest of the form goes as usual //qDebug()<< "eQSLUtilities::sendLogFile: e: " << user << QT_ENDL; //qDebug()<< "eQSLUtilities::sendLogFile: pass: " << pass << QT_ENDL; //qDebug()<< "eQSLUtilities::sendLogFile: stationcall: " << stationCallsign << QT_ENDL; QHttpPart userPart; userPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"eqsl_user\"")); userPart.setBody(user.toUtf8()); if (pass.length()<1) { bool ok; pass = QInputDialog::getText(nullptr, tr("KLog - eQSL.cc password needed"), tr("Please enter your eQSL.cc password: "), QLineEdit::Password, "", &ok); if (!ok) { return; } } QHttpPart passPart; passPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"eqsl_pswd\"")); passPart.setBody(pass.toUtf8()); QHttpPart filePart; QString aux = QString("form-data; name=\"Filename\"; filename=\"%1\"").arg(_file); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(aux)); filePart.setBody(blob); multiPart->append(userPart); multiPart->append(passPart); multiPart->append(filePart); uploadingFile = true; QNetworkRequest request(serviceUrl); //qDebug()<< "eQSLUtilities::sendLogFile: Before sending" << QT_ENDL; manager->post(request, multiPart); //qDebug()<< "eQSLUtilities::sendLogFile: After sending" << QT_ENDL; //multiPart->setParent(reply); //qDebug()<< "eQSLUtilities::sendLogFile - END" << QT_ENDL; } klog-1.8.6/world.h0000644000175000017500000001347114166020407012750 0ustar develdevel#ifndef WORLD_H #define WORLD_H /*************************************************************************** world.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include #include #include #include #include #include #include #include "locator.h" #include "dataproxy_sqlite.h" //#include "klogdefinitions.h" //#include "awards.h" class QStringList; enum { Entity_Name = 1, Entity_Continent = 2 }; class World : public QWidget { //friend class Awards; Q_OBJECT public: World(DataProxy_SQLite *dp, const QString &_parentFunction); World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_parentFunction); World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_klogVer, const QString &_parentFunction); ~World(); bool create(const QString &_worldFile); bool recreate(const QString &_worldFile); QString getQRZEntityName(const QString &_qrz); QString getEntityName(const int _entityN); QString getQRZEntityMainPrefix(const QString &_qrz); QString getEntityMainPrefix(const int _entityN); QString getQRZContinentNumber(const QString &_qrz); // Returns the continent id number int getContinentNumber(const int _enti); // Returns the continent id number QString getQRZContinentShortName(const QString &_qrz); // Returns the continent shortName (EU, AF, ...) QString getContinentShortName(const int _enti); QString getQRZLocator(const QString &_qrz); // Returns the entity locator QString getLocator(const int _entityN); // Returns the entity locator double getQRZLongitude(const QString &_qrz); // Returns the longitude of the Entity double getLongitude(const int _enti); // Returns the longitude of the Entity double getQRZLatitude(const QString &_qrz); // Returns the latitude of the Entity double getLatitude(const int _enti); // Returns the latitude of the Entity int getEntityCqz(const int _enti); int getQRZCqz(const QString &_qrz); //int getPrefixCQz(const QString &_p); int getQRZItuz(const QString &_qrz); int getEntityItuz(const int _enti); int getQRZARRLId(const QString &_qrz); //Returns the ARRL id of the Entity from a QRZ & Returns -1 if not found. bool isNewCQz(const int _cqz); bool isNewEntity(const int _entityN); //int getBandIdFromFreq(const QString fr); QString getQRZEntityPrefixes(const QString &_qrz); QString getEntityPrefixes(const int _enti); bool checkQRZValidFormat(const QString &_qrz); QStringList getEntitiesNames(); int getHowManyEntities(); bool hasSpecialEntities(); private slots: private: //void identifyOS(); bool insertSpecialEntities(); int getPrefixId(const QString &_qrz); //bool readCTYDAT(); bool readCTYCSV(const QString &_worldFile); QStringList processLine(const QString &_line); QStringList processLineP(const QString &_line, const int _processingEntity); void createWorldModel(); QStringList readZones(const QString &pref, const int _cq, const int _itu); QString changeSlashAndFindPrefix(const QString &_qrz); // Changes the \ into / and find the country prefix int progressBarPosition; bool created; QString klogDir, klogVersion; int cqz, ituz, numberOfEntities; QString entityName; QString currentPrefix; // Used in the progressBar bool ret; QStringList list, prefixAndZones; QString continentName, prefix; int continentId; double lat, lon, utc; //int utc; //QString line; //bool readingDataOfAnEntity; int nullValue; QSqlRelationalTableModel *worldModel; //QProgressBar *progressBar; Locator *locator; DataProxy_SQLite *dataProxy; int constrid; // Just an id for the constructor to check who is being executed at one specific time //Awards *awards; //FLAGS //QString flagsDir; //FLAGS-END signals: //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // WORLD_H klog-1.8.6/INSTALL-win.txt0000644000175000017500000000014714166020407014106 0ustar develdevelInstalling KLog on a Windows system is easy. Just double-click on the installer and follow the steps. klog-1.8.6/klogdefinitions.h0000644000175000017500000000531214166020407015004 0ustar develdevel#ifndef KLOGDEFINITIONS_H #define KLOGDEFINITIONS_H /*************************************************************************** klogdefinitions.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include using namespace std; enum ExportMode {ModeLotW, ModeADIF, ModeClubLog, ModeEQSL, ModeQRZ}; enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ}; //, HamQTH, HRDLog enum OnlineErrorCode {Ok, Fail}; enum OnlineErrorReason {Other, Auth, DupeQSO, WrongLogBook}; enum DebugLogLevel {Info, Debug}; enum ValidFieldsForStats {DXCC, GridSquare}; struct EntityData { // Used to pass a list of data from World to dxccstatuswidget int dxcc; QString mainprefix; QString name; QString isoname; }; struct EntityBandStatus { // Used to pass a list of data from Awards to dxccstatuswidget int dxcc; int bandid; bool confirmed; }; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 2)) #define QT_SKIP Qt::SkipEmptyParts #define QT_ENDL Qt::endl #define QT_RETURNBYVALUE Qt::ReturnByValue #else #define QT_SKIP QString::SkipEmptyParts #define QT_ENDL endl #define QT_RETURNBYVALUE #endif //#if QT_VERSION>=0x041502 //#else //#endif #endif // KLOGDEFINITIONS_H klog-1.8.6/logviewsortfilterproxymodel.h0000644000175000017500000000635014166020407017534 0ustar develdevel/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef LOGVIEWSORTFILTERPROXYMODEL_H #define LOGVIEWSORTFILTERPROXYMODEL_H #include #include //! [0] class LogViewSortFilterProxyModel: public QSortFilterProxyModel { Q_OBJECT public: LogViewSortFilterProxyModel(QObject *parent = nullptr); //QDate filterMinimumDate() const { return minDate; } //void setFilterMinimumDate(const QDate &date); //QDate filterMaximumDate() const { return maxDate; } //void setFilterMaximumDate(const QDate &date); protected: //bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; private: //bool dateInRange(const QDate &date) const; //QDate minDate; //QDate maxDate; }; //! [0] #endif // LOGVIEWSORTFILTERPROXYMODEL_H klog-1.8.6/setupdialog.h0000644000175000017500000001506414166020407014141 0ustar develdevel#ifndef SETUPDIALOG_H #define SETUPDIALOG_H /*************************************************************************** setupdialog.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "setuppages/setuppageuserdata.h" #include "setuppages/setuppagebandmode.h" #include "setuppages/setuppagemisc.h" #include "setuppages/setuppagedxcluster.h" #include "setuppages/setuppagecolors.h" #include "setuppages/setuppagelogs.h" #include "setuppages/setuppageworldeditor.h" //#include "setuppages/setuppageclublog.h" #include "setuppages/setuppageelog.h" //#include "setuppages/setuppageeqsl.h" //#include "setuppages/setuppagelotw.h" #include "setuppages/setuppageudp.h" #include "setuppages/setuppagesats.h" #include "setuppages/setuppagehamlib.h" #include "setuppages/setuppagesubdivisions.h" #include "setuppages/setuppagelogview.h" //#include "setuppages/setuppageinterfaceswindows.h" #include "utilities.h" #include "locator.h" #include "klogdefinitions.h" class QListWidget; class QListWidgetItem; class QStackedWidget; class SetupDialog : public QDialog { Q_OBJECT public: //SetupDialog(DataProxy_SQLite *dp, const bool _firstTime=true, QWidget *parent = nullptr); SetupDialog(DataProxy_SQLite *dp, const QString &_configFile, const QString &_softwareVersion, const int _page=0, const bool _firstTime = true, QWidget *parent = nullptr); ~SetupDialog(); void setData(const QString &_configFile, const QString &_softwareVersion, const int _page, const bool _firstTime=true); void setClubLogActive(const bool _b); void setEQSLActive(const bool _b); void setQRZCOMAutoCheckActive(const bool _b); void checkIfNewBandOrMode(); void setSeverity(const DebugLogLevel _sev); signals: void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void debugLog (QString _func, QString _msg, DebugLogLevel _level); void qrzcomAuto(bool); //void newLogRequested(const bool _s); // true show new log private slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous); void slotReadConfigData(); void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); // We receive the station callsign and operators from the logs tab void slotSetStationCallSign(const QString &_p); // We receive te station callsign from the userData tab to fill the new log void slotSetOperators(const QString &_p); // We receive te station operators from the userData tab to fill the new log void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotFocusOK(); void slotQRZCOMAuto(const bool _b); private: void showEvent(QShowEvent *event); void setConfigFile(const QString &_configFile); void setSoftVersion(const QString &_softwareVersion); void setConfigured(const bool _configured); void setPage(const int _page); void connectActions(); void createIcons(); bool processConfigLine(const QString &_line); void setDefaults(); void readActiveBands (const QString &actives); void readActiveModes (const QString &actives); bool isValidBand (const QString &b); bool isValidMode (const QString &b); QString checkAndFixASCIIinADIF(const QString &_data); bool haveAtleastOneLog(); bool firstTime; // To know if we are calling it from the Start wizard or not bool nolog; // If there is no log being managed QString dxClusterServerToUse; QStringList dxClusterServers; QPushButton *okButton; QTabWidget *tabWidget; int logsPageTabN; QListWidget *contentsWidget; QStackedWidget *pagesWidget; SetupPageUserDataPage *userDataPage; SetupPageBandMode *bandModePage; SetupPageDxCluster *dxClusterPage; SetupPageMisc *miscPage; SetupPageColors *colorsPage; SetupPageLogs *logsPage; SetupPageWorldEditor *worldEditorPage; SetupPageELog *eLogPage; //SetupPageClubLog *clubLogPage; //SetupPageEQSL *eQSLPage; //SetupPageLoTW *lotwPage; SetupPageUDP *UDPPage; SetupPageSats *satsPage; SetupPageHamLib *hamlibPage; //SetupPageInterfacesWindows *interfacesWindowsPage; SetupPageSubdivisions *subdivisionsPage; SetupPageLogView *logViewPage; //SetupPageRegionalAwards *regionalAwardsPage; int pageRequested; // The page on the Dialog that is requested to be shown when you call it //QString klogDir; QString configFileName, version; QStringList bands, modes, logViewFields; Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; QString windowSize; QString latestBackup; int constrid; // Just an id for the constructor to check who is being executed at one specific time DebugLogLevel logSeverity; // Manages as syslog, the severity of the application debug log }; #endif // SETUPDIALOG_H klog-1.8.6/setuppages/0000755000175000017500000000000014166020421013616 5ustar develdevelklog-1.8.6/setuppages/setuppagesats.h0000644000175000017500000001021214166020407016657 0ustar develdevel#ifndef SETUPPAGESATS_H #define SETUPPAGESATS_H /*************************************************************************** setuppagesats.h - description ------------------- begin : Dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "updatesatsdata.h" #include "dataproxy_sqlite.h" #include "utilities.h" #include "setuppages/setuppagesatsnew.h" class SetupPageSats : public QWidget { Q_OBJECT public: SetupPageSats(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageSats(); int getSelectedSat(); void setSelectedSat(const int _i); void createNewSat(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); private slots: void slotImportButtonClicked(); void slotExportButtonClicked(); void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewSatData(const QStringList _qs); void slotSatselected(const QModelIndex & index); void slotSatDoubleClicked(const QModelIndex & index); //void slotSatsCancelled(const bool _q); signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newSatData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: //void createActions(); QStringList readSats(); //bool readSatsFile(); void createSatsPanel(); void createSatsModel(); void createActions(); //bool addNewSat(const QStringList _qs); void updateSelectedSats(); //void readSelectedSat(const int _i); void showError(const QString &_errorC); /* Wizard to create a new Sat*/ //QWizardPage *createSatTypePage(); //QWizard *newSatWizard; // Wizard to create a new Sat /*^Wizard to create a new satellite^*/ QSqlRelationalTableModel *satsModel; QWidget *satsPanel; QTableView *satsView; QAbstractButton *finishButton; QPushButton *newSatPushButton, *editPushButton, *removePushButton, *importPushButton, *exportPushButton; int lastSat; QString currentSatComment; QString currentStationCallSign; QComboBox *currentSats; QStringList satsAvailable; QString arrild, satname, uplink, downlink, modes; DataProxy_SQLite *dataProxy; int selectedSat; QString defaultStationCallSign, defaultOperators; Utilities *util; SetupPageSatsNew *newSat; }; #endif // SETUPPAGESATS_H klog-1.8.6/setuppages/setuppagesatseditor.h0000644000175000017500000000570414166020407020100 0ustar develdevel#ifndef SETUPPAGESATEDITOR_H #define SETUPPAGESATEDITOR_H /*************************************************************************** setuppagesateditor.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy.h" //#include "utilities.h" enum { WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 }; class SetupPageSatEditor : public QWidget { Q_OBJECT public: SetupPageSatEditor(DataProxy *dp, QWidget *parent=0); ~SetupPageSatEditor(); private slots: void slotAddButtonClicked(); void slotDelButtonClicked(); void slotEditButtonClicked(); void slotDoubleClickEntity( const QModelIndex & index); //void slotAnalyzeEntityAddedSignal(const QStringList _qs); void slotImportSatsButtonClicked(); private: //World *world; Utilities *util; DataProxy *dataProxy; void createSatsPanel(); void createSatsModel(); void createActions(); bool isSatsListEmpty(); QSqlRelationalTableModel *satsModel; QWidget *satsPanel; QTableView *satsView; QTreeWidget *searchResultsTreeWidget; QPushButton *addSatPushButton, *delSatPushButton, *editSatPushButton, *exportSatsPushButton, *loadSatsPushButton; //SetupEntityDialog *setupEntityDialog; }; #endif // SetupPageSatEditor_H klog-1.8.6/setuppages/setuppagelogview.h0000644000175000017500000000446714166020407017400 0ustar develdevel#ifndef SETUPPAGELOGVIEW_H #define SETUPPAGELOGVIEW_H /*************************************************************************** setuppagelogview.h - description ------------------- begin : ago 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "dataproxy_sqlite.h" class SetupPageLogView : public QWidget { Q_OBJECT public: SetupPageLogView(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageLogView(); QString getFields(); void setActiveFields(QStringList _q); signals: public slots: private: void addFields (QStringList _b); // read the available fields from the DB QListWidget *fieldsListWidget; DataProxy_SQLite *dataProxy; }; #endif // SETUPPAGELOGVIEW_H klog-1.8.6/setuppages/setuppagesubdivisionnew.cpp0000644000175000017500000010413614166020407021321 0ustar develdevel/*************************************************************************** setuppageregionalawardsnew.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppages/setuppagesubdivisionnew.h" SetupPageSubdivisionNew::SetupPageSubdivisionNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew" << QT_ENDL; dataProxy = dp; editing = false; checking = false; /* * bCass = false; bCOp = false; bCMo = false; bCPo = false; bCBa = false; bCOv = false; bCTy = false; */ logData.clear(); stationCallsignFilled = false; operatorsFilled = true; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); //typeContest = 0; //contestCatMode = 0; //contestCatOperators = 0; //contestCatAssisted = 0; //contestCatPower = 0; //contestCatBands = 0; //contestBands = 0; //contestCatOverlay = 0; //typeContestSelected = 0; //typeConteststr = QString(); stationCallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; dateEdit = new QDateEdit; dateEdit->setDate(QDate::currentDate ()); commentLineEdit = new QLineEdit; /* typeComboBox = new QComboBox; contestCatModeComboBox = new QComboBox; contestCatOperatorsComboBox = new QComboBox; contestCatAssistedComboBox = new QComboBox; contestCatPowerComboBox = new QComboBox; contestCatBandsComboBox = new QComboBox; contestBandsComboBox = new QComboBox; contestCatOverlayComboBox = new QComboBox; contestCatModeComboBox = new QComboBox; catAsLabel = new QLabel(); typeLabel = new QLabel(); catOpLabel = new QLabel(); catModeLabel = new QLabel(); catPowerLabel = new QLabel(); catBandsLabel = new QLabel(); overlayLabel = new QLabel(); validCats = new QLabel(); */ dateLabel = new QLabel(tr("&Date")); stationCallsignLabel = new QLabel(tr("&Station Callsign")); operatorsLabel = new QLabel(tr("&Operators")); commentLabel = new QLabel(tr("Comm&ent")); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createWidget(); okButton->setEnabled(false); //qDebug() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew - END" << QT_ENDL; } void SetupPageSubdivisionNew::clear() { //qDebug() << "SetupPageSubdivisionNew::Clear - Start" << QT_ENDL; stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); /* typeComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); contestCatOperatorsComboBox->setCurrentIndex(0); contestCatAssistedComboBox->setCurrentIndex(0); contestCatPowerComboBox->setCurrentIndex(0); contestCatBandsComboBox->setCurrentIndex(0); contestBandsComboBox->setCurrentIndex(0); contestCatOverlayComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); typeContest = 0; contestCatMode = 0; contestCatOperators = 0; contestCatAssisted = 0; contestCatPower = 0; contestCatBands = 0; contestBands = 0; contestCatOverlay = 0; typeContestSelected = 0;*/ //qDebug() << "SetupPageSubdivisionNew::Clear - END" << QT_ENDL; } void SetupPageSubdivisionNew::createWidget() { //qDebug() << "SetupPageSubdivisionNew::createWidget - Start" << QT_ENDL; stationCallsignLabel->setWordWrap(true); operatorsLabel->setWordWrap(true); commentLabel->setWordWrap(true); dateLabel->setBuddy(dateEdit); stationCallsignLabel->setBuddy(stationCallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); commentLabel->setBuddy(commentLineEdit); /* catAsLabel->setBuddy(contestCatAssistedComboBox); typeLabel->setBuddy(typeComboBox); catOpLabel->setBuddy(contestCatOperatorsComboBox); catModeLabel->setBuddy(contestCatModeComboBox); catPowerLabel->setBuddy(contestCatPowerComboBox); catBandsLabel->setBuddy(contestCatBandsComboBox); overlayLabel->setBuddy(contestCatOverlayComboBox); validCats->setText(tr("Select categories")); validCats->setWordWrap(true); */ stationCallsignLineEdit->setToolTip(tr("Callsign used for this log.")); operatorsLineEdit->setToolTip(tr("Comma separated list of operators: callsign1, callsign2.")); dateEdit->setToolTip(tr("Start date of this log.")); commentLineEdit->setToolTip(tr("Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log.")); //typeLabel->setText(tr("&Type of Operation")); //typeLabel->setWordWrap(true); //nameLabel->setWordWrap(true); dateLabel->setWordWrap(true); /* typeComboBox->setToolTip(tr("Select the kind of operation for this log.")); QStringList _qs; _qs.clear(); _qs.append(dataProxy->getContestNames()); typeComboBox->addItems(_qs); //qDebug() << "SetupPageSubdivisionNew::createWidget - contestNames: " << _qs.at(0) << QT_ENDL; catModeLabel->setText(tr("&Mode Category")); catModeLabel->setWordWrap(true); contestCatModeComboBox->setToolTip(tr("Select the mode category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(6)); contestCatModeComboBox->addItems(_qs); //QLabel *catOpLabel = new QLabel(tr("Operators Category")); catOpLabel->setText(tr("O&perators Category")); catOpLabel->setWordWrap(true); contestCatOperatorsComboBox->setToolTip(tr("Select the operators category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(1)); contestCatOperatorsComboBox->addItems(_qs); catAsLabel->setText(tr("&Assisted Category")); catOpLabel->setWordWrap(true); contestCatAssistedComboBox->setToolTip(tr("Select the assisted category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(2)); contestCatAssistedComboBox->addItems(_qs); //QLabel *catPowerLabel = new QLabel(tr("Power Category")); catPowerLabel->setText(tr("Po&wer Category")); catPowerLabel->setWordWrap(true); contestCatPowerComboBox->setToolTip(tr("Select the power category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(3)); contestCatPowerComboBox->addItems(_qs); //QLabel *catBandsLabel = new QLabel(tr("Bands Category")); catBandsLabel->setText(tr("&Bands Category")); catBandsLabel->setWordWrap(true); contestCatBandsComboBox->setToolTip(tr("Select the bands category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(4)); contestCatBandsComboBox->addItems(_qs); overlayLabel->setText(tr("O&verlay")); overlayLabel->setWordWrap(true); contestCatOverlayComboBox->setToolTip(tr("Select the Overlay category.")); _qs.clear(); _qs.append(dataProxy->getContestOverlays()); contestCatOverlayComboBox->addItems(_qs); */ connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsTextChanged() ) ); /* connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; */ //connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; //connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; //connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *callsLayout = new QGridLayout; // Widget, row, column callsLayout->addWidget(stationCallsignLabel, 0, 0); callsLayout->addWidget(stationCallsignLineEdit, 0, 1); callsLayout->addWidget(dateLabel, 1, 0); callsLayout->addWidget(dateEdit, 1, 1); callsLayout->addWidget(operatorsLabel, 2, 0); callsLayout->addWidget(operatorsLineEdit, 2, 1); callsLayout->addWidget(commentLabel, 3, 0); callsLayout->addWidget(commentLineEdit, 3, 1); /* callsLayout->addWidget(typeLabel, 3, 0); callsLayout->addWidget(typeComboBox, 3, 1); callsLayout->addWidget(catModeLabel, 4, 0); callsLayout->addWidget(contestCatModeComboBox, 4, 1); callsLayout->addWidget(catOpLabel, 5, 0); callsLayout->addWidget(contestCatOperatorsComboBox, 5, 1); callsLayout->addWidget(catAsLabel, 6, 0); callsLayout->addWidget(contestCatAssistedComboBox, 6, 1); callsLayout->addWidget(catPowerLabel, 7, 0); callsLayout->addWidget(contestCatPowerComboBox, 7, 1); callsLayout->addWidget(catBandsLabel, 8, 0); callsLayout->addWidget(contestCatBandsComboBox, 8, 1); callsLayout->addWidget(contestBandsComboBox, 8, 2); callsLayout->addWidget(overlayLabel, 10, 0); callsLayout->addWidget(contestCatOverlayComboBox, 10, 1); */ QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(callsLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); //page->setLayout(callsLayout); //qDebug() << "SetupPageSubdivisionNew::createWidget - End" << QT_ENDL; } void SetupPageSubdivisionNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotOperatorsTextChanged - Start" << QT_ENDL; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((operatorsLineEdit->text()).length()<1) { return; } int cursorP = operatorsLineEdit->cursorPosition(); QString currentQrz = operatorsLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; operatorsLineEdit->setText(currentQrz); } operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) {//TODO: Add a check of the format (comma separated) operatorsFilled= true; } //qDebug() << "SetupPageSubdivisionNew::slotOperatorsTextChanged - End" << QT_ENDL; } void SetupPageSubdivisionNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotStationCallSignTextChanged" << QT_ENDL; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((stationCallsignLineEdit->text()).length()<1) { showNOK(); return; } int cursorP = stationCallsignLineEdit->cursorPosition(); QString currentQrz = stationCallsignLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; stationCallsignLineEdit->setText(currentQrz); } stationCallsignLineEdit->setText(((stationCallsignLineEdit->text())).simplified()); stationCallsignLineEdit->setText((stationCallsignLineEdit->text()).toUpper()); stationCallsignLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) { stationCallsignFilled = true; } showOK(); //qDebug() << "SetupPageSubdivisionNew::slotStationCallSignTextChanged - End" << QT_ENDL; } /* void SetupPageSubdivisionNew::slotTypeComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotTypeComboBoxChanged" << QT_ENDL; // connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { typeLabel->setStyleSheet("QLabel {color : red; }"); validCats->setText(tr("Categories not OK")); validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } else { typeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatAssistedComboBoxChanged() { //qDebug() << "SetupPageLogs:slotCatAssistedComboBoxChanged: " << QString::number(contestCatAssistedComboBox->currentIndex()) << QT_ENDL; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catAsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catAsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatOperatorsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatOperatorsComboBoxChanged(): " << QString::number(contestCatOperatorsComboBox->currentIndex()) << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catOpLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catOpLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatPowerComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatPowerComboBoxChanged(): " << QString::number(contestCatPowerComboBox->currentIndex()) << QT_ENDL; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catPowerLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catPowerLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatBandsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatBandsComboBoxChanged(): " << QString::number(contestCatBandsComboBox->currentIndex()) << QT_ENDL; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catBandsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catBandsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotBandsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotBandsComboBoxChanged(): " << QString::number(contestBandsComboBox->currentIndex()) << QT_ENDL; //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; } void SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged(): " << QString::number(contestCatOverlayComboBox->currentIndex()) << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged(): typeContest = " << QString::number(typeContest) << QT_ENDL; if (typeContest < 0) { overlayLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { overlayLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatModeComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatModeComboBoxChanged(): " << QString::number(contestCatModeComboBox->currentIndex()) << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageSubdivisionNew::slotCatModeComboBoxChanged(): " << QString::number(typeContest) << QT_ENDL; if (typeContest < 0) { catModeLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catModeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } */ void SetupPageSubdivisionNew::slotOKButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked" << QT_ENDL; stationCallsign = stationCallsignLineEdit->text(); if (stationCallsign.length()<3) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter a valid callsign in the Station Callsign box.\nThe log will not be opened.")); msgBox.exec(); return; } operators = operatorsLineEdit->text(); //TODO: Check if operators is really including a comma separated list of QRZ comment = commentLineEdit->text(); dateString = dateEdit->date().toString("yyyy-MM-dd"); logData.clear(); logData << stationCallsign << operators << comment << dateString; if (editing) { logData << "1"; editing = false; } else { logData << "0"; } emit newLogData(logData); //gatherAndSend(); clear(); accept(); //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode /* if (typeComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: type" << QT_ENDL; typeContestSelected = typeComboBox->currentIndex(); typeConteststr = typeComboBox->currentText(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: type" << QT_ENDL; typeContestSelected = 0; typeConteststr = QString(); } if (contestCatModeComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: mode" << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: mode" << QT_ENDL; contestCatMode = 0; } if (contestCatOperatorsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: oper" << QT_ENDL; contestCatOperators = contestCatOperatorsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: oper" << QT_ENDL; contestCatOperators = 0; } if (contestCatAssistedComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: ass" << QT_ENDL; contestCatAssisted = contestCatAssistedComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: ass" << QT_ENDL; contestCatAssisted = 0; } if (contestCatPowerComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr" << QT_ENDL; contestCatPower = contestCatPowerComboBox->currentIndex(); //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr - " << contestCatPowerComboBox->currentText() << QT_ENDL; } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: pwr" << QT_ENDL; contestCatPower = 0; } if (contestCatBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: Cbands" << QT_ENDL; contestCatBands = contestCatBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: Cbands" << QT_ENDL; contestCatBands = 0; } if (contestBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: bands" << QT_ENDL; contestBands = contestBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: bands" << QT_ENDL; contestBands = 0; } if (contestCatOverlayComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: over" << QT_ENDL; contestCatOverlay = contestCatOverlayComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: over" << QT_ENDL; contestCatOverlay = 0; } //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode // typeContest = getSelectedTypeContest(); if (typeContest < 0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You selected an invalid combination.\nThe log will not be opened.")); msgBox.exec(); } else { } */ } void SetupPageSubdivisionNew::gatherAndSend() { //qDebug() << "SetupPageSubdivisionNew::gatherAndSend: " << QT_ENDL; // The following lines will be removed once more contest types have been added //contestCatMode = contestCatModeComboBox->currentIndex(); //contestCatBands = contestCatBandsComboBox->currentIndex(); //contestCatPower = contestCatPowerComboBox->currentIndex(); //contestCatOperators = contestCatOperatorsComboBox->currentIndex(); //contestCatAssisted = contestCatAssistedComboBox->currentIndex(); //typeContestSelected = typeComboBox->currentIndex(); //contestCatOverlay = contestCatOverlayComboBox->currentIndex(); //typeContest = getSelectedTypeContest(); // The previous lines will be removed once more contest types have been added logData.clear(); logData << stationCallsign << operators << comment << dateString; /* << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); */ if (editing) { logData << "1"; editing = false; } else { logData << "0"; } //logData << QString::number(typeContest) // Update the SetupPageLogs::slotAnalyzeNewLogData if you add or remove any field (Today 12) //qDebug() << "SetupPageSubdivisionNew::gatherAndSend: EMITED" << QT_ENDL; emit newLogData(logData); } void SetupPageSubdivisionNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotCancelButtonClicked" << QT_ENDL; logData.clear(); emit cancelled(true); setResult(QDialog::Rejected); clear(); close(); } /* QStringList SetupPageSubdivisionNew::getValidCatOptions(const int _currentCat, const int _higherCat) {// currentCat is the current category and highercat is the category we want to know the information // being: // 1 - contestcatoperator // 2 - contestcatassisted // 3 - contestcatpower // 4 - contestcatband // 5 - contestcatoverlay // 6 - contestcatmode //qDebug() << "SetupPageSubdivisionNew::getValidCatOptions: " << QString::number(_currentCat) <<"/"<< QString::number(_higherCat) << QT_ENDL; //return dataProxy->getValidCatOptions(_currentCat, _higherCat); return QStringList(); } */ void SetupPageSubdivisionNew::setStationCallSign(const QString &_st) { stationCallsign = _st; stationCallsignLineEdit->setText(stationCallsign.toUpper()); } void SetupPageSubdivisionNew::setOperators(const QString &_st) { operators = _st; operatorsLineEdit->setText(operators.toUpper()); } void SetupPageSubdivisionNew::setComment(const QString &_st) { comment = _st; commentLineEdit->setText(comment); } void SetupPageSubdivisionNew::setDateString(const QString &_st) { dateString = _st; dateEdit->setDate(QDate::fromString(dateString, "yyyy-MM-dd")); } /* void SetupPageSubdivisionNew::setType(const QString &_st) { typeConteststr = _st; //typeConteststr = typeComboBox->currentText(); typeComboBox->setCurrentIndex(typeComboBox->findText(typeConteststr, Qt::MatchExactly)); //findText ( const QString & text, Qt::MatchFlags flags = static_cast ( Qt::MatchExactly | Qt::MatchCaseSensitive ) ) const } void SetupPageSubdivisionNew::setCMode(const int _n) { contestCatMode = _n; contestCatModeComboBox->setCurrentIndex(contestCatMode); } void SetupPageSubdivisionNew::setCOperators(const int _n) { contestCatOperators = _n; contestCatOperatorsComboBox->setCurrentIndex(contestCatOperators); } void SetupPageSubdivisionNew::setCAssisted(const int _n) { contestCatAssisted = _n; contestCatAssistedComboBox->setCurrentIndex(contestCatAssisted); } void SetupPageSubdivisionNew::setCPower(const int _n) { contestCatPower = _n; contestCatPowerComboBox->setCurrentIndex(contestCatPower); } void SetupPageSubdivisionNew::setCBands(const int _n) { contestCatBands = _n; contestCatBandsComboBox->setCurrentIndex(contestCatBands); } void SetupPageSubdivisionNew::setBands(const int _n) { contestBands = _n; contestBandsComboBox->setCurrentIndex(contestBands); } void SetupPageSubdivisionNew::setCOverlay(const int _n) { contestCatOverlay = _n; contestCatOverlayComboBox->setCurrentIndex(contestCatOverlay); } */ void SetupPageSubdivisionNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } /* int SetupPageSubdivisionNew::getSelectedTypeContest() { //qDebug() << "SetupPageSubdivisionNew::getSelectedTypeContest: " << QT_ENDL; //is/contest/catoperator/catassisted/catpower/catband/catoverlay/catmode int i = dataProxy->getContestTypeN(typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode); //qDebug() << "SetupPageSubdivisionNew::getSelectedTypeContest: " << QString::number(i) << QT_ENDL; return i; } void SetupPageSubdivisionNew::setTypeN(const int _n) { //qDebug() << "SetupPageSubdivisionNew::setTypeN: " << QString::number(_n) << QT_ENDL; typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageSubdivisionNew::fillWithType(const int _n) { //qDebug() << "SetupPageSubdivisionNew::fillWithType - n = " << QString::number(_n) << QT_ENDL; typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageSubdivisionNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")" << QT_ENDL; if (contestData.length()== 8) { //qDebug() << "SetupPageSubdivisionNew::fillWithType-2" << QT_ENDL; //setCOperators ((contestData.at(1)).toInt()); //setCAssisted ((contestData.at(2)).toInt()); //setCPower ((contestData.at(3)).toInt()); //setCOverlay ((contestData.at(4)).toInt()); //setCMode ((contestData.at(5)).toInt()); //setType(contestData.at(6)); //setCBands((contestData.at(7)).toInt()); //qDebug() << "SetupPageSubdivisionNew::fillWithType: " << contestData.at(6) << QT_ENDL; } else { //qDebug() << "SetupPageSubdivisionNew::fillWithType-3" << QT_ENDL; return; } } void SetupPageSubdivisionNew::updateAllCats() { //qDebug() << "SetupPageSubdivisionNew::updateAllCats" << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); } */ void SetupPageSubdivisionNew::showOK() { //validCats->setText(tr("Data OK")); //validCats->setStyleSheet("QLabel {color : black; }"); okButton->setEnabled(true); } void SetupPageSubdivisionNew::showNOK() { //validCats->setText(tr("Data not OK")); //validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } klog-1.8.6/setuppages/setuppageinterfaceswindows.cpp0000644000175000017500000001070114166020407022001 0ustar develdevel#include "setuppages/setuppageinterfaceswindows.h" SetupPageInterfacesWindows::SetupPageInterfacesWindows(QWidget *parent) : QWidget(parent) { sendToPSTRotatorCheckBox = new QCheckBox(this); PSTRotatorUDPServerPortSpinBox = new QSpinBox; PSTRotatorServerLineEdit = new QLineEdit; PSTRotatorDefaultport = 12040; createUI(); createActions(); } SetupPageInterfacesWindows::~SetupPageInterfacesWindows(){ //qDebug() << "SetupPageInterfacesWindows::~SetupPageInterfacesWindows" << endl; } void SetupPageInterfacesWindows::createUI() { PSTRotatorServer = "localhost"; setPSTRotatorUDPServer(PSTRotatorServer); QString labelTip = tr("UDP port number where the PSTRotator Server will listen for packets.") + "\n" + tr("Default port is 12040."); PSTRotatorUDPServerPortSpinBox->setToolTip(labelTip); PSTRotatorUDPServerPortSpinBox->setMinimum(0); PSTRotatorUDPServerPortSpinBox->setMaximum(65535); PSTRotatorUDPServerPortSpinBox->setValue(PSTRotatorDefaultport); QLabel *udpPortLabel = new QLabel(tr("PST Rotator UDP Port")); udpPortLabel->setBuddy(PSTRotatorUDPServerPortSpinBox); udpPortLabel->setToolTip(labelTip); udpPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); udpPortLabel->setEnabled(true); labelTip = tr("Hostname or IP address of the computer running PSTRotator. Leave it as localhost if you are running KLog and PSTRotator in the same computer."); PSTRotatorServerLineEdit->setToolTip(labelTip); QLabel *udpServerLabel = new QLabel(tr("PST Rotator host")); udpServerLabel->setBuddy(PSTRotatorServerLineEdit); udpServerLabel->setToolTip(labelTip); udpServerLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); udpServerLabel->setEnabled(true); QHBoxLayout *UDPLayout1 = new QHBoxLayout; UDPLayout1->addWidget(udpServerLabel); UDPLayout1->addWidget(PSTRotatorServerLineEdit); UDPLayout1->addWidget(udpPortLabel); UDPLayout1->addWidget(PSTRotatorUDPServerPortSpinBox); sendToPSTRotatorCheckBox->setText(tr("Send antenna bearing to PST Rotator")); sendToPSTRotatorCheckBox->setChecked(false); //PSTRotatorServerLineEdit->clear(); //PSTRotatorServerLineEdit->setText(tr("Enter the hostname of the machine running PSTRotator. Enter localhost if it is the same machine.")); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(sendToPSTRotatorCheckBox); layout->addLayout(UDPLayout1); setLayout(layout); } void SetupPageInterfacesWindows::createActions() { connect(sendToPSTRotatorCheckBox, SIGNAL(clicked () ), this, SLOT(slotSendToPSTRotatorCheckBoxClicked() ) ); } void SetupPageInterfacesWindows::setSendToPSTRotator(const QString &_t) { //qDebug() << "SetupPageInterfacesWindows::setUDPServer: " << _t << endl; if ( (_t.toUpper()) == "FALSE") { sendToPSTRotatorCheckBox->setChecked(false); } else { sendToPSTRotatorCheckBox->setChecked(true); } slotSendToPSTRotatorCheckBoxClicked(); } void SetupPageInterfacesWindows::setPSTRotatorUDPServerPort(const QString &_t) { if ( (_t.toInt()>=0) && (_t.toInt()<=65535)) { PSTRotatorUDPServerPortSpinBox->setValue(_t.toInt()); } else { PSTRotatorUDPServerPortSpinBox->setValue(PSTRotatorDefaultport); } } void SetupPageInterfacesWindows::setPSTRotatorUDPServer(const QString &_t) { PSTRotatorServer = _t; PSTRotatorServerLineEdit->setText(PSTRotatorServer); } QString SetupPageInterfacesWindows::getSendToPSTRotator() { if (sendToPSTRotatorCheckBox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageInterfacesWindows::getPSTRotatorUDPServerPort() { int t = PSTRotatorUDPServerPortSpinBox->value(); if ( (t>=0) && (t<=65535) ) { return QString::number(t); } else { return QString::number(PSTRotatorDefaultport); } } QString SetupPageInterfacesWindows::getPSTRotatorUDPServer() { return PSTRotatorServer; } void SetupPageInterfacesWindows::slotSendToPSTRotatorCheckBoxClicked() { //qDebug() << "SetupPageInterfacesWindows::slotLogFromWSJTCheckBoxClicked" << endl; if (sendToPSTRotatorCheckBox->isChecked()) { PSTRotatorUDPServerPortSpinBox->setEnabled(true); PSTRotatorServerLineEdit->setEnabled(true); } else { PSTRotatorUDPServerPortSpinBox->setEnabled(false); PSTRotatorServerLineEdit->setEnabled(false); } } klog-1.8.6/setuppages/setuppagecolors.h0000644000175000017500000000715514166020407017222 0ustar develdevel#ifndef SETUPPAGECOLORS_H #define SETUPPAGECOLORS_H /*************************************************************************** setuppagecolors.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include //#include #include #include "utilities.h" class SetupPageColors : public QWidget { Q_OBJECT public: SetupPageColors(QWidget *parent=0); ~SetupPageColors(); QString getNewOneColor(); QString getNeededColor(); QString getWorkedColor(); QString getConfirmedColor(); QString getDefaultColor(); QString getDarkMode(); void setNewOneColor(const QString &_c); void setNeededColor(const QString &_c); void setWorkedColor(const QString &_c); void setConfirmedColor(const QString &_c); void setDefaultColor(const QString &_c); void setDarkMode(const QString &_dm); private slots: void slotNewOneColorButtonClicked(); void slotConfirmedColorButtonClicked(); void slotWorkedColorButtonClicked(); void slotNeededColorButtonClicked(); void slotDefaultColorButtonClicked(); void slotWSJTXButtonClicked(); void slotKLogButtonClicked(); void slotSetDarkMode(); private: Utilities *util; bool darkMode; void setDefaultColors(); void setWSJTXColors(); QColor giveColor (QColor c); QPalette palette; QPushButton *newOneColorButton; // In ANY band QPushButton *neededColorButton; // In this band QPushButton *workedColorButton; // In this band QPushButton *confirmedColorButton; // In this band QPushButton *defaultColorButton; // In this band QPushButton *wsjtxColorButton; // In this band QPushButton *klogColorButton; // In this band QPushButton *darkModeButton; QColor color; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. */ }; #endif // SETUPPAGECOLORS_H klog-1.8.6/setuppages/setuppageworldeditor.h0000644000175000017500000000610114166020407020245 0ustar develdevel#ifndef SETUPPAGEWORLDEDITOR_H #define SETUPPAGEWORLDEDITOR_H /*************************************************************************** setuppageworldeditor.h - description ------------------- begin : jun 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "world.h" #include "dataproxy_sqlite.h" #include "setuppages/setupentitydialog.h" #include "utilities.h" enum { WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 }; class SetupPageWorldEditor : public QWidget { Q_OBJECT public: SetupPageWorldEditor(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageWorldEditor(); private slots: void slotAddButtonClicked(); void slotDelButtonClicked(); void slotEditButtonClicked(); //void slotDoubleClickEntity( const QModelIndex & index); void slotAnalyzeEntityAddedSignal(const QStringList _qs); void slotImportWorldButtonClicked(); private: World *world; Utilities *util; DataProxy_SQLite *dataProxy; void createWorldPanel(); void createWorldModel(); void createActions(); bool isWorldEmpty(); QSqlRelationalTableModel *worldModel; QWidget *worldPanel; QTableView *worldView; QTreeWidget *searchResultsTreeWidget; QPushButton *addEntityPushButton, *delEntityPushButton, *editEntityPushButton, *exportWorldPushButton, *loadWorldPushButton; SetupEntityDialog *setupEntityDialog; }; #endif // SETUPPAGEWORLDEDITOR_H klog-1.8.6/setuppages/setupentitydialog.cpp0000644000175000017500000004076614166020407020120 0ustar develdevel/*************************************************************************** setupentitydialog.cpp - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setupentitydialog.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupEntityDialog::SetupEntityDialog(){ //qDebug() << "SetupEntityDialog::SetupEntityDialog: " << QT_ENDL; //QPalette::ColorRole QWidget::foregroundRole () const; //QPalette::ColorRole //paletteOrig = new QPalette; //paletteWrong = new QPalette; //paletteWrong.setColor(QPalette::Normal, QPalette::WindowText, Qt::red); //paletteWrong = new QPalette(); //*paletteWrong->setColor(QPalette::WindowText, Qt::red); //paletteWrong.setColor(QPalette::WindowText, color.setNamedColor("red")); palw.setColor(QPalette::Text, Qt::red); //pal.setColor(QPalette::Text, Qt::black); entityData.clear(); entityBool = false; mainPrefixBool = false; cqBool = false; ituBool = false; contBool = false; latBool = false; lonBool = false; utcBool = false; arrlidBool = false; delBool = false; delDateBool = false; prefBool = false; //qDebug() << "SetupEntityDialog::SetupEntityDialog - 0" << QT_ENDL; QLabel *entityLabel = new QLabel(tr("Entity")); entityLineEdit = new QLineEdit; entityLineEdit->setToolTip(tr("Name of the Entity.")); QLabel *cqLabel = new QLabel(tr("CQ")); cqLineEdit = new QLineEdit; cqLineEdit->setToolTip(tr("CQ zone.")); QLabel *ituLabel = new QLabel(tr("ITU")); ituLineEdit = new QLineEdit; ituLineEdit->setToolTip(tr("ITU zone.")); //QLabel *contLabel = new QLabel(tr("Continent")); //contLineEdit = new QLineEdit; //contLineEdit->setToolTip(tr("Continent of the Entity")); QLabel *latLabel = new QLabel(tr("Latitude")); latLineEdit = new QLineEdit; latLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *lonLabel = new QLabel(tr("Longitude")); lonLineEdit = new QLineEdit; lonLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *utcLabel = new QLabel(tr("UTC")); utcLineEdit = new QLineEdit; utcLineEdit->setToolTip(tr("Local time difference to UTC.")); QLabel *mprefLabel = new QLabel(tr("Main prefix")); mprefLineEdit = new QLineEdit; mprefLineEdit->setToolTip(tr("Main prefix of the entity.")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 1" << QT_ENDL; QLabel *arrlidLabel = new QLabel(tr("ARRL ID")); arrlidLineEdit = new QLineEdit; arrlidLineEdit->setToolTip(tr("ARRL ID.")); //QLabel *deletedLabel = new QLabel(tr("Deleted")); //deletedLineEdit = new QLineEdit; //deletedLineEdit->setToolTip(tr("Mark if the entity is deleted")); QLabel *prefLabel = new QLabel(tr("Prefixes")); prefLineEdit = new QLineEdit; prefLineEdit->setToolTip(tr("Comma separated possible prefixes, e.g. EA1, EA2, ...")); delQDateEdit = new QDateEdit; delQDateEdit->setToolTip(tr("Date of the deletion.")); delRbutton = new QCheckBox(tr("Deleted"), this); QPushButton *closeButton = new QPushButton(tr("Cancel")); QPushButton *okButton = new QPushButton(tr("Ok")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 2" << QT_ENDL; /* connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connect(entityLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckEntity() ) ); connect(mprefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckMainprefix() ) ); connect(cqLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckCQz() ) ); connect(ituLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckITUz() ) ); connect(contLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckContinent() ) ); connect(latLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLatitude() ) ); connect(lonLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLongitude() ) ); connect(utcLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckUTC() ) ); connect(arrlidLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckARRLid() ) ); connect(delRbutton, SIGNAL(checked), this, SLOT(slotCheckDeleted() ) ); connect(delQDateEdit, SIGNAL(dateChanged), this, SLOT(slotCheckDeletedDate() ) ); connect(prefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckPrefixes() ) ); */ //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3" << QT_ENDL; QVBoxLayout *cqLayout = new QVBoxLayout; cqLayout->addWidget(cqLabel); cqLayout->addWidget(cqLineEdit); QVBoxLayout *ituLayout = new QVBoxLayout; ituLayout->addWidget(ituLabel); ituLayout->addWidget(ituLineEdit); QVBoxLayout *latLayout = new QVBoxLayout; latLayout->addWidget(latLabel); latLayout->addWidget(latLineEdit); QVBoxLayout *lonLayout = new QVBoxLayout; lonLayout->addWidget(lonLabel); lonLayout->addWidget(lonLineEdit); QHBoxLayout *posLayout = new QHBoxLayout; posLayout->addLayout(cqLayout); posLayout->addLayout(ituLayout); posLayout->addLayout(latLayout); posLayout->addLayout(lonLayout); QVBoxLayout *utcLayout = new QVBoxLayout; utcLayout->addWidget(utcLabel); utcLayout->addWidget(utcLineEdit); QVBoxLayout *arrlidLayout = new QVBoxLayout; arrlidLayout->addWidget(arrlidLabel); arrlidLayout->addWidget(arrlidLineEdit); QVBoxLayout *delLayout = new QVBoxLayout; delLayout->addWidget(delRbutton); delLayout->addWidget(delQDateEdit); QHBoxLayout *thirdLayout = new QHBoxLayout; thirdLayout->addLayout(utcLayout); thirdLayout->addLayout(arrlidLayout); thirdLayout->addLayout(delLayout); QVBoxLayout *prefLayout = new QVBoxLayout; prefLayout->addWidget(prefLabel); prefLayout->addWidget(prefLineEdit); QGridLayout *dataLayout = new QGridLayout; dataLayout->addWidget(entityLabel, 0, 0); dataLayout->addWidget(entityLineEdit, 1, 0); dataLayout->addWidget(mprefLabel, 0, 1); dataLayout->addWidget(mprefLineEdit, 1, 1); dataLayout->addLayout(posLayout, 2, 0, 2, -1); dataLayout->addLayout(thirdLayout, 4, 0, 4, -1); dataLayout->addLayout(prefLayout, 8, 0, 8, -1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addStretch(1); mainLayout->addSpacing(12); mainLayout->addLayout(buttonsLayout); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3" << QT_ENDL; setLayout(mainLayout); setWindowTitle(tr("Entity Dialog")); pal = lonLineEdit->palette(); //qDebug() << "SetupEntityDialog::SetupEntityDialog: END" << QT_ENDL; } SetupEntityDialog::~SetupEntityDialog() { //qDebug() << "SetupEntityDialog::~SetupEntityDialog " << QT_ENDL; } void SetupEntityDialog::slotOkButtonClicked() { //qDebug() << "SetupEntityDialog::slotOkButtonClicked " << QT_ENDL; QStringList ql; ql.clear(); if (entityBool && mainPrefixBool && cqBool && ituBool && contBool && latBool && lonBool && utcBool && arrlidBool && delBool && delDateBool && prefBool) { ql << checkEntity(); ql << checkMainprefix(); ql << checkContinent(); ql << checkCQz(); ql << checkITUz(); ql << checkLatitude(); ql << checkLongitude(); ql << checkUTC(); ql << checkARRLid(); ql << checkDeleted(); //ql << checkDeletedDate(); ql << checkPrefixes(); emit entityAdded(ql); accept(); } else { reject(); } reject(); } QString SetupEntityDialog::checkContinent() { //qDebug() << "SetupEntityDialog::checkContinent" << QT_ENDL; if(contBool) { return contLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkEntity() { //qDebug() << "SetupEntityDialog::checkEntity" << QT_ENDL; if(entityBool) { return entityLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkMainprefix() { //qDebug() << "SetupEntityDialog::checkMainprefix" << QT_ENDL; if(mainPrefixBool) { return mprefLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkCQz() { //qDebug() << "SetupEntityDialog::checkCQz" << QT_ENDL; if(cqBool) { return cqLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkITUz() { //qDebug() << "SetupEntityDialog::checkITUz" << QT_ENDL; if(ituBool) { return ituLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLatitude() { //qDebug() << "SetupEntityDialog::checkLatitude" << QT_ENDL; if(latBool) { return latLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLongitude() { //qDebug() << "SetupEntityDialog::checkLongitude" << QT_ENDL; if(lonBool) { return lonLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkUTC() { //qDebug() << "SetupEntityDialog::checkUTC" << QT_ENDL; if(utcBool) { return utcLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkARRLid() { //qDebug() << "SetupEntityDialog::checkARRLid" << QT_ENDL; if(arrlidBool) { return arrlidLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkDeleted() { //qDebug() << "SetupEntityDialog::checkDeleted" << QT_ENDL; if(delBool) { return "Y"; } else { return "N"; } return ""; } QString SetupEntityDialog::checkDeletedDate() { //qDebug() << "SetupEntityDialog::checkDeletedDate" << QT_ENDL; if(delDateBool) { return "00/00/0000"; } else { return ""; } return ""; } QString SetupEntityDialog::checkPrefixes() { //qDebug() << "SetupEntityDialog::checkPrefixes" << QT_ENDL; if(prefBool) { return prefLineEdit->text(); } else { return ""; } return ""; } void SetupEntityDialog::slotCancelButtonClicked() { //qDebug() << "SetupEntityDialog::slotCancelButtonClicked " << QT_ENDL; reject(); } void SetupEntityDialog::slotCheckEntity() { //qDebug() << "SetupEntityDialog::slotCheckEntity " << QT_ENDL; QString aux; aux = entityLineEdit->text(); if (aux.length()>2) { entityBool = true; entityLineEdit->setPalette(pal); } else { entityBool = false; entityLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckMainprefix() { //qDebug() << "SetupEntityDialog::slotCheckMainprefix" << QT_ENDL; QString aux; aux = mprefLineEdit->text(); if (aux.length()>0) { mprefLineEdit->setPalette(pal); mainPrefixBool = true; } else { mainPrefixBool = false; mprefLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckCQz() { //qDebug() << "SetupEntityDialog::slotCheckCQz" << QT_ENDL; QString aux; aux = cqLineEdit->text(); if (aux.length()>0) { cqBool = true; cqLineEdit->setPalette(pal); } else { cqBool = false; cqLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckITUz() { //qDebug() << "SetupEntityDialog::slotCheckITUz" << QT_ENDL; QString aux; aux = ituLineEdit->text(); if (aux.length()>0) { ituBool = true; ituLineEdit->setPalette(pal); } else { ituBool = false; ituLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckContinent() { //qDebug() << "SetupEntityDialog::slotCheckContinent" << QT_ENDL; QString aux; aux = contLineEdit->text(); if (aux.length()>2) { contBool = true; contLineEdit->setPalette(pal); } else { contBool = false; contLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLatitude() { //qDebug() << "SetupEntityDialog::slotCheckLatitude" << QT_ENDL; QString aux; aux = latLineEdit->text(); if (aux.length()>0) { latBool = true; latLineEdit->setPalette(pal); } else { latBool = false; latLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLongitude() { //qDebug() << "SetupEntityDialog::slotCheckLongitude" << QT_ENDL; QString aux; aux = lonLineEdit->text(); if (aux.length()>3) { //lonLineEdit->setPalette(*paletteOrig); lonBool = true; lonLineEdit->setPalette(pal); } else { //lonLineEdit->setForegroundRole(QPalette::WindowText); lonLineEdit->setPalette(palw); //lonLineEdit->setPalette(*paletteWrong); lonBool = false; } } void SetupEntityDialog::slotCheckUTC() { //qDebug() << "SetupEntityDialog::slotCheckUTC" << QT_ENDL; QString aux; aux = utcLineEdit->text(); if (aux.length()>0) { utcBool = true; utcLineEdit->setPalette(pal); } else { utcBool = false; utcLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckARRLid() { //qDebug() << "SetupEntityDialog::slotCheckARRLid" << QT_ENDL; QString aux; aux = arrlidLineEdit->text(); // int n = aux.toInt(); if (aux.length()>0) { arrlidBool = false; arrlidLineEdit->setPalette(pal); } else { arrlidBool = false; arrlidLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckDeleted() { //qDebug() << "SetupEntityDialog::slotCheckDeleted" << QT_ENDL; if (delRbutton->isChecked()) { delBool = true; } else { delBool = false; } } void SetupEntityDialog::slotCheckDeletedDate() { //qDebug() << "SetupEntityDialog::slotCheckDeletedDate" << QT_ENDL; delDateBool = false; //arrlidLineEdit->setPalette(palw); } void SetupEntityDialog::slotCheckPrefixes() { //qDebug() << "SetupEntityDialog::slotCheckPrefixes" << QT_ENDL; QString aux; aux = prefLineEdit->text(); aux = aux.simplified(); QStringList list = aux.split(",", QT_SKIP); if (aux.length()>0) { prefBool = true; prefLineEdit->setPalette(pal); //"EA1, EA2, EA3" } else { prefBool = false; prefLineEdit->setPalette(palw); } } klog-1.8.6/setuppages/setuppagelogview.cpp0000644000175000017500000000770614166020407017732 0ustar develdevel/*************************************************************************** setuppagelogview.cpp - description ------------------- begin : ago 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppagelogview.h" SetupPageLogView::SetupPageLogView(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageLogView::SetupPageLogView" << QT_ENDL; dataProxy = dp; fieldsListWidget = new QListWidget; QHBoxLayout *layout = new QHBoxLayout; QVBoxLayout *fLayout = new QVBoxLayout; QLabel *fieldsLabel = new QLabel(fieldsListWidget); fieldsLabel->setText(tr("Fields")); fieldsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); addFields(dataProxy->getFields()); fLayout->addWidget(fieldsLabel); fLayout->addWidget(fieldsListWidget); layout->addLayout(fLayout); setLayout(layout); //qDebug() << "SetupPageLogView::SetupPageLogView - END" << QT_ENDL; } SetupPageLogView::~SetupPageLogView() {} void SetupPageLogView::addFields(QStringList _b) { fieldsListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < fieldsListWidget->count(); ++i){ item = fieldsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QString SetupPageLogView::getFields() { //qDebug() << "SetupPageLogView::getBands" << QT_ENDL; QString b; QListWidgetItem *it; if ( (fieldsListWidget->count()) < 1) { return ""; } for (int i = 0; i < fieldsListWidget->count(); i++) { it = fieldsListWidget->item(i); if (it->checkState() == Qt::Checked) { b = b + it->text(); b = b + ", "; } } if (b.size()<2) { }else { b.chop(2); } return b; } void SetupPageLogView::setActiveFields(QStringList q) { //qDebug() << "SetupPageLogView::setActiveFields" << QT_ENDL; if (q.isEmpty()) {return;} //QString b; QListWidgetItem *it; if ( (fieldsListWidget->count()) < 1) { return; } for (int i = 0; i < fieldsListWidget->count(); i++) { it = fieldsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } klog-1.8.6/setuppages/setuppagelogs.h0000644000175000017500000001013714166020407016657 0ustar develdevel#ifndef SETUPPAGELOGS_H #define SETUPPAGELOGS_H /*************************************************************************** setuppagelogs.h - description ------------------- begin : feb 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "dataproxy_sqlite.h" #include "setuppages/setuppagelogsnew.h" //const int CONTEST_DX = 0; //const int CONTEST_CQ_WW_SSB = 1; //const int CONTEST_CQ_WW_CW = 2; //const int CONTEST_CQ_WPX_SSB = 3; //const int CONTEST_CQ_WPX_CW = 4; class SetupPageLogs : public QWidget { Q_OBJECT public: SetupPageLogs(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageLogs(); int getSelectedLog(); void setSelectedLog(const int _i); void createNewLog(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); private slots: void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); void slotLogSelected(const QModelIndex & index); void slotLogDoubleClicked(const QModelIndex & index); signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newLogData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void focusOK(); private: //void createActions(); void showEvent(QShowEvent *event); QStringList readLogs(); void createLogsPanel(); void createLogsModel(); void createActions(); //bool addNewLog(const QStringList _qs); void updateSelectedLogs(); //void readSelectedLog(const int _i); void showError(const QString &_errorC); /* Wizard to create a new log*/ //QWizardPage *createLogTypePage(); //QWizard *newLogWizard; // Wizard to create a new log /*^Wizard to create a new log^*/ QSqlRelationalTableModel *logsModel; QWidget *logsPanel; QTableView *logsView; QAbstractButton *finishButton; QPushButton *newLogPushButton, *editPushButton, *removePushButton; int lastLog; QString currentLogComment; QString currentStationCallSign; QStringList logsAvailable; SetupPageLogsNew *newLog; QString stationCallsign, operators, comment, dateString;//, typeContest; DataProxy_SQLite *dataProxy; int selectedLog; QString defaultStationCallSign, defaultOperators; }; #endif // SETUPPAGELOGS_H klog-1.8.6/setuppages/setuppagesubdivisions.cpp0000644000175000017500000003541714166020407020777 0ustar develdevel/*************************************************************************** setuppageregionalawards.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagesubdivisions.h" SetupPageSubdivisions::SetupPageSubdivisions(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions" << QT_ENDL; dataProxy = dp; fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); //util = new Utilities(); selectedLog = -1; currentLogs = new QComboBox(); logsAvailable.clear(); logsModel = new QSqlRelationalTableModel(this); logsView = new QTableView; logsView->setContextMenuPolicy(Qt::CustomContextMenu); logsView->setSortingEnabled(true); createLogsModel(); createLogsPanel(); logsView->setCurrentIndex(logsModel->index(0, 0)); lastLog = 0; //newLogPushButton = new QPushButton(tr("&New"), this); //editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); importAwardPushButton = new QPushButton(tr("Import new")); importAwardPushButton->setToolTip(tr("Import an AWA file with the subdivision details.")); //newLogPushButton->setToolTip(tr("Add a new references file.")); //editPushButton->setToolTip(tr("Edit the selected references.")); removePushButton->setToolTip(tr("Remove the selected references.")); currentLogs->setToolTip(tr("Select the references you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(importAwardPushButton); //buttonsLayout->addWidget(newLogPushButton); //buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(logsView); widgetLayout->addWidget(currentLogs); widgetLayout->addLayout(buttonsLayout); setLayout(widgetLayout); createActions(); updateSelectedLogs(); //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions - END" << QT_ENDL; } SetupPageSubdivisions::~SetupPageSubdivisions(){ //qDebug() << "SetupPageSubdivisions::~SetupPageSubdivisions" << QT_ENDL; } /* void SetupPageSubdivisions::slotEditButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked" << QT_ENDL; //QSqlQuery query; //int nameCol = -1; selectedLog = getSelectedLog(); QString getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked" << QT_ENDL; newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); newLog->setComment(dataProxy->getCommentsFromLog(selectedLog)); newLog->setDateString(dataProxy->getLogDateFromLog(selectedLog)); //newLog->setTypeN(dataProxy->getLogTypeNFromLog(selectedLog).toInt()); int result = newLog->exec(); if (result == QDialog::Accepted) { emit focusOK(); } } */ void SetupPageSubdivisions::slotRemoveButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked" << QT_ENDL; int selectedLog = getSelectedLog(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove the data of this entity?") + "\n" + tr("All the subdivision information for this entity will be deleted..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")" << QT_ENDL; QString stringQuery = QString("DELETE FROM logs WHERE id='%1'").arg(selectedLog); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; stringQuery = QString("DELETE FROM award WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageSubdivisions::createLogsPanel() { //qDebug() << "SetupPageSubdivisions::createLogsPanel" << QT_ENDL; logsView->setModel(logsModel); QString stringQuery = QString("SELECT * FROM primary_subdivision"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ logsView->setColumnHidden(i, true); } //columns = rec.indexOf("id"); //logsView->setColumnHidden(columns, false); logsView->setItemDelegate(new QSqlRelationalDelegate(this)); logsView->setSelectionMode( QAbstractItemView::SingleSelection); logsView->setSelectionBehavior(QAbstractItemView::SelectRows); logsView->resizeColumnsToContents(); logsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageSubdivisions::createLogsModel() { //qDebug() << "SetupPageSubdivisions::createLogsModel" << QT_ENDL; QString stringQuery = QString("SELECT * FROM primary_subdivisions"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; logsModel->setTable("primary_subdivisions"); nameCol = rec.indexOf("id"); logsModel->setSort(nameCol, Qt::AscendingOrder); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("name"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Name")); nameCol = rec.indexOf("shortname"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Short Name")); nameCol = rec.indexOf("cqz"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("deleted"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("start_date"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Start Date")); nameCol = rec.indexOf("end_date"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("End Date")); nameCol = rec.indexOf("dxcc"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("DXCC")); logsModel->select(); } void SetupPageSubdivisions::slotLogSelected(const QModelIndex & index) { //qDebug() << "SetupPageSubdivisions::slotLogSelected" << QT_ENDL; int row = index.row(); setSelectedLog((logsModel->index(row, 0)).data(0).toInt()); } void SetupPageSubdivisions::createActions() { //qDebug() << "SetupPageSubdivisions::createActions" << QT_ENDL; connect(currentLogs, SIGNAL(currentIndexChanged(int)), this, SLOT(slotCurrentLogsComboBoxChanged() ) ) ; connect(importAwardPushButton, SIGNAL(clicked()), this, SLOT(slotImportButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(logsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotLogSelected(QModelIndex) ) ); } QStringList SetupPageSubdivisions::readLogs() { //qDebug() << "SetupPageSubdivisions::readLogs" << QT_ENDL; QString aux, aux2; QStringList _logs; QSqlQuery query; int nameCol = -1; bool sqlOk = false; aux2.clear(); aux.clear(); _logs.clear(); aux = "SELECT DISTINCT dxcc from primary_subdivisions"; int counter = 0; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { counter ++; aux2.clear(); nameCol = rec.indexOf("dxcc"); //aux2 = QString::number(counter) + "-"; aux2 = (query.value(nameCol)).toString() + "-" + dataProxy->getEntityNameFromId(query.value(nameCol).toInt()); //aux2.append((query.value(nameCol)).toString()); _logs.append(aux2); } return _logs; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _logs; } } void SetupPageSubdivisions::updateSelectedLogs() { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs" << QT_ENDL; logsAvailable = readLogs(); if (logsAvailable.length()>0) { currentLogs->clear(); currentLogs->addItems(logsAvailable); } else { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs Not selected (less than 1)" << QT_ENDL; currentLogs->clear(); } } int SetupPageSubdivisions::getSelectedLog() { //qDebug() << "SetupPageSubdivisions::getSelectedLog: " << currentLogs->currentText() << QT_ENDL; QString selectedLog = currentLogs->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedLog.split("-"); i = (qs.at(0)).toInt(); //qDebug() << "SetupPageSubdivisions::getSelectedLog: " << QString::number(i) << QT_ENDL; if (i>=1) { return i; } else { return 0; } } void SetupPageSubdivisions::slotCurrentLogsComboBoxChanged() { //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: " << currentLogs->currentText() << QT_ENDL; QString a = (currentLogs->currentText()).section('-', 0, 0); //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: a: " << a << QT_ENDL; setSelectedLog(a.toInt()); } void SetupPageSubdivisions::setSelectedLog(const int _i) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog: " << QString::number(_i) << QT_ENDL; QString n = QString::number(_i) + "-"; int selected = currentLogs->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog selected>=0: " << QString::number(selected) << QT_ENDL; currentLogs->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog not selected" << QT_ENDL; return; } } void SetupPageSubdivisions::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageSubdivisions"), text, QMessageBox::Ok); } void SetupPageSubdivisions::slotImportButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked" << QT_ENDL; if (fileAwardManager->importNewAwardFile()) { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - OK" << QT_ENDL; } else { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - NOK" << QT_ENDL; } //QString fileName = QFileDialog::getOpenFileName(this, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - END" << QT_ENDL; } klog-1.8.6/setuppages/setuppageuserdata.cpp0000644000175000017500000005406114166020407020062 0ustar develdevel/*************************************************************************** userdatapage.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * Foobar is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppageuserdata.h" SetupPageUserDataPage::SetupPageUserDataPage(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageUserDataPage::SetupPageUserDataPage" << QT_ENDL; locator = new Locator(); util = new Utilities; dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); mainCallOK = false; operatorsOK = false; tabWidget = new QTabWidget; QWidget *personalTab = new QWidget; QWidget *stationTab = new QWidget; tabWidget->addTab(personalTab, tr("&Personal data")); tabWidget->addTab(stationTab, tr("Station &data")); maincallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; nameLineEdit = new QLineEdit; cqzLineEdit = new QLineEdit; ituzLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; defaultPalette = new QPalette; //defaultPalette = operatorsLineEdit->palette(); wrongPalette = new QPalette; //wrongPalette->setColor(QPalette::WindowText, setNamedColor(Qt::red)); //redColor.setNamedColor(Qt::red); //redColor->setNamedColor(Qt::red); wrongPalette->setColor(QPalette::Text, Qt::red); //Personal Tab nameLineEdit = new QLineEdit; address1LineEdit = new QLineEdit; address2LineEdit = new QLineEdit; address3LineEdit = new QLineEdit; address4LineEdit = new QLineEdit; cityLineEdit = new QLineEdit; zipLineEdit = new QLineEdit; provinceLineEdit = new QLineEdit; countryLineEdit = new QLineEdit; nameLineEdit->setToolTip(tr("Enter your name.")); address1LineEdit->setToolTip(tr("Enter your address - 1st line.")); address2LineEdit->setToolTip(tr("Enter your address - 2nd line.")); address3LineEdit->setToolTip(tr("Enter your address - 3rd line.")); address4LineEdit->setToolTip(tr("Enter your address - 4th line.")); cityLineEdit->setToolTip(tr("Enter your city.")); zipLineEdit->setToolTip(tr("Enter your zip code.")); provinceLineEdit->setToolTip(tr("Enter your province or state.")); countryLineEdit->setToolTip(tr("Enter your country.")); QLabel *nameLabel = new QLabel(tr("&Name")); QLabel *addressLabel = new QLabel(tr("&Address")); QLabel *cityLabel = new QLabel(tr("Cit&y")); QLabel *zipLabel = new QLabel(tr("&Zip Code")); QLabel *provLabel = new QLabel(tr("Pro&v/State")); QLabel *countryLabel = new QLabel(tr("Countr&y")); nameLabel->setBuddy(nameLineEdit); addressLabel->setBuddy(address1LineEdit); cityLabel->setBuddy(cityLineEdit); zipLabel->setBuddy(zipLineEdit); provLabel->setBuddy(provinceLineEdit); countryLabel->setBuddy(countryLineEdit); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *personalLayout = new QGridLayout(); personalLayout->addWidget(nameLabel, 0, 0); personalLayout->addWidget(nameLineEdit, 1, 0); personalLayout->addWidget(addressLabel, 2, 0); personalLayout->addWidget(address1LineEdit, 3, 0, 1, 2); personalLayout->addWidget(address2LineEdit, 4, 0, 1, 2); personalLayout->addWidget(address3LineEdit, 5, 0, 1, 2); personalLayout->addWidget(address4LineEdit, 6, 0, 1, 2); personalLayout->addWidget(cityLabel, 2, 2); personalLayout->addWidget(cityLineEdit, 3, 2, 1, 1); personalLayout->addWidget(zipLabel, 2, 5); personalLayout->addWidget(zipLineEdit, 3, 5, 1, 1); personalLayout->addWidget(provLabel, 4, 2); personalLayout->addWidget(provinceLineEdit, 5, 2, 1, 1); personalLayout->addWidget(countryLabel, 4, 5); personalLayout->addWidget(countryLineEdit, 5, 5, 1, 1); //personalLayout->addWidget(); //QHBoxLayout *personalAllLayout = new QHBoxLayout(); //personalAllLayout->addLayout(nameLayout); //personalAllLayout->addLayout(personalLayout); personalTab->setLayout(personalLayout); // Station Tab rig1LineEdit = new QLineEdit; rig2LineEdit = new QLineEdit; rig3LineEdit = new QLineEdit; ant1LineEdit = new QLineEdit; ant2LineEdit = new QLineEdit; ant3LineEdit = new QLineEdit; //powerLineEdit = new QLineEdit; myPowerSpinBox = new QDoubleSpinBox; myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); rig1LineEdit->setToolTip(tr("Enter your information for rig") + " #1."); rig2LineEdit->setToolTip(tr("Enter your information for rig") + " #2."); rig3LineEdit->setToolTip(tr("Enter your information for rig") + " #3."); ant1LineEdit->setToolTip(tr("Enter your information for antenna") + " #1."); ant2LineEdit->setToolTip(tr("Enter your information for antenna") + " #2."); ant3LineEdit->setToolTip(tr("Enter your information for antenna") + " #3."); myPowerSpinBox->setToolTip(tr("Enter your power information.")); QLabel *rig1Label = new QLabel(tr("&Rig 1")); QLabel *rig2Label = new QLabel(tr("R&ig 2")); QLabel *rig3Label = new QLabel(tr("Ri&g 3")); QLabel *antenna1Label = new QLabel(tr("Antenna &1")); QLabel *antenna2Label = new QLabel(tr("Antenna &2")); QLabel *antenna3Label = new QLabel(tr("Antenna &3")); QLabel *powerLabel = new QLabel(tr("Po&wer")); rig1Label->setBuddy(rig1LineEdit); rig2Label->setBuddy(rig2LineEdit); rig3Label->setBuddy(rig3LineEdit); antenna1Label->setBuddy(ant1LineEdit); antenna2Label->setBuddy(ant2LineEdit); antenna3Label->setBuddy(ant3LineEdit); powerLabel->setBuddy(myPowerSpinBox); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *stationLayout = new QGridLayout(); stationLayout->addWidget(rig1Label, 0, 0); stationLayout->addWidget(rig1LineEdit, 1, 0, 1, 1); stationLayout->addWidget(rig2Label, 2, 0); stationLayout->addWidget(rig2LineEdit, 3, 0, 1, 1); stationLayout->addWidget(rig3Label, 4, 0); stationLayout->addWidget(rig3LineEdit, 5, 0, 1, 1); stationLayout->addWidget(antenna1Label, 0, 2); stationLayout->addWidget(ant1LineEdit, 1, 2, 1, 1); stationLayout->addWidget(antenna2Label, 2, 2); stationLayout->addWidget(ant2LineEdit, 3, 2, 1, 1); stationLayout->addWidget(antenna3Label, 4, 2); stationLayout->addWidget(ant3LineEdit, 5, 2, 1, 1); stationLayout->addWidget(powerLabel, 0, 4); stationLayout->addWidget(myPowerSpinBox, 1, 4); stationTab->setLayout(stationLayout); //TODO:Defining ALL the tooltips maincallsignLineEdit->setToolTip(tr("Enter the station callsign that will be used for logging.")); operatorsLineEdit->setToolTip(tr("Enter the operators (comma separated if more than one).")); myLocatorLineEdit->setToolTip(tr("Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign.")); QLabel *qrzLabel = new QLabel(tr("&Callsign")); QLabel *operatorsLabel = new QLabel (tr("&Operators")); QLabel *cqzLabel = new QLabel(tr("&CQ Zone")); QLabel *ituzLabel = new QLabel(tr("&ITU Zone")); myLocatorLabel = new QLabel(tr("&Locator")); qrzLabel->setBuddy(maincallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); cqzLabel->setBuddy(cqzLineEdit); ituzLabel->setBuddy(ituzLineEdit); myLocatorLabel->setBuddy(myLocatorLineEdit); cqzLineEdit->setInputMask("09"); ituzLineEdit->setInputMask("09"); cqzLineEdit->setText("00"); ituzLineEdit->setText("00"); QGridLayout *userdataLayout = new QGridLayout; userdataLayout->addWidget(qrzLabel, 0, 0); userdataLayout->addWidget(maincallsignLineEdit, 1, 0); userdataLayout->addWidget(operatorsLabel, 0, 1); userdataLayout->addWidget(operatorsLineEdit, 1, 1, 1, -1); userdataLayout->addWidget(myLocatorLabel, 3, 0); userdataLayout->addWidget(myLocatorLineEdit, 4, 0); userdataLayout->addWidget(cqzLabel, 3, 1); userdataLayout->addWidget(cqzLineEdit, 4, 1); userdataLayout->addWidget(ituzLabel, 3, 2); userdataLayout->addWidget(ituzLineEdit, 4, 2); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(userdataLayout); mainLayout->addWidget(tabWidget); //mainLayout->addStretch(1); connect(maincallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZTextChanged() ) ); connect(maincallsignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(operatorsLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cqzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(ituzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address1LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address2LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address3LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address4LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cityLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(zipLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(provinceLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(countryLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsChanged() ) ); setLayout(mainLayout); maincallsignLineEdit->setFocus(); //qDebug() << "SetupPageUserDataPage::SetupPageUserDataPage - END" << QT_ENDL; } SetupPageUserDataPage::~SetupPageUserDataPage() { //qDebug() << "SetupPageUserDataPage::~SetupPageUserDataPage" << QT_ENDL; } QString SetupPageUserDataPage::getMainCallsign() { mainCallOK = world->checkQRZValidFormat(maincallsignLineEdit->text()); if (mainCallOK) { return maincallsignLineEdit->text(); } else { return QString(); } } void SetupPageUserDataPage::slotEnterKeyPressed() { emit enterKey(); } void SetupPageUserDataPage::slotQRZTextChanged() { //qDebug() << "SetupPageUserDataPage::slotQRZTextChanged: " << maincallsignLineEdit->text() << " / Length: " << QString::number((maincallsignLineEdit->text()).size()) << QT_ENDL; int i = maincallsignLineEdit->cursorPosition(); QString _a = util->getClearSQLi (maincallsignLineEdit->text()); if (i<1) { return; } if ((_a.at(i-1)).isSpace()) { maincallsignLineEdit->setText(_a.remove(i-1, 1)); } maincallsignLineEdit->setText(((maincallsignLineEdit->text())).simplified()); maincallsignLineEdit->setText((maincallsignLineEdit->text()).toUpper()); cqzLineEdit->setText(QString::number(world->getQRZCqz(maincallsignLineEdit->text()))); ituzLineEdit->setText(QString::number(world->getQRZItuz(maincallsignLineEdit->text()))); myLocatorLineEdit->setText(world->getQRZLocator(maincallsignLineEdit->text())); maincallsignLineEdit->setCursorPosition(i); emit mainCallsignSignal(maincallsignLineEdit->text()); /* if (!locator->isValidLocator(myLocatorLineEdit->text()) ) { myLocatorLineEdit->setText(world->getQRZLocator(maincallsignLineEdit->text())); } */ } int SetupPageUserDataPage::getCQz(){ return (cqzLineEdit->text()).toInt(); } int SetupPageUserDataPage::getITUz(){ return (ituzLineEdit->text()).toInt(); } bool SetupPageUserDataPage::setMainCallsign(const QString &_qrz){ maincallsignLineEdit->setText((_qrz).toUpper()); return true; } bool SetupPageUserDataPage::setCQz(const int _cqz){ cqzLineEdit->setText(QString::number(_cqz)); return true; } bool SetupPageUserDataPage::setITUz(const int _ituz){ ituzLineEdit->setText(QString::number(_ituz)); return true; } void SetupPageUserDataPage::slotMyLocatorTextChanged() { //qDebug() << "SetupPageUserDataPage::slotMyLocatorTextChanged: " << myLocatorLineEdit->text() << QT_ENDL; //int i; myLocatorLineEdit->setText(((util->getClearSQLi(myLocatorLineEdit->text()))).simplified()); myLocatorLineEdit->setText((myLocatorLineEdit->text()).toUpper()); if ( ((myLocatorLineEdit->text()).length()) >3 ) { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { myLocatorLabel->setText(tr("&Locator (not valid)")); } else { myLocatorLabel->setText(tr("&Locator")); } } } QString SetupPageUserDataPage::getStationLocator() { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { return ""; } else { return (myLocatorLineEdit->text()).toUpper(); } } bool SetupPageUserDataPage::setStationLocator(const QString &_loc) { if (!(locator->isValidLocator(_loc) )) { return false; } else { myLocatorLineEdit->setText((_loc).toUpper()); return true; } } QString SetupPageUserDataPage::getName() { return nameLineEdit->text(); } QStringList SetupPageUserDataPage::getAddress() { QStringList a; a.clear(); a << address1LineEdit->text() << address2LineEdit->text() << address3LineEdit->text() << address4LineEdit->text(); return a; } QString SetupPageUserDataPage::getAddress1() { return address1LineEdit->text(); } QString SetupPageUserDataPage::getAddress2() { return address2LineEdit->text(); } QString SetupPageUserDataPage::getAddress3() { return address3LineEdit->text(); } QString SetupPageUserDataPage::getAddress4() { return address4LineEdit->text(); } QString SetupPageUserDataPage::getRig1() { return rig1LineEdit->text(); } QString SetupPageUserDataPage::getRig2() { return rig2LineEdit->text(); } QString SetupPageUserDataPage::getRig3() { return rig3LineEdit->text(); } QString SetupPageUserDataPage::getAntenna1() { return ant1LineEdit->text(); } QString SetupPageUserDataPage::getAntenna2() { return ant2LineEdit->text(); } QString SetupPageUserDataPage::getAntenna3() { return ant3LineEdit->text(); } QString SetupPageUserDataPage::getCity() { return cityLineEdit->text(); } QString SetupPageUserDataPage::getZipCode() { return zipLineEdit->text(); } QString SetupPageUserDataPage::getProvince() { return provinceLineEdit->text(); } QString SetupPageUserDataPage::getCountry() { return countryLineEdit->text(); } bool SetupPageUserDataPage::setName (const QString &_aux) { nameLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress (const QStringList _aux) { address1LineEdit->setText(_aux.at(0)); address2LineEdit->setText(_aux.at(1)); address3LineEdit->setText(_aux.at(2)); address4LineEdit->setText(_aux.at(3)); return true; } bool SetupPageUserDataPage::setAddress1 (const QString &_aux) { address1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress2 (const QString &_aux) { address2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress3 (const QString &_aux) { address3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress4 (const QString &_aux) { address4LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCity (const QString &_aux) { cityLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setZipCode(const QString &_aux) { zipLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setProvince (const QString &_aux) { provinceLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCountry (const QString &_aux) { countryLineEdit->setText(_aux); return true; } QStringList SetupPageUserDataPage::getRigs() { QStringList a; a.clear(); a << rig1LineEdit->text() << rig2LineEdit->text() << rig3LineEdit->text(); return a; } QStringList SetupPageUserDataPage::getAntennas() { QStringList a; a.clear(); a << ant1LineEdit->text() << ant2LineEdit->text() << ant3LineEdit->text(); return a; } QString SetupPageUserDataPage::getPower() { return QString::number(myPowerSpinBox->value()); } bool SetupPageUserDataPage::setPower(const QString &_aux) { myPowerSpinBox->setValue(_aux.toFloat()); return true; } bool SetupPageUserDataPage::setRig1 (const QString &_aux) { rig1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig2 (const QString &_aux) { rig2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig3 (const QString &_aux) { rig3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna1 (const QString &_aux) { ant1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna2 (const QString &_aux) { ant2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna3 (const QString &_aux) { ant3LineEdit->setText(_aux); return true; } void SetupPageUserDataPage::slotOperatorsChanged() { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged" << QT_ENDL; //QString _operators = operatorsLineEdit->text(); if (operatorsLineEdit->text().length() < 1) return; int i = operatorsLineEdit->cursorPosition(); QString _a = operatorsLineEdit->text(); if ((_a.at(i-1)).isSpace()) { operatorsLineEdit->setText(_a.remove(i-1, 1)); } operatorsLineEdit->setText(util->getClearSQLi (_a).simplified().toUpper()); _a = operatorsLineEdit->text(); QStringList operators = _a.split(",", QT_SKIP); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02" << QT_ENDL; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02.5 Size: " << QString::number(operators.size()) << QT_ENDL; for (int ii = 0; ii < operators.size(); ++ii) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-03 - " << QString::number(ii) << QT_ENDL; operatorsOK = world->checkQRZValidFormat(operators.at(ii)); //ent = world->getQRZARRLId(operators.at(ii)); if (operatorsOK) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: NO VALID CALL: " << operators.at(ii) << QT_ENDL; } else { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: VALID CALL: " << operators.at(ii) << QT_ENDL; } } // cout << fonts.at(i).toLocal8Bit().constData() << QT_ENDL; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-04" << QT_ENDL; if (operatorsOK) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: VALID FORMAT" << QT_ENDL; //QColor defaultColor = (operatorsLineEdit->palette()).color(QPalette::WindowText); operatorsLineEdit->setPalette(*defaultPalette); emit operatorsSignal(operatorsLineEdit->text()); } else { operatorsLineEdit->setPalette(*wrongPalette); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: NOT VALID FORMAT" << QT_ENDL; } //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-05" << QT_ENDL; /* cqzLineEdit->setText(QString::number(world->getQRZCqz(maincallsignLineEdit->text()))); ituzLineEdit->setText(QString::number(world->getQRZItuz(maincallsignLineEdit->text()))); myLocatorLineEdit->setText(world->getQRZLocator(maincallsignLineEdit->text())); */ //operatorsLineEdit->setText(_a); operatorsLineEdit->setCursorPosition(i); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-END" << QT_ENDL; } QString SetupPageUserDataPage::getOperators() { if (operatorsOK) { return operatorsLineEdit->text(); } else { return QString(); } } bool SetupPageUserDataPage::setOperators(const QString &_aux) { if (checkOperatorsLineQString(_aux)) { operatorsLineEdit->setText(_aux); return true; } return false; } bool SetupPageUserDataPage::checkOperatorsLineQString(const QString &_auxLine) { QStringList _aux = _auxLine.split(','); for (int ii = 0; ii < _aux.size(); ++ii) { operatorsOK = world->checkQRZValidFormat(_aux.at(ii)); if (!operatorsOK) return operatorsOK; } return true; } void SetupPageUserDataPage::setStationFocus() { //qDebug() << "SetupPageUserDataPage::setStationFocus" << QT_ENDL; maincallsignLineEdit->setFocus(); } klog-1.8.6/setuppages/setuppagesubdivisionnew.h0000644000175000017500000001002114166020407020753 0ustar develdevel#ifndef SETUPPAGESUBDIVISIONNEW_H #define SETUPPAGESUBDIVISIONNEW_H /*************************************************************************** setuppagesubdivisionnew.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "dataproxy_sqlite.h" #include #include #include //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of logs when the user wants to edit a log class SetupPageSubdivisionNew : public QDialog { Q_OBJECT public: //SetupPageLogsNew(QWidget *parent = 0); SetupPageSubdivisionNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); void setEditing(const bool b); void setStationCallSign(const QString &_st); void setOperators(const QString &_st); void setComment(const QString &_st); void setDateString(const QString &_st); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotStationCallSignTextChanged(); void slotOperatorsTextChanged(); signals: void newLogData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedLog(); void createWidget(); void gatherAndSend(); //QStringList getValidCatOptions(const int _currentCat, const int _higherCat); //int getSelectedTypeContest(); //void fillWithType(const int _n); //void updateAllCats(); void showOK(); void showNOK(); void clear(); DataProxy_SQLite *dataProxy; QDateEdit *dateEdit; QLineEdit *stationCallsignLineEdit; QLineEdit *operatorsLineEdit, *commentLineEdit; QString stationCallsign, operators, comment, dateString;//, typeConteststr; //int typeContest, typeContestSelected, contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands, contestCatOverlay; bool stationCallsignFilled, operatorsFilled; //int typeOperation; // DX, CQ-WW-SSB, CQ-WW-CW, CQ-WPX-SSB, CQ-WPX-CW QPushButton *okButton, *cancelButton; QStringList logData; bool editing; //QLabel *catAsLabel, *catOpLabel, *catModeLabel, *catPowerLabel, *catBandsLabel, *overlayLabel; //QLabel *typeLabel, *validCats, QLabel *stationCallsignLabel, *operatorsLabel, *commentLabel, *dateLabel; //nameLabel->setBuddy(); bool checking; //, bCass, bCOp, bCMo, bCPo, bCBa, bCOv, bCTy; }; #endif // SETUPPAGEREGIONALAWARDSNEW_H klog-1.8.6/setuppages/setuppagesubdivisions.h0000644000175000017500000001126414166020407020436 0ustar develdevel#ifndef SETUPPAGESUBDIVISION_H #define SETUPPAGESUBDIVISION_H /*************************************************************************** setuppagesubdivision.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "dataproxy_sqlite.h" //#include "utilities.h" //#include "setuppages/setuppagesubdivisionnew.h" #include "fileawardmanager.h" class SetupPageSubdivisions : public QWidget { Q_OBJECT public: SetupPageSubdivisions(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageSubdivisions(); int getSelectedLog(); void setSelectedLog(const int _i); void createNewLog(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); private slots: //void slotNewButtonClicked(); //void slotEditButtonClicked(); void slotRemoveButtonClicked(); //void slotAnalyzeNewLogData(const QStringList _qs); void slotLogSelected(const QModelIndex & index); //void slotLogDoubleClicked(const QModelIndex & index); void slotCurrentLogsComboBoxChanged(); void slotImportButtonClicked(); //void slotCreateLog(); // signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked //void newLogData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void focusOK(); private: FileAwardManager *fileAwardManager; QStringList readLogs(); void createLogsPanel(); void createLogsModel(); void createActions(); //bool addNewLog(const QStringList _qs); void updateSelectedLogs(); //void readSelectedLog(const int _i); void showError(const QString &_errorC); /* Wizard to create a new log*/ //QWizardPage *createLogTypePage(); //QWizard *newLogWizard; // Wizard to create a new log /*^Wizard to create a new log^*/ QSqlRelationalTableModel *logsModel; QWidget *logsPanel; QTableView *logsView; QAbstractButton *finishButton; //QWidget *logsWidget; //QTreeWidget *logsQTreeWidget; //QListWidget *bandsNotActiveListWidget, *bandsActiveListWidget; //QListWidget *modesNotActiveListWidget, *modesActiveListWidget; //QStringList bands, modes; QPushButton *removePushButton; //*editPushButton, *newLogPushButton, QPushButton *importAwardPushButton; //*loadAllPushButton, *loadSelectedPushButton, *clearPushButton,; int lastLog; QString currentLogComment; QString currentStationCallSign; QComboBox *currentLogs; QStringList logsAvailable; //SetupPageSubdivisionNew *newLog; //QString stationCallsign, operators, comment, dateString;//, typeContest; //int contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands;//, typeContestN; DataProxy_SQLite *dataProxy; //Utilities *util; int selectedLog; //QString defaultStationCallSign, defaultOperators; }; #endif // SETUPPAGEREGIONALAWARDS_H klog-1.8.6/setuppages/setuppagesats.cpp0000644000175000017500000006040714166020407017225 0ustar develdevel/*************************************************************************** setuppagesats.cpp - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagesats.h" SetupPageSats::SetupPageSats(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSats::SetupPageSats" << QT_ENDL; dataProxy = dp; arrild = QString(); satname = QString(); uplink = QString(); downlink = QString(); modes = QString(); newSat = new SetupPageSatsNew(dataProxy, this); util = new Utilities; selectedSat = -1; //defaultStationCallSign.clear(); //setupD = new SetupDialog(); currentSats = new QComboBox(); satsAvailable.clear(); //newSat = new SetupPageSatsNew(dataProxy); satsModel = new QSqlRelationalTableModel(this); satsView = new QTableView; satsView->setContextMenuPolicy(Qt::CustomContextMenu); satsView->setSortingEnabled(true); createSatsModel(); createSatsPanel(); satsView->setCurrentIndex(satsModel->index(0, 0)); lastSat = 0; newSatPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); importPushButton = new QPushButton(tr("&Import"), this); exportPushButton = new QPushButton(tr("E&xport"), this); newSatPushButton->setToolTip(tr("Add a new satellite.")); editPushButton->setToolTip(tr("Edit the selected satellite.")); removePushButton->setToolTip(tr("Remove the selected satellite.")); importPushButton->setToolTip(tr("Import a satellites file. It will replace the satellites you have in the current list.")); exportPushButton->setToolTip(tr("Export your current satellites to a file.")); currentSats->setToolTip(tr("Select the sat you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(importPushButton); buttonsLayout->addWidget(exportPushButton); buttonsLayout->addWidget(newSatPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(satsView); widgetLayout->addWidget(currentSats); widgetLayout->addLayout(buttonsLayout); //widgetLayout->addLayout(SatDataLayout); setLayout(widgetLayout); //connect(newSatPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); //QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //connect(setupD, SIGNAL(newSatRequested(true)), this, slotNewButtonClicked() ) createActions(); updateSelectedSats(); //qDebug() << "SetupPageSats::SetupPageSats - END" << QT_ENDL; } SetupPageSats::~SetupPageSats(){ //qDebug() << "SetupPageSats::~SetupPageSats" << QT_ENDL; } void SetupPageSats::createNewSat() { //qDebug() << "SetupPageSats::createNewSat" << QT_ENDL; selectedSat = -1; //newSat->clear(); newSat->setEditing(false); newSat->exec(); } void SetupPageSats::slotNewButtonClicked() { //qDebug() << "SetupPageSats::slotNewButtonClicked" << QT_ENDL; createNewSat(); } void SetupPageSats::slotEditButtonClicked() { //qDebug() << "SetupPageSats::slotEditButtonClicked" << QT_ENDL; //QSqlQuery query; //int nameCol = -1; selectedSat = getSelectedSat(); QString shortName = dataProxy->getSateliteArrlIdFromId(selectedSat); newSat->clear(); newSat->setEditing(true); newSat->setShortName(shortName); newSat->setName(dataProxy->getSatelliteName(shortName)); newSat->setUpLink(dataProxy->getSatelliteFullUplink(shortName)); newSat->setDownLink(dataProxy->getSatelliteFullDownlink(shortName)); newSat->setModes(dataProxy->getSatelliteFullMode(shortName)); newSat->exec(); //newSat->setStationCallSign(dataProxy->getStationCallSignFromSat(selectedSat)); //newSat->setOperators(dataProxy->getOperatorsFromSat(selectedSat)); //newSat->setComment(dataProxy->getCommentsFromSat(selectedSat)); //newSat->setDateString(dataProxy->getSatDateFromSat(selectedSat)); //newSat->setTypeN(dataProxy->getSatTypeNFromSat(selectedSat).toInt()); /* //qDebug() << "SetupPageSats::slotEditButtonClicked-1 (selectedlog: " << QString::number(selectedLog) << ")" << QT_ENDL; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageSats::slotEditButtonClicked -2" << QT_ENDL; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageSats::slotEditButtonClicked Query OK" << QT_ENDL; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/ /stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageSats::slotEditButtonClicked Query Valid" << QT_ENDL; //nameCol = rec.indexOf("stationcall"); //newLog->setStationCallSign((query.value(nameCol)).toString()); //nameCol = rec.indexOf("operators"); //newLog->setOperators((query.value(nameCol)).toString()); //nameCol = rec.indexOf("comment"); //newLog->setComment((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logdate"); //newLog->setDateString((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtypen"); //qDebug() << "SetupPageSats::slotEditButtonClicked -3" << QT_ENDL; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } */ } /* void SetupPageSats::slotSatsCancelled(const bool _q) { selectedSat = -1; } */ void SetupPageSats::slotRemoveButtonClicked() { //qDebug() << "SetupPageSats::slotRemoveButtonClicked" << QT_ENDL; int selectedSat = getSelectedSat(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this satellite?") + "\n" + tr("This satellite will no be longer available to be selected ..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { QString stringQuery = QString("DELETE FROM satellites WHERE id='%1'").arg(selectedSat); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { satsModel->select(); updateSelectedSats(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedSat) << ")" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Sat has not been removed. (#3)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedSat) << ")" << QT_ENDL; } } else { showError(tr("Sat has not been removed. (#2)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedSat) << ")" << QT_ENDL; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Sat has not been removed. (#1)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedSat) << ")" << QT_ENDL; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED Sat } void SetupPageSats::createSatsPanel() { //qDebug() << "SetupPageSats::createSatsPanel" << QT_ENDL; satsView->setModel(satsModel); QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ satsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satarrlid"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satname"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("uplink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("downlink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satmode"); satsView->setColumnHidden(columns, false); satsView->setItemDelegate(new QSqlRelationalDelegate(this)); satsView->setSelectionMode( QAbstractItemView::SingleSelection); satsView->setSelectionBehavior(QAbstractItemView::SelectRows); satsView->resizeColumnsToContents(); satsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageSats::createSatsModel() { //qDebug() << "SetupPageSats::createsatsModel" << QT_ENDL; QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //satsModel = new QSqlRelationalTableModel(this); satsModel->setTable("satellites"); nameCol = rec.indexOf("id"); satsModel->setSort(nameCol, Qt::AscendingOrder); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("satarrlid"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Short")); nameCol = rec.indexOf("satname"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Name")); nameCol = rec.indexOf("uplink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Uplink")); nameCol = rec.indexOf("downlink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Downlink")); nameCol = rec.indexOf("satmode"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Modes")); satsModel->select(); } void SetupPageSats::slotSatselected(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatselected" << QT_ENDL; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); } void SetupPageSats::slotSatDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatDoubleClicked" << QT_ENDL; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); slotEditButtonClicked(); } void SetupPageSats::slotAnalyzeNewSatData(const QStringList _qs) { updateSelectedSats(); } void SetupPageSats::createActions() { //qDebug() << "SetupPageSats::createActions" << QT_ENDL; connect(importPushButton, SIGNAL(clicked()), this, SLOT(slotImportButtonClicked() ) ); connect(exportPushButton, SIGNAL(clicked()), this, SLOT(slotExportButtonClicked() ) ); connect(newSatPushButton, SIGNAL(clicked()), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked() ) ); connect(newSat, SIGNAL(newSatData(QStringList)), this, SLOT(slotAnalyzeNewSatData(QStringList) ) ); connect(satsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotSatselected(QModelIndex) ) ); connect(satsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotSatDoubleClicked(QModelIndex) ) ); //connect(SatView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickSat( const QModelIndex& ) ) ); //loadAllPushButton->setToolTip(tr("Load all the Sats")); //loadSelectedPushButton->setToolTip(tr("Load only the selected Sat")); //clearPushButton->setToolTip(tr("Clear selection")); } /* bool SetupPageSats::addNewSat(const QStringList _qs) { //qDebug() << "SetupPageSats::addNewSat: " << _qs.at(2) << QT_ENDL; QString aux = QString(); int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _typeContest = _qs.at(2); QString _comment = _qs.at(3); QString _typeContestN = _qs.at(4); QString queryString = QString("SELECT * FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "SetupPageSats::addNewLog query1: " << queryString << QT_ENDL; QSqlQuery query; bool sqlOK = query.exec(queryString); QSqlRecord rec = query.record(); // Number of columns while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("id"); aux = (query.value(nameCol)).toString(); //qDebug() << "SetupPageSats::addNewLog: id = " << aux << QT_ENDL; return false; } queryString = QString("INSERT INTO logs (logdate, stationcall, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5')").arg(_dateString).arg(_stationCallsign).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "SetupPageSats::addNewSat query1: " << queryString << QT_ENDL; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageSats::addNewSat ADDED! id = " << QT_ENDL; satsModel->select(); updateSelectedSats(); return true; } else { return false; } return false; } */ void SetupPageSats::updateSelectedSats() { //qDebug() << "SetupPageSats::updateSelectedSats" << QT_ENDL; satsAvailable = readSats(); satsModel->select(); if (satsAvailable.length()>0) { currentSats->clear(); currentSats->addItems(satsAvailable); } else { //qDebug() << "SetupPageSats::updateSelectedSats Not selected (less than 1)" << QT_ENDL; currentSats->clear(); } } QStringList SetupPageSats::readSats() { //qDebug() << "SetupPageSats::readSats" << QT_ENDL; QString aux, aux2; QStringList _sats; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _sats.clear(); aux = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("satarrlid"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satname"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("uplink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("downlink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satmode"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); _sats.append(aux2); } return _sats; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _sats; } //_sats.clear(); //qDebug() << "SetupPageSats::readSats: " << QString::number(_sats.size())<< QT_ENDL; //return _sats; } int SetupPageSats::getSelectedSat() { //qDebug() << "SetupPageSats::getSelectedSat: " << currentSats->currentText() << QT_ENDL; QString selectedSat = currentSats->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedSat.split("-"); i = (qs.at(0)).toInt(); if (i>=1) { return i; } else { return 0; } //return 0; } void SetupPageSats::setSelectedSat(const int _i) { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat: " << QString::number(_i) << QT_ENDL; QString n = QString::number(_i) + "-"; int selected = currentSats->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat selected>0: " << QString::number(selected) << QT_ENDL; currentSats->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat not selected" << QT_ENDL; return; } } //void SetupPageSats::readSelectedSat(const int _i) //{ //} void SetupPageSats::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageSats"), text, QMessageBox::Ok); } void SetupPageSats::slotImportButtonClicked() { //qDebug() << "SetupPageSats::slotImportButtonClicked" << QT_ENDL; QString fileName = QFileDialog::getOpenFileName(this, tr("Open Satellites File"), util->getHomeDir(), "SATS (*.dat)"); if (fileName.isNull()) { return; } UpdateSatsData *updateSat = new UpdateSatsData(dataProxy, this); if (updateSat->satDataFileRead(fileName)) { //qDebug() << "SetupPageSats::slotImportButtonClicked IMPORTED OK" << QT_ENDL; } else { //qDebug() << "SetupPageSats::slotImportButtonClicked IMPORTED NOK" << QT_ENDL; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog warning")); QString aux = QString(); aux = tr("An unexpected error ocurred while importing the satellite data.\n\nIt may be caused because the file you are trying to import does not have the right format."); //msgBox.setText(aux + "MW-1#" + QString::number(errorCode)); msgBox.setText(aux); msgBox.setDetailedText(tr("Please check the format or contact the developer for analysis with the error code: ") + "SetupPageSats error #1"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } satsModel->select(); updateSelectedSats(); } void SetupPageSats::slotExportButtonClicked() { //qDebug() << "SetupPageSats::slotExportButtonClicked" << QT_ENDL; int nameCol = -1; QString queryString, aux; QSqlQuery query; int satsN = -1; bool sqlOk = false; aux.clear(); queryString = "SELECT COUNT (*) from satellites"; sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { satsN = (query.value(0)).toInt(); //qDebug() << "SetupPageSats::slotExportButtonClicked: Sats: " << QString::number(satsN) << QT_ENDL; } else { return; } } else { return; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QDateTime *dateTime = new QDateTime(); //dateTime->currentDateTime(); queryString = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(queryString); if (sqlOk) { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Satellites File"), util->getHomeDir(), "SATS (*.dat)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return ; QTextStream out(&file); out << "SATS" << QT_ENDL; out << "" << QString::number(satsN) << QT_ENDL; out << "" << (dateTime->currentDateTime().date()).toString("yyyyMMdd"); out << "" << QT_ENDL; QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("satarrlid"); aux = (query.value(nameCol)).toString(); QString satText = "" + aux + " "; nameCol = rec.indexOf("satname"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("uplink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("downlink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("satmode"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " " + ""; out << satText << QT_ENDL; //satText.clear(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SetupPageSats::slotExportButtonClicked END" << QT_ENDL; } klog-1.8.6/setuppages/setuppageinterfaceswindows.h0000644000175000017500000000532414166020407021453 0ustar develdevel#ifndef SETUPPAGEINTERFACESWINDOWS_H #define SETUPPAGEINTERFACESWINDOWS_H /*************************************************************************** setuppageinterfaceswindows.h - description ------------------- begin : feb 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include class SetupPageInterfacesWindows : public QWidget { Q_OBJECT public: SetupPageInterfacesWindows(QWidget *parent = nullptr); ~SetupPageInterfacesWindows(); void setSendToPSTRotator(const QString &_t); void setPSTRotatorUDPServerPort(const QString &_t); void setPSTRotatorUDPServer(const QString &_t); QString getSendToPSTRotator(); QString getPSTRotatorUDPServerPort(); QString getPSTRotatorUDPServer(); private: void createUI(); void createActions(); QCheckBox *sendToPSTRotatorCheckBox; QSpinBox *PSTRotatorUDPServerPortSpinBox; QLineEdit *PSTRotatorServerLineEdit; int PSTRotatorDefaultport; QString PSTRotatorServer; signals: public slots: //void slotLogFromWSJTCheckBoxClicked(); //void slotUDPServerCheckBoxClicked(); void slotSendToPSTRotatorCheckBoxClicked(); }; #endif // SetupPageInterfacesWindows_H klog-1.8.6/setuppages/setuppagelogs.cpp0000644000175000017500000004710514166020407017217 0ustar develdevel/*************************************************************************** setuppagelogs.cpp - description ------------------- begin : feb 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagelogs.h" SetupPageLogs::SetupPageLogs(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageLogs::SetupPageLogs" << QT_ENDL; dataProxy = dp; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); selectedLog = -1; defaultStationCallSign.clear(); logsAvailable.clear(); newLog = new SetupPageLogsNew(dataProxy); logsModel = new QSqlRelationalTableModel(this); logsView = new QTableView; logsView->setContextMenuPolicy(Qt::CustomContextMenu); logsView->setSortingEnabled(true); createLogsModel(); createLogsPanel(); logsView->setCurrentIndex(logsModel->index(0, 0)); lastLog = 0; newLogPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); newLogPushButton->setToolTip(tr("Add a new log.")); editPushButton->setToolTip(tr("Edit the selected log.")); removePushButton->setToolTip(tr("Remove the selected log.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(newLogPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(logsView); widgetLayout->addLayout(buttonsLayout); setLayout(widgetLayout); createActions(); updateSelectedLogs(); //qDebug() << "SetupPageLogs::SetupPageLogs - END" << QT_ENDL; } SetupPageLogs::~SetupPageLogs(){ //qDebug() << "SetupPageLogs::~SetupPageLogs" << QT_ENDL; } void SetupPageLogs::createNewLog() { //qDebug() << "SetupPageLogs::createNewLog" << QT_ENDL; selectedLog = -1; newLog->setEditing(false); if (defaultStationCallSign.length()>2) { //qDebug() << "SetupPageLogs::createNewLog-1" << QT_ENDL; newLog->setStationCallSign(defaultStationCallSign); } if (defaultOperators.length()>2) { newLog->setOperators(defaultOperators); } newLog->setDateString(QDate::currentDate().toString("yyyy-MM-dd")); newLog->setComment(""); int result = newLog->exec(); //qDebug() << "SetupPageLogs::createNewLog: result: " << QString::number(result) << QT_ENDL; if (result == QDialog::Accepted) { //qDebug() << "SetupPageLogs::createNewLog - Accepted, emitting focusOK" << QT_ENDL; emit focusOK(); } //qDebug() << "SetupPageLogs::createNewLog - END" << QT_ENDL; } void SetupPageLogs::slotNewButtonClicked() { //qDebug() << "SetupPageLogs::slotNewButtonClicked" << QT_ENDL; createNewLog(); } void SetupPageLogs::slotEditButtonClicked() { //qDebug() << "SetupPageLogs::slotEditButtonClicked" << QT_ENDL; //QSqlQuery query; //int nameCol = -1; //selectedLog = getSelectedLog(); QString getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageLogs::slotEditButtonClicked" << QT_ENDL; newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); newLog->setComment(dataProxy->getCommentsFromLog(selectedLog)); newLog->setDateString(dataProxy->getLogDateFromLog(selectedLog)); //newLog->setTypeN(dataProxy->getLogTypeNFromLog(selectedLog).toInt()); int result = newLog->exec(); if (result == QDialog::Accepted) { emit focusOK(); } /* //qDebug() << "SetupPageLogs::slotEditButtonClicked-1 (selectedlog: " << QString::number(selectedLog) << ")" << QT_ENDL; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageLogs::slotEditButtonClicked -2" << QT_ENDL; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageLogs::slotEditButtonClicked Query OK" << QT_ENDL; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/logdate/stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageLogs::slotEditButtonClicked Query Valid" << QT_ENDL; //nameCol = rec.indexOf("stationcall"); //newLog->setStationCallSign((query.value(nameCol)).toString()); //nameCol = rec.indexOf("operators"); //newLog->setOperators((query.value(nameCol)).toString()); //nameCol = rec.indexOf("comment"); //newLog->setComment((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logdate"); //newLog->setDateString((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtypen"); //qDebug() << "SetupPageLogs::slotEditButtonClicked -3" << QT_ENDL; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } */ } /* void SetupPageLogs::slotLogsCancelled(const bool _q) { selectedLog = -1; } */ void SetupPageLogs::slotRemoveButtonClicked() { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked" << QT_ENDL; //int selectedLog = getSelectedLog(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this log?") + "\n" + tr("All the QSOs from this log will also be deleted..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")" << QT_ENDL; QString stringQuery = QString("DELETE FROM logs WHERE id='%1'").arg(selectedLog); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() << QT_ENDL; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")" << QT_ENDL; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageLogs::createLogsPanel() { //qDebug() << "SetupPageLogs::createLogsPanel" << QT_ENDL; logsView->setModel(logsModel); QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ logsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logdate"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("stationcall"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("operators"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("comment"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logtypen"); logsView->setColumnHidden(columns, false); logsView->setItemDelegate(new QSqlRelationalDelegate(this)); logsView->setSelectionMode( QAbstractItemView::SingleSelection); logsView->setSelectionBehavior(QAbstractItemView::SelectRows); logsView->resizeColumnsToContents(); logsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageLogs::createLogsModel() { //qDebug() << "SetupPageLogs::createLogsModel" << QT_ENDL; QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; logsModel->setTable("logs"); nameCol = rec.indexOf("id"); logsModel->setSort(nameCol, Qt::AscendingOrder); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("logdate"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Date")); nameCol = rec.indexOf("stationcall"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Station Callsign")); nameCol = rec.indexOf("operators"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Operators")); nameCol = rec.indexOf("comment"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Comments")); nameCol = rec.indexOf("logtypen"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("QSOs")); logsModel->select(); } void SetupPageLogs::slotLogSelected(const QModelIndex & index) { int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); //qDebug() << "SetupPageLogs::slotLogSelected: " << QString::number(selectedLog) << QT_ENDL; //setSelectedLog(selectedLog); } void SetupPageLogs::slotLogDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageLogs::slotLogDoubleClicked" << QT_ENDL; int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); //setSelectedLog(selectedLog); slotEditButtonClicked(); } void SetupPageLogs::createActions() { //qDebug() << "SetupPageLogs::createActions" << QT_ENDL; //connect(currentLogs, SIGNAL(currentIndexChanged (int)), this, SLOT(slotCurrentLogsComboBoxChanged() ) ) ; connect(newLogPushButton, SIGNAL(clicked()), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked() ) ); connect(newLog, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList) ) ); connect(logsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotLogSelected(QModelIndex) ) ); connect(logsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotLogDoubleClicked(QModelIndex) ) ); } QStringList SetupPageLogs::readLogs() { //qDebug() << "SetupPageLogs::readLogs" << QT_ENDL; QString aux, aux2; QStringList _logs; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _logs.clear(); aux = "SELECT id, logdate, stationcall FROM logs"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("stationcall"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtype"); //aux2 = aux2.append("-"); //aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("logdate"); aux2 = aux2.append(" ("); aux2.append((query.value(nameCol)).toString()); aux2 = aux2.append(")"); _logs.append(aux2); } return _logs; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _logs; } /* _logs.clear(); //qDebug() << "SetupPageLogs::readLogs: " << QString::number(_logs.size())<< QT_ENDL; return _logs; */ } void SetupPageLogs::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupPageLogs::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")" << QT_ENDL; if (_qs.length()!=5) { return; } stationCallsign = _qs.at(0); operators = _qs.at(1); comment = _qs.at(2); dateString = _qs.at(3); //TODO: Check that those vars have received valid data (calls, date, ...) QStringList newLogq; newLogq.clear(); newLogq << dateString << stationCallsign << operators << comment << QString::number(selectedLog) << _qs.at(4) ; if (dataProxy->addNewLog(newLogq)) { logsModel->select(); updateSelectedLogs(); } else { showError(tr("The new log could not be created.")); } // We send the data to the main tab QStringList logData; logData.clear(); logData << stationCallsign << operators ; emit newLogData(logData); } /* bool SetupPageLogs::addNewLog(const QStringList _qs) { //qDebug() << "SetupPageLogs::addNewLog: " << _qs.at(2) << QT_ENDL; QString aux = QString(); int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _typeContest = _qs.at(2); QString _comment = _qs.at(3); QString _typeContestN = _qs.at(4); QString queryString = QString("SELECT * FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "SetupPageLogs::addNewLog query1: " << queryString << QT_ENDL; QSqlQuery query; bool sqlOK = query.exec(queryString); QSqlRecord rec = query.record(); // Number of columns while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("id"); aux = (query.value(nameCol)).toString(); //qDebug() << "SetupPageLogs::addNewLog: id = " << aux << QT_ENDL; return false; } queryString = QString("INSERT INTO logs (logdate, stationcall, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5')").arg(_dateString).arg(_stationCallsign).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "SetupPageLogs::addNewLog query1: " << queryString << QT_ENDL; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageLogs::addNewLog ADDED! id = " << QT_ENDL; logsModel->select(); updateSelectedLogs(); return true; } else { return false; } return false; } */ void SetupPageLogs::updateSelectedLogs() { //qDebug() << "SetupPageLogs::updateSelectedLogs" << QT_ENDL; logsAvailable = readLogs(); /* if (logsAvailable.length()>0) { currentLogs->clear(); currentLogs->addItems(logsAvailable); } else { //qDebug() << "SetupPageLogs::updateSelectedLogs Not selected (less than 1)" << QT_ENDL; currentLogs->clear(); } */ } int SetupPageLogs::getSelectedLog() { //qDebug() << "SetupPageLogs::getSelectedLog: " << currentLogs->currentText() << QT_ENDL; return selectedLog; } void SetupPageLogs::setSelectedLog(const int _i) { //qDebug() << "SetupPageLogs::SetupPageLogs::setSelectedLog: " << QString::number(_i) << QT_ENDL; //TODO: Show which is the selected log selectedLog = _i; logsView->selectRow(1); QModelIndex index = logsModel->index(selectedLog, 0); logsView->setCurrentIndex(index); } /* void SetupPageLogs::readSelectedLog(const int _i) { } */ void SetupPageLogs::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageLogs"), text, QMessageBox::Ok); } void SetupPageLogs::setDefaultStationCallsign(const QString &_p) { //qDebug() << "SetupPageLogs::setDefaultStationCallsign: " << _p << QT_ENDL; defaultStationCallSign = _p; } void SetupPageLogs::setDefaultOperators(const QString &_p) { //SetupPageLogs defaultOperators = _p; } void SetupPageLogs::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO << QT_ENDL; QWidget::showEvent(event); dataProxy->updateQSONumberPerLog(); logsModel->select(); //logsView->selectRow(1); /* int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); */ //setSelectedLog(selectedLog); } klog-1.8.6/setuppages/setuppageudp.h0000644000175000017500000000632014166020407016502 0ustar develdevel#ifndef SETUPPAGEUDP_H #define SETUPPAGEUDP_H /*************************************************************************** setuppageudp.h - description ------------------- begin : sept 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "utilities.h" class SetupPageUDP : public QWidget { Q_OBJECT public: SetupPageUDP(QWidget *parent = nullptr); ~SetupPageUDP(); void setLogFromWSJTx(const QString &_t); void setAutoLogFromWSJTx(const QString &_t); void setReaDataFromWSJTx(const QString &_t); void setUDPServer(const QString &_t); void setUDPServerPort(const QString &_t); void setTimeout(const QString &_t); void setNetworkInterface(const QString &_t); QString getLogFromWSJTx(); QString getAutoLogFromWSJTx(); QString getReaDataFromWSJTx(); QString getUDPServerPort(); QString getUDPServer(); QString getTimeout(); QString getNetworkInterface(); private: void createUI(); void createActions(); void fillNetworkInterfaceComboBox(); QCheckBox *logFromWSJTXCheckbox, *logAutomaticallyWSJTXCheckbox, *realDataFromWSJTXCheckbox, *UDPServerCheckBox; //QLineEdit *wsjtxIPAddress, *wsjtxPortNumber; QSpinBox *UDPServerPortSpinBox; QSpinBox *miliSecsSpinBox; QComboBox *networkInterfacesComboBox; int defaultport, defaultTimer; Utilities *util; //bool logFromWSJTx, autoLogFromWSJTx, realDataFromWSJTx; signals: public slots: void slotLogFromWSJTCheckBoxClicked(); //void slotAutoLogFromWSJTCheckBoxClicked(); //void slotRealFromWSJTCheckBoxClicked(); void slotUDPServerCheckBoxClicked(); }; #endif // SETUPPAGEUDP_H klog-1.8.6/setuppages/setuppagebandmode.h0000644000175000017500000000475714166020407017477 0ustar develdevel#ifndef SETUPPAGEBANDMODE_H #define SETUPPAGEBANDMODE_H /*************************************************************************** setuppagebandmode.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "dataproxy_sqlite.h" class SetupPageBandMode : public QWidget { Q_OBJECT public: SetupPageBandMode(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageBandMode(); QString getBands(); // 10m, 12m, 15m QString getModes(); //ssb, CW void setActiveBands(QStringList q); void setActiveModes(QStringList q); signals: public slots: private: void addBands(QStringList _b); // read the available bands from the DB void addModes(QStringList _b); // read the available modes from the DB QListWidget *bandsListWidget, *modesListWidget; DataProxy_SQLite *dataProxy; }; #endif // SETUPPAGEBANDMODE_H klog-1.8.6/setuppages/setuppageworldeditor.cpp0000644000175000017500000003024214166020407020603 0ustar develdevel/*************************************************************************** setuppageworldeditor.h - description ------------------- begin : jun 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor" << QT_ENDL; //worldPanel = new QWidget; dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); util = new Utilities(); setupEntityDialog = new SetupEntityDialog(); worldModel = new QSqlRelationalTableModel(this); worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); createWorldModel(); createWorldPanel(); worldView->setCurrentIndex(worldModel->index(0, 0)); addEntityPushButton = new QPushButton; delEntityPushButton = new QPushButton; editEntityPushButton = new QPushButton; exportWorldPushButton = new QPushButton; loadWorldPushButton = new QPushButton; addEntityPushButton->setText(tr("Add")); delEntityPushButton->setText(tr("Delete")); editEntityPushButton->setText(tr("Edit")); exportWorldPushButton->setText(tr("Export World")); loadWorldPushButton->setText(tr("Import World")); addEntityPushButton->setEnabled(false); delEntityPushButton->setEnabled(false); editEntityPushButton->setEnabled(false); addEntityPushButton->setToolTip(tr("Still not implemented.")); delEntityPushButton->setToolTip(tr("Still not implemented.")); editEntityPushButton->setToolTip(tr("Still not implemented.")); exportWorldPushButton->setEnabled(false); loadWorldPushButton->setEnabled(true); exportWorldPushButton->setToolTip(tr("Still not implemented.")); loadWorldPushButton->setToolTip(tr("Import a new cty.csv file")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(exportWorldPushButton); buttonsLayout->addWidget(loadWorldPushButton); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(addEntityPushButton); buttonsLayout->addWidget(editEntityPushButton); buttonsLayout->addWidget(delEntityPushButton); /* QHBoxLayout *wbuttonsLayout = new QHBoxLayout; wbuttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); wbuttonsLayout->addWidget(exportWorldPushButton); wbuttonsLayout->addWidget(loadWorldPushButton); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addLayout(wbuttonsLayout); buttonsLayout->addLayout(ebuttonsLayout); */ QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); setLayout(layout); createActions(); if (isWorldEmpty()) { QString ctyfile = util->getCTYFile(); QMessageBox msgBox; if (QFile::exists(ctyfile)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("An entities information file (cty.csv) has been detected in your KLog folder and will be loaded.")); msgBox.exec(); world->recreate(ctyfile); worldModel->select(); //slotImportWorldButtonClicked(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("No entities information file (cty.csv) has been detected in your KLog folder.")); msgBox.setInformativeText(tr("KLog will not be able to show entities information.")); msgBox.exec(); } } //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor - END" << QT_ENDL; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" << QT_ENDL; } void SetupPageWorldEditor::createWorldPanel() { worldView->setModel(worldModel); QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ worldView->setColumnHidden(i, true); } columns = rec.indexOf("mainprefix"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("name"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("dxcc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("continent"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("cqz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("ituz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("utc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("latitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("longitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("deleted"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("sincedate"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("todate"); worldView->setColumnHidden(columns, false); worldView->setItemDelegate(new QSqlRelationalDelegate(this)); worldView->setSelectionMode( QAbstractItemView::SingleSelection); worldView->setSelectionBehavior(QAbstractItemView::SelectRows); worldView->resizeColumnsToContents(); worldView->horizontalHeader()->setStretchLastSection(true); } void SetupPageWorldEditor::createWorldModel() { /* WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 */ QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //worldModel = new QSqlRelationalTableModel(this); worldModel->setTable("entity"); worldModel->setEditStrategy(QSqlTableModel::OnFieldChange); nameCol = rec.indexOf("mainprefix"); worldModel->setSort(nameCol, Qt::AscendingOrder); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Prefix")); nameCol = rec.indexOf("name"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Entity")); nameCol = rec.indexOf("dxcc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ARRL ID")); nameCol = rec.indexOf("continent"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Continent")); nameCol = rec.indexOf("cqz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("utc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("UTC")); nameCol = rec.indexOf("latitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Latitude")); nameCol = rec.indexOf("longitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Longitude")); nameCol = rec.indexOf("deleted"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("sincedate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Since Date")); nameCol = rec.indexOf("todate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("To Date")); worldModel->select(); } void SetupPageWorldEditor::createActions() { //qDebug() << "SetupPageWorldEditor::createActions" << QT_ENDL; connect(addEntityPushButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(delEntityPushButton, SIGNAL(clicked()), this, SLOT(slotDelButtonClicked()) ); connect(editEntityPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked()) ); connect(loadWorldPushButton, SIGNAL(clicked()), this, SLOT(slotImportWorldButtonClicked()) ); //connect(worldView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickEntity( const QModelIndex& ) ) ); //SIGNAL received from the setupEntityDialog // void entityAdded(const QStringList _qs); // entity connect(setupEntityDialog, SIGNAL(entityAdded(QStringList)), this, SLOT(slotAnalyzeEntityAddedSignal(QStringList) ) ); } void SetupPageWorldEditor::slotAnalyzeEntityAddedSignal(const QStringList _qs) { /* //qDebug() << "SetupPageWorldEditor::slotAnalyzeEntityAddedSignal\n" << _qs.at(0) << "\n" << _qs.at(1) << "\n" << _qs.at(2) << "\n" << _qs.at(3) << "\n" << _qs.at(4) << "\n" << _qs.at(5) << "\n" << _qs.at(6) << "\n" << _qs.at(7) << "\n" << _qs.at(8) << "\n" << _qs.at(9) << "\n" << _qs.at(10) << "\n" << QT_ENDL; */ } bool SetupPageWorldEditor::isWorldEmpty() { // I need to check if the world is empty and I have the CTY.CSV file if (world->getHowManyEntities()<1) { return true; } else { return false; } //return true; } void SetupPageWorldEditor::slotAddButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotAddButtonClicked" << QT_ENDL; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked" << QT_ENDL; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked" << QT_ENDL; //TODO } /* void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity" << QT_ENDL; //TODO //QSqlQuery query; //QString queryString; //int row = index.row(); } */ void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked" << QT_ENDL; QString klogDir; klogDir = util->getHomeDir(); QString worldFile; worldFile.clear(); worldFile = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, tr("BigCTY (*.csv)")); QMessageBox msgBox; //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked: " << worldFile << QT_ENDL; if (world->recreate(worldFile) ) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Entities information has been updated.")); worldModel->select(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Entities information has not been updated.")); } msgBox.exec(); //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked - END" << QT_ENDL; } klog-1.8.6/setuppages/setuppagedxcluster.cpp0000644000175000017500000003670314166020407020272 0ustar develdevel/*************************************************************************** setuppagedxcluster.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagedxcluster.h" SetupPageDxCluster::SetupPageDxCluster(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageDxCluster::SetupPageDxCluster" << QT_ENDL; //xClusterServers = new QStringList; //dxClusterServers << "dxfun.com:8000"; dxclusterServersComboBox = new QComboBox; dxclusterServersComboBox->addItem("dxfun.com:8000"); addClusterButton = new QPushButton; deleteClusterButton = new QPushButton; showHFQCheckbox = new QCheckBox; showVHFQCheckbox = new QCheckBox; showWARCQCheckbox = new QCheckBox; showWorkedQCheckbox = new QCheckBox; showConfirmedQCheckbox = new QCheckBox; showANNQCheckbox = new QCheckBox; showWWVQCheckbox = new QCheckBox; showWCYQCheckbox = new QCheckBox; saveAllDXClusterDataQCheckbox = new QCheckBox; saveAllDXClusterDataQCheckbox->setAutoExclusive(false); showHFQCheckbox->setAutoExclusive(false); showVHFQCheckbox->setAutoExclusive(false); showWARCQCheckbox->setAutoExclusive(false); showWorkedQCheckbox->setAutoExclusive(false); showConfirmedQCheckbox->setAutoExclusive(false); showANNQCheckbox->setAutoExclusive(false); showWWVQCheckbox->setAutoExclusive(false); showWCYQCheckbox->setAutoExclusive(false); showHFQCheckbox->setChecked(true); showVHFQCheckbox->setChecked(true); showWARCQCheckbox->setChecked(true); showWorkedQCheckbox->setChecked(true); showConfirmedQCheckbox->setChecked(true); showANNQCheckbox->setChecked(true); showWWVQCheckbox->setChecked(true); showWCYQCheckbox->setChecked(true); saveAllDXClusterDataQCheckbox->setChecked(false); addClusterButton->setText(tr("Add")); deleteClusterButton->setText(tr("Delete")); showHFQCheckbox->setText(tr("Show &HF spots")); showVHFQCheckbox->setText(tr("Show V/&UHF spots")); showWARCQCheckbox->setText(tr("Show W&ARC spots")); showWorkedQCheckbox->setText(tr("Show &worked spots")); showConfirmedQCheckbox->setText(tr("Show &confirmed spots")); showANNQCheckbox->setText(tr("Show ANN/&FULL messages")); showWWVQCheckbox->setText(tr("Show WW&V messages")); showWCYQCheckbox->setText(tr("Show WC&Y messages")); saveAllDXClusterDataQCheckbox->setText(tr("Save DX Cluster activity")); saveAllDXClusterDataQCheckbox->setToolTip(tr("Saves all the DX-Cluster activity to a file in the KLog folder")); QGroupBox *spotsGroupBox = new QGroupBox(tr("DX Spots")); QVBoxLayout *spotsVBoxLayout = new QVBoxLayout; spotsVBoxLayout->addWidget(showHFQCheckbox); spotsVBoxLayout->addWidget(showVHFQCheckbox); spotsVBoxLayout->addWidget(showWARCQCheckbox); spotsVBoxLayout->addWidget(showWorkedQCheckbox); spotsVBoxLayout->addWidget(showConfirmedQCheckbox); spotsVBoxLayout->addStretch(1); spotsGroupBox->setLayout(spotsVBoxLayout); QGroupBox *miscGroupBox = new QGroupBox(tr("Others")); QVBoxLayout *miscVBoxLayout = new QVBoxLayout; miscVBoxLayout->addWidget(saveAllDXClusterDataQCheckbox); miscVBoxLayout->addStretch(1); miscGroupBox->setLayout(miscVBoxLayout); QGroupBox *messagesGroupBox = new QGroupBox(tr("Messages")); QVBoxLayout *messagesVBoxLayout = new QVBoxLayout; messagesVBoxLayout->addWidget(showANNQCheckbox); messagesVBoxLayout->addWidget(showWWVQCheckbox); messagesVBoxLayout->addWidget(showWCYQCheckbox); messagesVBoxLayout->addStretch(1); messagesGroupBox->setLayout(messagesVBoxLayout); // ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, //int columnSpan, Qt::Alignment alignment = 0 ) QHBoxLayout *serversButtonsLayout = new QHBoxLayout; serversButtonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); serversButtonsLayout->addWidget(addClusterButton); serversButtonsLayout->addWidget(deleteClusterButton); QVBoxLayout *serversLayout = new QVBoxLayout; serversLayout->addWidget(dxclusterServersComboBox); serversLayout->addLayout(serversButtonsLayout); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(serversLayout, 0, 0); mainLayout->addWidget(spotsGroupBox, 1, 0); mainLayout->addWidget(messagesGroupBox, 1, 1); mainLayout->addWidget(miscGroupBox, 2, 0, 1, -1); setLayout(mainLayout); createActions(); //qDebug() << "SetupPageDxCluster::SetupPageDxCluster - END" << QT_ENDL; } SetupPageDxCluster::~SetupPageDxCluster() { //qDebug() << "SetupPageDxCluster::~SetupPageDxCluster" << QT_ENDL; } void SetupPageDxCluster::createActions() { //qDebug() << "SetupPageDxCluster::createActions" << QT_ENDL; connect(addClusterButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(deleteClusterButton, SIGNAL(clicked()), this, SLOT(slotDeleteButtonClicked()) ); } void SetupPageDxCluster::slotAddButtonClicked() { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked" << QT_ENDL; bool ok; ok = false; while (!ok) { QString text = QInputDialog::getText (this, tr("KLog: Add a DXCluster server"), tr("Add the address followed by the :port\nExample: dxfun.com:8000\nIf no port is specified, 41112 will be used by default:"), QLineEdit::Normal, QString(), &ok); //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - SERVER: " << text << QT_ENDL; if (ok && !text.isEmpty ()) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 01" << QT_ENDL; if (checkIfValidDXCluster (text)) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 02" << QT_ENDL; if (checkIfNewDXCluster (text)) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 03" << QT_ENDL; ok = true; if ((text.contains (":")) == 0) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 04" << QT_ENDL; text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 05" << QT_ENDL; } else { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 06" << QT_ENDL; ok = false; } } else { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 07" << QT_ENDL; ok = false; } } else { // user entered nothing or pressed Cancel //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 08" << QT_ENDL; ok = true; } } } void SetupPageDxCluster::slotDeleteButtonClicked() { //qDebug() << "SetupPageDxCluster::slotDeleteButtonClicked" << QT_ENDL; dxclusterServersComboBox->removeItem (dxclusterServersComboBox->currentIndex ()); } bool SetupPageDxCluster::checkIfValidDXCluster (const QString & tdxcluster) { QUrl url ("http://" + tdxcluster); if ((!url.host ().isEmpty ()) || (url.port () != -1)) { return true; } else { return false; } } bool SetupPageDxCluster::checkIfNewDXCluster (const QString & tdxcluster) { //qDebug() << "checkIfNewDXCluster: -" << tdxcluster << "-"<< QT_ENDL; //int numberOfDXClusterServers = dxclusterServersComboBox->count (); if (dxclusterServersComboBox->findText(tdxcluster)<0) { //qDebug() << "checkIfNewDXCluster: true" << QT_ENDL; return true; } else { //qDebug() << "checkIfNewDXCluster: false" << QT_ENDL; return false; } /* for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { if ((dxclusterServersComboBox->currentText ()) == (tdxcluster)) { return false; } dxclusterServersComboBox->setCurrentIndex(i); } return true; */ } QStringList SetupPageDxCluster::getDxclusterServersComboBox() { //qDebug() << "SetupPageDxCluster::getDxclusterServersComboBox" << QT_ENDL; QStringList servers; int numberOfDXClusterServers = dxclusterServersComboBox->count (); servers.clear(); if(numberOfDXClusterServers>=1) { //stream << "DXClusterServerToUse=" << dxclusterServersComboBox->currentText () << QT_ENDL; //servers << dxclusterServersComboBox->currentText (); for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { dxclusterServersComboBox->setCurrentIndex (i); servers << dxclusterServersComboBox->currentText (); //stream << "DXClusterServerPort=" << dxclusterServersComboBox->currentText () << QT_ENDL; } } return servers; } void SetupPageDxCluster::setDxclusterServersComboBox(const QStringList t) { //qDebug() << "SetupPageDxCluster::setDxclusterServersComboBox" << QT_ENDL; if (t.count()>0) { QString text; for (int i=0; i < t.count(); i++) { text.clear(); text = t.at(i); if (checkIfValidDXCluster (text)) { if (checkIfNewDXCluster (text)) { if ((text.contains (":")) == 0) { text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); } else { // Not added } } } } } QString SetupPageDxCluster::getSaveActivityQCheckbox() { if (saveAllDXClusterDataQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowHFQCheckbox() { if (showHFQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowVHFQCheckbox() { if (showVHFQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWARCQCheckbox() { if (showWARCQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWorkedQCheckbox() { if (showWorkedQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowConfirmedQCheckbox() { if (showConfirmedQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowANNQCheckbox() { if (showANNQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWWVQCheckbox() { if (showWWVQCheckbox->isChecked()) { return "True"; } else { return "False"; } } QString SetupPageDxCluster::getShowWCYQCheckbox() { if (showWCYQCheckbox->isChecked()) { return "True"; } else { return "False"; } } void SetupPageDxCluster::setShowHFQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showHFQCheckbox->setChecked(false); } else { showHFQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowVHFQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showVHFQCheckbox->setChecked(false); } else { showVHFQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowWARCQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showWARCQCheckbox->setChecked(false); } else { showWARCQCheckbox->setChecked(true); } } void SetupPageDxCluster::setSaveActivityQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { saveAllDXClusterDataQCheckbox->setChecked(false); } else { saveAllDXClusterDataQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowWorkedQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showWorkedQCheckbox->setChecked(false); } else { showWorkedQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowConfirmedQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showConfirmedQCheckbox->setChecked(false); } else { showConfirmedQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowANNQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showANNQCheckbox->setChecked(false); } else { showANNQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowWWVQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showWWVQCheckbox->setChecked(false); } else { showWWVQCheckbox->setChecked(true); } } void SetupPageDxCluster::setShowWCYQCheckbox(const QString t) { if ( (t.toUpper()) == "FALSE") { showWCYQCheckbox->setChecked(false); } else { showWCYQCheckbox->setChecked(true); } } QString SetupPageDxCluster::getSelectedDxClusterServer() { //return dxclusterServersComboBox->currentText(); int dxclusterServerListItems = dxclusterServersComboBox->count (); if (dxclusterServerListItems >= 1) { return dxclusterServersComboBox->currentText (); } else { return QString(); } //return QString(); } void SetupPageDxCluster::setSelectedDxClusterServer(const QString t) { dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(t)); } klog-1.8.6/setuppages/setupentitydialog.h0000644000175000017500000000662014166020407017554 0ustar develdevel#ifndef SETUPENTITYDIALOG_H #define SETUPENTITYDIALOG_H /*************************************************************************** SetupEntityDialog.h - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../klogdefinitions.h" class SetupEntityDialog : public QDialog { Q_OBJECT public: SetupEntityDialog(); ~SetupEntityDialog(); public slots: private slots: void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotCheckEntity(); void slotCheckMainprefix(); void slotCheckCQz(); void slotCheckITUz(); void slotCheckContinent(); void slotCheckLatitude(); void slotCheckLongitude(); void slotCheckUTC(); void slotCheckARRLid(); void slotCheckDeleted(); void slotCheckDeletedDate(); void slotCheckPrefixes(); signals: void entityAdded(const QStringList _qs); // entity private: QString checkEntity(); QString checkMainprefix(); QString checkCQz(); QString checkITUz(); QString checkContinent(); QString checkLatitude(); QString checkLongitude(); QString checkUTC(); QString checkARRLid(); QString checkDeleted(); QString checkDeletedDate(); QString checkPrefixes(); bool entityBool, mainPrefixBool, cqBool, ituBool, contBool; bool latBool, lonBool, utcBool, arrlidBool, delBool, delDateBool, prefBool; QLineEdit *entityLineEdit, *cqLineEdit, *ituLineEdit; QLineEdit *contLineEdit, *latLineEdit, *lonLineEdit; QLineEdit *utcLineEdit, *mprefLineEdit, *arrlidLineEdit; QLineEdit *deletedLineEdit, *prefLineEdit; QDateEdit *delQDateEdit; QCheckBox *delRbutton; QStringList entityData; //QPalette *paletteOrig, *paletteWrong; //QColor color; QPalette pal, palw; }; #endif // SetupEntityDialog_H klog-1.8.6/setuppages/hamlibserialconfigwidget.h0000644000175000017500000000227214166020421021020 0ustar develdevel#ifndef HAMLIBSERIALCONFIGWIDGET_H #define HAMLIBSERIALCONFIGWIDGET_H #include #include #include "../klogdefinitions.h" class HamLibSerialConfigWidget : public QWidget { Q_OBJECT public: explicit HamLibSerialConfigWidget(QWidget *parent = nullptr); void createUI(); //void setRigList(const QStringList &_rigs); int getDataBits(); void setDataBits (const int _b); QString getFlowControl(); void setFlowControl(const QString &_st); void setParity(const QString &_st); QString getParity(); void setStopBits(const QString &_st); int getStopBits(); bool setSerialBauds(const int _speed ); bool setSerialPort(const QString &_port); QString getSerialPort(); int getSerialBauds(); private slots: void slotScanPorts(); private: QStringList getAvailableSerialPorts(); void fillSerialPortsComboBox(); QPushButton *scanSerialPortButton; QComboBox *serialBaudsComboBox, *serialPortComboBox, *dataBitsComboBox, *flowControlComboBox, *parityComboBox, *stopBitsComboBox; QLineEdit *dataFromRigLineEdit; QLineEdit *serialPort; QStringList serialPorts; }; #endif // HAMLIBSERIALCONFIGWIDGET_H klog-1.8.6/setuppages/setuppagecolors.cpp0000644000175000017500000002651114166020407017552 0ustar develdevel/*************************************************************************** setuppagecolors.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagecolors.h" SetupPageColors::SetupPageColors(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageColors::SetupPageColors" << QT_ENDL; newOneColorButton = new QPushButton; neededColorButton = new QPushButton; workedColorButton = new QPushButton; confirmedColorButton = new QPushButton; defaultColorButton = new QPushButton; wsjtxColorButton = new QPushButton; klogColorButton = new QPushButton; darkModeButton = new QPushButton; newOneColorButton->setText(tr("New One")); neededColorButton->setText(tr("Needed in this band")); workedColorButton->setText(tr("Worked in this band")); confirmedColorButton->setText(tr("Confirmed in this band")); defaultColorButton->setText(tr("Default")); wsjtxColorButton->setText(tr("WSJT-X palette")); klogColorButton->setText(tr("Default palette")); darkModeButton->setText(tr("Dark Mode")); newOneColorButton->setToolTip(tr("Color when the DXCC is an ATNO (All Time New One).")); neededColorButton->setToolTip(tr("This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ...")); workedColorButton->setToolTip(tr("Worked DXCC, but not confirmed in this band.")); confirmedColorButton->setToolTip(tr("DXCC is confirmed in this band.")); defaultColorButton->setToolTip(tr("Default color.")); wsjtxColorButton->setToolTip(tr("Sets a palette of colors similar to the one used in WSJT-X.")); klogColorButton->setToolTip(tr("Sets the default palette.")); darkModeButton->setToolTip(tr("Sets the Dark Mode")); newOneColorButton->setAutoFillBackground ( true ); QVBoxLayout *buttonsLayout = new QVBoxLayout; buttonsLayout->addWidget(newOneColorButton); buttonsLayout->addWidget(neededColorButton); buttonsLayout->addWidget(workedColorButton); buttonsLayout->addWidget(confirmedColorButton); buttonsLayout->addWidget(defaultColorButton); QHBoxLayout *schemasLayout = new QHBoxLayout; schemasLayout->setSpacing(40); schemasLayout->addWidget(wsjtxColorButton); schemasLayout->addWidget(klogColorButton); schemasLayout->addWidget(darkModeButton); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(buttonsLayout, 0, 0); mainLayout->addLayout(schemasLayout, 1, 0); //setLayout(buttonsLayout); setLayout(mainLayout); connect(newOneColorButton, SIGNAL(clicked()), this, SLOT(slotNewOneColorButtonClicked()) ); connect(neededColorButton, SIGNAL(clicked()), this, SLOT(slotNeededColorButtonClicked()) ); connect(workedColorButton, SIGNAL(clicked()), this, SLOT(slotWorkedColorButtonClicked()) ); connect(confirmedColorButton, SIGNAL(clicked()), this, SLOT(slotConfirmedColorButtonClicked()) ); connect(defaultColorButton, SIGNAL(clicked()), this, SLOT(slotDefaultColorButtonClicked()) ); connect(wsjtxColorButton, SIGNAL(clicked()), this, SLOT(slotWSJTXButtonClicked()) ); connect(klogColorButton, SIGNAL(clicked()), this, SLOT(slotKLogButtonClicked()) ); connect(darkModeButton, SIGNAL(clicked()), this, SLOT(slotSetDarkMode()) ); setDefaultColors(); //qDebug() << "SetupPageColors::SetupPageColors - END" << QT_ENDL; } SetupPageColors::~SetupPageColors() {; } void SetupPageColors::setDefaultColors() { setNewOneColor("#FF0000"); setNeededColor("#FF8C00"); setWorkedColor("#FFD700"); setConfirmedColor("#32CD32"); setDefaultColor("#00BFFF"); } void SetupPageColors::setWSJTXColors() { setNewOneColor("#FF00FF"); // New DXCC setNeededColor("#FFAAFF"); // New DXCC on Band setWorkedColor("#00BFFF"); // Like Default, WSJT-X does not make any difference setConfirmedColor("#00BFFF"); // Like Default, WSJT-X does not make any difference setDefaultColor("#00BFFF"); } void SetupPageColors::slotNewOneColorButtonClicked() { //qDebug() << "SetupPageColors::slotNewOneColorButtonClicked " << QT_ENDL; QString style = "* { background-color: "; style = style + (giveColor(newOneColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::slotNeededColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked " << QT_ENDL; QString style = "* { background-color: "; style = style + (giveColor(neededColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::slotWorkedColorButtonClicked () { //qDebug() << "SetupPageColors::slotWorkedColorButtonClicked " << QT_ENDL; QString style = "* { background-color: "; style = style + (giveColor(workedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::slotConfirmedColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked " << QT_ENDL; QString style = "* { background-color: "; style = style + (giveColor(confirmedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::slotDefaultColorButtonClicked() { //qDebug() << "SetupPageColors::slotDefaultColorButtonClicked " << QT_ENDL; QString style = "* { background-color: "; style = style + (giveColor(defaultColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; defaultColorButton->setStyleSheet(style); } QColor SetupPageColors::giveColor (QColor c) { // Receives the actual color, shows the user a color picker and returns the color that the user selects. QColor colorb; color = c; colorb = color; color = QColorDialog::getColor (color, this, tr("Choose a color")); if (color.isValid ()) { //qDebug() << "SetupPageColors::giveColor valid color: " << color.name() << QT_ENDL; return color; } else { //qDebug() << "SetupPageColors::giveColor NOT valid color" << QT_ENDL; return colorb; } } QString SetupPageColors::getNewOneColor() { //qDebug() << "SetupPageColors::getNewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name() << QT_ENDL; return (newOneColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getNeededColor() { return (neededColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getWorkedColor() { return (workedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getConfirmedColor() { return (confirmedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getDefaultColor() { return (defaultColorButton->palette().color(QPalette::Button)).name(); } void SetupPageColors::setNewOneColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::setNeededColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::setWorkedColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::setConfirmedColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::setDefaultColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; defaultColorButton->setStyleSheet(style); } void SetupPageColors::slotWSJTXButtonClicked() { setWSJTXColors(); } void SetupPageColors::slotKLogButtonClicked() { setDefaultColors(); } void SetupPageColors::slotSetDarkMode() { if (!darkMode) { QApplication::setStyle(QStyleFactory::create("Fusion")); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(53,53,53)); p.setColor(QPalette::Button, QColor(53,53,53)); p.setColor(QPalette::Highlight, QColor(142,45,197)); p.setColor(QPalette::ButtonText, QColor(255,255,255)); p.setColor(QPalette::WindowText, QColor(255,255,255)); p.setColor(QPalette::Text, Qt::white); p.setColor(QPalette::Base, QColor(100,100,100)); qApp->setPalette(p); darkModeButton->setText(tr("Light Mode")); darkMode = true; } else { QApplication::setStyle(QStyleFactory::create("Fusion")); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(244,246,246)); //p.setColor(QPalette::Button, QColor(214,219,223)); p.setColor(QPalette::Text, Qt::black); p.setColor(QPalette::Button, QColor(234,237,237)); p.setColor(QPalette::Highlight, QColor(40,120,240)); p.setColor(QPalette::ButtonText, Qt::black); p.setColor(QPalette::WindowText, QColor(33,47,60)); p.setColor(QPalette::Base, Qt::white); p.setColor(QPalette::ToolTipBase, Qt::white); p.setColor(QPalette::ToolTipText, Qt::black); qApp->setPalette(p); darkModeButton->setText(tr("Dark Mode")); darkMode = false; } } QString SetupPageColors::getDarkMode(){ return util->boolToQString(darkMode); } void SetupPageColors::setDarkMode(const QString &_dm) { darkMode = !util->trueOrFalse(_dm); slotSetDarkMode(); } klog-1.8.6/setuppages/setuppageelog.h0000644000175000017500000001303414166020421016634 0ustar develdevel#ifndef SETUPPAGEELOG_H #define SETUPPAGEELOG_H /*************************************************************************** setuppageelog.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "utilities.h" class SetupPageELog : public QWidget { Q_OBJECT public: SetupPageELog(QWidget *parent=nullptr); ~SetupPageELog(); //Clublog void setClubLogEmail(const QString &c); void setClubLogPassword(const QString &c); void setClubLogActive(const bool &_b); void setClubLogRealTime(const bool &_s); QString getClubLogEmail(); QString getClubLogPassword(); bool getClubLogActive(); bool getClubLogRealTime(); // LoTW void setTQSLPath(const QString &c); QString getTQSLPath(); void setLoTWActive(const bool &_s); QString getLoTWActive(); void setLoTWUser(const QString &_s); QString getLoTWUser(); void setLoTWPass(const QString &_s); QString getLoTWPass(); // eQSL void setEQSLUser(const QString &c); void setEQSLPassword(const QString &c); void setEQSLActive(const bool _b); //void setEQSLRealTime(const QString &_s); QString getEQSLUser(); QString getEQSLPassword(); bool getEQSLActive(); //QString getEQSLRealTime(); //QRZ.COM void setQRZCOMUser(const QString &_s); void setQRZCOMPassword(const QString &_s); void setQRZCOMLogBookKEY(const QString &_s); void setQRZCOMActive(const QString &_s); void setQRZCOMAutoCheck(const QString &_s); QString getQRZCOMUser(); QString getQRZCOMPassword(); QString getQRZCOMLogBookKEY(); bool getQRZCOMActive(); bool getQRZCOMAutoCheck(); bool getQRZCOMSubscriber(); void setQRZCOMSubscriber(const bool _s); private slots: void slotClubLogActive(const bool _s); void slotEQSLActive(const bool _s); void slotTQSLActive(const bool _s); void slotQRZCOMActive(const bool _s); void slotQRZCOMAuto(const bool _s); void slotQRZCallTextChanged(); void slotSelectTQSLClicked(); void slotPathLineEditChanged(const QString &_q); void slotEnterKeyPressed(); void slotClubLogEmailDefineColor(); void slotLoTWEmailDefineColor(); void sloteQSLCallTextChanged(); signals: void enterKey(); void qrzcomAuto(bool _s); protected: //void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private: void setDefaults(); //QString defaultFileName; QGroupBox *clubLogGroup; QCheckBox *clubLogSendInRealTimeCheckBox, *clubLogActiveCheckBox;//, *useQSOStationCallCheckBox; QLineEdit *clubLogPasswordLineEdit, *clubLogEmailLineEdit;//, *callLineEdit; QLabel *clubLogPasswordLabel, *clubLogEmailLabel; //*callLabel, QString clubLogEmail, clubLogPass; bool clubLogActive, clubLogRealTime; QGroupBox *eQSLccGroup; QLineEdit *eQSLUserLineEdit, *eQSLPasswordLineEdit; QCheckBox *eQSLActiveCheckBox; //*eQSLSendInRealTimeCheckBox, QLabel *eQSLpasswordLabel, *eQSLemailLabel; bool eqslActive; QString eqslUser, eqslPass; QGroupBox *lotwGroup, *lotwUpGroup, *lotwDownGroup; QLineEdit *lotwUserLineEdit, *lotwPasswordLineEdit; QLineEdit *lotwTQSLPathLineEdit; QPushButton *lotwSearchTQSLPushButton; QCheckBox *lotwUseTQSLCheckBox; QLabel *lotwpasswordLabel, *lotwemailLabel; bool lotwTQSL; QString lotwPath, lotwUser, lotwPass; QGroupBox *QRZCOMGroup; //QLineEdit *QRZCOMAPILineEdit; QLineEdit *QRZCOMUserLineEdit, *QRZCOMPasswordLineEdit, *QRZCOMLogBookKEYLineEdit; QLabel *QRZCOMPasswordLabel, *QRZCOMUserLabel, *QRZLogBookKeyLabel; QCheckBox *QRZCOMActiveCheckBox, *QRZCOMAutoCheckCheckBox, *QRZCOMSubscriberCheckBox; bool qrzcomActive, qrzcomAutoFill; QString qrzComUser, qrzcomPass, qrcomLogbookKey; Utilities *util; QPalette palRed, palBlack; }; #endif // SETUPPAGEELOG_H klog-1.8.6/setuppages/setuppagelogsnew.h0000644000175000017500000000700714166020407017373 0ustar develdevel#ifndef SETUPPAGELOGSNEW_H #define SETUPPAGELOGSNEW_H /*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "dataproxy_sqlite.h" #include "utilities.h" #include #include #include //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of logs when the user wants to edit a log class SetupPageLogsNew : public QDialog { Q_OBJECT public: //SetupPageLogsNew(QWidget *parent = 0); SetupPageLogsNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); void setEditing(const bool b); void setStationCallSign(const QString &_st); void setOperators(const QString &_st); void setComment(const QString &_st); void setDateString(const QString &_st); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotStationCallSignTextChanged(); void slotOperatorsTextChanged(); signals: void newLogData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: void createWidget(); void gatherAndSend(); void showOK(); void showNOK(); void clear(); DataProxy_SQLite *dataProxy; Utilities *util; QDateEdit *dateEdit; QLineEdit *stationCallsignLineEdit; QLineEdit *operatorsLineEdit, *commentLineEdit; QString stationCallsign, operators, comment, dateString; bool stationCallsignFilled, operatorsFilled; QPushButton *okButton, *cancelButton; QStringList logData; bool editing; //QLabel *catAsLabel, *catOpLabel, *catModeLabel, *catPowerLabel, *catBandsLabel, *overlayLabel; //QLabel *typeLabel, *validCats, QLabel *stationCallsignLabel, *operatorsLabel, *commentLabel, *dateLabel; bool checking; //, bCass, bCOp, bCMo, bCPo, bCBa, bCOv, bCTy; }; #endif // SETUPPAGELOGSNEW_H klog-1.8.6/setuppages/setuppagehamlib.cpp0000644000175000017500000003363114166020421017502 0ustar develdevel/*************************************************************************** setuppagehamlib.cpp - description ------------------- begin : feb 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppagehamlib.h" SetupPageHamLib::SetupPageHamLib(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO ; hamlibTestOK = false; hamlib = new HamLibClass(); activateHamlibCheckBox = new QCheckBox(); readOnlyModeCheckBox = new QCheckBox(); tabWidget = new QTabWidget; serialConfigWidget = new HamLibSerialConfigWidget; networkConfigWidget = new HamLibNetworkConfigWidget; testHamlibPushButton = new QPushButton(); rigTypeComboBox = new QComboBox; pollIntervalQSpinBox = new QSpinBox; createUI(); setDefaults(); //qDebug() << Q_FUNC_INFO << " - END" ; } void SetupPageHamLib::slotTestHamlib() { //qDebug() << Q_FUNC_INFO; hamlib->stop (); if ((rigTypeComboBox->currentText ().contains ("NET rigctl")) || (rigTypeComboBox->currentText ().contains ("FLRig"))) { //qDebug() << Q_FUNC_INFO << " - FLRig/NetRig"; hamlib->setNetworkPort (networkConfigWidget->getPort ()); hamlib->setNetworkAddress (networkConfigWidget->getAddress ()); } else { //qDebug() << Q_FUNC_INFO << " - Serial rig"; hamlib->setPort (serialConfigWidget->getSerialPort ()); hamlib->setSpeed (serialConfigWidget->getSerialBauds ()); hamlib->setParity(serialConfigWidget->getParity ()); hamlib->setFlow(serialConfigWidget->getFlowControl ()); //qDebug() << Q_FUNC_INFO << ": StopBits: " << QString::number(getStopBits()); hamlib->setStop(serialConfigWidget->getStopBits ()); //qDebug() << Q_FUNC_INFO << " - 50"; hamlib->setDataBits(serialConfigWidget->getDataBits ()); //qDebug() << Q_FUNC_INFO << " - 51"; } hamlib->setModelId (hamlib->getModelIdFromName (rigTypeComboBox->currentText ())); hamlib->setPoll (2000); //qDebug() << Q_FUNC_INFO << " - Calling hamlib->init"; setTestResult (hamlib->init(true)); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setTestResult(const bool _ok) { //qDebug() << Q_FUNC_INFO ; QPalette pal = testHamlibPushButton->palette(); if (_ok ) { //qDebug() << Q_FUNC_INFO << " - OK"; testHamlibPushButton->setText (tr("Test: OK")); pal.setColor(QPalette::Button, QColor(Qt::green)); //qDebug() << Q_FUNC_INFO << " - before reading freq"; //double freq = hamlib->getFrequency (); //qDebug() << Q_FUNC_INFO << " - after reading freq"; //dataFromRigLineEdit->setText (QString::number(freq)); } else { //qDebug() << Q_FUNC_INFO << " - NOK"; testHamlibPushButton->setText (tr("Test: NOK")); pal.setColor(QPalette::Button, QColor(Qt::red)); } testHamlibPushButton->setPalette(pal); testHamlibPushButton->update(); //qDebug() << Q_FUNC_INFO << " - NOK END"; } void SetupPageHamLib::slotRadioComboBoxChanged(QString _r) { //qDebug() << Q_FUNC_INFO << ": " << _r; if (_r == "NET rigctl") { rigctlport = 4532; networkConfigWidget->setPort (rigctlport); tabWidget->setCurrentWidget (networkConfigWidget); //qDebug() << Q_FUNC_INFO << ": Network radio found!" ; networkRadio = true; } else if (_r == "FLRig") { rigctlport = 12345; networkConfigWidget->setPort (rigctlport); tabWidget->setCurrentWidget (networkConfigWidget); //qDebug() << Q_FUNC_INFO << ": Network radio found!" ; networkRadio = true; } else { tabWidget->setCurrentWidget (serialConfigWidget); networkRadio = false; } setTestResult(false); } void SetupPageHamLib::createUI() { pollMax = 10000; pollMin = 10; pollIntervalQSpinBox->setRange(pollMin, pollMax); //qDebug() << Q_FUNC_INFO << " - 0"; serialConfigWidget->createUI(); //qDebug() << Q_FUNC_INFO << " - 1"; networkConfigWidget->createUI(); //qDebug() << Q_FUNC_INFO << " - 2"; activateHamlibCheckBox->setText(tr("Activate HamLib")); activateHamlibCheckBox->setToolTip(tr("Activates the hamlib support that will enable the connection to a radio.")); readOnlyModeCheckBox->setText(tr("Read-Only mode")); readOnlyModeCheckBox->setToolTip(tr("If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio.")); testHamlibPushButton->setText (tr("Test")); testHamlibPushButton->setToolTip (tr("Click to test the connection to the radio")); setRig(); QString pollTip = QString(tr("Defines the interval to poll the radio in msecs.")); pollIntervalQSpinBox->setToolTip(pollTip); //qDebug() << Q_FUNC_INFO << " - 13"; //showDebugLog->setMinimum(pollMin); //qDebug() << Q_FUNC_INFO << " - 14"; //showDebugLog->setMaximum(pollMax); //qDebug() << Q_FUNC_INFO << " - 15"; QLabel *pollIntervalLabel = new QLabel(tr("Poll interval")); pollIntervalLabel->setBuddy(rigTypeComboBox); pollIntervalLabel->setToolTip(pollTip); pollIntervalLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); pollIntervalLabel->setEnabled(true); QHBoxLayout *pollIntervalLayout = new QHBoxLayout; pollIntervalLayout->addWidget(pollIntervalLabel); pollIntervalLayout->addWidget(pollIntervalQSpinBox); //qDebug() << Q_FUNC_INFO << " - 24"; QLabel *rigTypeLabel = new QLabel(tr("Radio")); rigTypeLabel->setBuddy(rigTypeComboBox); rigTypeLabel->setToolTip(tr("Select your rig.")); rigTypeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); rigTypeLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 25"; QHBoxLayout *radioLayout = new QHBoxLayout; radioLayout->addWidget (rigTypeLabel); radioLayout->addWidget (rigTypeComboBox); radioLayout->addLayout (pollIntervalLayout); radioLayout->addWidget (testHamlibPushButton); //radioLayout->addWidget (dataFromRigLineEdit); //qDebug() << Q_FUNC_INFO << " - 30"; QHBoxLayout *checkBoxLayout = new QHBoxLayout; checkBoxLayout->addWidget(activateHamlibCheckBox); checkBoxLayout->addWidget(readOnlyModeCheckBox); //qDebug() << Q_FUNC_INFO << " - 35"; tabWidget->addTab (serialConfigWidget, tr("Serial")); tabWidget->addTab (networkConfigWidget, tr("Network")); QGridLayout *mLayout = new QGridLayout; //QVBoxLayout *mLayout = new QVBoxLayout; mLayout->addLayout(checkBoxLayout, 0, 1); mLayout->addLayout (radioLayout, 1, 0); mLayout->addWidget (tabWidget, 2, 0, 2, -1); //mLayout->addWidget (networkConfigWidget, 2, 1); //qDebug() << Q_FUNC_INFO << " - 199"; setLayout(mLayout); //connect(serialPortComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialPortChanged(QString) )); //connect(serialBaudsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialSpeedChanged (int) )); //connect(stopBitsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialStopBitChanged (int) )); //connect(dataBitsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialDataBitsChanged (int) )); //connect(flowControlComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialFlowControlChanged (QString))); //connect(parityComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialParityChanged (QString))); connect(testHamlibPushButton, SIGNAL(clicked(bool)), this, SLOT(slotTestHamlib()) ); connect(rigTypeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotRadioComboBoxChanged(QString)) ); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setRig() { //qDebug() << Q_FUNC_INFO << QT_ENDL; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's QStringList rigs; rigs.clear(); //qDebug() << Q_FUNC_INFO << " - 10" << QT_ENDL; rigs << hamlib->getRigList(); //qDebug() << Q_FUNC_INFO << " - rigs: " << QString::number(rigs.length())<< QT_ENDL; rigTypeComboBox->clear (); rigTypeComboBox->addItems (rigs); rigTypeComboBox->setCurrentIndex(0); //rigTypeComboBox->clear(); //rigTypeComboBox->addItems(rigs); //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void SetupPageHamLib::setDefaults() { //qDebug() << Q_FUNC_INFO; hamlib->initClass(); rigctlport = 4532; networkRadio = false; rigTypeComboBox->setCurrentIndex(0); //showDebugLog->setValue(300); setTestResult(false); //qDebug() << Q_FUNC_INFO << " - END"; } QString SetupPageHamLib::getData() { //qDebug() << "SetupPageHamLib::getData" << QT_ENDL; QString _output; _output.clear(); QString _rigType, _serialPort, _baudsSpeed;//, dataBits, stopBits, handshake, flowControlLine; _rigType = rigTypeComboBox->currentText (); _serialPort = serialConfigWidget->getSerialPort (); _baudsSpeed = serialConfigWidget->getSerialBauds (); _output.clear(); if (activateHamlibCheckBox->isChecked()) { _output = _output + "Hamlib=True;\n"; } if (readOnlyModeCheckBox->isChecked()) { _output = _output + "HamlibReadOnly=True;\n"; } else { _output = _output + "HamlibReadOnly=False;\n"; } _output = _output + "HamLibRigType=" + QString::number(hamlib->getModelIdFromName(_rigType)) + ";\n"; _output = _output + "HamlibRigPollRate=" + QString::number(pollIntervalQSpinBox->value ()) + ";\n"; _output = _output + "HamlibSerialPort=" + _serialPort + ";\n"; _output = _output + "HamlibSerialBauds=" + _baudsSpeed + ";\n"; _output = _output + "HamLibSerialDataBits=" + QString::number(getDataBits()) + ";\n"; _output = _output + "HamLibSerialStopBits=" + QString::number(getStopBits()) + ";\n"; _output = _output + getFlowControl() + ";\n"; _output = _output + getParity() + ";\n"; if ((networkConfigWidget->getAddress ()).length()>1) { _output = _output + "HamlibNetAddress=" + networkConfigWidget->getAddress () + ";\n"; _output = _output + "HamlibNetPort=" + QString::number(networkConfigWidget->getPort ()) + ";\n"; } return _output; } bool SetupPageHamLib::setRigType(const QString &_radio) { int _index = rigTypeComboBox->findText(hamlib->getNameFromModelId(_radio.toInt()), Qt::MatchFlag::MatchExactly); //qDebug() << "SetupPageHamLib::setRig: After: " << QString::number(_index) << QT_ENDL; if (_index >= 0) { rigTypeComboBox->setCurrentIndex(_index); return true; } else { rigTypeComboBox->setCurrentIndex(0); } return false; } bool SetupPageHamLib::setSerialPort(const QString &_port) { return serialConfigWidget->setSerialPort (_port); } bool SetupPageHamLib::setSerialSpeed(const int _speed ) { return serialConfigWidget->setSerialBauds (_speed); } void SetupPageHamLib::setActive(const QString &_active) { //qDebug() << "SetupPageHamLib::setActive: " << _active << QT_ENDL; if (_active.toUpper() == "TRUE") { activateHamlibCheckBox->setChecked(true); } else { activateHamlibCheckBox->setChecked(false); } } void SetupPageHamLib::setReadOnly(const QString &_m) { if (_m.toUpper() == "TRUE") { readOnlyModeCheckBox->setChecked(true); } else { readOnlyModeCheckBox->setChecked(false); } } int SetupPageHamLib::getDataBits() { return serialConfigWidget->getDataBits (); } void SetupPageHamLib::setDataBits(const int _st) { serialConfigWidget->setDataBits (_st); } QString SetupPageHamLib::getFlowControl() { return serialConfigWidget->getFlowControl (); } void SetupPageHamLib::setFlowControl(const QString &_st) { serialConfigWidget->setFlowControl (_st); } QString SetupPageHamLib::getParity() { return serialConfigWidget->getParity (); } void SetupPageHamLib::setParity(const QString &_st) { serialConfigWidget->setParity(_st); } int SetupPageHamLib::getStopBits() { return serialConfigWidget->getStopBits (); } void SetupPageHamLib::setStopBits(const QString &_st) { serialConfigWidget->setStopBits (_st); } void SetupPageHamLib::setPollingInterval(const int _msecs) { pollIntervalQSpinBox->setValue(_msecs); } void SetupPageHamLib::setRadioNetworkAddress(const QString &_m) { if (_m.length ()>0) { networkConfigWidget->setAddress (_m); } } void SetupPageHamLib::setRadioNetworkPort(const int _p) { networkConfigWidget->setPort (_p); } klog-1.8.6/setuppages/setuppageelog.cpp0000644000175000017500000006242114166020421017173 0ustar develdevel/*************************************************************************** setuppageelog.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppageelog.h" SetupPageELog::SetupPageELog(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageELog::SetupPageELog" << QT_ENDL; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); clubLogEmailLineEdit = new QLineEdit; clubLogPasswordLineEdit = new QLineEdit; clubLogPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); clubLogPasswordLabel = new QLabel(tr("ClubLog password")); clubLogEmailLabel = new QLabel(tr("ClubLog email")); clubLogPasswordLabel->setBuddy(clubLogPasswordLineEdit); clubLogEmailLabel->setBuddy(clubLogEmailLineEdit); clubLogEmailLineEdit->setToolTip(tr("Enter the email you used to register in ClubLog.")); clubLogPasswordLineEdit->setToolTip(tr("Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); QRegularExpression rx("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", QRegularExpression::CaseInsensitiveOption); clubLogEmailLineEdit->setValidator(new QRegularExpressionValidator(rx, this)); clubLogSendInRealTimeCheckBox = new QCheckBox(tr("Send QSOs in real time"), this); clubLogActiveCheckBox = new QCheckBox(tr("Activate ClubLog"), this); clubLogSendInRealTimeCheckBox->setToolTip(tr("Send each QSO to ClubLog in real time, as they are added (or modified) in KLog.")); clubLogActiveCheckBox->setToolTip(tr("Starts the ClubLog support in KLog.")); //qDebug() << "SetupPageELog::SetupPageELog - 00010" << QT_ENDL; eQSLUserLineEdit = new QLineEdit; eQSLPasswordLineEdit = new QLineEdit; eQSLPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); eQSLActiveCheckBox = new QCheckBox(tr("Activate eQSL.cc"), this); eQSLUserLineEdit->setToolTip(tr("Enter your username of eQSL.cc.")); eQSLPasswordLineEdit->setToolTip(tr("Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); //eQSLSendInRealTimeCheckBox = new QCheckBox(tr("Send QSOs in real time"), this); eQSLpasswordLabel = new QLabel(tr("eQSL.cc password")); eQSLemailLabel = new QLabel(tr("eQSL.cc user")); clubLogGroup = new QGroupBox (tr("ClubLog")); eQSLccGroup = new QGroupBox (tr("eQSL.cc")); //qDebug() << "SetupPageELog::SetupPageELog - 00020" << QT_ENDL; QGridLayout *cl1layout = new QGridLayout; cl1layout->addWidget(clubLogEmailLabel, 0, 0); cl1layout->addWidget(clubLogPasswordLabel, 1, 0); cl1layout->addWidget(clubLogEmailLineEdit, 0, 1); cl1layout->addWidget(clubLogPasswordLineEdit, 1, 1); QVBoxLayout *cl2layout = new QVBoxLayout; cl2layout->addWidget(clubLogActiveCheckBox); //cl2layout->addWidget(warningLabel); cl2layout->addLayout(cl1layout); cl2layout->addWidget(clubLogSendInRealTimeCheckBox); clubLogGroup->setLayout(cl2layout); //qDebug() << "SetupPageELog::SetupPageELog - 00030" << QT_ENDL; QGridLayout *e1layout = new QGridLayout; e1layout->addWidget(eQSLemailLabel, 0, 0); e1layout->addWidget(eQSLpasswordLabel, 1, 0); e1layout->addWidget(eQSLUserLineEdit, 0, 1); e1layout->addWidget(eQSLPasswordLineEdit, 1, 1); QVBoxLayout *e2layout = new QVBoxLayout; e2layout->addWidget(eQSLActiveCheckBox); e2layout->addLayout(e1layout); //e2layout->addWidget(eQSLSendInRealTimeCheckBox); eQSLccGroup->setLayout(e2layout); //qDebug() << "SetupPageELog::SetupPageELog - 00040" << QT_ENDL; QRZCOMGroup = new QGroupBox (tr("QRZ.com")); QRZCOMUserLineEdit = new QLineEdit; QRZCOMUserLineEdit->setToolTip(tr("Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service.")); QRZCOMUserLabel = new QLabel(tr("User")); QRZCOMPasswordLineEdit = new QLineEdit; QRZCOMPasswordLineEdit->setToolTip(tr("Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); QRZCOMPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); QRZCOMPasswordLabel = new QLabel(tr("Password")); QRZCOMActiveCheckBox = new QCheckBox(tr("Activate QRZ.com"), this); QRZCOMAutoCheckCheckBox = new QCheckBox(tr("Check automatically"), this); QRZCOMAutoCheckCheckBox->setToolTip(tr("Check in Qrz.com all Calls as they are entered")); //qDebug() << "SetupPageELog::SetupPageELog - 00050" << QT_ENDL; QRZCOMSubscriberCheckBox = new QCheckBox(tr("Paying Subscriber"), this); QRZCOMSubscriberCheckBox->setToolTip(tr("Check it if you are paying for a qrz.com subscription")); QRZLogBookKeyLabel = new QLabel(tr("LogBook Key")); QRZCOMLogBookKEYLineEdit = new QLineEdit; QRZCOMLogBookKEYLineEdit->setToolTip(tr("LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature.")); QGridLayout *q1layout = new QGridLayout; q1layout->addWidget(QRZCOMUserLabel, 0, 0); q1layout->addWidget(QRZCOMPasswordLabel, 1, 0); q1layout->addWidget(QRZCOMUserLineEdit, 0, 1); q1layout->addWidget(QRZCOMPasswordLineEdit, 1, 1); q1layout->addWidget(QRZCOMSubscriberCheckBox,0,2); QHBoxLayout *qrzcomKeyLayout = new QHBoxLayout; qrzcomKeyLayout->addWidget(QRZLogBookKeyLabel); qrzcomKeyLayout->addWidget(QRZCOMLogBookKEYLineEdit); QHBoxLayout *qrzcomActive = new QHBoxLayout; qrzcomActive->addWidget(QRZCOMActiveCheckBox); //qrzcomActive->addWidget(QRZCOMSubscriberCheckBox); //qDebug() << "SetupPageELog::SetupPageELog - 00070" << QT_ENDL; QVBoxLayout *qrzLayout = new QVBoxLayout; qrzLayout->addLayout(qrzcomActive); qrzLayout->addLayout(q1layout); qrzLayout->addWidget(QRZCOMAutoCheckCheckBox); qrzLayout->addLayout(qrzcomKeyLayout); QRZCOMGroup->setLayout(qrzLayout); //qDebug() << "SetupPageELog::SetupPageELog - 00080" << QT_ENDL; lotwGroup = new QGroupBox (tr("LoTW")); lotwUpGroup = new QGroupBox (tr("Upload")); lotwDownGroup = new QGroupBox (tr("Download")); lotwUserLineEdit = new QLineEdit; lotwUserLineEdit->setValidator(new QRegularExpressionValidator(rx, this)); lotwPasswordLineEdit = new QLineEdit; lotwPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); lotwTQSLPathLineEdit = new QLineEdit; lotwSearchTQSLPushButton = new QPushButton(tr("TQSL path"), this); lotwUseTQSLCheckBox = new QCheckBox(tr("Use TQSL"), this); lotwpasswordLabel = new QLabel(tr("LoTW password")); lotwemailLabel = new QLabel(tr("LoTW user")); lotwUserLineEdit->setToolTip(tr("Enter your LoTW user.")); lotwPasswordLineEdit->setToolTip(tr("Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); lotwTQSLPathLineEdit->setToolTip(tr("Path to the TQSL software.")); lotwSearchTQSLPushButton->setToolTip(tr("Enable the LoTW integration with TQSL. You will need to have TQSL installed")); QHBoxLayout *l1layout = new QHBoxLayout; l1layout->addWidget(lotwTQSLPathLineEdit); l1layout->addWidget(lotwSearchTQSLPushButton); //lotwUpGroup->setLayout(l1layout); QVBoxLayout *l2layout = new QVBoxLayout; l2layout->addWidget(lotwUseTQSLCheckBox); l2layout->addLayout(l1layout); lotwUpGroup->setLayout(l2layout); QGridLayout *l3layout = new QGridLayout; l3layout->addWidget(lotwemailLabel, 0, 0); l3layout->addWidget(lotwpasswordLabel, 1, 0); l3layout->addWidget(lotwUserLineEdit, 0, 1); l3layout->addWidget(lotwPasswordLineEdit, 1, 1); lotwDownGroup->setLayout(l3layout); //qDebug() << "SetupPageELog::SetupPageELog - 00100" << QT_ENDL; QVBoxLayout *llayout = new QVBoxLayout; //llayout->addLayout(l2layout); llayout->addWidget(lotwUpGroup); llayout->addWidget(lotwDownGroup); lotwGroup->setLayout(llayout); //qDebug() << "SetupPageELog::SetupPageELog - 00110" << QT_ENDL; QVBoxLayout *v1layout = new QVBoxLayout; v1layout->addWidget(clubLogGroup); v1layout->addWidget(eQSLccGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00120" << QT_ENDL; QVBoxLayout *v2layout = new QVBoxLayout; v2layout->addWidget(QRZCOMGroup); v2layout->addWidget(lotwGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00130" << QT_ENDL; QHBoxLayout *mlayout = new QHBoxLayout; mlayout->addLayout(v1layout); mlayout->addLayout(v2layout); setLayout(mlayout); //qDebug() << "SetupPageELog::SetupPageELog - 00140" << QT_ENDL; connect(clubLogActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotClubLogActive(bool))); connect(clubLogPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(clubLogEmailLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotEQSLActive(bool))); connect(eQSLUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(sloteQSLCallTextChanged() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00150" << QT_ENDL; connect(QRZCOMActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotQRZCOMActive(bool))); connect(QRZCOMAutoCheckCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotQRZCOMAuto(bool))); connect(QRZCOMUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(QRZCOMUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZCallTextChanged() ) ); connect(QRZCOMPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00160" << QT_ENDL; connect(lotwUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwTQSLPathLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwSearchTQSLPushButton, SIGNAL(clicked()), this, SLOT(slotSelectTQSLClicked()) ); connect(lotwTQSLPathLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotPathLineEditChanged(QString)) ); connect(lotwUseTQSLCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotTQSLActive(bool))); connect(clubLogEmailLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotClubLogEmailDefineColor() ) ); connect(lotwUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLoTWEmailDefineColor() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00150" << QT_ENDL; setDefaults(); slotClubLogActive(false); setLoTWActive(false); slotTQSLActive(false); slotEQSLActive(false); slotQRZCOMActive(false); //qDebug() << "SetupPageELog::SetupPageELog - END" << QT_ENDL; } SetupPageELog::~SetupPageELog() { } void SetupPageELog::slotQRZCallTextChanged() { //qDebug() << "SetupPageELog::slotQRZCallTextChanged" << QT_ENDL; int cursor = QRZCOMUserLineEdit->cursorPosition(); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-1" << QT_ENDL; QString aux = util->getClearSQLi (QRZCOMUserLineEdit->text()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2" << QT_ENDL; if (util->isValidCall(aux)) { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.1" << QT_ENDL; QRZCOMUserLineEdit->setPalette(palBlack); } else { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.2" << QT_ENDL; QRZCOMUserLineEdit->setPalette(palRed); } //qDebug() << "SetupPageELog::slotQRZCallTextChanged-3" << QT_ENDL; QRZCOMUserLineEdit->setText(aux.toUpper()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-4" << QT_ENDL; QRZCOMUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::slotQRZCallTextChanged - END" << QT_ENDL; } void SetupPageELog::sloteQSLCallTextChanged() { //qDebug() << "SetupPageELog::sloteQSLCallTextChanged" << QT_ENDL; int cursor = eQSLUserLineEdit->cursorPosition(); QString aux = util->getClearSQLi (eQSLUserLineEdit->text()); if (util->isValidCall(aux)) { eQSLUserLineEdit->setPalette(palBlack); } else { eQSLUserLineEdit->setPalette(palRed); } eQSLUserLineEdit->setText(aux.toUpper()); eQSLUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::sloteQSLCallTextChanged - END" << QT_ENDL; } void SetupPageELog::slotClubLogEmailDefineColor() { //qDebug() << "SetupPageELog::slotClubLogEmailDefineColor" << QT_ENDL; if(!clubLogEmailLineEdit->hasAcceptableInput()) clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: red;}"); else clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: black;}"); } void SetupPageELog::slotLoTWEmailDefineColor() { //qDebug() << "SetupPageELog::slotLoTWEmailDefineColor" << QT_ENDL; int cursor = lotwUserLineEdit->cursorPosition(); QString aux = lotwUserLineEdit->text(); if (util->isValidCall(aux)) { lotwUserLineEdit->setPalette(palBlack); } else { lotwUserLineEdit->setPalette(palRed); } lotwUserLineEdit->setText(aux.toUpper()); lotwUserLineEdit->setCursorPosition(cursor); } void SetupPageELog::setDefaults() { //qDebug() << "SetupPageELog::setDefaults()" << QT_ENDL; qrzcomActive = false; qrzcomAutoFill = false; qrzComUser = QString(); qrzcomPass = QString(); qrcomLogbookKey = QString(); clubLogEmail = QString(); clubLogPass = QString(); clubLogActive = false; clubLogRealTime = false; eqslActive = false; eqslUser = QString(); eqslPass = QString(); lotwTQSL = false; lotwPath = QString(); lotwUser = QString(); lotwPass = QString(); //qDebug() << "SetupPageELog::setDefaults() - END" << QT_ENDL; } void SetupPageELog::setClubLogEmail(const QString &c) { clubLogEmail = c; clubLogEmailLineEdit->setText(clubLogEmail); } void SetupPageELog::setClubLogPassword(const QString &c) { clubLogPass = c; clubLogPasswordLineEdit->setText(clubLogPass); } QString SetupPageELog::getClubLogEmail() { clubLogEmail = clubLogEmailLineEdit->text(); return (clubLogEmail); } QString SetupPageELog::getClubLogPassword() { clubLogPass = clubLogPasswordLineEdit->text(); return clubLogPass; } bool SetupPageELog::getClubLogActive() { clubLogActive = clubLogActiveCheckBox->isChecked(); return clubLogActive; } void SetupPageELog::setClubLogActive(const bool &_b) { clubLogActive = _b; clubLogActiveCheckBox->setChecked(clubLogActive); clubLogSendInRealTimeCheckBox->setEnabled(clubLogActive); } void SetupPageELog::slotClubLogActive(const bool _s) { //qDebug() << "SetupPageELog::slotClubLogActive: " << util->boolToQString(_s) << QT_ENDL; clubLogEmailLabel->setEnabled(_s); clubLogPasswordLabel->setEnabled(_s); clubLogEmailLineEdit->setEnabled(_s); clubLogPasswordLineEdit->setEnabled(_s); clubLogSendInRealTimeCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotClubLogActive" << QT_ENDL; } void SetupPageELog::setClubLogRealTime(const bool &_s) { clubLogRealTime = _s; clubLogSendInRealTimeCheckBox->setEnabled(clubLogRealTime); } bool SetupPageELog::getClubLogRealTime() { clubLogRealTime = clubLogSendInRealTimeCheckBox->isChecked(); return clubLogRealTime; } // END of CLubLog // Start of eQSL.CC void SetupPageELog::setEQSLUser(const QString &c) { eqslUser = c; eQSLUserLineEdit->setText(eqslUser); } void SetupPageELog::setEQSLPassword(const QString &c) { eqslPass = c; eQSLPasswordLineEdit->setText(eqslPass); } QString SetupPageELog::getEQSLUser() { eqslUser = eQSLUserLineEdit->text(); return eqslUser; } QString SetupPageELog::getEQSLPassword() { eqslPass = eQSLPasswordLineEdit->text(); return eqslPass; } bool SetupPageELog::getEQSLActive() { eqslActive = eQSLActiveCheckBox->isChecked(); return eqslActive; } void SetupPageELog::setEQSLActive(const bool _b) { eqslActive = _b; eQSLActiveCheckBox->setChecked(eqslActive); //eQSLActiveCheckBox->setEnabled(eqslActive); } void SetupPageELog::slotEQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotEQSLActive: " << util->boolToQString(_s) << QT_ENDL; eQSLemailLabel->setEnabled(_s); eQSLpasswordLabel->setEnabled(_s); eQSLUserLineEdit->setEnabled(_s); eQSLPasswordLineEdit->setEnabled(_s); } void SetupPageELog::slotTQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotTQSLActive: " << util->boolToQString(_s) << QT_ENDL; setLoTWActive(_s); } // END of eQSL.CC // Start of LoTW void SetupPageELog::setLoTWActive(const bool &_s) { lotwTQSL = _s; lotwUseTQSLCheckBox->setChecked(lotwTQSL); lotwTQSLPathLineEdit->setEnabled(lotwTQSL); lotwSearchTQSLPushButton->setEnabled(_s); //lotwUserLineEdit->setEnabled(_s); //lotwPasswordLineEdit->setEnabled(_s); } QString SetupPageELog::getLoTWActive() { lotwTQSL = lotwUseTQSLCheckBox->isChecked(); return util->boolToQString(lotwTQSL); } void SetupPageELog::setTQSLPath(const QString &c) { lotwPath = c; lotwTQSLPathLineEdit->setText(lotwPath); } QString SetupPageELog::getTQSLPath() { lotwPath = lotwTQSLPathLineEdit->text(); return lotwPath; } void SetupPageELog::slotSelectTQSLClicked() { //qDebug() << "SetupPageELogr::slotSelectTQSLClicked: " << QStandardPaths::ApplicationsLocation << QT_ENDL; QString appsDir= util->getTQSLsPath(); //QString proposedName = util->getTQSLsFileName(); QString filter; filter.clear(); #if defined(Q_OS_WIN) filter = "TQSL (*.exe)"; #elif defined(Q_OS_MACOS) filter = "TQSL (*.app)"; #else filter = "TQSL (tqsl)"; //filter = "TQSL (tqsl*)"; #endif QString tqslFile; tqslFile.clear(); tqslFile = QFileDialog::getOpenFileName(this, tr("Select File"), appsDir, filter); if (tqslFile.length()>0) { lotwTQSLPathLineEdit->setText(tqslFile); } //qDebug() << "SetupPageELogr::slotSelectTQSLClicked - END" << QT_ENDL; } void SetupPageELog::slotPathLineEditChanged(const QString &_q) { if (QFile::exists(_q)) { lotwTQSLPathLineEdit->setPalette(palBlack); } else { lotwTQSLPathLineEdit->setPalette(palRed); } } void SetupPageELog::setLoTWUser(const QString &_s) { lotwUser = _s; lotwUserLineEdit->setText(lotwUser); } QString SetupPageELog::getLoTWUser() { lotwUser = lotwUserLineEdit->text(); return lotwUser; } void SetupPageELog::setLoTWPass(const QString &_s) { lotwPass = _s; lotwPasswordLineEdit->setText(lotwPass); } QString SetupPageELog::getLoTWPass() { lotwPass = lotwPasswordLineEdit->text(); return lotwPass; } // END of LoTW void SetupPageELog::slotEnterKeyPressed() { emit enterKey(); } // QRZ.COM void SetupPageELog::setQRZCOMActive(const QString &_s) { //qDebug() << "SetupPageELog::setQRZCOMActive " << QT_ENDL; qrzcomActive = util->trueOrFalse(_s); QRZCOMActiveCheckBox->setChecked(qrzcomActive); QRZCOMAutoCheckCheckBox->setEnabled(qrzcomActive); } bool SetupPageELog::getQRZCOMActive() { //qDebug() << "SetupPageELog::getQRZCOMActive :" << QT_ENDL; qrzcomActive = QRZCOMActiveCheckBox->isChecked(); return qrzcomActive; //qDebug() << "SetupPageELog::getQRZCOMActive : " << util->boolToQString(qrzcomActive) << QT_ENDL; } void SetupPageELog::setQRZCOMSubscriber(const bool _s) { //qDebug() << "SetupPageELog::setQRZCOMActive " << QT_ENDL; //qrzcomSubscriber = util->trueOrFalse(_s); QRZCOMSubscriberCheckBox->setChecked(_s); } bool SetupPageELog::SetupPageELog::getQRZCOMSubscriber() { //qDebug() << "SetupPageELog::getQRZCOMActive :" << QT_ENDL; return QRZCOMSubscriberCheckBox->isChecked(); //return qrzcomSubscriber; //qDebug() << "SetupPageELog::getQRZCOMActive : " << util->boolToQString(qrzcomActive) << QT_ENDL; } void SetupPageELog::slotQRZCOMActive(bool _s) { //qDebug() << "SetupPageELog::slotQRZCOMActive: " << util->boolToQString(_s) << QT_ENDL; QRZCOMUserLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 1" << QT_ENDL; QRZCOMUserLineEdit->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 2" << QT_ENDL; QRZCOMPasswordLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 3" << QT_ENDL; QRZCOMPasswordLineEdit->setEnabled(_s); QRZCOMAutoCheckCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - END" << QT_ENDL; if (!QRZCOMActiveCheckBox->isChecked()) { QRZCOMAutoCheckCheckBox->setChecked(false); } } void SetupPageELog::slotQRZCOMAuto(const bool _s) { emit qrzcomAuto(_s); } void SetupPageELog::setQRZCOMUser(const QString &_s) { if (_s.length()>0) { qrzComUser = _s; QRZCOMUserLineEdit->setText(qrzComUser); } } void SetupPageELog::setQRZCOMLogBookKEY(const QString &_s) { if (_s.length()>0) { qrcomLogbookKey = _s; QRZCOMLogBookKEYLineEdit->setText( qrcomLogbookKey); } } void SetupPageELog::setQRZCOMPassword(const QString &_s) { if (_s.length()>0) { qrzcomPass = _s; QRZCOMPasswordLineEdit->setText(qrzcomPass); } } QString SetupPageELog::getQRZCOMUser() { qrzComUser = QRZCOMUserLineEdit->text(); return qrzComUser; } QString SetupPageELog::getQRZCOMLogBookKEY() { qrcomLogbookKey = QRZCOMLogBookKEYLineEdit->text(); return qrcomLogbookKey; } QString SetupPageELog::getQRZCOMPassword() { qrzcomPass = QRZCOMPasswordLineEdit->text(); return qrzcomPass; } bool SetupPageELog::getQRZCOMAutoCheck() { qrzcomAutoFill = QRZCOMAutoCheckCheckBox->isChecked(); return qrzcomAutoFill; } void SetupPageELog::setQRZCOMAutoCheck(const QString &_s) { qrzcomAutoFill = util->trueOrFalse(_s); QRZCOMAutoCheckCheckBox->setChecked(qrzcomAutoFill); } void SetupPageELog::showEvent(QShowEvent *event) { clubLogSendInRealTimeCheckBox->setChecked(clubLogRealTime); clubLogActiveCheckBox->setChecked(clubLogActive); clubLogPasswordLineEdit->setText(clubLogPass); clubLogEmailLineEdit->setText(clubLogEmail); QRZCOMUserLineEdit->setText(qrzComUser); QRZCOMPasswordLineEdit->setText(qrzcomPass); QRZCOMActiveCheckBox->setChecked(qrzcomActive); QRZCOMAutoCheckCheckBox->setChecked(qrzcomAutoFill); QRZCOMLogBookKEYLineEdit->setText(qrcomLogbookKey); eQSLUserLineEdit->setText(eqslUser); eQSLPasswordLineEdit->setText(eqslPass); eQSLActiveCheckBox->setChecked(eqslActive); lotwUserLineEdit->setText(lotwUser); lotwPasswordLineEdit->setText(lotwPass); lotwUseTQSLCheckBox->setChecked(lotwTQSL); lotwTQSLPathLineEdit->setText(lotwPath); event->accept(); } klog-1.8.6/setuppages/setuppagesatseditor.cpp0000644000175000017500000002471314166020407020434 0ustar develdevel#include "setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor" << endl; //worldPanel = new QWidget; dataProxy = dp; world = new World(dataProxy); util = new Utilities(); setupEntityDialog = new SetupEntityDialog(); worldModel = new QSqlRelationalTableModel(this); worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); createWorldModel(); createWorldPanel(); worldView->setCurrentIndex(worldModel->index(0, 0)); addEntityPushButton = new QPushButton; delEntityPushButton = new QPushButton; editEntityPushButton = new QPushButton; exportWorldPushButton = new QPushButton; loadWorldPushButton = new QPushButton; addEntityPushButton->setText("Add"); delEntityPushButton->setText("Delete"); editEntityPushButton->setText("Edit"); exportWorldPushButton->setText("Export World"); loadWorldPushButton->setText("Import World"); addEntityPushButton->setEnabled(false); delEntityPushButton->setEnabled(false); editEntityPushButton->setEnabled(false); addEntityPushButton->setToolTip("Still not implemented."); delEntityPushButton->setToolTip("Still not implemented."); editEntityPushButton->setToolTip("Still not implemented."); exportWorldPushButton->setEnabled(false); loadWorldPushButton->setEnabled(true); exportWorldPushButton->setToolTip("Still not implemented."); loadWorldPushButton->setToolTip("Import a new cty.csv file"); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(exportWorldPushButton); buttonsLayout->addWidget(loadWorldPushButton); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(addEntityPushButton); buttonsLayout->addWidget(editEntityPushButton); buttonsLayout->addWidget(delEntityPushButton); /* QHBoxLayout *wbuttonsLayout = new QHBoxLayout; wbuttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); wbuttonsLayout->addWidget(exportWorldPushButton); wbuttonsLayout->addWidget(loadWorldPushButton); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addLayout(wbuttonsLayout); buttonsLayout->addLayout(ebuttonsLayout); */ QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); setLayout(layout); createActions(); if (isWorldEmpty()) { QString ctyfile = util->getCTYFile(); QMessageBox msgBox; if (QFile::exists(ctyfile)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("An entities information file (cty.csv) has been detected in your KLog folder and will be loaded.")); msgBox.exec(); world->recreate(ctyfile); worldModel->select(); //slotImportWorldButtonClicked(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("No entities information file (cty.csv) has been detected in your KLog folder.")); msgBox.setInformativeText(tr("KLog will not be able to show entities information.")); msgBox.exec(); } } //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor - END" << endl; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" << endl; } void SetupPageWorldEditor::createWorldPanel() { worldView->setModel(worldModel); QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ worldView->setColumnHidden(i, true); } columns = rec.indexOf("mainprefix"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("name"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("dxcc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("continent"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("cqz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("ituz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("utc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("latitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("longitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("deleted"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("sincedate"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("todate"); worldView->setColumnHidden(columns, false); worldView->setItemDelegate(new QSqlRelationalDelegate(this)); worldView->setSelectionMode( QAbstractItemView::SingleSelection); worldView->setSelectionBehavior(QAbstractItemView::SelectRows); worldView->resizeColumnsToContents(); worldView->horizontalHeader()->setStretchLastSection(true); } void SetupPageWorldEditor::createWorldModel() { /* WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 */ QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //worldModel = new QSqlRelationalTableModel(this); worldModel->setTable("entity"); worldModel->setEditStrategy(QSqlTableModel::OnFieldChange); nameCol = rec.indexOf("mainprefix"); worldModel->setSort(nameCol, Qt::AscendingOrder); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Prefix")); nameCol = rec.indexOf("name"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Entity")); nameCol = rec.indexOf("dxcc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ARRL ID")); nameCol = rec.indexOf("continent"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Continent")); nameCol = rec.indexOf("cqz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("utc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("UTC")); nameCol = rec.indexOf("latitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Latitude")); nameCol = rec.indexOf("longitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Longitude")); nameCol = rec.indexOf("deleted"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("sincedate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Since Date")); nameCol = rec.indexOf("todate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("To Date")); worldModel->select(); } void SetupPageWorldEditor::createActions() { //qDebug() << "SetupPageWorldEditor::createActions" << endl; connect(addEntityPushButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(delEntityPushButton, SIGNAL(clicked()), this, SLOT(slotDelButtonClicked()) ); connect(editEntityPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked()) ); connect(loadWorldPushButton, SIGNAL(clicked()), this, SLOT(slotImportWorldButtonClicked()) ); connect(worldView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickEntity( const QModelIndex& ) ) ); //SIGNAL received from the setupEntityDialog // void entityAdded(const QStringList _qs); // entity connect(setupEntityDialog, SIGNAL(entityAdded(QStringList)), this, SLOT(slotAnalyzeEntityAddedSignal(QStringList) ) ); } void SetupPageWorldEditor::slotAnalyzeEntityAddedSignal(const QStringList _qs) { /* //qDebug() << "SetupPageWorldEditor::slotAnalyzeEntityAddedSignal\n" << _qs.at(0) << "\n" << _qs.at(1) << "\n" << _qs.at(2) << "\n" << _qs.at(3) << "\n" << _qs.at(4) << "\n" << _qs.at(5) << "\n" << _qs.at(6) << "\n" << _qs.at(7) << "\n" << _qs.at(8) << "\n" << _qs.at(9) << "\n" << _qs.at(10) << "\n" << endl; */ } bool SetupPageWorldEditor::isWorldEmpty() { // I need to check if the world is empty and I have the CTY.CSV file if (world->getHowManyEntities()<1) { return true; } else { return false; } return true; } void SetupPageWorldEditor::slotAddButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotAddButtonClicked" << endl; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked" << endl; //TODO } void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity" << endl; //TODO QSqlQuery query; QString queryString; //int row = index.row(); //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity: ARRLid: " << QString::number((worldModel->index(row, 8)).data(0).toInt()) << endl; } void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked" << endl; QString klogDir; klogDir = util->getHomeDir(); QString worldFile; worldFile.clear(); worldFile = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, tr("BigCTY (*.csv)")); QMessageBox msgBox; //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked: " << worldFile << endl; if (world->recreate(worldFile) ) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Entities information has been updated.")); worldModel->select(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Entities information has not been updated.")); } msgBox.exec(); //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked - END" << endl; } klog-1.8.6/setuppages/setuppagelogsnew.cpp0000644000175000017500000003662514166020407017736 0ustar develdevel/*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppages/setuppagelogsnew.h" SetupPageLogsNew::SetupPageLogsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageLogsNew::SetupPageLogsNew" << QT_ENDL; dataProxy = dp; util = new Utilities; editing = false; checking = false; logData.clear(); stationCallsignFilled = false; operatorsFilled = true; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); stationCallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; dateEdit = new QDateEdit; dateEdit->setDate(QDate::currentDate ()); commentLineEdit = new QLineEdit; dateLabel = new QLabel(tr("&Date")); stationCallsignLabel = new QLabel(tr("&Station Callsign")); operatorsLabel = new QLabel(tr("&Operators")); commentLabel = new QLabel(tr("Comm&ent")); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createWidget(); okButton->setEnabled(false); //qDebug() << "SetupPageLogsNew::SetupPageLogsNew - END" << QT_ENDL; } void SetupPageLogsNew::clear() { //qDebug() << "SetupPageLogsNew::Clear - Start" << QT_ENDL; stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); //qDebug() << "SetupPageLogsNew::Clear - END" << QT_ENDL; } void SetupPageLogsNew::createWidget() { //qDebug() << "SetupPageLogsNew::createWidget - Start" << QT_ENDL; stationCallsignLabel->setWordWrap(true); operatorsLabel->setWordWrap(true); commentLabel->setWordWrap(true); dateLabel->setBuddy(dateEdit); stationCallsignLabel->setBuddy(stationCallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); commentLabel->setBuddy(commentLineEdit); stationCallsignLineEdit->setToolTip(tr("Callsign used for this log.")); operatorsLineEdit->setToolTip(tr("Comma separated list of operators: callsign1, callsign2.")); dateEdit->setToolTip(tr("Start date of this log.")); commentLineEdit->setToolTip(tr("Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log.")); dateLabel->setWordWrap(true); connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsTextChanged() ) ); connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *callsLayout = new QGridLayout; // Widget, row, column callsLayout->addWidget(stationCallsignLabel, 0, 0); callsLayout->addWidget(stationCallsignLineEdit, 0, 1); callsLayout->addWidget(dateLabel, 1, 0); callsLayout->addWidget(dateEdit, 1, 1); callsLayout->addWidget(operatorsLabel, 2, 0); callsLayout->addWidget(operatorsLineEdit, 2, 1); callsLayout->addWidget(commentLabel, 3, 0); callsLayout->addWidget(commentLineEdit, 3, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(callsLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); //qDebug() << "SetupPageLogsNew::createWidget - End" << QT_ENDL; } void SetupPageLogsNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged - Start" << QT_ENDL; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((operatorsLineEdit->text()).length()<1) { return; } int cursorP = operatorsLineEdit->cursorPosition(); QString currentQrz = util->getClearSQLi (operatorsLineEdit->text()); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; operatorsLineEdit->setText(currentQrz); } operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) {//TODO: Add a check of the format (comma separated) operatorsFilled= true; } //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged - End" << QT_ENDL; } void SetupPageLogsNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged" << QT_ENDL; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((stationCallsignLineEdit->text()).length()<1) { showNOK(); return; } int cursorP = stationCallsignLineEdit->cursorPosition(); QString currentQrz = util->getClearSQLi (stationCallsignLineEdit->text()); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; stationCallsignLineEdit->setText(currentQrz); } stationCallsignLineEdit->setText(((stationCallsignLineEdit->text())).simplified()); stationCallsignLineEdit->setText((stationCallsignLineEdit->text()).toUpper()); stationCallsignLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) { stationCallsignFilled = true; } showOK(); //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged - End" << QT_ENDL; } void SetupPageLogsNew::slotOKButtonClicked() { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked" << QT_ENDL; stationCallsign = stationCallsignLineEdit->text(); if (stationCallsign.length()<3) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter a valid callsign in the Station Callsign box.\nThe log will not be opened.")); msgBox.exec(); return; } operators = operatorsLineEdit->text(); //TODO: Check if operators is really including a comma separated list of QRZ comment = commentLineEdit->text(); dateString = dateEdit->date().toString("yyyy-MM-dd"); logData.clear(); logData << stationCallsign << operators << comment << dateString; if (editing) { logData << "1"; editing = false; } else { logData << "0"; } emit newLogData(logData); clear(); accept(); } void SetupPageLogsNew::gatherAndSend() { //qDebug() << "SetupPageLogsNew::gatherAndSend: " << QT_ENDL; // The following lines will be removed once more contest types have been added //contestCatMode = contestCatModeComboBox->currentIndex(); //contestCatBands = contestCatBandsComboBox->currentIndex(); //contestCatPower = contestCatPowerComboBox->currentIndex(); //contestCatOperators = contestCatOperatorsComboBox->currentIndex(); //contestCatAssisted = contestCatAssistedComboBox->currentIndex(); //typeContestSelected = typeComboBox->currentIndex(); //contestCatOverlay = contestCatOverlayComboBox->currentIndex(); //typeContest = getSelectedTypeContest(); // The previous lines will be removed once more contest types have been added logData.clear(); logData << stationCallsign << operators << comment << dateString; /* << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); */ if (editing) { logData << "1"; editing = false; } else { logData << "0"; } //logData << QString::number(typeContest) // Update the SetupPageLogs::slotAnalyzeNewLogData if you add or remove any field (Today 12) //qDebug() << "SetupPageLogsNew::gatherAndSend: EMITED" << QT_ENDL; emit newLogData(logData); } void SetupPageLogsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageLogsNew::slotCancelButtonClicked" << QT_ENDL; logData.clear(); emit cancelled(true); setResult(QDialog::Rejected); clear(); close(); } /* QStringList SetupPageLogsNew::getValidCatOptions(const int _currentCat, const int _higherCat) {// currentCat is the current category and highercat is the category we want to know the information // being: // 1 - contestcatoperator // 2 - contestcatassisted // 3 - contestcatpower // 4 - contestcatband // 5 - contestcatoverlay // 6 - contestcatmode //qDebug() << "SetupPageLogsNew::getValidCatOptions: " << QString::number(_currentCat) <<"/"<< QString::number(_higherCat) << QT_ENDL; //return dataProxy->getValidCatOptions(_currentCat, _higherCat); return QStringList(); } */ void SetupPageLogsNew::setStationCallSign(const QString &_st) { stationCallsign = _st; stationCallsignLineEdit->setText(stationCallsign.toUpper()); } void SetupPageLogsNew::setOperators(const QString &_st) { operators = _st; operatorsLineEdit->setText(operators.toUpper()); } void SetupPageLogsNew::setComment(const QString &_st) { comment = _st; commentLineEdit->setText(comment); } void SetupPageLogsNew::setDateString(const QString &_st) { dateString = _st; dateEdit->setDate(QDate::fromString(dateString, "yyyy-MM-dd")); } /* void SetupPageLogsNew::setType(const QString &_st) { typeConteststr = _st; //typeConteststr = typeComboBox->currentText(); typeComboBox->setCurrentIndex(typeComboBox->findText(typeConteststr, Qt::MatchExactly)); //findText ( const QString & text, Qt::MatchFlags flags = static_cast ( Qt::MatchExactly | Qt::MatchCaseSensitive ) ) const } void SetupPageLogsNew::setCMode(const int _n) { contestCatMode = _n; contestCatModeComboBox->setCurrentIndex(contestCatMode); } void SetupPageLogsNew::setCOperators(const int _n) { contestCatOperators = _n; contestCatOperatorsComboBox->setCurrentIndex(contestCatOperators); } void SetupPageLogsNew::setCAssisted(const int _n) { contestCatAssisted = _n; contestCatAssistedComboBox->setCurrentIndex(contestCatAssisted); } void SetupPageLogsNew::setCPower(const int _n) { contestCatPower = _n; contestCatPowerComboBox->setCurrentIndex(contestCatPower); } void SetupPageLogsNew::setCBands(const int _n) { contestCatBands = _n; contestCatBandsComboBox->setCurrentIndex(contestCatBands); } void SetupPageLogsNew::setBands(const int _n) { contestBands = _n; contestBandsComboBox->setCurrentIndex(contestBands); } void SetupPageLogsNew::setCOverlay(const int _n) { contestCatOverlay = _n; contestCatOverlayComboBox->setCurrentIndex(contestCatOverlay); } */ void SetupPageLogsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } /* int SetupPageLogsNew::getSelectedTypeContest() { //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: " << QT_ENDL; //is/contest/catoperator/catassisted/catpower/catband/catoverlay/catmode int i = dataProxy->getContestTypeN(typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode); //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: " << QString::number(i) << QT_ENDL; return i; } void SetupPageLogsNew::setTypeN(const int _n) { //qDebug() << "SetupPageLogsNew::setTypeN: " << QString::number(_n) << QT_ENDL; typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageLogsNew::fillWithType(const int _n) { //qDebug() << "SetupPageLogsNew::fillWithType - n = " << QString::number(_n) << QT_ENDL; typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageLogsNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")" << QT_ENDL; if (contestData.length()== 8) { //qDebug() << "SetupPageLogsNew::fillWithType-2" << QT_ENDL; //setCOperators ((contestData.at(1)).toInt()); //setCAssisted ((contestData.at(2)).toInt()); //setCPower ((contestData.at(3)).toInt()); //setCOverlay ((contestData.at(4)).toInt()); //setCMode ((contestData.at(5)).toInt()); //setType(contestData.at(6)); //setCBands((contestData.at(7)).toInt()); //qDebug() << "SetupPageLogsNew::fillWithType: " << contestData.at(6) << QT_ENDL; } else { //qDebug() << "SetupPageLogsNew::fillWithType-3" << QT_ENDL; return; } } void SetupPageLogsNew::updateAllCats() { //qDebug() << "SetupPageLogsNew::updateAllCats" << QT_ENDL; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); } */ void SetupPageLogsNew::showOK() { //validCats->setText(tr("Data OK")); //validCats->setStyleSheet("QLabel {color : black; }"); okButton->setEnabled(true); } void SetupPageLogsNew::showNOK() { //validCats->setText(tr("Data not OK")); //validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } klog-1.8.6/setuppages/setuppagehamlib.h0000644000175000017500000000717014166020421017146 0ustar develdevel#ifndef SETUPPAGEHAMLIB_H #define SETUPPAGEHAMLIB_H /*************************************************************************** setuppagehamlib.h - description ------------------- begin : feb 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "hamlibclass.h" #include "dataproxy_sqlite.h" #include "hamlibserialconfigwidget.h" #include "hamlibnetworkconfigwidget.h" #include class SetupPageHamLib : public QWidget { Q_OBJECT public: explicit SetupPageHamLib(DataProxy_SQLite *dp, QWidget *parent = nullptr); QString getData(); bool setRigType(const QString &_radio); void setPollingInterval(const int _msecs); bool setSerialPort(const QString &_port); bool setSerialSpeed(const int _speed ); void setActive(const QString &_active); //void setRTS(const QString &_state); //void setDTR(const QString &_state); void setDataBits(const int _st); void setFlowControl(const QString &_st); void setParity(const QString &_st); void setStopBits(const QString &_st); //void setPollInterval(const QString &_st); void setReadOnly(const QString &_m); void setRadioNetworkAddress(const QString &_m); void setRadioNetworkPort(const int _p); public slots: //void slotScanPorts(); void slotRadioComboBoxChanged(QString _r); void slotTestHamlib(); private: void createUI(); void setRig(); void setDefaults(); void setTestResult(const bool _ok); QStringList getAvailableSerialPorts(); int getDataBits(); QString getFlowControl(); QString getParity(); int getStopBits(); QTabWidget *tabWidget; HamLibSerialConfigWidget *serialConfigWidget; HamLibNetworkConfigWidget *networkConfigWidget; QComboBox *rigTypeComboBox; QPushButton *testHamlibPushButton; QSpinBox *pollIntervalQSpinBox; int pollMin, pollMax, rigctlport; HamLibClass *hamlib; QCheckBox *activateHamlibCheckBox, *readOnlyModeCheckBox; //, *RTSCheckBox, *DTRCheckBox; bool networkRadio, hamlibTestOK; }; #endif // SETUPPAGEHAMLIB_H klog-1.8.6/setuppages/hamlibserialconfigwidget.cpp0000644000175000017500000002343514166020421021357 0ustar develdevel#include "hamlibserialconfigwidget.h" HamLibSerialConfigWidget::HamLibSerialConfigWidget(QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; serialBaudsComboBox = new QComboBox(); serialPortComboBox = new QComboBox(); dataBitsComboBox = new QComboBox(); flowControlComboBox = new QComboBox(); parityComboBox = new QComboBox(); stopBitsComboBox = new QComboBox(); scanSerialPortButton = new QPushButton; //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibSerialConfigWidget::createUI() { //qDebug() << Q_FUNC_INFO ; QLabel *serialPortLabel = new QLabel(); //qDebug() << Q_FUNC_INFO << " - 10"; serialPortComboBox->addItems(serialPorts); serialPortLabel->setBuddy(serialPortComboBox); serialPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *serialBaudsLabel = new QLabel(tr("Bauds")); serialBaudsLabel->setBuddy(serialBaudsComboBox); serialBaudsLabel->setToolTip(tr("Select the serial port speed.")); serialBaudsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //qDebug() << Q_FUNC_INFO << " - 50"; serialPortLabel->setText (tr("Port")); //qDebug() << Q_FUNC_INFO << " - 52"; serialPortLabel->setToolTip(tr("Select the serial port. Only the serial ports that are detected are shown.")); //qDebug() << Q_FUNC_INFO << " - 53"; serialPortLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 54"; scanSerialPortButton->setText(tr("Scan")); //qDebug() << Q_FUNC_INFO << " - 55"; scanSerialPortButton->setToolTip(tr("Click to identify the serial ports available in your computer.")); //qDebug() << Q_FUNC_INFO << " - 56"; QStringList strings; strings.clear(); strings << "1200" << "2400" << "4800" << "9600" << "19200" << "38400" << "57600" << "115200"; serialBaudsComboBox->addItems(strings); serialBaudsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 60"; strings.clear(); strings << tr("5 bits") << tr("6 bits") << tr("7 bits") << tr("8 bits"); dataBitsComboBox->addItems(strings); QLabel *dataBitsLabel = new QLabel(tr("Data bits")); dataBitsLabel->setBuddy(dataBitsComboBox); dataBitsLabel->setToolTip(tr("Select the serial data bits.")); dataBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); dataBitsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 70"; strings.clear(); strings << tr("None") << tr("Hardware") << tr("Software XON/XOFF"); flowControlComboBox->addItems(strings); QLabel *flowControlLabel = new QLabel(tr("Flow control")); flowControlLabel->setBuddy(flowControlComboBox); flowControlLabel->setToolTip(tr("Select the serial flow control")); flowControlLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); flowControlLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 80"; strings.clear(); strings << tr("No parity") << tr("Even") << tr("Odd") << tr("Space") << tr("Mark") ; parityComboBox->addItems(strings); QLabel *parityLabel = new QLabel(tr("Parity")); parityLabel->setBuddy(parityComboBox); parityLabel->setToolTip(tr("Select the serial parity.")); parityLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); parityLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 90"; strings.clear(); //strings << tr("1 bit") << tr("1.5 bits") << tr("2 bits"); strings << tr("Default") << tr("1 bit") << tr("2 bits"); stopBitsComboBox->addItems(strings); QLabel *stopBitsLabel = new QLabel(tr("Stop bits")); stopBitsLabel->setBuddy(stopBitsComboBox); stopBitsLabel->setToolTip(tr("Select the serial stop bits.")); stopBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); stopBitsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 100"; QGridLayout *serialLayout = new QGridLayout; serialLayout->addWidget(serialPortLabel, 1, 0); serialLayout->addWidget(serialPortComboBox, 1, 1); serialLayout->addWidget(scanSerialPortButton, 1, 2); serialLayout->addWidget(serialBaudsLabel, 2, 0); serialLayout->addWidget(serialBaudsComboBox, 2, 1); serialLayout->addWidget(dataBitsLabel, 3, 0); serialLayout->addWidget(dataBitsComboBox, 3, 1); serialLayout->addWidget(stopBitsLabel, 4, 0); serialLayout->addWidget(stopBitsComboBox, 4, 1); serialLayout->addWidget(flowControlLabel, 5, 0); serialLayout->addWidget(flowControlComboBox, 5, 1); serialLayout->addWidget(parityLabel, 6, 0); serialLayout->addWidget(parityComboBox, 6, 1); setLayout (serialLayout); fillSerialPortsComboBox(); connect(scanSerialPortButton, SIGNAL(clicked(bool)), this, SLOT(slotScanPorts()) ); //qDebug() << Q_FUNC_INFO << " - END"; } QStringList HamLibSerialConfigWidget::getAvailableSerialPorts() { //qDebug() << Q_FUNC_INFO; QStringList st; st.clear(); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) { //st << info.portName(); st << info.systemLocation(); } //qDebug() << Q_FUNC_INFO << " - END"; return st; } void HamLibSerialConfigWidget::fillSerialPortsComboBox() { //qDebug() << "SetupPageHamLib::fillSerialPortsComboBox" ; serialPortComboBox->clear(); serialPortComboBox->addItems(getAvailableSerialPorts()); serialPortComboBox->setCurrentIndex(0); } void HamLibSerialConfigWidget::slotScanPorts() { //qDebug() << Q_FUNC_INFO; fillSerialPortsComboBox(); } int HamLibSerialConfigWidget::getDataBits() { return ((dataBitsComboBox->currentText()).left(1)).toInt(); } void HamLibSerialConfigWidget::setDataBits (const int _b) { switch (_b) { case 5: dataBitsComboBox->setCurrentIndex(0); break; case 6: dataBitsComboBox->setCurrentIndex(1); break; case 7: dataBitsComboBox->setCurrentIndex(2); break; default: // should never be reached dataBitsComboBox->setCurrentIndex(3); break; } } //FlowControl { NoFlowControl, HardwareControl, SoftwareControl, UnknownFlowControl } QString HamLibSerialConfigWidget::getFlowControl() { int ret = flowControlComboBox->currentIndex(); QString output; output = "HamLibSerialFlowControl="; switch (ret) { case 0: output = output + "None"; break; case 1: output = output + "Hardware"; break; case 2: output = output + "Software"; break; default: // should never be reached output = output + "None"; break; } return output; } void HamLibSerialConfigWidget::setFlowControl(const QString &_st) { QString _s = _st.toUpper(); if (_s == "HARDWARE") { flowControlComboBox->setCurrentIndex(1); } else if (_s == "SOFTWARE") { flowControlComboBox->setCurrentIndex(2); } else { flowControlComboBox->setCurrentIndex(0); } } //Parity { NoParity, EvenParity, OddParity, SpaceParity, MarkParity, UnknownParity } QString HamLibSerialConfigWidget::getParity() { int ret = parityComboBox->currentIndex(); QString output; output = "HamLibSerialParity="; switch (ret) { case 0: output = output + "None"; break; case 1: output = output + "Even"; break; case 2: output = output + "Odd"; break; case 3: output = output + "Space"; break; case 4: output = output + "Mark"; break; default: // should never be reached output = output + "None"; break; } return output; } void HamLibSerialConfigWidget::setParity(const QString &_st) { QString _s = _st.toUpper(); if (_s == "EVEN") { parityComboBox->setCurrentIndex(1); } else if (_s == "ODD") { parityComboBox->setCurrentIndex(2); } else if (_s == "SPACE") { parityComboBox->setCurrentIndex(3); } else if (_s == "MARK") { parityComboBox->setCurrentIndex(4); } else { parityComboBox->setCurrentIndex(0); } } //StopBits { OneStop, OneAndHalfStop, TwoStop, UnknownStopBits } int HamLibSerialConfigWidget::getStopBits() { int ret = stopBitsComboBox->currentIndex(); switch (ret) { case 0: return 0; break; case 1: return 1; break; case 2: return 2; break; default: // should never be reached return 2; break; } } void HamLibSerialConfigWidget::setStopBits(const QString &_st) { if (_st == "Default") { stopBitsComboBox->setCurrentIndex(0); } else if (_st == "1") { stopBitsComboBox->setCurrentIndex(1); } else { stopBitsComboBox->setCurrentIndex(2); } } bool HamLibSerialConfigWidget::setSerialPort(const QString &_port) { int _index = serialPortComboBox->findText(_port, Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialPortComboBox->setCurrentIndex(_index); return true; } else { serialPortComboBox->setCurrentIndex(0); } return false; } bool HamLibSerialConfigWidget::setSerialBauds(const int _speed ) { int _index = serialBaudsComboBox->findText(QString::number(_speed), Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialBaudsComboBox->setCurrentIndex(_index); return true; } else { serialPortComboBox->setCurrentIndex(0); } return false; } QString HamLibSerialConfigWidget::getSerialPort() { return serialPortComboBox->currentText (); } int HamLibSerialConfigWidget::getSerialBauds() { return (serialBaudsComboBox->currentText ()).toInt (); } klog-1.8.6/setuppages/setuppageuserdata.h0000644000175000017500000001234314166020407017524 0ustar develdevel#ifndef SETUPPAGEUSERDATA_H #define SETUPPAGEUSERDATA_H /*************************************************************************** setuppageuserdata.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include "world.h" #include "locator.h" #include "dataproxy_sqlite.h" #include "utilities.h" class SetupPageUserDataPage : public QWidget { Q_OBJECT public: SetupPageUserDataPage(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageUserDataPage(); QString getMainCallsign(); QString getOperators(); QString getStationLocator(); int getCQz(); int getITUz(); QString getName(); QStringList getAddress(); QString getAddress1(); QString getAddress2(); QString getAddress3(); QString getAddress4(); QString getCity(); QString getZipCode(); QString getProvince(); QString getCountry(); bool setName (const QString &_aux); bool setAddress1 (const QString &_aux); bool setAddress2 (const QString &_aux); bool setAddress3 (const QString &_aux); bool setAddress4 (const QString &_aux); bool setAddress (const QStringList _aux); bool setCity (const QString &_aux); bool setZipCode (const QString &_aux); bool setProvince (const QString &_aux); bool setCountry (const QString &_aux); bool setMainCallsign(const QString &_qrz); bool setOperators(const QString &_aux); bool setStationLocator(const QString &_loc); bool setCQz(const int _cqz); bool setITUz(const int _ituz); QString getRig1(); QString getRig2(); QString getRig3(); QString getAntenna1(); QString getAntenna2(); QString getAntenna3(); QStringList getRigs(); QStringList getAntennas(); QString getPower(); bool setRigs(const QStringList _aux); bool setAntennas(const QStringList _aux); bool setPower(const QString &_aux); bool setRig1 (const QString &_aux); bool setRig2 (const QString &_aux); bool setRig3 (const QString &_aux); bool setAntenna1 (const QString &_aux); bool setAntenna2 (const QString &_aux); bool setAntenna3 (const QString &_aux); void setStationFocus(); signals: void mainCallsignSignal (const QString &_p); void operatorsSignal (const QString &_p); void enterKey(); private slots: void slotMyLocatorTextChanged(); void slotOperatorsChanged(); void slotEnterKeyPressed(); void slotQRZTextChanged(); // void slotContestOverLayChanged(int i); private: bool checkOperatorsLineQString(const QString &_auxLine); QTabWidget *tabWidget; QLineEdit *maincallsignLineEdit; // This is the callsign of the user. Will be suggested as station callsign for new logs QLineEdit *operatorsLineEdit; //Operators QLineEdit *cqzLineEdit; QLineEdit *ituzLineEdit; QLineEdit *myLocatorLineEdit; QLabel *myLocatorLabel; //Personal Tab QLineEdit *nameLineEdit; QTextEdit *addressTextEdit; QLineEdit *address1LineEdit; QLineEdit *address2LineEdit; QLineEdit *address3LineEdit; QLineEdit *address4LineEdit; QLineEdit *cityLineEdit; QLineEdit *zipLineEdit; QLineEdit *provinceLineEdit; QLineEdit *countryLineEdit; // Station Tab QLineEdit *rig1LineEdit; QLineEdit *rig2LineEdit; QLineEdit *rig3LineEdit; QLineEdit *ant1LineEdit; QLineEdit *ant2LineEdit; QLineEdit *ant3LineEdit; //QLineEdit *powerLineEdit; QDoubleSpinBox *myPowerSpinBox; QPalette *defaultPalette, *wrongPalette; QColor redColor; Locator *locator; World *world; DataProxy_SQLite *dataProxy; bool operatorsOK; bool mainCallOK; Utilities *util; }; #endif // SETUPPAGEUSERDATA_H klog-1.8.6/setuppages/setuppagedxcluster.h0000644000175000017500000000731214166020407017731 0ustar develdevel#ifndef SETUPPAGEDXCLUSTER_H #define SETUPPAGEDXCLUSTER_H /*************************************************************************** setuppagedxcluster.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include //#include //#include //#include #include class SetupPageDxCluster : public QWidget { Q_OBJECT public: SetupPageDxCluster(QWidget *parent=nullptr); ~SetupPageDxCluster(); QStringList getDxclusterServersComboBox(); void setDxclusterServersComboBox(const QStringList t); QString getSelectedDxClusterServer(); void setSelectedDxClusterServer(const QString t); QString getShowHFQCheckbox(); QString getShowVHFQCheckbox(); QString getShowWARCQCheckbox(); QString getShowWorkedQCheckbox(); QString getShowConfirmedQCheckbox(); QString getShowANNQCheckbox(); QString getShowWWVQCheckbox(); QString getShowWCYQCheckbox(); QString getSaveActivityQCheckbox(); void setShowHFQCheckbox(const QString t); void setShowVHFQCheckbox(const QString t); void setShowWARCQCheckbox(const QString t); void setShowWorkedQCheckbox(const QString t); void setShowConfirmedQCheckbox(const QString t); void setShowANNQCheckbox(const QString t); void setShowWWVQCheckbox(const QString t); void setShowWCYQCheckbox(const QString t); void setSaveActivityQCheckbox(const QString t); private slots: void slotAddButtonClicked(); void slotDeleteButtonClicked(); private: void createActions(); bool checkIfValidDXCluster (const QString &tdxcluster); bool checkIfNewDXCluster (const QString &tdxcluster); QComboBox *dxclusterServersComboBox; QPushButton *addClusterButton; QPushButton *deleteClusterButton; QCheckBox *showHFQCheckbox; QCheckBox *showVHFQCheckbox; QCheckBox *showWARCQCheckbox; QCheckBox *showWorkedQCheckbox; QCheckBox *showConfirmedQCheckbox; QCheckBox *showANNQCheckbox; QCheckBox *showWWVQCheckbox; QCheckBox *showWCYQCheckbox; QCheckBox *saveAllDXClusterDataQCheckbox; //QStringList dxClusterServers; }; #endif // SETUPPAGEDXCLUSTER_H klog-1.8.6/setuppages/setuppagesatsnew.h0000644000175000017500000000713214166020407017400 0ustar develdevel#ifndef SETUPPAGESATSNEW_H #define SETUPPAGESATSNEW_H /*************************************************************************** setuppagesatsnew.h - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new satellite // #include "dataproxy_sqlite.h" #include "utilities.h" #include #include #include //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of sats when the user wants to edit a sat class SetupPageSatsNew : public QDialog { Q_OBJECT public: SetupPageSatsNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); void setEditing(const bool b); void setShortName(const QString st); void setName(const QString st); void setUpLink(const QString st); void setDownLink(const QString st); void setModes(const QString st); void clear(); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotShortNameTextChanged(); void slotNameTextChanged(); void slotUpLinkTextChanged(); void slotDownLinkTextChanged(); void slotModesTextChanged(); signals: void newSatData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedSat(); void createUI(); void gatherAndSend(); bool isItAFreq(const QString &_st); //void fillWithType(const int _n); //void updateAllCats(); //void showOK(); //void showNOK(); //void clear(); DataProxy_SQLite *dataProxy; Utilities *util; QLineEdit *shortNameLineEdit, *nameLineEdit; QLineEdit *uplinkLineEdit, *downlinkLineEdit; QLineEdit *modesLineEdit; QLabel *shortNameLabel, *nameLabel; QLabel *uplinkLabel, *downlinkLabel; QLabel *modesLabel; QString shortName, name, uplink, downlink, modes; bool hasShortName, hasName, hasUplink, hasDownlink, hasModes; QPushButton *okButton, *cancelButton; QStringList satData; bool editing; }; #endif // SETUPPAGESATSNEW_H klog-1.8.6/setuppages/setuppageudp.cpp0000644000175000017500000003027214166020407017040 0ustar develdevel/*************************************************************************** setuppageudp.cpp - description ------------------- begin : sept 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppageudp.h" SetupPageUDP::SetupPageUDP(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageUDP::SetupPageUDP" << QT_ENDL; logFromWSJTXCheckbox = new QCheckBox(this); realDataFromWSJTXCheckbox = new QCheckBox(this); logAutomaticallyWSJTXCheckbox = new QCheckBox(this); UDPServerCheckBox = new QCheckBox(tr("Start UDP Server"), this); UDPServerPortSpinBox = new QSpinBox; miliSecsSpinBox = new QSpinBox; networkInterfacesComboBox = new QComboBox; //qDebug() << "SetupPageUDP::SetupPageUDP: 1" << QT_ENDL; util = new Utilities; //wsjtxIPAddress = new QLineEdit(this); //wsjtxPortNumber = new QLineEdit(this); //logFromWSJTx = false; //autoLogFromWSJTx = false; //realDataFromWSJTx = false; defaultport = 2237; // Default WSJTX port defaultTimer = 2000; // 2 secs //qDebug() << "SetupPageUDP::SetupPageUDP: 2" << QT_ENDL; createUI(); //qDebug() << "SetupPageUDP::SetupPageUDP: 3" << QT_ENDL; createActions(); //qDebug() << "SetupPageUDP::SetupPageUDP: 4" << QT_ENDL; fillNetworkInterfaceComboBox(); //qDebug() << "SetupPageUDP::SetupPageUDP - END" << QT_ENDL; } SetupPageUDP::~SetupPageUDP(){ //qDebug() << "SetupPageUDP::~SetupPageUDP" << QT_ENDL; } void SetupPageUDP::createUI() { QString msgAuto = QString(tr("Automatically log QSOs from WSJT-X")); logFromWSJTXCheckbox->setText(tr("Allow WSJT-X to send logged QSOs to KLog")); logFromWSJTXCheckbox->setToolTip(tr("QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless \"%1\" is selected").arg(msgAuto)); logAutomaticallyWSJTXCheckbox->setText(msgAuto); logAutomaticallyWSJTXCheckbox->setToolTip(tr("KLog will automatically log any QSO coming from WSJT-X without any manual confirmation.")); realDataFromWSJTXCheckbox->setText(tr("Update status information from WSJT-X")); realDataFromWSJTXCheckbox->setToolTip(tr("KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...)")); UDPServerCheckBox->setChecked(false); logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); QVBoxLayout *checkLayout = new QVBoxLayout; checkLayout->addWidget(logFromWSJTXCheckbox); checkLayout->addWidget(logAutomaticallyWSJTXCheckbox); checkLayout->addWidget(realDataFromWSJTXCheckbox); QString labelTip = tr("UDP port number where the UDP Server will listen for packets.") + "\n" + tr("Make sure it is the same port that the other programs are sending the data to. Default port is 2237."); UDPServerCheckBox->setToolTip(tr("UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs.")); UDPServerPortSpinBox->setToolTip(labelTip); UDPServerPortSpinBox->setMinimum(0); UDPServerPortSpinBox->setMaximum(65535); UDPServerPortSpinBox->setValue(defaultport); QLabel *udpPortLabel = new QLabel(tr("UDP Port")); udpPortLabel->setBuddy(UDPServerPortSpinBox); udpPortLabel->setToolTip(labelTip); udpPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); udpPortLabel->setEnabled(true); QHBoxLayout *UDPPortLayout = new QHBoxLayout; UDPPortLayout->addWidget(udpPortLabel); UDPPortLayout->addWidget(UDPServerPortSpinBox); networkInterfacesComboBox->setToolTip(tr("Select the interface to listen for UDP datagrams coming from WSJT-X.")); QLabel *networkInterfaceLabel = new QLabel(tr("Network interface")); networkInterfaceLabel->setToolTip(tr("Select the interface to listen for UDP datagrams coming from WSJT-X.")); QHBoxLayout *networkIfacesLayout = new QHBoxLayout; networkIfacesLayout->addWidget(networkInterfaceLabel); networkIfacesLayout->addWidget(networkInterfacesComboBox); miliSecsSpinBox->setMinimum(0); miliSecsSpinBox->setMaximum(30000); miliSecsSpinBox->setValue(defaultTimer); QLabel *miliSecsSpinBoxLabel = new QLabel(tr("QSOs notification timeout (milisecs)")); miliSecsSpinBox->setToolTip(tr("Miliseconds that the notification of QSOs received from WSJTX will be shown.")); miliSecsSpinBoxLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); miliSecsSpinBoxLabel->setEnabled(true); miliSecsSpinBox->setEnabled(false); QHBoxLayout *UDPTimeLayout = new QHBoxLayout; UDPTimeLayout->addWidget(miliSecsSpinBoxLabel); UDPTimeLayout->addWidget(miliSecsSpinBox); //QHBoxLayout *UDPLayout = new QHBoxLayout; //UDPLayout->addLayout(networkIfacesLayout); //UDPLayout->addLayout(UDPPortLayout); QGridLayout *gridLayout = new QGridLayout; gridLayout->addLayout(networkIfacesLayout, 0, 0); gridLayout->addLayout(UDPPortLayout, 0, 1); gridLayout->addLayout(UDPTimeLayout, 1, 0); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(UDPServerCheckBox); layout->addLayout(gridLayout); layout->addLayout(checkLayout); setLayout(layout); } void SetupPageUDP::createActions() { connect(logFromWSJTXCheckbox, SIGNAL(clicked()), this, SLOT(slotLogFromWSJTCheckBoxClicked() ) ); //connect(logAutomaticallyWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotAutoLogFromWSJTCheckBoxClicked() ) ); //connect(realDataFromWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotRealFromWSJTCheckBoxClicked() ) ); connect(UDPServerCheckBox, SIGNAL(clicked()), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } void SetupPageUDP::slotUDPServerCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotUDPServerCheckBoxClicked" << QT_ENDL; if (UDPServerCheckBox->isChecked()) { logFromWSJTXCheckbox->setEnabled(true); logFromWSJTXCheckbox->setChecked(true); logAutomaticallyWSJTXCheckbox->setEnabled(true); realDataFromWSJTXCheckbox->setEnabled(true); miliSecsSpinBox->setEnabled(true); } else { logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); miliSecsSpinBox->setEnabled(false); } } void SetupPageUDP::fillNetworkInterfaceComboBox() { QNetworkInterface loopBack; QStringList interfacesNames; interfacesNames.clear(); networkInterfacesComboBox->clear(); QList ifaces; ifaces.clear(); ifaces << QNetworkInterface::allInterfaces(); foreach (QNetworkInterface i, ifaces) { if ((i.flags().testFlag(QNetworkInterface::IsUp)) && (i.flags().testFlag(QNetworkInterface::IsLoopBack))) { loopBack = i; } else if ((i.flags().testFlag(QNetworkInterface::IsUp)) && (i.humanReadableName().length()>0) && (i.flags().testFlag(QNetworkInterface::CanMulticast)) ) { interfacesNames.append(i.humanReadableName() + "-" + i.hardwareAddress() ); } } interfacesNames.insert(0, loopBack.humanReadableName()); networkInterfacesComboBox->addItems(interfacesNames); } void SetupPageUDP::slotLogFromWSJTCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotLogFromWSJTCheckBoxClicked" << QT_ENDL; if (logFromWSJTXCheckbox->isChecked()) { logAutomaticallyWSJTXCheckbox->setEnabled(true); } else { logAutomaticallyWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setChecked(false); } } QString SetupPageUDP::getUDPServer() { return util->boolToQString(UDPServerCheckBox->isChecked()); } void SetupPageUDP::setUDPServer(const QString &_t) { //qDebug() << "SetupPageUDP::setUDPServer: " << t << QT_ENDL; UDPServerCheckBox->setChecked(util->trueOrFalse(_t)); slotUDPServerCheckBoxClicked(); } void SetupPageUDP::setUDPServerPort(const QString &_t) { if ( (_t.toInt()>=0) && (_t.toInt()<=65535)) { UDPServerPortSpinBox->setValue(_t.toInt()); } else { UDPServerPortSpinBox->setValue(defaultport); } } QString SetupPageUDP::getUDPServerPort() { int t = UDPServerPortSpinBox->value(); if ( (t>=0) && (t<=65535) ) { return QString::number(t); } else { return QString::number(defaultport); } } void SetupPageUDP::setTimeout(const QString &_t) { if ( (_t.toInt()>=0) && (_t.toInt()<=30000)) { miliSecsSpinBox->setValue(_t.toInt()); } else { miliSecsSpinBox->setValue(defaultTimer); } } QString SetupPageUDP::getTimeout() { int t = miliSecsSpinBox->value(); if ( (t>=0) && (t<=30000) ) { return QString::number(t); } else { return QString::number(defaultTimer); } } QString SetupPageUDP::getLogFromWSJTx() { return util->boolToQString(logFromWSJTXCheckbox->isChecked()); } QString SetupPageUDP::getAutoLogFromWSJTx() { return util->boolToQString(logAutomaticallyWSJTXCheckbox->isChecked()); } QString SetupPageUDP::getReaDataFromWSJTx() { return util->boolToQString(realDataFromWSJTXCheckbox->isChecked()); } void SetupPageUDP::setLogFromWSJTx(const QString &_t) { logFromWSJTXCheckbox->setChecked(util->trueOrFalse(_t)); slotLogFromWSJTCheckBoxClicked(); } void SetupPageUDP::setAutoLogFromWSJTx(const QString &_t) { logAutomaticallyWSJTXCheckbox->setChecked(util->trueOrFalse(_t)); } void SetupPageUDP::setReaDataFromWSJTx(const QString &_t) { realDataFromWSJTXCheckbox->setChecked(util->trueOrFalse(_t)); } QString SetupPageUDP::getNetworkInterface() { if (networkInterfacesComboBox->currentIndex() == 0) { return networkInterfacesComboBox->currentText(); } else { return networkInterfacesComboBox->currentText().split('-').at(1); } } void SetupPageUDP::setNetworkInterface(const QString &_t) { //qDebug() << "SetupPageUDP::setNetworkInterface: " << _t << QT_ENDL; if (networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith) >= 0) { //qDebug() << "SetupPageUDP::setNetworkInterface: found: " << _t << QT_ENDL; networkInterfacesComboBox->setCurrentIndex(networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith)); } else { //qDebug() << "SetupPageUDP::setNetworkInterface: NOT found: " << _t << QT_ENDL; networkInterfacesComboBox->setCurrentIndex(0); } } klog-1.8.6/setuppages/hamlibnetworkconfigwidget.cpp0000644000175000017500000000407214166020421021565 0ustar develdevel#include "hamlibnetworkconfigwidget.h" HamLibNetworkConfigWidget::HamLibNetworkConfigWidget(QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; hostAddressLineEdit = new QLineEdit(); portQSpinBox = new QSpinBox; //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibNetworkConfigWidget::createUI() { portQSpinBox->setMaximum (65535); portQSpinBox->setMinimum (0); hostAddressLineEdit->setToolTip (tr("Enter the hostname or address of the radio.")); portQSpinBox->setToolTip (tr("Set de network port of the radio.")); //portQSpinBox->setValue (rigctlport); QLabel *hostAddLabel = new QLabel(tr("Host/Address")); hostAddLabel->setBuddy(hostAddressLineEdit); hostAddLabel->setToolTip(tr("Enter the hostname or address of the radio.")); hostAddLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); hostAddLabel->setEnabled(true); QLabel *portNetLabel = new QLabel(tr("Port")); portNetLabel->setBuddy(portQSpinBox); portNetLabel->setToolTip(tr("Enter the port of the radio.")); portNetLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); portNetLabel->setEnabled(true); QGridLayout *networkLayout = new QGridLayout; //qDebug() << Q_FUNC_INFO << " - 120"; networkLayout->addWidget (hostAddLabel, 0, 0); networkLayout->addWidget (hostAddressLineEdit, 0, 1); networkLayout->addWidget (portNetLabel, 1, 0); networkLayout->addWidget (portQSpinBox, 1, 1); //networkGroup->setLayout (networkLayout); setLayout (networkLayout); //qDebug() << Q_FUNC_INFO << " - END"; } int HamLibNetworkConfigWidget::getPort() { return portQSpinBox->value (); } void HamLibNetworkConfigWidget::setPort (const int _b) {//TODO: Check that if ((_b<0) || (_b>65535)) { return; } portQSpinBox->setValue (_b); } QString HamLibNetworkConfigWidget::getAddress() { return hostAddressLineEdit->text (); } void HamLibNetworkConfigWidget::setAddress(const QString &_st) { //TODO: Check that what is arriving is a hostname or IP address hostAddressLineEdit->setText (_st); } klog-1.8.6/setuppages/setuppagebandmode.cpp0000644000175000017500000001362514166020407020024 0ustar develdevel/*************************************************************************** setuppagebandmode.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppages/setuppagebandmode.h" SetupPageBandMode::SetupPageBandMode(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageBandMode::SetupPageBandMode" << QT_ENDL; dataProxy = dp; bandsListWidget = new QListWidget; modesListWidget = new QListWidget; QHBoxLayout *layout = new QHBoxLayout; QVBoxLayout *bLayout = new QVBoxLayout; QVBoxLayout *mLayout = new QVBoxLayout; QLabel *bandsLabel = new QLabel(bandsListWidget); bandsLabel->setText(tr("Bands")); bandsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *modesLabel = new QLabel(modesListWidget); modesLabel->setText(tr("Modes")); modesLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); addBands(dataProxy->getBands()); addModes(dataProxy->getModes()); bLayout->addWidget(bandsLabel); bLayout->addWidget(bandsListWidget); mLayout->addWidget(modesLabel); mLayout->addWidget(modesListWidget); layout->addLayout(bLayout); layout->addLayout(mLayout); //layout->addWidget(bandsListWidget); //layout->addWidget(modesListWidget); setLayout(layout); //qDebug() << "SetupPageBandMode::SetupPageBandMode - END" << QT_ENDL; } SetupPageBandMode::~SetupPageBandMode() {} void SetupPageBandMode::addBands(QStringList _b) { bandsListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < bandsListWidget->count(); ++i){ item = bandsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } void SetupPageBandMode::addModes(QStringList _b) { modesListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < modesListWidget->count(); ++i){ item = modesListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QString SetupPageBandMode::getBands() { //qDebug() << "SetupPageBandMode::getBands" << QT_ENDL; QString b; QListWidgetItem *it; if ( (bandsListWidget->count()) < 1) { return ""; } for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); if (it->checkState() == Qt::Checked) { b = b + it->text(); b = b + ", "; } } if (b.size()<2) { }else { b.chop(2); } return b; } QString SetupPageBandMode::getModes() { //qDebug() << "SetupPageBandMode::getModes" << QT_ENDL; QString b; QListWidgetItem *it; if ( (modesListWidget->count()) < 1) { return ""; } for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); if (it->checkState() == Qt::Checked) { b = b + it->text(); b = b + ", "; } } if (b.size()<2) { }else { b.chop(2); } //qDebug() << "SetupPageBandMode::getModes: " << b << QT_ENDL; return b; } void SetupPageBandMode::setActiveBands(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveBands" << QT_ENDL; if (q.isEmpty()) {return;} //QString b; QListWidgetItem *it; if ( (bandsListWidget->count()) < 1) { return; } for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } void SetupPageBandMode::setActiveModes(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveModes" << QT_ENDL; if (q.isEmpty()) {return;} //QString b; QListWidgetItem *it; if ( (modesListWidget->count()) < 1) { return; } for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } klog-1.8.6/setuppages/setuppagemisc.h0000644000175000017500000001161314166020407016646 0ustar develdevel#ifndef SETUPPAGEMISC_H #define SETUPPAGEMISC_H /*************************************************************************** setuppagemisc.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include "utilities.h" class SetupPageMisc : public QWidget { Q_OBJECT public: SetupPageMisc(QWidget *parent=nullptr); ~SetupPageMisc(); QString getRealTime(); void setRealTime(const QString &_t); QString getUTCTime(); void setUTCTime(const QString &_t); QString getAlwaysADIF(); void setAlwaysADIF(const QString &_t); QString getDefaultFileName(); void setUseDefaultName(const QString &_t); QString getDefaultDBPath(); void setUseDefaultDBPath(const QString &_t); QString getUseDefaultName(); void setDefaultFileName(const QString &_t); //QString getInMemory(); //void setInMemory(const QString &_t); QString getImperial(); void setImperial(const QString &_t); QString getSendQSLWhenRec(); void setSendQSLWhenRec(const QString &_t); QString getShowStationCallSignInSearch(); void setShowStationCallSignInSearch(const QString &_t); //QString getKeepMyData(); //void setKeepMyData(const QString &_t); QString getCompleteWithPrevious(); void setCompleteWithPrevious(const QString &_t); QString getCheckNewVersions(); void setCheckNewVersions(const QString &_t); bool getReportInfo(); void setReportInfo(const QString &_t); QString getDXMarathon(); void setDXMarathon(const QString &_t); QString getDebugLog(); void setDebugLog(const QString &_t); //QString getLogSort(); //void setLogSort(const QString &_t); QString getSendEQSLByDefault(); void setSetEQSLByDefault(const QString &_t); void setDeleteAlwaysAdiFile(const bool &_t); QString getDeleteAlwaysAdiFile(); bool getCheckCalls(); void setCheckCalls(const bool &_t); void setDupeTime(const int _t); int getDupeTime(); bool areDBPathChangesApplied(); private slots: void slotOpenFileButtonClicked(); void slotUseDefaultButtonStateChanged(int state); //void slotdefaultFileNameChanged(); void slotDefaultFileNameLineEditChanged(); void slotcheckNewVersionCheckBoxClicked(); void slotDBButtonClicked(); void slotDBLineEditChanged(); void slotMoveDBButtonClicked(); //void slotUDPServerCheckBoxClicked(); private: void createActions(); void createUI(); Utilities *util; QCheckBox *realTimeCheckbox, *UTCCheckbox, *alwaysADIFCheckBox, *useDefaultName, *completeWithPreviousCheckBox; QCheckBox *imperialCheckBox, *sendQSLWhenRecCheckBox, *showStationCallWhenSearchCheckBox; QCheckBox *checkNewVersionCheckBox, *provideCallCheckBox, *useDxMarathonCheckBox, *debugLogCheckBox, *checkCallsCheckBox; //QCheckBox *logSortCheckBox; QCheckBox *sendEQSLByDefaultSearchCheckBox, *deleteAlwaysAdiFileCheckBox; QString defaultFileName; QLineEdit *defaultFileNameLineEdit, *dbPathLineEdit; QPushButton *fileNameButton, *dbPushButton, *moveDBPushButton; QLineEdit *dupeTimeLineEdit; QString klogDir, dbDirNew, dbDirCurrent; //TODO: To be removed when the defaultDir is saved in the config file QPalette palRight, palWrong; // To paint Text in red or black(normal) bool dbPathApplied; //QWidget *bandsWidget; }; #endif // SETUPPAGEMISC_H klog-1.8.6/setuppages/hamlibnetworkconfigwidget.h0000644000175000017500000000101114166020421021220 0ustar develdevel#ifndef HAMLIBNETWORKCONFIGWIDGET_H #define HAMLIBNETWORKCONFIGWIDGET_H #include #include "../klogdefinitions.h" class HamLibNetworkConfigWidget : public QWidget { Q_OBJECT public: explicit HamLibNetworkConfigWidget(QWidget *parent = nullptr); void createUI(); int getPort(); void setPort (const int _b); QString getAddress(); void setAddress(const QString &_st); private: QLineEdit*hostAddressLineEdit; QSpinBox *portQSpinBox; }; #endif // HAMLIBNETWORKCONFIGWIDGET_H klog-1.8.6/setuppages/setuppagesatsnew.cpp0000644000175000017500000003416014166020407017734 0ustar develdevel/*************************************************************************** SetupPageSatsNew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppages/setuppagesatsnew.h" SetupPageSatsNew::SetupPageSatsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSatsNew::SetupPageSatsNew" << QT_ENDL; dataProxy = dp; util = new Utilities; editing = false; //checking = false; shortNameLineEdit = new QLineEdit(); nameLineEdit = new QLineEdit(); uplinkLineEdit = new QLineEdit(); downlinkLineEdit = new QLineEdit(); modesLineEdit = new QLineEdit(); shortNameLabel = new QLabel(tr("Short name")); nameLabel = new QLabel(tr("Sat name")); uplinkLabel = new QLabel(tr("UpLink")); downlinkLabel = new QLabel(tr("DownLink")); modesLabel = new QLabel(tr("Modes")); clear(); //satData.clear(); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createUI(); okButton->setEnabled(true); //qDebug() << "SetupPageSatsNew::SetupPageSatsNew - END" << QT_ENDL; } void SetupPageSatsNew::clear() { shortName = QString(); name = QString(); uplink = QString(); downlink = QString(); modes = QString(); hasShortName = false; hasName = false; hasUplink = false; hasDownlink = false; hasModes = false; shortNameLineEdit->clear(); nameLineEdit->clear(); uplinkLineEdit->clear(); downlinkLineEdit->clear(); modesLineEdit->clear(); } void SetupPageSatsNew::createUI() { //qDebug() << "SetupPageSatsNew::createWidget" << QT_ENDL; shortNameLabel->setWordWrap(true); nameLabel->setWordWrap(true); uplinkLabel->setWordWrap(true); downlinkLabel->setWordWrap(true); modesLabel->setWordWrap(true); shortNameLabel->setBuddy(shortNameLineEdit); nameLabel->setBuddy(nameLineEdit); uplinkLabel->setBuddy(uplinkLineEdit); downlinkLabel->setBuddy(downlinkLineEdit); modesLabel->setBuddy(modesLineEdit); shortNameLineEdit->setToolTip(tr("Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards.")); nameLineEdit->setToolTip(tr("Enter the name of the satellite.")); uplinkLineEdit->setToolTip(tr("Enter the uplink frequencies in this format: 144.300")); downlinkLineEdit->setToolTip(tr("Enter the downlink frequencies in this format: 144.300")); modesLineEdit->setToolTip(tr("Enter the modes in this format: USB")); connect(shortNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotShortNameTextChanged() ) ); connect(nameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotNameTextChanged() ) ); connect(uplinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpLinkTextChanged() ) ); connect(downlinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDownLinkTextChanged() ) ); connect(modesLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotModesTextChanged() ) ); connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *dataLayout = new QGridLayout; // Widget, row, column dataLayout->addWidget(shortNameLabel, 0, 0); dataLayout->addWidget(shortNameLineEdit, 0, 1); dataLayout->addWidget(nameLabel, 1, 0); dataLayout->addWidget(nameLineEdit, 1, 1); dataLayout->addWidget(uplinkLabel, 2, 0); dataLayout->addWidget(uplinkLineEdit, 2, 1); dataLayout->addWidget(downlinkLabel, 3, 0); dataLayout->addWidget(downlinkLineEdit, 3, 1); dataLayout->addWidget(modesLabel, 4, 0); dataLayout->addWidget(modesLineEdit, 4, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); } void SetupPageSatsNew::slotShortNameTextChanged() { int cursorP = shortNameLineEdit->cursorPosition(); shortNameLineEdit->setText((shortNameLineEdit->text()).toUpper()); if ((shortNameLineEdit->text()).length()>2) { hasShortName = true; } else { hasShortName = false; } shortNameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotNameTextChanged() { int cursorP = nameLineEdit->cursorPosition(); nameLineEdit->setText((nameLineEdit->text()).toUpper()); if ((nameLineEdit->text()).length()>2) { hasName = true; } else { hasName = false; } nameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotUpLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged:" << uplinkLineEdit->text() << QT_ENDL; if ((uplinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = uplinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasUplink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux << QT_ENDL; } else { //It is just one freq if (isItAFreq(aux)) { } else { hasUplink = false; } } } } bool SetupPageSatsNew::isItAFreq(const QString &_st) { //qDebug() << "SetupPageSatsNew::isItAFreq: It is one freq: " << _st << QT_ENDL; bool ok = false; double freq = _st.toDouble(&ok); return ok; } void SetupPageSatsNew::slotDownLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ if ((downlinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = downlinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasDownlink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux << QT_ENDL; } else { //It is just one freq if (isItAFreq(aux)) { } else { hasDownlink = false; } } } } void SetupPageSatsNew::slotModesTextChanged() { /* Format: Single mode: USB Two modes: USB,LSB One mode per up/down USB/LSB */ //qDebug() << "SetupPageSatsNew::slotModesTextChanged: " << modesLineEdit->text() << QT_ENDL; int cursorP = modesLineEdit->cursorPosition(); modesLineEdit->setText((modesLineEdit->text()).toUpper()); QString aux = QString(); QString aux2 = QString(); hasModes = false; if ((modesLineEdit->text()).length()<2) { return; } //qDebug() << "SetupPageSatsNew::slotModesTextChanged: length >=2" << QT_ENDL; QStringList _modes; _modes.clear(); _modes = (modesLineEdit->text()).split(','); //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Starting to process the list" << QT_ENDL; foreach (aux, _modes) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing: " << aux << QT_ENDL; if (aux.contains('/')) {// It s a pair of modes (up and down link) QStringList _pair; _pair.clear(); _pair << aux.split('/'); foreach (aux2, _pair) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing aux2: " << aux2 << QT_ENDL; if (dataProxy->getIdFromModeName(aux2)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: true: " << aux2 << QT_ENDL; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: false: " << aux2 << QT_ENDL; hasModes = false; } } } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: " << aux << QT_ENDL; if (dataProxy->getSubModeIdFromSubMode(aux)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: true: " << aux << QT_ENDL; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: false: " << aux << QT_ENDL; hasModes = false; } } } modesLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::setShortName(const QString st) { shortNameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setName(const QString st) { nameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setUpLink(const QString st) { uplinkLineEdit->setText(st); } void SetupPageSatsNew::setDownLink(const QString st) { downlinkLineEdit->setText(st); } void SetupPageSatsNew::setModes(const QString st) { modesLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::slotOKButtonClicked() { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked" << QT_ENDL; shortName = shortNameLineEdit->text(); name = nameLineEdit->text(); uplink = uplinkLineEdit->text(); downlink = downlinkLineEdit->text(); modes = modesLineEdit->text(); if (hasShortName && hasName && (hasUplink || hasDownlink) && hasModes) { gatherAndSend(); editing = false; close(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Some of the data you have entered is not correct; the satellite can't be added.")); msgBox.exec(); if (!hasShortName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasShortName is FALSE" << QT_ENDL; } else if (!hasName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasName is FALSE" << QT_ENDL; } else if (!hasUplink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasUpLink is FALSE" << QT_ENDL; } else if (!hasDownlink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasDownLink is FALSE" << QT_ENDL; } else if (!hasModes) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasModes is FALSE" << QT_ENDL; } } //close(); } void SetupPageSatsNew::gatherAndSend() { //qDebug() << "SetupPageSatsNew::gatherAndSend: " << QT_ENDL; // The previous lines will be removed once more contest types have been added satData.clear(); satData << shortNameLineEdit->text() << nameLineEdit->text() << downlinkLineEdit->text() << uplinkLineEdit->text() << modesLineEdit->text(); int satId = dataProxy->getDBSatId(shortNameLineEdit->text()); //qDebug() << "SetupPageSatsNew::gatherAndSend: satId: " << QString::number(satId) << QT_ENDL; if ((editing) && (satId>0)) { satData << "1"; editing = false; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text(), satId); } else { satData << "0"; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text()); } //qDebug() << "SetupPageSatsNew::gatherAndSend: EMITED" << QT_ENDL; emit newSatData(satData); } void SetupPageSatsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSatsNew::slotCancelButtonClicked" << QT_ENDL; satData.clear(); clear(); emit cancelled(true); close(); } void SetupPageSatsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } klog-1.8.6/setuppages/setuppagemisc.cpp0000644000175000017500000005147714166020407017215 0ustar develdevel/*************************************************************************** setuppagemisc.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppages/setuppagemisc.h" //TODO: The defaultFileName QString can be removed and used the content of defaultFileNameLineEdit // instead. It is easy to change but the code would not be so clear... Think about this. :-) SetupPageMisc::SetupPageMisc(QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageMisc::SetupPageMisc" << QT_ENDL; util = new Utilities; checkCallsCheckBox = new QCheckBox(tr("Check non-valid calls"), this); imperialCheckBox = new QCheckBox(tr("&Imperial system"), this); realTimeCheckbox = new QCheckBox(tr("&Log in real time"), this); UTCCheckbox = new QCheckBox(tr("&Time in UTC"), this); alwaysADIFCheckBox = new QCheckBox(tr("&Save ADIF on exit"), this); useDefaultName = new QCheckBox(tr("Use this &default filename"), this); sendQSLWhenRecCheckBox = new QCheckBox(tr("Mark &QSO to send QSL when QSL is received"), this); completeWithPreviousCheckBox = new QCheckBox(tr("Complete QSO with previous data")); showStationCallWhenSearchCheckBox = new QCheckBox(tr("Show the Station &Callsign used in the search box"), this); //keepMyDataCheckBox = new QCheckBox(tr("&Reset to My Data for all QSOs"), this); checkNewVersionCheckBox = new QCheckBox(tr("&Check for new versions automatically"), this); provideCallCheckBox = new QCheckBox(tr("&Provide Info for statistics"), this); useDxMarathonCheckBox = new QCheckBox(tr("Manage DX-Marathon"), this); debugLogCheckBox = new QCheckBox(tr("Activate the application debug log")); //logSortCheckBox = new QCheckBox(tr("Sort log based in date && time")); sendEQSLByDefaultSearchCheckBox = new QCheckBox(tr("Mark sent eQSL && LoTW in new QSO as queued")); deleteAlwaysAdiFileCheckBox = new QCheckBox(tr("&Delete always temp ADIF file after uploading QSOs")); dupeTimeLineEdit = new QLineEdit; defaultFileNameLineEdit = new QLineEdit; dbPathLineEdit = new QLineEdit; fileNameButton = new QPushButton (tr("Browse")); dbPushButton = new QPushButton (tr("Browse")); moveDBPushButton = new QPushButton(tr("Move DB")); dbPathApplied = true; createUI(); createActions(); if (areDBPathChangesApplied()) { moveDBPushButton->setEnabled(false); } else { moveDBPushButton->setEnabled(true); } //qDebug() << "SetupPageMisc::SetupPageMisc - END" << QT_ENDL; } SetupPageMisc::~SetupPageMisc(){ //qDebug() << "SetupPageMisc::~SetupPageMisc" << QT_ENDL; } void SetupPageMisc::createUI() { dupeTimeLineEdit->setInputMask("0000000"); dupeTimeLineEdit->setToolTip(tr("In seconds, enter the time range to consider a duplicate if same call, band and mode is entered.")); palWrong.setColor(QPalette::Text, Qt::red); palRight.setColor(QPalette::Text, Qt::black); //TODO: To be removed when the defaultDir is saved in the config file #ifdef Q_OS_WIN //qDebug() << "WINDOWS DETECTED!" << QT_ENDL; klogDir = util->getHomeDir(); // We create the \klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #else //qDebug() << "NO WINDOWS DETECTED!" << QT_ENDL; klogDir = util->getHomeDir(); // We create the ~/.klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #endif dbDirNew = klogDir; // The new path where the DB is to be moved dbDirCurrent = dbDirNew; // The path where the DB is hosted defaultFileNameLineEdit->setReadOnly(false); defaultFileNameLineEdit->setText(defaultFileName); defaultFileNameLineEdit->setEnabled(false); dbPathLineEdit->setReadOnly(false); dbPathLineEdit->setText(dbDirCurrent); dbPathLineEdit->setEnabled(true); useDefaultName->setChecked(true); alwaysADIFCheckBox->setChecked(true); showStationCallWhenSearchCheckBox->setChecked(true); //keepMyDataCheckBox->setChecked(true); completeWithPreviousCheckBox->setChecked(false); debugLogCheckBox->setChecked(false); UTCCheckbox->setChecked(true); realTimeCheckbox->setChecked(true); //logSortCheckBox->setChecked(false); defaultFileNameLineEdit->setEnabled(true); fileNameButton->setEnabled(true); dupeTimeLineEdit->setText("300"); checkCallsCheckBox->setEnabled (true); checkCallsCheckBox->setChecked (true); checkCallsCheckBox->setToolTip (tr("If you disable this checkbox KLog will not check callsigns to identify wrong callsigns.")); sendQSLWhenRecCheckBox->setToolTip(tr("QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours.")); showStationCallWhenSearchCheckBox->setToolTip(tr("The search box will also show the callsign on the air to do the QSO.")); //keepMyDataCheckBox->setToolTip(tr("All the data from the My Data tab will be used or data from the previous QSO will be maintained.")); checkNewVersionCheckBox->setToolTip(tr("Check if there is a new release of KLog available every time you start KLog.")); provideCallCheckBox->setToolTip(tr("If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog.")); imperialCheckBox ->setToolTip(tr("Check it for Imperial system (Miles instead of Kilometers).")); realTimeCheckbox->setToolTip(tr("Select to use real time.")); UTCCheckbox->setToolTip(tr("Select to use UTC time.")); alwaysADIFCheckBox->setToolTip(tr("Select if you want to save to ADIF on exit.")); useDefaultName->setToolTip(tr("Select to use the following name for the logfile without being asked for it again.")); completeWithPreviousCheckBox->setToolTip(tr("Complete the current QSO with previous QSO data.")); useDxMarathonCheckBox->setToolTip(tr("Select if you want to manage DX-Marathon.")); defaultFileNameLineEdit->setToolTip(tr("This is the default file where ADIF data will be saved.")); dbPathLineEdit->setToolTip(tr("This is the directory where the database (logbook.dat) will be saved.")); fileNameButton->setToolTip(tr("Click to change the default ADIF file.")); dbPushButton->setToolTip(tr("Click to change the path of the database.")); moveDBPushButton->setToolTip(tr("Click to move the DB to the new directory.")); debugLogCheckBox->setToolTip(tr("Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory.")); //logSortCheckBox->setToolTip(tr("Click to enable that log will be sorted based on date and time when clicking on the date column. It may be a little bit slower.")); sendEQSLByDefaultSearchCheckBox->setToolTip(tr("Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default.")); deleteAlwaysAdiFileCheckBox->setToolTip(tr("Delete Always the adif file created after uploading QSOs")); QHBoxLayout *fileLayout = new QHBoxLayout; fileLayout->addWidget(useDefaultName); fileLayout->addWidget(defaultFileNameLineEdit); fileLayout->addWidget(fileNameButton); QHBoxLayout *dbLayout = new QHBoxLayout; dbLayout->addWidget(dbPathLineEdit); dbLayout->addWidget(dbPushButton); dbLayout->addWidget(moveDBPushButton); QLabel *timeRangeLabel = new QLabel; timeRangeLabel->setText(tr("Dupe time range:")); QHBoxLayout *timeRangeLayout = new QHBoxLayout; timeRangeLayout->addWidget(timeRangeLabel); timeRangeLayout->addWidget(dupeTimeLineEdit); QGridLayout *mainLayou1 = new QGridLayout; mainLayou1->addLayout(fileLayout, 0, 0, 1, -1); mainLayou1->addLayout(dbLayout, 1, 0, 1, -1); mainLayou1->addWidget(alwaysADIFCheckBox, 2, 0, 1, 1); mainLayou1->addWidget(debugLogCheckBox, 2, 1, 1, 1); mainLayou1->addWidget(UTCCheckbox, 3, 0, 1, 1); mainLayou1->addWidget(realTimeCheckbox, 3, 1, 1, 1); mainLayou1->addWidget(imperialCheckBox, 4, 0, 1, 1); mainLayou1->addWidget(useDxMarathonCheckBox, 4, 1, 1, 1); mainLayou1->addLayout(timeRangeLayout, 5, 0, 1, 1); mainLayou1->addWidget(completeWithPreviousCheckBox, 5, 1, 1, 1); mainLayou1->addWidget(sendQSLWhenRecCheckBox,6, 0, 1, 1); mainLayou1->addWidget(sendEQSLByDefaultSearchCheckBox, 6, 1, 1, 1); mainLayou1->addWidget(checkNewVersionCheckBox, 7, 0, 1, 1); mainLayou1->addWidget(provideCallCheckBox, 7, 1, 1, 1); //mainLayou1->addWidget(logSortCheckBox, 8, 0, 1, 1); mainLayou1->addWidget(showStationCallWhenSearchCheckBox, 8, 0, 1, 1); mainLayou1->addWidget(deleteAlwaysAdiFileCheckBox, 8, 1, 1, 1); mainLayou1->addWidget (checkCallsCheckBox, 9, 0, 1, 1); setLayout(mainLayou1); } void SetupPageMisc::createActions(){ //void itemDoubleClicked ( QListWidgetItem * item ) connect(fileNameButton, SIGNAL(clicked() ), this, SLOT(slotOpenFileButtonClicked() ) ); connect(useDefaultName, SIGNAL(stateChanged(int) ), this, SLOT(slotUseDefaultButtonStateChanged(int) ) ); connect(defaultFileNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDefaultFileNameLineEditChanged() ) ); connect(checkNewVersionCheckBox, SIGNAL(clicked() ), this, SLOT(slotcheckNewVersionCheckBoxClicked() ) ); connect(dbPushButton, SIGNAL(clicked() ), this, SLOT(slotDBButtonClicked() ) ); connect(dbPathLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDBLineEditChanged() ) ); connect(moveDBPushButton, SIGNAL(clicked() ), this, SLOT(slotMoveDBButtonClicked() ) ); //connect(UDPServerCheckBox, SIGNAL(clicked () ), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } void SetupPageMisc::setDeleteAlwaysAdiFile(const bool &_t){ deleteAlwaysAdiFileCheckBox->setChecked(_t); //qDebug() << "SetupPageMisc::setDeleteAlwaysAdiFile - DELETEALWAYSADIFILE = " << _t << QT_ENDL; } QString SetupPageMisc::getDeleteAlwaysAdiFile(){ return util->boolToQString(deleteAlwaysAdiFileCheckBox->isChecked()); } QString SetupPageMisc::getSendEQSLByDefault(){ return util->boolToQString(sendEQSLByDefaultSearchCheckBox->isChecked()); } void SetupPageMisc::setSetEQSLByDefault(const QString &_t){ sendEQSLByDefaultSearchCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getRealTime(){ return util->boolToQString(realTimeCheckbox->isChecked()); } void SetupPageMisc::setRealTime(const QString &_t) { realTimeCheckbox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getUTCTime(){ return util->boolToQString(UTCCheckbox->isChecked()); } void SetupPageMisc::setUTCTime(const QString &_t) { UTCCheckbox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getAlwaysADIF() { return util->boolToQString(alwaysADIFCheckBox->isChecked()); } void SetupPageMisc::setAlwaysADIF(const QString &_t) { // Defaul value is false alwaysADIFCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDefaultFileName() { return defaultFileName; } void SetupPageMisc::setDefaultFileName(const QString &_t) { //qDebug() << "SetupPageMisc::setDefaultFileName: " << _t << QT_ENDL; defaultFileName = _t; defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotOpenFileButtonClicked() { defaultFileName = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, "ADIF (*.adi)"); defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotDefaultFileNameLineEditChanged() { //setDefaultFileName(); defaultFileName = defaultFileNameLineEdit->text(); } QString SetupPageMisc::getUseDefaultName() { return util->boolToQString(useDefaultName->isChecked()); } void SetupPageMisc::setUseDefaultName(const QString &_t) { useDefaultName->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getImperial() { return util->boolToQString(imperialCheckBox->isChecked()); } void SetupPageMisc::setImperial(const QString &_t) { imperialCheckBox->setChecked(util->trueOrFalse(_t)); } void SetupPageMisc::slotUseDefaultButtonStateChanged(int state) { //qDebug() << "SetupPageMisc::slotUseDefaultButtonStateChanged" << QT_ENDL; if (state) { defaultFileNameLineEdit->setEnabled(true); moveDBPushButton->setEnabled(true); } else { defaultFileNameLineEdit->setEnabled(false); moveDBPushButton->setEnabled(false); } } QString SetupPageMisc::getSendQSLWhenRec() { return util->boolToQString(sendQSLWhenRecCheckBox->isChecked()); } void SetupPageMisc::setSendQSLWhenRec(const QString &_t) { sendQSLWhenRecCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getShowStationCallSignInSearch() { return util->boolToQString(showStationCallWhenSearchCheckBox->isChecked()); } void SetupPageMisc::setShowStationCallSignInSearch(const QString &_t) { showStationCallWhenSearchCheckBox->setChecked(util->trueOrFalse(_t)); } /* QString SetupPageMisc::getKeepMyData() { return util->boolToQString(keepMyDataCheckBox->isChecked()); } void SetupPageMisc::setKeepMyData(const QString &_t) { keepMyDataCheckBox->setChecked(util->trueOrFalse(_t)); } */ QString SetupPageMisc::getCompleteWithPrevious() { return util->boolToQString(completeWithPreviousCheckBox->isChecked()); } void SetupPageMisc::setCompleteWithPrevious(const QString &_t) { completeWithPreviousCheckBox->setChecked(util->trueOrFalse(_t)); } void SetupPageMisc::slotcheckNewVersionCheckBoxClicked() { if (checkNewVersionCheckBox->isChecked()) { provideCallCheckBox->setEnabled(true); } else { provideCallCheckBox->setEnabled(false); provideCallCheckBox->setChecked(false); } } QString SetupPageMisc::getCheckNewVersions() { return util->boolToQString(checkNewVersionCheckBox->isChecked()); } void SetupPageMisc::setCheckNewVersions(const QString &_t) { checkNewVersionCheckBox->setChecked(util->trueOrFalse(_t)); } bool SetupPageMisc::getReportInfo() { return checkNewVersionCheckBox->isChecked(); } void SetupPageMisc::setReportInfo(const QString &_t) { provideCallCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDefaultDBPath() { return dbDirCurrent; } void SetupPageMisc::setUseDefaultDBPath(const QString &_t) { dbDirCurrent = _t; dbPathLineEdit->setText(dbDirCurrent); } QString SetupPageMisc::getDXMarathon(){ return util->boolToQString(useDxMarathonCheckBox->isChecked()); } void SetupPageMisc::setDXMarathon(const QString &_t){ //QString st = t; useDxMarathonCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDebugLog() { return util->boolToQString(debugLogCheckBox->isChecked()); } void SetupPageMisc::setDebugLog(const QString &_t) { debugLogCheckBox->setChecked(util->trueOrFalse(_t)); } void SetupPageMisc::slotDBButtonClicked() { // QString dbDirBack = dbDir; QString dir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), dbDirCurrent, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.length()>=1) { dbDirNew = dir; } dbPathLineEdit->setText(dbDirNew); if (dbDirCurrent == dbDirNew) { dbPathApplied = true; } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } //setUseDefaultDBPath(dbDirNew); } void SetupPageMisc::slotDBLineEditChanged() { //qDebug() << "SetupPageMisc::slotDBLineEditChanged: " << dbPathLineEdit->text() << QT_ENDL; QString aux; aux = dbPathLineEdit->text(); if ( QFile::exists(aux) ) { dbPathLineEdit->setToolTip(tr("This is the directory where DB (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palRight); dbDirNew = dbPathLineEdit->text(); } else { dbPathLineEdit->setToolTip(tr("Please specify an existing directory where the database (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palWrong); } if (dbDirCurrent == dbDirNew) { dbPathApplied = true; moveDBPushButton->setEnabled(false); } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } } void SetupPageMisc::slotMoveDBButtonClicked() { QString source = dbDirCurrent + "/logbook.dat"; QString target = dbDirNew + "/logbook.dat"; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Move DB")); //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (source): " << source << QT_ENDL; //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target): " << target << QT_ENDL; if ( QFile::exists(dbDirNew) ) { //dbDirCurrent //dbDir if (QFile::exists(target)) { //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target EXISTS): " << target << QT_ENDL; } if (QFile::copy(source, target)) { dbDirCurrent = dbDirNew; if (QFile::remove(source)) { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File moved")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File copied")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); if (QFile::exists(target)) { //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target EXISTS): " << target << QT_ENDL; msgBox.setText(tr("File already exist.")); msgBox.setDetailedText(tr("The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file.")); } else { msgBox.setText(tr("File NOT copied")); msgBox.setDetailedText(tr("The file was not copied due to an unknown problem.")); } msgBox.exec(); dbPathApplied = false; moveDBPushButton->setEnabled(true); } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The target directory does not exist. Please select an existing directory.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = false; moveDBPushButton->setEnabled(true); } } bool SetupPageMisc::areDBPathChangesApplied() { return dbPathApplied; } void SetupPageMisc::setDupeTime(const int _t) { dupeTimeLineEdit->setText(QString::number(_t)); } int SetupPageMisc::getDupeTime() { return dupeTimeLineEdit->text().toInt(); } bool SetupPageMisc::getCheckCalls() { return checkCallsCheckBox->isChecked (); } void SetupPageMisc::setCheckCalls(const bool &_t) { checkCallsCheckBox->setChecked (_t); } klog-1.8.6/elogclublog.cpp0000644000175000017500000006433314166020407014455 0ustar develdevel/*************************************************************************** elogclublog.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "elogclublog.h" #include #include #include #include //#include //https://clublog.freshdesk.com/support/solutions/59800 eLogClubLog::eLogClubLog() { //qDebug()<< "eLogClubLog::eLogClubLog" << QT_ENDL; //email = QString(); //pass = QString(); qsos.clear(); api = "9467beee93377e82a276b0a777d388b5c933d044"; currentQSO = -1; manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); //stationCallsign = QString(); uploadingFile = false; util = new Utilities; //qDebug()<< "eLogClubLog::eLogClubLog - END" << QT_ENDL; } eLogClubLog::~eLogClubLog() { //qDebug()<< "eLogClubLog::~eLogClubLog" << QT_ENDL; } void eLogClubLog::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished" << QT_ENDL; result = data->error(); //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = " << QString::number(result) << QT_ENDL; const QByteArray sdata = data->readAll(); QString text = QString(); if (currentQSO>0) { emit actionReturnDownload(result, currentQSO); currentQSO = -1; } if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug()<< sdata; //qDebug()<< "eLogClubLog::slotQsoUploadFinished - NO ERROR" << QT_ENDL; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(result, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = Host Not found! = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = Time out error! = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } /* else if (result == 201) { text = "ClubLog: " + tr("It seems to be a CREDENTIALS ERROR; check your email and password."); int i = QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("It seems that your ClubLog credentials are not correct.") + "\n" + tr("Please check your credentials in the setup. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); } else if (result == 202) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = Password Error! = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("It seems to be a PASSWORD ERROR; check your password."); int i = QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("It seems that your ClubLog password is not correct.") + "\n" + tr("Please check your password in the setup. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); //TODO: Mark the previous QSO as not sent to clublog } */ else if (result == 203) { text = "ClubLog: " + tr("QSO dupe or not existing (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("We have received an undefined error from Clublog (%1)").arg(result) + "\n" + tr("This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO."), QMessageBox::Ok); } else { //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = UNDEFINED = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Undefined error number (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("We have received an undefined error from Clublog (%1)").arg(result) + "\n" + tr("Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); //TODO: Mark the previous QSO as not sent to clublog } //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result = " << QString::number(result) << QT_ENDL; //qDebug()<< "eLogClubLog::slotQsoUploadFinished - Result Text = " << text << QT_ENDL; //emit done(); //emit signalFileUploaded(result, qsos); emit showMessage(text); } void eLogClubLog::slotFileUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotFileUploadFinished" << QT_ENDL; result = data->error(); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result) << QT_ENDL; const QByteArray sdata = data->readAll(); QString text; if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = NoError = " << QString::number(result) << QT_ENDL; //qDebug()<< sdata; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Host Not found! = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Host not found!"); } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Time out error! = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Timeout error!"); } else { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = UNDEFINED = " << QString::number(result) << QT_ENDL; text = "ClubLog: " + tr("Undefined error..."); } //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result) << QT_ENDL; //emit done(); emit showMessage(text); } void eLogClubLog::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eLogClubLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; //qDebug()<< received << total; emit actionShowProgres(received, total); } void eLogClubLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eLogClubLog::slotErrorManagement: " << QString::number(networkError) << QT_ENDL; result = networkError; if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotErrorManagement: Host not found" << QT_ENDL; } else { //qDebug()<< "eLogClubLog::slotErrorManagement: ERROR!" << QT_ENDL; } //actionError(result); } int eLogClubLog::sendQSO(QStringList _qso) { //qDebug() << "eLogClubLog::sendQSO: " << email << "/" << pass << "/" << api << QT_ENDL; //qDebug()<< "eLogClubLog::sendQSO:: length = " << QString::number(_qso.length()) << QT_ENDL; // First Data in the QStringList is the QSO id, not to be sent to clublog but used in the signal actionReturnDownload(const int _i, const int _qsoId); for(int i = 0; i<_qso.length(); i++) { //qDebug()<< "eLogClubLog::sendQSO = qso-at: "<< QString::number(i) << "- " << _qso.at(i) << QT_ENDL; } if (_qso.length()!=18) { //qDebug() << "eLogClubLog::sendQSO:: length - END" << QT_ENDL; return -1; } currentQSO = (_qso.at(0)).toInt(); _qso.removeFirst(); //_qso.removeFirst(); //qDebug()<< "eLogClubLog::sendQSO CALL TO USE (before checking): " << _qso.at(16) << QT_ENDL; //qDebug()<< "eLogClubLog::sendQSO default StationCallsign): " << stationCallsign << QT_ENDL; QString tempCall = _qso.at(16); if (tempCall.length()<1) { tempCall = stationCallsign; } //qDebug()<< "eLogClubLog::sendQSO CALL TO USE: " << tempCall << QT_ENDL; _qso.removeLast(); QString qso = getClubLogAdif(_qso); //qDebug()<< "eLogClubLog::sendQSO: " << qso << QT_ENDL; QUrlQuery params; params.addQueryItem("adif",qso); //qDebug() << "eLogClubLog::sendQSO: QSO: " << qso << QT_ENDL; //qDebug() << "eLogClubLog::sendQSO: END" << QT_ENDL; uploadingFile = false; return sendDataParams(tempCall, params, true); //return sendData(tempCall, qso); } /* int eLogClubLog::deleteQSOid(const int _qsoId) { //qDebug()<< "eLogClubLog::deleteQSOid: " << QString::number(_qsoId) << QT_ENDL; // email, password, callsign, dxcall, datetime, bandid, api QString dxcall, datatime, bandid; QUrlQuery params; params } */ int eLogClubLog::sendDataParams(const QString &_clublogCall, const QUrlQuery &_params, bool _adding) { //qDebug()<< "eLogClubLog::sendDataParams: Call: " << _clublogCall << QT_ENDL; //qDebug()<< "eLogClubLog::sendDataParams: Params: " << _params.query(QUrl::FullyEncoded).toUtf8() << QT_ENDL; //qDebug()<< "eLogClubLog::sendDataParams: email = " << email << QT_ENDL; //qDebug()<< "eLogClubLog::sendDataParams: Pass = " << pass << QT_ENDL; QUrl serviceUrl; if (_adding) { serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); } else { serviceUrl = QUrl("https://secure.clublog.org/delete.php"); } QByteArray postData; QUrlQuery params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if (_clublogCall.length()>2) { params.addQueryItem("callsign",_clublogCall); //qDebug()<< "eLogClubLog::sendDataParams - callsign 1: " << _clublogCall << QT_ENDL; } else { params.addQueryItem("callsign",stationCallsign); } //qDebug()<< "eLogClubLog::sendDataParams - query before send/delete: " << params.query(QUrl::FullyEncoded).toUtf8() << QT_ENDL; if (_adding) { params.addQueryItem("api",api); postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); //TODO: ADD the params } else { //TODO: ADD the params postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8() ; params.setQuery(postData); params.addQueryItem("api",api); } postData = params.query(QUrl::FullyEncoded).toUtf8(); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); manager->post(request, postData); //qDebug()<< "eLogClubLog::sendDataParams - END" << QT_ENDL; return -1; } /* int eLogClubLog::sendData(const QString &_clublogCall, const QString &_q) { //qDebug()<< "eLogClubLog::sendData: " << _q << QT_ENDL; QUrl serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); QByteArray postData; //QByteArray postData; QUrlQuery params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if (_clublogCall.length()>2) { params.addQueryItem("callsign",_clublogCall); //qDebug()<< "eLogClubLog::sendData - callsign 1: " << _clublogCall << QT_ENDL; } else { params.addQueryItem("callsign",stationCallsign); //ERROR } params.addQueryItem("api",api); params.addQueryItem("adif",_q); postData = params.query(QUrl::FullyEncoded).toUtf8(); //qDebug()<< "eLogClubLog::sendData - query: " << postData << QT_ENDL; //postData = params.encodedQuery(); // Call the webservice //QNetworkAccessManager *networkManager = new QNetworkAccessManager; QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); manager->post(request, postData); return -1; } */ QString eLogClubLog::getClubLogAdif(const QStringList _q) { //qDebug() << "eLogClubLog::getClubLogAdif: " << QString::number(_q.length()) << QT_ENDL; // _qso must include 16 ordered fields than can be empty or contain data. This function builds the ADIF QSO /* http://clublog.freshdesk.com/support/solutions/articles/53202-which-adif-fields-does-club-log-use- ClubLog only accepts the following ADIF fields: QSO_DATE TIME_ON TIME_OFF (this is stored independently and used for log matching as well as ADIF exports) QSLRDATE QSLSDATE CALL OPERATOR MODE BAND BAND_RX FREQ QSL_RCVD LOTW_QSL_RCVD QSL_SENT DXCC PROP_MODE CREDIT_GRANTED RST_SENT RST_RCVD NOTES */ if (_q.length()!=16) { return QString(); } for (int i = 0; i< _q.length(); i++) { //qDebug()<< QString("eLogClubLog::getClubLogAdif: (%1): %2").arg(i).arg(_q.at(i)) << QT_ENDL; } QString qso, aux1; qso.clear(); aux1 = _q.at(0); //qDebug()<< "eLogClubLog::getClubLogAdif: Date: " << _q.at(0) << QT_ENDL; if (QDate::fromString(aux1, "yyyyMMdd").isValid()){ qso = "" + aux1 + " "; } else { //qDebug() << "eLogClubLog::getClubLogAdif: END error " << QT_ENDL; return QString(); } //qso = "" + _q.at(0) + " "; qso = qso + "" + _q.at(1) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 10" << QT_ENDL; if ((_q.at(2)).length()>0) { qso = qso + "" + _q.at(2) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 20" << QT_ENDL; if ((_q.at(3)).length()>0) { qso = qso + "" + _q.at(3) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 30" << QT_ENDL; qso = qso + "" + _q.at(4) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 40" << QT_ENDL; if ((_q.at(5)).length()>0) { qso = qso + "" + _q.at(5) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 50" << QT_ENDL; qso = qso + "" + _q.at(6) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 60" << QT_ENDL; qso = qso + "" + _q.at(7) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 70" << QT_ENDL; if ((_q.at(8)).length()> 2) { qso = qso + "" + _q.at(8) + " "; } if ((_q.at(9)).length()> 2) { qso = qso + "" + _q.at(9) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 90" << QT_ENDL; qso = qso + "" + _q.at(10) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" << QT_ENDL; qso = qso + "" + _q.at(11) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 110" << QT_ENDL; //qso = qso + "" + _q.at(12) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 120" << QT_ENDL; if ((_q.at(13)).toInt()> 0) { qso = qso + "" + _q.at(13) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 130'" << QT_ENDL; if ((_q.at(14)).toInt()> 0) { qso = qso + "" + _q.at(14) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 140" << QT_ENDL; if ((_q.at(15)).length()>0) { qso = qso + "" + _q.at(15) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 150" << QT_ENDL; qso = qso + ""; //qDebug()<< "eLogClubLog:: - QSO: " << qso << QT_ENDL; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" << QT_ENDL; return qso; } void eLogClubLog::setCredentials(const QString &_email, const QString &_pass, const QString &_defaultStationCallsign) { //qDebug()<< "eLogClubLog::setCredentials: email: " << _email << " / Pass: " << _pass << " / StationCallsign: " << _defaultStationCallsign << QT_ENDL; stationCallsign = _defaultStationCallsign; email = _email; pass = _pass; } int eLogClubLog::deleteQSO(QStringList _qso) { //qDebug()<< "eLogClubLog::deleteQSO: length = " << QString::number(_qso.length()) << QT_ENDL; //qDebug()<< "eLogClubLog::deleteQSO: " << email << "/" << pass << "/" << api << QT_ENDL; //qDebug()<< "eLogClubLog::deleteQSO: email = " << email << QT_ENDL; //qDebug()<< "eLogClubLog::deleteQSO: Pass = " << pass << QT_ENDL; // email, password, callsign, dxcall, datetime (sqlite format, not ADIF), bandid (only the number, not ADIF), api if (_qso.length()!=18) { return -1; } for (int i = 0; i<_qso.length(); i++) { //qDebug()<< QString("eLogClubLog::deleteQSO: qso.at(%1) = %2").arg(i).arg(_qso.at(i)) << QT_ENDL; } QString dxcall, sdateTime, bandid; QString tempCall = _qso.at(17); if (tempCall.length()<1) { tempCall = stationCallsign; } dxcall = _qso.at(5); QDateTime dateTime; dateTime.setDate(QDate::fromString(_qso.at(1), "yyyyMMdd")); dateTime.setTime(QTime::fromString(_qso.at(2), "HHmmss")); if (!dateTime.isValid()) { return -1; } sdateTime = dateTime.toString("yyyy-MM-dd HH:mm:ss"); //qDebug()<< QString("eLogClubLog::deleteQSO: DateTime = %1").arg(sdateTime) << QT_ENDL; //qDebug()<< QString("eLogClubLog::deleteQSO: band-1: ") << _qso.at(8) << QT_ENDL; bandid = (_qso.at(8)).chopped(1); //qDebug()<< QString("eLogClubLog::deleteQSO: band-2: ") << bandid << QT_ENDL; bool ok; bandid.toInt(&ok); if (!ok) { // This check is to capture potential QSOs in 222Mhz (AKA 1.25) bandid = bandid.chopped(1); //qDebug()<< QString("eLogClubLog::deleteQSO: band-3: ") << bandid << QT_ENDL; } //qDebug()<< QString("eLogClubLog::deleteQSO: bandid = %1").arg(bandid) << QT_ENDL; if (bandid.toInt()<=0) { return -2; } QUrlQuery params; params.addQueryItem("dxcall", dxcall); params.addQueryItem("datetime", sdateTime); params.addQueryItem("bandid", bandid); //params.addQueryItem("adif",qso); uploadingFile = false; return sendDataParams(tempCall, params, false); //return sendData(qso); } QString eLogClubLog::prepareToTranslate(const QString &_m) { //qDebug()<< "eLogClubLog:: = prepareToTranslate" << _m << QT_ENDL; if (_m == "Callsign missing") { return tr("Callsign missing"); } else if (_m == "Invalid callsign") { return tr("Invalid callsign"); } else if (_m == "Skipping SWL callsign") { return tr("Skipping SWL callsign"); } else if (_m == "Callsign is your own call") { return tr("Callsign is your own call"); } else if (_m == "Invalid callsign with no DXCC mapping") { return tr("Invalid callsign with no DXCC mapping"); } else if (_m == "Updated QSO") { return tr("Updated QSO"); } else if (_m == "Invalid ADIF record") { return tr("Invalid ADIF record"); } else if (_m == "Missing ADIF record") { return tr("Missing ADIF record"); } else if (_m == "Test mode - parameters ok, no action taken") { return tr("Test mode - parameters ok, no action taken"); } else if (_m == "Excessive API Usage") { return tr("Excessive API Usage"); } else if (_m == "Internal Error") { return tr("Internal Error"); } else if (_m == "Rejected") { return tr("Rejected"); } else if (_m == "QSO Duplicate") { return tr("QSO Duplicate"); } else if (_m == "QSO Modified") { return tr("QSO Modified"); } else if (_m == "Missing Login") { return tr("Missing Login"); } else if (_m == "QSO OK") { return tr("QSO OK"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "No callsign selected") { return tr("No callsign selected"); } else if (_m == "No match found") { return tr("No match found"); } else if (_m == "Dropped QSO") { return tr("Dropped QSO"); } else if (_m == "OK") { return tr("OK"); } else if (_m == "Login rejected") { return tr("Login rejected"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "Rejected: Callsign is your own call") { return tr("Rejected: Callsign is your own call"); } else { return _m; } } int eLogClubLog::modifyQSO (QStringList _oldQSO, QStringList _newQSO) { //qDebug()<< QString("eLogClubLog::modifyQSO") << QT_ENDL; int x = -1; x = deleteQSO(_oldQSO); x = sendQSO(_newQSO); return x; } void eLogClubLog::sendLogFile(const QString &_file, QList _qso, bool _overwrite) { //qDebug()<< "eLogClubLog::sendLogFile: " << _file << QT_ENDL; qsos.clear(); qsos.append(_qso); QUrl serviceUrl; serviceUrl = QUrl("https://clublog.org/putlogs.php"); QByteArray postData; QUrlQuery params; // FIRST PARAMS is the file QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QByteArray blob; //QFile *file = new QFile("_file"); QFile *file = new QFile(util->getClubLogFile()); if (file->open(QIODevice::ReadOnly)) /* Flawfinder: ignore */ { blob = file->readAll(); } else { //qDebug()<< "eLogClubLog::sendLogFile: ERROR File not opened" << QT_ENDL; return; } file->close(); // The rest of the form goes as usual //qDebug()<< "eLogClubLog::sendLogFile: email: " << email << QT_ENDL; //qDebug()<< "eLogClubLog::sendLogFile: pass: " << pass << QT_ENDL; //qDebug()<< "eLogClubLog::sendLogFile: stationcall: " << stationCallsign << QT_ENDL; //qDebug()<< "eLogClubLog::sendLogFile: api: " << api << QT_ENDL; QHttpPart emailPart; emailPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"email\"")); emailPart.setBody(email.toUtf8()); QHttpPart passPart; passPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"password\"")); passPart.setBody(pass.toUtf8()); QHttpPart callPart; callPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"callsign\"")); callPart.setBody(stationCallsign.toUtf8()); QHttpPart apiPart; apiPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api\"")); apiPart.setBody(api.toUtf8()); QString one; if (_overwrite) { one = QString("1"); } else { one = QString("0"); } //QString one = QString("1"); QHttpPart clearPart; clearPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"clear\"")); clearPart.setBody(one.toUtf8()); QHttpPart filePart; QString aux = QString("form-data; name=\"file\"; filename=\"%1\"").arg(_file); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(aux)); filePart.setBody(blob); multiPart->append(filePart); multiPart->append(emailPart); multiPart->append(passPart); multiPart->append(callPart); multiPart->append(clearPart); multiPart->append(apiPart); uploadingFile = true; QNetworkRequest request(serviceUrl); manager->post(request, multiPart); //multiPart->setParent(reply); //qDebug()<< "eLogClubLog::sendLogFile - END" << QT_ENDL; } klog-1.8.6/softwareupdate.h0000644000175000017500000000702614166020407014655 0ustar develdevel#ifndef SOFTWAREUPDATE_H #define SOFTWAREUPDATE_H /*************************************************************************** softwareupdate.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include //#include //#include //#include #include //#include #include "utilities.h" #include "softwareupdatedialog.h" class QSslError; class SoftwareUpdate: public QObject { Q_OBJECT public: SoftwareUpdate(const QString &_klogVersion); ~SoftwareUpdate(); void addCall(const QString &_call); void needToUpdate(bool _showWithoutVersion=false); void setVersion(const QString &_klogVersion); private slots: void slotReadyRead(); //void slotError(int _p); //void slotSslErrors(QList _p); //void replyFinished(QNetworkReply *data); void slotDownloadFinished(QNetworkReply *reply); signals: void updateNeededSignal(const bool _q); // Will be TRUE if updated if needed and FALSE if we already have the latest version private: void connectToURL(const QString &_url); bool checkUpdates(QIODevice *data); void updateNeeded(const QString &_newVer); //void setTheURL(QString _url); void setHeader(); void findOS(const int _os); QString findMatch(QRegularExpression rx, const QString & fileExtension, const QStringList &data); Utilities *util; QString klogVersion, latestVersion, callsign; QString urld; QString OSString; int OSVersion; QUrl *url; //QNetworkAccessManager *manager; QNetworkRequest request; SoftwareUpdateDialog *updateDialog; //int result; //bool toUpdate; bool repositoryFound; // True when the versions have been checked to prevent multiple qmessagebox due to redirections bool messageShown; }; #endif // SOFTWAREUPDATE_H klog-1.8.6/locator.h0000644000175000017500000000633214166020407013262 0ustar develdevel/*************************************************************************** locator.h - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #ifndef LOCATOR_H #define LOCATOR_H #include #include #include const double PI = 3.141592654; //http://en.wikipedia.org/wiki/Pi const bool LATITUDE = false; const bool LONGITUDE = true; const double EARTH_RADIUS = 6371; //http://en.wikipedia.org/wiki/Earth_radius const double RADIAN = 180.0/PI; const double DEG_TO_RAD = PI/180.0; const double KM_IN_A_MILE = 1.609344; class Locator{ public: Locator(); ~Locator(); bool isValidLocator(const QString& tlocator); double getLat(const QString& tlocator); double getLon(const QString& tlocator); QString getLocator(const double lon1, const double lat1) const; int getBeam(const double lon1, const double lat1, const double lon2, const double lat2); int getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2); int getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem); int getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem); //int getDistanceMilles(const double lon1, const double lat1, const double lon2, const double lat2); //void degTodms(const double deg); //double dmsTodeg (int deg, int min, int sec); bool checkCoords(const double lon1, const double lat1); private: //bool valid; //QString myLocator; //QString testLocator; //QString otherLocator; //QChar theChar; //double my_lon, my_lat, other_lon, other_lat, beam, testNumb; //int ideg, imin, isec; }; #endif klog-1.8.6/logmodel.cpp0000644000175000017500000001250214166020407013750 0ustar develdevel/*************************************************************************** logmodel.cpp - description ------------------- begin : june 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "logmodel.h" LogModel::LogModel(DataProxy_SQLite *dp, QObject *parent):QSqlRelationalTableModel(parent) { //qDebug() << Q_FUNC_INFO ; //logModel = new QSqlRelationalTableModel(this); dataProxy = dp; util = new Utilities; //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns = dataProxy->filterValidFields(util->getDefaultLogFields()); setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); //qDebug() << Q_FUNC_INFO << " - END"; } void LogModel::createlogModel(const int _i) { /* Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 setRelation ( int column, const QSqlRelation & relation ) model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); The setRelation() call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. */ /* This should be coherent with the logview */ //qDebug() << Q_FUNC_INFO ; QString stringQuery = QString("lognumber='%1'").arg(_i); //QSqlQuery query(stringQuery); setFilter(stringQuery); setColumns(columns); select(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogModel::setColumns(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO ; //QString auxt; //foreach(auxt, _columns) //{ // //qDebug() << Q_FUNC_INFO << ": " << auxt; //} columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(_columns); QSqlQuery q; QString stringQuery = QString("SELECT * from log LIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; bool sqlOK = q.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().nativeErrorCode(), q.lastQuery()); } q.next(); rec = q.record(); // Number of columns //qDebug() << "LogModel::createlogModel - columns: " << QString::number(rec.count()) << QT_ENDL; if (_columns.contains("bandid")) { nameCol = rec.indexOf("bandid"); setRelation(nameCol, QSqlRelation("band", "id", "name")); } if (_columns.contains("band_rx")) { nameCol = rec.indexOf("band_rx"); setRelation(nameCol, QSqlRelation("band", "id", "name")); } if (_columns.contains("modeid")) { nameCol = rec.indexOf("modeid"); setRelation(nameCol, QSqlRelation("mode", "id", "submode")); } if (_columns.contains("dxcc")) { nameCol = rec.indexOf("dxcc"); setRelation(nameCol, QSqlRelation("entity", "dxcc", "name")); } nameCol = rec.indexOf("id"); setSort(nameCol, Qt::AscendingOrder); QString aux; foreach(aux, columns) { nameCol = rec.indexOf(aux); setHeaderData(nameCol, Qt::Horizontal, util->getLogColumnName(aux)); //qDebug() << Q_FUNC_INFO << ": - " << aux; } //qDebug() << Q_FUNC_INFO << " - END"; } /* void LogModel::showColumn(const QString &_columnName) { QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int nameCol = rec.indexOf(_columnName); setHeaderData(nameCol, Qt::Horizontal, _columnName); } */ klog-1.8.6/aboutdialog.h0000644000175000017500000000412314166020407014105 0ustar develdevel#ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H /*************************************************************************** aboutdialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ class QEvent; #include #include class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(const QString &tversion, QWidget *parent = nullptr); ~AboutDialog(); bool event(QEvent *event); private: QTabWidget *tabw; QWidget *tab1, *tab2, *tab3, *tab4; }; #endif // ABOUTDIALOG_H klog-1.8.6/klog.ico0000644000175000017500000032473514166020407013110 0ustar develdevel ǩPNG  IHDRx IDATxwxŵ[Ҫf⊻ز1z %M#!b !&!_ \XЌ{rQ_i;?feKldIyYiv9̙3 B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!שD7@0 ҁ4A@a >4Z [ B: 8,`0(r\.WzaaaYvvvYVVVQFFFLKKKs8nbe`YRJ)˲ZsFڶvGkm۶mH$bH0~_sss}ssaϷyڇ  BG$"yXh(333oذaSdeee GjjJKKSn[E"D"DLg(H۶}mnmhTEQhHGoǮmc(\J)ҭo eYZt(#vccccSSuLp>Pwf! Z;Nsرcg 6ltiii:222,׫" *DB* p8L8&;;۵6AAsQeYڲ,[YBYv8H$b~; p8l766mͶ&M%a%!B$;&;CVedd8rss-m* p8L0  p(tL}`NaYeY6JE~A666lhhx7 ^BBLO1c‘#GJ-((pn B*U(2mx?WtM)p3Җ B߯@i[cccz"+v!' =)b`3*g̘qFqqqV~~#== * 'wD ]q޿,Hc?m5(*ˊh }>߾a $X<`=3&;-˲pDgvIy#gv~1J)m9a RP( і]Pd@ Rqjs***_paȑ#3JKK]n 4(K HP:uYw;u]m9=6?V!4DmCP( CpM߀! "]7Ͳ-|ƌc vh'pO!w3m@ @0$ FZW~  XNӉr²,s:N͵j& ?L"! 8-[ &VTTjniY~I:x:u---~N:55۝' Ávvq8G qp"FCPCH-yx zIO!ڛdYև-[vӇ 6mG)wd8CwOG0:xzh>}N)u$@pFZG ?N@&b=&DR@={',X0vĈ).57ب΁N PW[޽{9X]?H#i8#x/@GJ,cw{ $k/Kƌh~'kO¾ٻ{7I9\ߵh~4Db- a$MR꺥K~f֬Y` T0}gh4Jmm----ݻ۶Q__-z X _.0!NB1XLe]vرc332Qu:پu+;o'&6* 1y?Kl˄b s7ssδѣGAȲ=8vY^ٝ9~~mm-{eu'!h-;@ĶJC1:?3s̢ gC]UZSWWGMm-֯z,4b@SW+/ M`eY7.[SLLz555V|pοuh!l`;p?,}N*/M2%aYZ+?ٙ>󵵵8p|@sKK^1`ȑߜ={̊$$rfzzO'NxZisG q!8m nH"1|)/Ox~:tp:8bE0KpD@n1cT]fϭm3h4JSStBOrB=nܥ8! D_[ TTX ձmOCCTb}^3k n$meY?,..oiX6B|>Z !-5Aw*t7///C۶7 9}z/Y64 I<&~F2=eiH8Ekqy_$_^&A,:M# ԣ.k`0-H$B4%D2/D/S!$z% =z; < 28 !n|-1 DOp(p[ !eCP)u}W$Hq gXU!N@C6 6`$  NTLёd)3(XhS2`~%@]W`6 q@ TƬܩJlD_@t(Hu@62$DRj3j7< n.G R-&ABSgC@/N w|C!+ |IpD/@ģxdAw$y F*`O$zdF2%ٯ@4vq'ӯsjPm.trY?F3m7I< Om:fQ}ft'B11c?viݏ}W%΋$yc4̴P f>{ơLp vHbK ȍ]tLP .\TlɊ}\Jޓ͎CG0 Dgٱ_'=$3GC{7总ŮPyp`P *}׍ZØ `]#zEG1t&v6luUC[E1h/Ku+p*3b5$=]u S:Ӧ:ћ9wk0Y9Q241i Adș\bCXgGꛁ&E\Ha\L0pfjuS$Ŷ^i 0S"A^/Cy֌F @Ov.`>f#1S pݱсI0I:ƾO|]A^-@&7wgB-W`rt=~{>齅 exX> @f D{tfLg.pPV7Bf6] G1S%U@U0 ml"o4|YCP'T7iGin٫_ `=i$Kr`߶8fpl[L?/HMM哟$EEhOUJ=ncoV+%sp;#;I˗7<d_$ jv&MĆmVHa&qbk:m殿 Lǔ蝿a^̙MqqQΟ͛7|ov+AU 71G54><߲cў)fqRV| `"L-tt2uvR㏧޽/{˿ Z+\va}XcCcL:vu;]jY ,w屈;ر\#L0C) p)}:u*p8իinnw ?qHW+50Nׁs5챡.&(SمIpsD$sbK؏@, [`YJV⸆||%Š,mcBOˁDQs9fhRGvw1aFe|gu lTm_8ǀg;4\eV $nP܁o &v%ْhtcp%PS3G||[XHZATtmlDC!B>voPXTmmf{tmL/}xlrĶ&l+-N$t+9R6;'50$nI65cY&4(4L sr8g)㮺qcq8Oĵmw!i\xrr{i =짟6.1>-[`&&[0rȼ[ke40`AZKIo,Xj&/Nؐ uPh\*YʤO~ k3$Zw FA=iihߐ,},mm RxRZo巨TmS vRֺ:--\ww10 ,xm3rt & ү(".8L~-6 Uwfp-`L-Rz5MX\ʍX_?$xg&L-zќ;V83 2QSy]R֣v{}5(Lo` e%i@$ˀ>Ur/t-z0ЅO猛Bԩ;?}(zv#Fqp]?O>k;F˲ ~qmsϽh4a׈oӡ(ԗ@W-_M2>Ӏ RRh0K| VI-.+t ൘e}EMh!f HK[nጯDfERI߻]/(oQeS0i:|wʶmO4]9ߏ X|*Ċwjc j17'0EC$`\ma1NǴ96$[fo61kT 1YFH[̙, ]\\OΝpVRm,Q#,˩ߵP]]W~ES(hwZ3\wFӀW>jU`Y)6x XMA.mVݘH F~chc}Tn{88?_)EE̼WG@]q r{m8n 'MbBl؀0&;~R 0>ervoꖸ&-QEJ5 l?g >ˁ!'aØ/1%} :Ć[n II97DIn$,ٔÁ 7xN.]ʼys J)'ڜW?: R"˗S)/-i؆fmJJO<>"SL./5gjea8o<ΰ}f?,8v5@Cc`XTҫ^6&90ͽ!VЁ9}DFǥ@e_3t)>ȑ?ثgI~'59'p5U/@xzT FQEܹNDgqhM$ztށٿ&d_X ;6hmm?ah"Gc0#ՎDq2r75D}ҶO%-}$ xd\KL<;r8O)+OmnA)gP*ǟR{HgZN;GR۷H$Uh=J뚛[RSSۍ$(^' ~8jb֔`TR֫-˱nW n nb@3&y"0$|(YmDEdF`&hC"G\ҳbS\epؒpc#CqzHÑ@}(}eҪ7::p873S\\Lff&h|77u+Z_|3bsLZfT?\ݨ:̨'Qb=IJwc{~`,z̒8e1 O3jTB?OJM͑۔R??իL6-:v~K{Vs.'7&є P Z-1_Y}/uܸq̛7>)z]z xt(F45b~t>j%}{=Hu:(JOc6aً+Qg=nﻇї^IhA.T߀֛d: ‹4gd))::5J)2ZYIΘ1mzZ9.2MDQjjjt7|[w}5<_,Y̥}΀,6ZU%菲1žJ1\>C 1{= CJA^/~e~5umis{L)WVnY~FYvQ))=z"  -\.rNͰsSTmHԩS9s&mRyJ1V+++#e~txݿ1@7wI`xJR!5s 0p<`pf\PE Ypu z5GV"Hm xH-vFQRsr8Y,(1c1߻w+W>:J'S)urs_ q'{;5b' %l1&a9ڎF{,PC6sہ+=6]*v2/3 pz7ld$ee萎m5lg~ ?<}ARXXHQQQ۶y-/3cQ75mzh@oT f?=X2nfE9\lnh>1s /bw"+Ճ#5 ێƚw~J)TY4mКɓX5f G"MRqccjFlHA}S;G&;$StL2 +O8g1UZZ3>XizL}p]ZS` ftS X]dڛ\̝sLԥ$JmXn7C++9c9K=^)'gR:q7lp{ R,=o)@6XR-**,F{oM8 R'!{ h$fOJYrpҞH+ vZP~Emÿu[&'MJl`JV6el۶5gJOKK[P]]RXXeY+ Ze;:t%f!qm^t&t@ת:u; U@wc <^"B s.2p8F(H`]~6嘝$GLr$G`]wq>+#d_9x5>tk $gdLH( "'+&{&(/"-q?O8vZׄeYdddt:?HIq+;}O5kɕC,`&G4(ÕFWVV]UU՛ s4|`ww_W=)/JK]mx̶k{ ra&9)x ##۶ZZþ={N^M'{s&p3fΒ:?}sﺓї\3--?Pλx57i%%8SSM `\8RRzlBٚ Pm^rc^HZY)ׯ'҅5 jͧgc*o b]毘|.jWLb6YFG.JnvQeQ^^Nwzʏ (=H:C*s-+Pm;IaQ۶n=YO,2w XB) ?߲;ʳ;!Ӂ˗/w:'08'lT XdVjVL2L<Ͷm\N.<).zx-r%C+JvgkiidsN0700:\LA9U2>﹇E8#^RgJ)TWU\]'~pdoۆnӱ+EȑhzX c6ٌ8 ^5{^JCfL p.f$ O>ӦMkw֚h4JZjCܼis&/ --is/pYј1_sM0:Ŋz^VUV.|Gi? ᪪ڮ$": XoqW{Fh)/Tٹ&`,0.ǀ;&rQQA~1gBZ;_˂-~MM:d\,z XHUw^δHjnnvvm)Ckְg?z0QCF^R0?@|^rS=])E LOo8F)E ?\P-[< /8fA#7rqcvP\R쮫 oܰ)>~-N|TL+h)).9Vme˖rʃ?cΖ9x 7L Y/shf~㯹ug,ˢ33ݻ:4q4oN /5V\; CZYEsK [6ouرc7uuu#S kX2ǎ9ȏψs%$vWV.On4  aCe墏>@+~jU`n5PaB~'kc>m 7/'wmٽt]_Dĺ}H8nGYfq~1gG%lf 'e\Lg}mLxJbQ>HJn. 2 r1)4I{Y)t8Lk9xKK}~m<,v$B8 #.OQaO1b#;66rG߂JY>AnL0T6 sGkN }JZUյlāYL@>o۶-Kxf 5i{3jRUVr2f~/M. .L,U=Q"??߁?o_r  S&\Sή{R;Fhcʕ8I/+rwܱmLKhlϘALbkQ4څ O~~Q ch ڍƌk2K_SP`P< WZSekU}}=UUU:KKK)))3˗/ɞ`Ŋ;]K,Ztʳ*+]Yhŋ++Ν{v )ee>¥Kv5OqgDw}=۷ jjjy74֞={֮]@ =OOOw~=\Z}+@]QX)s5r8K*+>{Ѧ瞫J@p'sE89m̌Lii_\ BS1# ${6c]_XX|L0}t{コ+V$4q́-^Mg3UKц7m)E㖭G%"t0}=񖗑Z(9k"w"pJkrѶ[ZF9=i"9O;t {yzGCΆ]ؾ}s͚7uMMoٲeww߽ 0fkr:ߪ]a .ך-:륪瓹F𪪪*+:^-Ҽ֌Yj(0XWE5eYΏ~c:/(( 777pWxIf׾` ,s sC++MI uŽFg?D[4+SyNDaez0? gxhڶ  u{`5Ԭ7S?@kSFi7OWzݼ;еjZkguuu-[t!VcŊ3l pׅU8EJB_ԜDK,I,:庚6nvcJ?L$;W@`<0N6t:9s}hss󟁟]OD񏘡̸2R8[r }QCkd/~YmSy\~Ky@m82aUJ>S⯯÷[;z%g ǹO f`ܗѨ~j1ϒ|5)9?Bq7ߺ]ԲJ[RBJNΩ{/WTPͼ;$ܸ۾6Iiܾˉbm)hٹ='`oi)Snm,q(?+#M)4SΌt%%=3r@v(~TO:V8̫=S&6mc\OŢEsrݼhɧǏYg-h)#z}wn} ?_]df&̴ZwIe_TU=g޽✜9s椵nt@kǓJFFz ZjkF[0E Hn-\ +mNo7ݕ|S`,q?߾.gjjoWRvFfۦ-4TWS0gvקmK g[5.r23fS׿gbI)UV`ܝ0G)UU0gS1N@SkŋGgI驕+Kbz+W,UUZ?$Ipس{K|V '_J9KϳZ]b!333|q?Iwo܋7' >0.\*bS Yy릛PN2ƎAZ1‹4 )SȚ=`_Eٲt{+TWcL_,( w\Æ9\N_mvQ0!:vEYaM[ !I䜽SvqD_"'mGh8*1<Уfϧ?)pa`_ɒ?;7|7:@Ā:}ju.ZDwf')e߳g,| > Nn.[hoJqԨQ<[n]<|r+Ș>.>))L7zם$b/lpG՚5|?Jڰaf 1Ph55H;JBM}>r!g^/BB2|8y ҺsF8gB5 6!6?\i`@ȒMe72iȑ/]37;1.]CKUU֭[ǁ]:gb 0Kf͚b;kt*-1{k.]j/((P|զZ?xC&ayg;r`60iB9B NJO<(..ҺuEHf}|s}{諒eNS^ξ_ v5aXV1~@HV+}4[O֭I8rr-jBTN%}4|MM+TVRj\$9CI;9֖n7[z:JJH|ﶶb9dȐeVI:f7ʅ/0?B\Yb.uŋy.\phժU\kv.995|g81+`p:m[616S%ӦOz뭙9yvG{5VPP?^q5OtpLљy-Jٳ(Z_{a`w~Je>ҫSnw"p8X,{ΎOC%YNL>҅]]3wbŋזjkժU;<{zz1Ԏs˙a_SiN"xo5aloOGv2Là%*l0?@=).f#3&''d!$z#b`ִ4r%e|uk [R/2jޔGv24nZ;FẌp̨n`9~|&\Rœ<`*ӝB*,$o>L.~AΝԾ:μ|T3mJرMh۾=jnGÖjWu^\Eس7Ɓ!77㬮>Ҵi|3AÖ-z gظ,|䑇uxG] "`˕} ƺK ƍB!"ZA?:f0`Xq:?X g+9\TO> 9 w͜4=~ͪהd^~7|sg4pa.1s5(6{]W_?z[=IU=zC1:j$9!;x}Nvٍ[88rsքEδid͙ߡ}`૪n\ŃL~VO#G Ex`Mg%۽חK@pb9gftql3&1!xD)rL,(_[ZZz/J B@_|N.kz|Υt:+٥|ysc)ݟ=qdLXf5]7-_1St zSin /#G&ܵOR/T-_x!psB0Lɓɚ6?&jW]^5={vV -$e8Zv3?@iER$WQQB,>NixsSHh%LFӾ}{'oó i0 eqW,RZZ쳗`ƇN>B m۶_tb8,\0) -z<*DJj%XUYx1-x|$Kje]jڢ֡ feee:EtvcMAy BS%$wa#]gc=7v5=I;_C=>+*YYJ݆='4ZJ\ּB@Qq yy\=0.*B$ARQ!/ZFbj6mF},Y2]It]w}Ko߭X(---_x.t.ddeaeWuY|1~Ӧ˜o-Tm` b)Sc ˩w߽y#EttDZʔzL&HZQ”{fw\Tԭqi>cW೗/u,B7@qq=rPSs{.֮E4HBڨ{$h۽ʇ3qYX-#c`:{CӨ(NMlzgS&#j璢9f Ö-Cq8hxkkL0=|_#(ŋԀqv+--d7`Y~Y]tQ$ILR2aηSJJrJ۷`jv,n|.̔Ϛ%ѣG9"-:Zr=mp0S04:]' F&f/0mmc Z j;k!C"ϙ;zUWY,6ofDѺTTR7)z뭖իWt;Y?i4 dУUܒƌ`—#R}F #]{H̴}&Bnć?gk4hi%% -9yYӧ4e/jjn{ʢĤۣ-fo2f{]5z̙%kUL#%*--Kˑh@uYxrʺų첊ɆZ,df[_}>Ř[0l̮Ss'_8}b |h:|s=זS s -!$i;x4#9R[ 2Ia0o .ewTg@VUv>'Wd1  s{!@|O ׋x;s.$=}3ﻏi4~~ȥ>̝q -B0PqBiA0dϞ=^!DX 9\ڍ{E֯D"b껼iqy||Ņ@a;RL+.6;6EQ: y9#a ^`0ӍXtT C}7Vןkb*AEL.쿺\O!ޚVt$%q@ΤI]$!$j**9*]ÐT\oǙCP!ID^j־Os_cdХRty23V _WЃ~Y#dΞͰk&u(\8D˯R2c$'1w$~Yv?irX&~?oqu`0XJ &EQ{。c)_Frĉі@=-6_BlXVdYiooҢx֯[۶mG3qxXs.9`-}}9gMhT4HJb s/b"(BBEQ$r5ߏA:ؾmc3p;'VB`ַ_葠(:'LxwQfuǍjF^~y_$ah:UUT]?u>ȁ_iv""@Ӹm{_x"c$e`T%Ι2LG!l8 ˎO'k M'?w%YP`*? z:j^|!'ꜪI.OR0HINNCYGv".L׼es32ҋdYb._NgNV%bFj!?A <23HKK#-5̌ rsrT4Sf-Bn7ee&3Q;עCTZMo2dEEkLD֬h~--ԯyef+`22_#i;\N44(]Pd(WtXRRdӲ# lh3䦛mgeQ4dh'!UUl){{fyv}܉kV G%% 2d H)ÜǑ$$$jBA~mv5fh`[g4p.&qn%<x.}w̛\ ?II|*00!DJԳC(b݇_z6@ }_ fcm_aڷEzI V04u?J=]$Susojnv>)|k%nkF3\<Gffv(.g &L v㫨{]UG-]gA !p D%Xhۿ̅д~65ߣAEMX *(~WۛqIa]:a444۶mSS2%%+yݓΝlۄC exI v&]HHD9]$Zm呕M8V&LZȁ]E+6  М ?s]$ jt:tel۶j`bS%//cQR2aÇ#G YFEn``C ][VV^*G*}˘!o,@ױdf2K(d_m^z7:x IDATW=` 2gbصא:z ", ~ބ }>ҷo?#`Ckڂ1sNJ0;#cΜV#FT6l#܌or6ӱZLL4A`VP(oֻ{f1U O;w/k79EOyHINx0\I|á0m6ٻo/^.S( o6 O{;c?\^HFbUZr= hG[_2-;[N/I;[ZZOBghBQd=2J,olzY-j3tǐ! Z35 Yu?>#7 dsb|2"-[fAI?Sbe]寒MK1xeɒ%W_suvvvY2Zfm 0fǎlܸ]3FUU ݠN}}=)̘11ǐMn܂۷QW_ˆ OfVe ^L,L~,G,iXTK۠43m4FIVvIIIX6TjfLVVmX 2eDEQ$E,0oY˘mOaz4k,Y_-ZtSڲ앗OsZ,dϜɄ/ʔoŤnh|;gD֭;H9!CT`Dg&={6n'ܽFn׼G˞=زp&j23[#TVjl쳚 {NWEYoKi!bàŋ?Ou5Y\>S0TC0a믿.777G 37r04 /e23:y*'NdK?n<99l޼7z M^^PDϙE[tnkH8 ~kJ>_'E\I$\'@UUB0$&++ ]3ԓcZ vG&`LLHP f?SizӣB|CD='yԴ4F^s5g~;S-\{ cbKMER^f$xm 5a<ΜPx kj*3>e8\/~@ڕxkjpš`~EXsr:D;? iF7oFMNƑΆ!}>?a4iAHN۾ԮZEpBq$_@UI3y@i?t=XMԭZ!Y33M^A `:O"!u:>ZYJ H J Zj!t!&c:( D+sf͞- %9/akױhb223f017:e acN$V6ے dޟB"))ںZ j]b8iL yVeR_S,Y4"E[C$! C@a>wMӐJŻ+eȑ88EaX `.=384|83 _[z!EILMl_bDK+׌*r&M–Y+2{OYֱq^Rr̒@eRJ`>jZ{1>M6S~jJ΂cKaIdLJ_eeZe,'ގ#/kKt${ȑ# }QTCw8H3:Zȟ53x:0 3??e_+ L;$^o4Mci8Nd5zOƎ1n^, %9lFd 1 j% !$!'%9;vI|_>L ߘ6cs M2YfmoΟ7KD"6Ɠ3g$ѶKS?Ѽ{7\3 [fn,uuBf^L$Us=7w䉶|lVѕ -[PYUӱ;QH:-"/h,h{*l6\N>INN6=TWg{nS[L_NMNJffbZ1{x9r$vId IdH2 DF@|p%4 ??.$~"TQQljj9b5;?co dU?o#dO{fHlj:汎\s }9t㲦Ocwȫ!6S [.ȁjjVo5kjjBybͥM6Paj G~ihllb۶ܵ*ZZAZs9}(d!C(^Wa!mUU{3 |<Sy|EQ.eR~vT<̳0g\\.D5I"`)&njy<9_V,V+־ǔSd7QTYBȁ-OoI}@֍7}>[tguW^}I'JJFedEFddYҧwFA MI" Xa=30SF%Pm55Z1B4p)[͟G`@X 6v,da8[2+I+)Aׅ-+]\2G[˶sab-hq~@.9sT2*MM}fF۞=ԬZEp~0s=\J]*܇cžuxi߽ i8J&Ń=쮵 j%s8#ѼcgoRa6'N'O>c W~np:b-oCzz"nvT-H%q45gx<_ mn7 465ʪ5^LmyZ@J233ԴTIUTWJNBV0@@ H8&1Gh#G_t `$$\$v;et MӈhD`rl/{/}F_sMbvZ'Bhzu+5;?xGVֱ[!ݴ˝_otIQK׿=.u(˷>@H7Ϟ=hmڍ#7{vvbר@Μ9uuvȊ 8 7$BA?dIfftvf6nf ƈ+^$tIɟ1sX`?i50|$Ef&>蘿aF]w=୩aGuSRUf|d705u Sh7>Q~Upw(?`6m*JFjfIRxU\p^2Ǎ# {MI\ۧ'+/VTT(ZK/LFzv=KU2CQ5ïq4_Cq .&iP(/\}Ű.Ė_EEOL4;'?62UUl6D8fa+)(( [Gwzlqc-`,bpc@CH2Ke2e2FT5Ѳ|'gJ ȲWhB@8 }URj({׃0̛2n* (- \1 X9^_~鋜umv_Bn7~hrBqt_g7 ,Fz%Aö{n3 _0tWPU#cVe, IDmӟ~p=s皖|H[f&EQ IX>d)2^v)A `φa`D?[̞Ÿߺ@M LmY[ubb\DZV" ѭWgVS+@j׃X&ci/2_z"p8IK=@)$@CY'V1w~xvv=^-*' !QiOiDSHzt7] B!={1_0ĸ4 u`O⭬9)^GF+{z5ƮG4>o,r2ǎPBa:d^~9s~[_y!r?S6w?[&,p34Ùx??'u٧J/_|ۍHadOȢ_jjjoxĊb뺮iV~O &/$ ľ|~|t􈆮ixuMCD4 -A4$I2.t 4㟃"wZ]"NQ nf$IB_cYEFdsȨj-5 ߇((aEUQd9vQ@!RW -խG"?$2Sr%n$Ew?t{l1[PX ]ǒ}j'@L;Ԭ4l#.b;&GA>co rgi\1c8g_Q'd!Ih^wY7Hy}Cɝ2߿^oޓ0>HP|PH'~ BBA5qDwZ4P"a`N@\  mo?%&ƔxNt+dBp;}MuJJ2mmx<@@\j@*jj# 05ӽ>/YYt\ "TVV"$Ea1|ٲWf6?q+>\rLO`[WP~ؠZ[cf$$1I*(8ޗ"vicF3i8g#|ꭽ551ګ):\D"6/9ʫT2'~(h?r_:G" 9< uػ#^z5 4Moll"q>UT\,VQ0f+v5ae[ :šA@'%5k0Veb)84)=,PP4 \'%(H4BhimaȒN xv.䚫)b| `MN'ͷC%WSR{ ⶽ][S/DIU+Ǖ*Κ6{F-a:";w6gze)|pKyBx8?S7(&rA8z8-3_ 8 ԽOKN` :q0S. D*+CMhϪ&%%!>/%uM7u"ff"ᰙݕ$"FCcH$c 2x(  q8pp'gJ B;Λcu8쪪ZP;p[uS_8!mD"DH\'JjooGњuv:HJ:nsa|0gϘ|KrIxb!kX]r1XT>^*^.*.fh? ޻nk#}Dt\ڨQ.Z(x3'}T鋴Q}Zv=;_=j$gLRƌ@u}cƜ1az v~d BMMMn q)0 0MMCAϟ׉1k?}V7!$1+fY(\z#) Y }>ïW^Ak{oBYO~AZ쥗}%I.&竛7}5j3-5=> 3k:dhQ"yhiiϋ,ˤ:eK}C=ӦMW|>/$^{J5I0{ggdcƌv!VI.67>F ݈ZZ[raPYكz6%EMZZs4sah -al&qv!ILH1nDΛk ]g?F[BFdww{- 9%B4K޹ yӼi3EMM1Uva\dML鄃A>u\ |Ef!$ C^~~C Ν;] "#2JRRGfEoP0ێ+jƅ)vx&߄uαlIIaʝwtcqCԨiy9".j+}`GH̡7fRGbttyg#7j$yK E]ANhٽ[v`f$e--A$6<@$--yyJ++Ѻ|u\c=F(b͚5]YoMP=~,.˴EilhDUxY 0}m6tCF00 TU=n7 ,YAEE-\.Ӎp}'gZƬA;wvp( Ń9\^n47IN6-Q2 1aX,t  \wEۢLπںj^zx1L,*bn| V+{"c`\v3ª~sb2sS&-  k4f"҂o(Լ.&XSRDΜ .ȟG"T^{MwY$ϟ?NAA$CUL=DM:l#-=CˊLII V&´m3 𴵱eGPUUUq9477raXhdH̝ ?peOnpm' gZ8H錌;ج6FPWWbӉ$:Z֬( %, u_Gfffu]Wna5Xg~>#.X4ouu r=T?*ycm!*p' 5-wQ;5d )" E ֵ]\uW]t-+b/t"Mj@@zOd7&e%3{綹<98djZQqd̃Y Ip+f7짨Oq'%u?qAP/*b[ KX++ݞ;i$.\H||<}΂8mts2p隢£ ILVA֯_i95աRZٛ4Ms]р$!5 SP"vJ̓(ZM( 7 e8_vޣ kNV%>>In#BK9 ($oݎdR*|||RdI5j^evE`e+g qnr\XXXg G) " WV,_d6[3g ^4JU"njfhP22(%qxORE]HʱlMVc·)F x\v@[[7(ΠQkw$Ҩehn(QGzzeѢ/rsL@!ڳDPGtYa#Z5s]¢.Ml_jHf|cUz ՊwT۷ir? &_t!c'@աCl{esoOOONQw}P Nwʲ5R wu{Aj//oAq=<<>|:O? AZ@dzh4b0 QXM_%{F\M8Eү~Ț_6VXu#-,G*rA`p`X44Աo>jBtP~fY] xB\tȒ!<+.GAU>NG`~6'yW]u~)wy'-3G؎/usE#3v@eeU5}u:Nhȧ}V[)FC~||VXU1o+ v ()3};y]vU'"sH"I~>TTwl^w*+Jp K"~h6 dĈA tH'O=@M7Fci)8MGZȿwA.ټ Ε?$˧" 2]dI"iD]yEo|c?/t;zoSO=E;$Z'XBq'(eyԾjjZA(/+'#@K$\whd?tPss^(ݳ{W=pdjY=/ҹYYY 4He4ihhbb:B:J6mTű@Qr%؃Tz=~[vlaˋsipRopUE:v\4SJ&j$NÑXR ŊghH x#:l/dP{:̾7ޢbfh߉R)>_͞Ie3T*=s'ݿ^xPZ݇7&@/0|07P}GJ"44OOOf37njkk,K)"-yh,ˢb y{lNJj5fΤ0z j4;}*H7APMTXϟϔ)SПD믿f r`0z-0=#FcZ[dA Rl6/Լw?s>KȲYv>g ũ5懯s9WVihhʼndV\\ #(%*$L*5e;w{ՕeO>E]nn|M c}$w`?I;b*.:˒~#gj5xGE=n;2+@BMFQ$'dY+,Q>€)S0WT*T*-dnG#j.W݉CJ︃S.CyVwl6Li8Rtn9.[/\\X^{@QQQgWHn~E F,H qT*bXX{n2eʭ˗/_r[q4˲,ʲ<`o\常8c``` KVWgXV' ;1/49¦dj|={ZĻήb~BuYYl~ eegf `X23(P\̦gnZ3<ƍ˻755ِLzyαsz=maĉ~ߏ=z,g|?,˺C]p*++'DDD]hnUT}}EdQf h15Ά;OMlzz0P}KP1:_F^dYfܗݶMtIqczyu y4g2~ӟ(۶&FO>;\`vͫy< ::booo9w} ͛8lذU;rR8˗!˲ r^h&1""Bp7iu5;A\pj/X,[+Jc{sl }]}79n?2? r6c6p&BeOnc4;w.˖-c„ =ͥN@ӁC[М. vۄS=s& ˲/[lMlavw'`2ؾ}j>NujB!@Z))A:A' :|̝4rµk)ۗcd$Z}B]E23Y>{epDLk"|D} tveYȣT4iӦpBfΜ.]e i&WCL()Ξ8O ԓvDVT 111[הg=DYe]MM%K̭Jl6l6oEȷ\޸qj>T8A(+B"Cs$z+Jp (b%_6j""L#OH@nn.lf3_~TNJi~e?O 7A⿉js,G~@* mB Vr{^pp0=3gǧP3]vGt_Ō.(#( p~t:t:]HNNU 7͙3T84,ˁ^t|Z+HJ{@$IdeeI[l9lۧw9qdN\Ry+ijl׷B2*x^3 /[=2+Vb71Ġq -[9N5Ȥ7`+:+##t2;wb*)p_K3g [C_}͆j~Θ1w}Sq d7mļy\.Pt ,sssi4 ???mAnpsIxhh{ǏQudY̙aÆy;wc@@^Gvƾ3f3;wlJ wPyJ1:Z)s܂ӓÉ:KCՙn͓fnpfT:-ƨ(w :.nr_#|X:ooRR{Jm0x[ՇA)ޱO=MHnoOqJ$Igڵt_dQ |TRRU__jБok_>>>ѐ{oO ,˺IK.}|BPP b+0vN*++5k֘+++HBJ [++)\ ~~x+ʁ}i#<̃Xݚg_(ݛh;"BYm=@e~vΟ5I~omY1c5(ݱ1 Ϝrj5ֺ:y[[o?fĉ'-s<(..Ր]|N;N xzzxK\;^zh .6k֬eVg ˲_vvWZEe$IwEs$ÇK6mʶWߝòKP"n tl%xԣ;x6A#"xUxEGstӦW˩300pb4?;]n#`0F?qeIBg4rpW~n$nt4=DCw@hFV?0+WOt~_|_|EgC ;Esm͝jABm_%!!!Bpp={L?~-['xq֔6nݺQڶm_G;&;vvp4b=$f0WT倏j_{-ӗ.%ܞ'\?͊t'(X[n6BKV+pp!"v5V{/ ye5 <7ofƌNC}H ( ތ}Ϸmd6n8ޓ$~1eʔA:o.Y{pdYV=,,Lj[.$IXVf3ի͹sWP[= QZˬzaVCe;Bd*2>56 އ Pi /]ɜ9sx1bDY IDATOʒwl}Q]K83vi4Aն4kw[E8VM,%X?#0@s?dOozyyiuoY,jjj(++c۷/Fpe+]p?J%jC_;JV}7[ϧ&//pT*"/id3Owٚy?Eռk}}Wp' uw+hi;v|i&[ii)rhDEE ]vY,ZpF>U嗯߿~uTۋ8Gl6MMMRVVFaan:kqqs(U |DSA(OK#oz`8.1s*d.òɓv}JXGﺳ]bw!#*:pMx~dG)۽U]/l^,JkM_ T:ĖŞ7ߤڭy_|瓔tZrmuV}Q]+YJS(g",UUUU999F`0Gߔ3?@h4~yVsƹ,k233/Z|>$,,Lt-'w{jHII v,*TMd"w*y]VKwl,Ch(.Y0䚟~d#p(XC]@kZs; )رU,nO\ve̙3#G :c+i٫'cƌ0b1,, //n΂mAhgl6VLy˖-[WXqZz&dYoܸŋ,8^Ws$B ؾ}mϞ=z':`- n!w2JK1uV8 QG}^>)>H3,.77c ED}Oҥ.DŽM̙HFNv/Sեg7(۹C|  >11J ]BTطu{|y*_~s2`Ӛo9st%Uy60nNkoZ-F!000-@eÒ%K_uy Dee%>|X_G}l@1# vĪ W,GZD̫C% / ȁ/DX;܎_|Fg\}ZB@G_/f)ZzPRz#g x8hIwN̤Ihƾ;e*ZT~C׻RS_Y_u, yqڏ?ۿ?,#%iin;LJ L9Al~q.坈>FaԨQɴiHNNUN/̣>ِ"`pt&;T[nRAj}||~a-Aސ|vD7N˫U ZE}F"#"6iO>mܧNAz@eᄏlѢE~mǎE ZFl=iv)F]]cOZZn^fNYF͔fEGw|բQ$dz_&\D⭷6r$bGp\(ٵnuGf|]nmKPH#v}HMI\e P/gSyv \K{RSo%אs8RSSqIDjj*W^y%111=-δin溸@ur>?>t^3} *blf??АJANwWċ/Bubb"~~~h4-@%D`` ^Ra1Y(-)7߰G///ש8^3gO?i"N"мzifUl6Ԣ IFFnݺr 3_=$irAh4訫V}("j7]n9KXU1< Biz:~nEPJ 8,/zGeV+̡l{=:6W(ޱɓ PΆ!ov ƍcСxxxrAѣן /ʕ+ X(ɟMu\ܠPFCnc6)..۷7z޽# guP3hsrrt:. 2*aCmPJa*QErbXXTx~eunBwVe~GDUshWɎIq0=BQQIk֬hllx[n3~/ ?CCC}6׌;J h(dw%^,SN/ "HpU*$o:^2VSE@B"97dwy NN7)Q%.iH.<$IwEw;mƁTdT[n Q#|Xeaml>kAi,+cX^PQEfϞ͍7ވlvWqf{ڵ?ɴ1==}$I^A0$eY&i|F6 S Tmv6;,ƛLzz{ ˲n,Hv19 "v[M1U444ٺumΝdYҕ%0O>3OD6=?_8j ݆ffkj׉l2 3u @ Is ٰ❻y{JsGp0ZE PsQF]gdSy7fܜ9hW >(Mu퍷3Fb^~9h <:ɓi2[ܷ~l| ;a7=@/̙3G|g?CHv`F *? AY7[,_Ž;_~&V=Dzh̙ W ~~~ !!!JAZRbGp#;VǼAgՑz#K@8nD:D?d6׷/p;&n=o* CcoZ*+6eee.%'sk1xv Hѣ^}Ezz)}Aa?EHΊRyV4h1s>WDDD0zht:YYY\uU :;ฑ_JJJ=.^ȣÇ^ы"^^}Le&͒%|+JKhhGdj5vYIb I}.K&Mѯ_?2 IwWojɴu޽S$I0 !C֤Dw𿺙050YL_~aF)1MMMkkqqQQQ0AU*,Kllђ#ʿY8i߬ڂ F!v ʾw#g ﺓS+tΈ+4^n>t6 ?GԄ J|:; j4yo$;YFygqkߚY~,b澈rӷQ=(Z-?N|||F#W]uG4K.v}]NZ8~~RZA<__ $ɮ&_}0th 1}-R'z8 {z=^_ EKɽ$+V 'NTvȩT]R/YeAAA[Y#EG i1bYX";;[B =ziӦMc0EnG`4ղ$(~%,Z4n#/aop K4$oj#Q}iN 7$|Ç7)\տ?c aF:JEA'|#85O=tWl&xHn6o˧跅(NIIX]]͛odTj(uo!;ӂVVH]w|}}keYhyNN0HmBB___7shdP7Qhj7_9Q_ `d>hA?w6hc+ DNۻ dYFj 9~cƐzx+*i(+C@ m6.^桏 @~(K~~6%%gffKDj5H#,[cni=ߙRS[xwavpm4kJm„ wx&''c4;5HbAjIW-j}׻E$Lָ x4o(QtPo&8kÇoxZN\"m'攙hpт=2CXh5(bb'TqҤIu]a0 i:'y斿T*^511 0~w\GA**-eaz:>$\Ҽ"l}LE&Z<...QSST;jZAl`DQe/Gu1[Y)++$R]] 2-\Jrʝx8DRjjsqqq~4mQ,cX~rm\SVp  D)`pj~"{Q8[j q)d> @l, 7{u5m^r~aƌRСC8/2' hù4&{@$aia!jeE QB!+ͪаPT*: DQDדJuuoAAm۶ݝxtU ,ɭ 㕛cfN ܉,< ঠq#00pÒ ϯUJa;$Il1h戭Z8!$qBV'|,Ir.#?uR6 1j5!#S;vd2:N%lacA P{z:@EL~]|q=z4g&$$ECד89n455w^ x L\II\GK{V6xun6Rs|7$;$4ع#ɗ](TX]eQח$_~~kpѩj[2 6dZA%V+=J30L5H U+Y0xuw!#G9p@̀oG IVUiu߬6'ur_m4VX; 7-ee^?~cǢ qrq7Ra1']y "yxӦN f8y _x]'::LZm xȐ! 7 `2ywXx1,s̊nNGf -}uuPBn \@b""Q"&sps`LL EEEC믿f;] ZX9=NF4L>WZ~* IDAT;ؓ#Nx=͐H0`4Щ.w?(+zՊFFtvqB>MN5M.E:DD&^Bwם1`4r3CtC@;m` VD`bЮ5D,6=lӓnU?Ai(.f{qpܞ'",q̴iQ5kDR7D_r1'ii菇Ħ/{Ra6w[c(CRTTsСsrr~tuz>Q$YI8$YJEwjkkf< Xdm܀<7lذСCZ;9{$dEѶ|.tP¶)Sw w؎_HM~ l0ntqCA`ܗ:<I<8~*tqVS9s,?; YmӐ`FIXb6t=ʴi9rd9r @//^;|%‘$ 7ݘvPVY~(8RT&Z;mݞ :Мa7:NQUZIU$-nTtޱf5ۿMę (Ҷ݁ 6666V1jAwT$te ZF$ec8-glT7-f'hB%' ҝRS|C?D3RFᄡ@7@$]{-%;vRjUcJ6ofCtmDwd$Fl4O}]Rx{BJEjdZf8vܾ PQQ~>}: ?)dddxb.\Hqq1/fjt4׶Mr832`4J c0lDj;D@g0`]jjiii_wn:$IBT)DoH$KL&8 )z? [{^^ gHyyfvfx/++W^y#GrWm.dYfÆ ,Z?µQQ3u* SwǵEm66Nz:_0A 'v+! >(i ةouA`ذaٳ$IZI WRK%PjeG躶$b-ZЎ#grddG-?@bbJ3_GQ0cԷ֪v&5;\itS6+ģ|-$8D!\glZ-HMMحV~iNFCl{e[Gb h@[28cV[ܕedIb>f NСLzu;^}#uDJ?- LZqh;{wvm6>>>L8ZvAQQKB(X,{6n5\È#zPQQ%KxWؽ{7a:/w @}}*E,(`ޮ]d8Չo9`J%=]9 :twǎ[qAn8v#pJ:e ,Il6ɒ,&9&D4Z |ѣGG$%%c7ffR[qlyNqr yҰ54y?\ڳ Tr~ ֮#r862sы&{2?nُ!wE`Ri1FC޽﹔m3<<7|3֬~[z!aIhM#fxbL|twS;_WSUB('d/Zc~: &7#vRSn=.oД~ p[gYYY\~̘1YQFQPP y9 66.ӧRVVfw:C/`VRR\(† x饗X|9YY,+, :@_ $ R‹.!!_"7)..T^+}Q({Y*z7L? Yu. g%<) PkFPd$QQHz!{/*( 3| 2]c v>-eYfѢE\r%GoVV?)++/s9~(’%K<~zx V^M).fiv6vo ff߾Wjj@Ӹ "D-r@vf}=o&^{8pBff&III$]i@dHd﷡1P`Sm(ۏU+~8 @/5M$W"@f@GHHw/'IT2jfCU~-rEF@F梋.MԗYfQ\\_/_N.Ks3_qK~F´Tɾbv?Wm6XȽqi}% fc#rxs}OZc?$4U᫯̳[WՍtaa&%Ih믿f͚59rHNNf̙nu yf\NON&-,w$vW倗FnjkkyG @pp0?cICBB. V|"15N!+#ZCNB:/%I /$--mlX0L\r%|,_իW\R]Gƒ%\vQ9})ZV6{MQt}SE%Α}'IV+Ͽrs!qcne??:3~ ]tK,O M(,,$:ڣv~)9fEQ袋 = k.V\wM{{;##y}B1&8X~_ _ef3jkyh2Qg)HB" ܽ{y׹.@hhh p/iP{ PTPqh}Сz?,hmko7w6aIٖ]|vXXJww7j6W!g֩;?4@DZ#G  'YYY,\Mdd$v{.>(C~-.-#s?EBbb8/aO2UoI;s%2q@6PV쪠7/tx IhBCUM7Daaz墋.bԩ|HD^@öm׿3<(M1mB^ >4:;yk޺:LD ]ND! ?ɏ~#"## HӔ)S߷oz8 Xj"@Ҁ(joXSSڊ8`/)н~Pl6fv|5wL4p#3s]Ϗ.(yww7?Yyy\>nG>,v⩲2Zm6gIhG?s~5\=cbb833f )| xxἪI6I<R oSm㪭 xA$I2h.$zG^MޕwKnnXXݘfÔ_Gɵ@*81ԝE":ٳg3}tc͟?So/0Ҽ?_T͛Gu?%Nw̠iO‚'gP5JkwN%snZ~=.Ͻ`̜9ɓ'7TRR|ٮ8puqSRRB|@LƹdFD 2 I|̋<_YYQ8 Uod40zSvD;шfફbԨQnh"""`۷/O?V`e晴Roq7I3{8ؿfsl_HGww͇']%@݅+9'==9sGFFg:8M}/Y{rU81ԑ2`їQQQ\| QӃ?\s r =iӸ~=yW_M.&<5U|&HҬYl~q:k|툼\d IiWw>J퇞7c͛"??@||$a˿aZe "oSNx iF dffxS?hbaĉ<3]gy6Woc3喛I9S`hƨ8&^{-'wߥWQ,ޅ.>i W,Ӽs'[zzP#"""(**"-- Ϡ,4򈈈GEEQPP`X[X,JKK{ywQss$+9 Ⱦl IX,mx=&w1J|Ot#  \hFR8 ?ǟ4Ma~EΒ%|{?n >\FdVv۟~ŋz*\s lٲZCqVUUQ__ϸq&((p}b믹())$I237U{rߖ-Twv <违wF+(Ex-COEx3h7w\ z">n<`SD i 1׍GX?3҈Ե>4YfӡCgaUU~pŝh5=TomxDLp=3QI&9.nAEůwMMmUXd~)[H IDATt^bD@Z0セ<. ܎GŲ$0ޮ:p:Q~,[h`ty((~ϮIr/4ItCm6+weUյkzyC 3gd9ꢳѣG p3w\^z%>#KJX}d.]ʄ$"=8֐>|'W<^Ox\~zTKWeO8tmF]]a>YQU 6uV,Xܹs{V\I,smN1-&vIfc_RǍ`LE'5"a>Xyj^+F{{披yv$FAG/,WEfE5BţG"@0B(=,_Wk1./3[D0#2}?W0{'@Ot3Cwy$%%K۩"33|BCC X,ESOQVVqUoM$s :&32j֬eaG=ٯz gn(59splÇ3?Dgg'o6_}sŴvZ-[ȝ\FTQE{s3҈Ql6ˉ#=FFR4mC_{{qk2bi8q!WDխmӻ?y1cڐe!xC]ӊw>` !3:c ͛spajjjejGAAYYYGBnn.?06l'(< +^fm u\$P!d:PTCPPW\qgq.( ~f֯_Ç &M/hjj"/Luu5;v@QN rRRÿgV&w3resBDžɈYP ?z;Es @Y`c%peg76IbWk+wr5>|x (,AX)d߈J;e j 6sN!0ْޞ4^yw0bi[Ztj.=B@#`D8߹lJoMjgp.򍾌s16J+]4U|sj%99;~i<>_`׊vX=Ʉ7ޤOQQ?>&Dj '&&tRjkkY|9LiD.7pLhۏ-[xs^Mrf#S߅?F{_) ,'W@fV}4I%,VK w^o5`pUU8pq#H.;_İ0, &iЋΥs8~;tcoP9ǟPkݭdƎ{LqY5kֺ]V$K}}=yyyoFǥ*&MO?g?V0w%qƌAGH2}~l2N?~e}Mӈ ??_kX&V^w*++I Y8;=$G"c$l6>t7m⳦&nE.fdm%`/ -g$X4r$cˍȁ'p;-fGNWSSS;w. 񯬬dʕl63><,`^Rz?_$nf~;J! bd*kATKLOC7z=GIL>@۰8drm@~0 MQk @OOmmmF .77wB[{ۀ (thE!<`nء ɑج675{͵n*i,,Ycסi,ѣ_gW_Muu#;}@TT?Y`=We>ZE5LFr^Hǔ}_4%%lZvx^HHӧO'##YOHNN(\n[z-~dIn<ɱ a$ޒ*%6{"V8%".8awrDNbThmmi/G$,=C<:}B&*uy鎎U@K8 B4>"9r@m8IUU{3g_sw(>3F`-ZĤI۱j?YYY$&&RQQݻeC駟A^^fwƍyꩧhhh8iJc󥗘~`~#1DOk+O>_$rrr(**w@߿rrrvh????7/A&7)1A**R{zhU{6aiP1)2B# ;c"+.ٳq\k$I 89~iN)+ J#"2%)FԩScimk^ ءpFXX08vNրI\W/cȱb`6!00߉vjpܕtt0":y0jB+1 @p#n*^z饤k#WήNp @XX{clFߝ_?6e= Њd{. ܆ĸqX`ⶎFK!֯Ebb"P^^>>@>f&L@\\[}@\\z+ .ge7ޤw(խ{.QQ'4$ UQf }ΚMOOgٲeٯM||GO? Fߗϒ$a4>mhyDYۛpB'0"ww H@DB E?\54G3!!!9d`9X˹9o]$83R $$7VEDx@ppjmt/2]y \ fگz b.wॗ^JLL׳I/"ro63؂=Ki999PQQAeeÇgw~<|<~~~\}՜s95H~~>)))o>$I@vv6ƍobgy֯_\5yyL3Q&0Kª}xO\P< BpBا"e<>Cxc6ijlI5?suQ`("@1!ݫxoi=( bp 95r߀{Õy9UUQlٿ꽉 ]߃ij`:Ә:ub̼5$#7 Υ-#+@pp0'N$55;vAg555߿rrrvu8|xxWlanheaҲe.(8a,Ӽc^~6 |v;4Q"uڴidddPVVƁCYYYtttꫯcM&~?aee1>&}{"c鱻f`+o4q|ZlP }(8Q @$L&sT M5h!Njettoyp\Vߟ: e\A~fOps\zdggkRoKMS944574M1O(++s[fYlܸj o0vXn6 ~h@C' }3dDlG= xw_U{ɓ xros\IbbIϣ zK`{@u=WD@Q::: ofvg;, +|O3p3ƥpan4$Bj-11|9w9Yr. %Mq怦r8CXnL<~>{Jo̴ę3[Yajf*񏊊?)Ϸ7*4MƏOJJ eeelٲ2ك\ƏǏQ|_6<;UUܻ};2p[(t3!;#"'` }`F5 #I"zI}?p:kYͮfFSjc$,_0j( EShZVYV#GsınflmK0Z#p 0Zn87W^y%96pl!kieׯnB 퍷_r`T:Hk_ ΦSQx4M(..&--R&Mػw/8묳6moew'eB&^{-QY{Uj#} TH,^ .TUl6S[[{w}/*/IGEU {pQN8¾g3n%#ʾw"/"\BL^zjߘ٫p~^^Gw=xugHC (=^op 4>>~./f1h;ԏ8{f3498/gX0*,p|Ogf̙;.'Iuu^VF(vil\B[V&tVfI"tw,?kDEE1g)--T`XL0zhzϟo=6uWSz5)NI6h$ nL) Gv7y}rCBB曙?ǹRVX={1kd.%]ogA8jec#n'MM fK q Dň Yu.]9/Mܞ+Xm61W< b0ú:0g8'F!P&?B bmmvտ?`tuur,pg&g.-J}Y 'Ʒ/vUo艎0ψ}}_HhD"?r!JNDFIJJ"..jlܸ* oyŝw7|ó>QF5k_d"$LAL^.c3_of$!ɲ=t$LhLϑ66r`f? ϓd[oOv;UUYf +Vqaa<3{6ggpl ,susƍTvv&P4t v#~%ߓHgRFK6W̧:k@xGqӫq,&0Nn<Y0 G$IwEZZjח 0?z5:UsٿfCӴ>1Y~zf IDATRv!IK.%77_ߞ~~̣c|L*"NBI?7d~A[fә'-dENӄ MP^^n?A|gPPP@ddWd2qI'QXXȚ5kxfѰn= aQATVv#t )ğ'̙{`fl,uut޽oiZIGN}C= JǗBE؇H{<ͦW@S{o C 8axa*(xSȨp;! F7`qKEGGcX˷S_?xe7Ao!&Bj@;P\XN @ll,/>&=صkEEE=d5;eq&ӝ V+O=S1cߖDTאFU7UUM bddd lrss S$u^Ȍ3x7RihGGÛKZSq3a/'x3O.$;=_gw'.;~TFe%ݺ2 0x_F!B}J_'6h9eIBU<>;gOKQb%O Yၺw& _<7111466"IyAqw8׳Zvߌ,47ůu"{dY?1qqq>7z=֮]KFFjoJPGJC Ф"zzX92j%|_)?&rWz,l! >xd hFdd$sΥ[Zjcjkk'==ݰ$%%q-`^xJKKYxe(HKK[na>mLUVV]wńqI<{uc?lӇWJWPTG|Nߵ EUj6#F G 2S[uݣWیh07Ttuv9zt+r\=N"#='!8R_N40_G{{=eΓ222:f3{hg82!UUqf4{߉8q"s=&V7_,Z(W\Bak+k$󽕄 Oĭg` #n&y%G 8AvMqq1.~N {/yg9tJFȠb/;\p]w% 1*wȒ̽+>fYs$aVJyd6^}(;1$Xo]_bEV2ѻow{{?.x8,˧%݅ѣGj=g7ÕSWDzBW_}L]]]Llݺ={P\\LRRRЃ$bNI$/m#shi|ԕѓ@W$Uůτedbܸqc477駟ʄ 0$r)L< 6믳~q BBBxEEc񤧧;rzC"ݬxe$؛D ПG_im <xJV+<=7qSV1`=c#Dxfw5E?C{>T##+:::"@jnC۪R`wr.Ce(Jflܖ uHrr;wEӴS_E+C3f6 1\ܹnI?'>>Bbbb[ `WHs^.̏VSph; d"U.$jgaj Y5:Бo{MNJff&۶mP?޽{ QU0,Y©裏زeˠc0L$''Njjݸ;&I顤{ګ"yLZZZxᇩWkOy4B=O@IS2ƨ$qba}]woV"32"fe|7!fQiQ3?H "8uo䥕n܅ %:yǎ۷ &f0M7D[[UUU_~fmI3g2n8bccٿ?۷ow;$6l@RRx))-̓'7:4@Y/А [ٸglF;z$ڮ.VVW["x1By}V_h@%&7}a/+F1#_qEgg:%'Ր8w e )y^mtH`,ˆXVzzzG ]ͮhXT5MvMYYYllܸ HHHp;X,3a +444LGGﮮ.DTTѤǘ1c*aFFTVVRQQ\HDCCMMMdee1n8BCC]n>#}*,4h֟Mtd(mV+Ơ@vFEOqba:wtF /!ȋ aP /*IJ}#ل܉p$"@l,; WD'F:?sgE1ñބ~ p"X?؎>;B${h@ l@})St~5^\yKKKinnv{l6Ү0Lh@s8Z3do6F/9E ISBԠne܃ ['w}vGaݺu$%%1qD=;0vX;s<9B +cDaa!cǎe+uuu(G}s=n>LgdI檋o>GJzx8/TTУ(y?NiD: X,JV#z(bu>Vկߋn}  ̹z9s1. Ӌl~h@ɖeiqnzz~YDmϏ;0ELyy9fy<%''GMM ۶mp$e- _/!HNE4;Ir/=$7o%fu?ًM mMFVV%%% $hhFhv:bFѯDdlT;QaU{=ʮP`$[ʣNHjnpYsʼnRCW}f?s$z\5C.+6*ǿ`qq1ftN:$jkkt)ګ%''sNv=Ō)2d)I|4Y UCR5dz e/JݍWs$gh2UUdSRR>BҎI%o I'#ߺ>/ )) EQxᇙ7+o]JDІ?Ikuxu=c/w#TqxcWZBw"n+E6 q} UUXT\f4wߍsd;6nF'd2W]=ΟID[[[7$Utxcɒ%y$I;vM}}Ga]Ua$t1*AVU`&MdW۷6%I{RXXHVVJ4Q^6*EHE3+WSfgNW4HRUB#9ɣ[HHH;v oaKd2MRR޽{P͛Yr%)Y2DudsOW5#!ރH+@B A$w¾}nD=y]Ѵ=jOCF)0 il6!!5>|za78QBdcz76OE\|dYj?>GbۮN^8qgᢸ|@@톱|MU_Db2EB|`Μ9dggSRRBKK6wII {졨~8k:ɉs2au?Qvo%1;vs#4\>@${mػwĮ>d khfFYYaIVVZQ|$EV{30.;+s'nߊ0/ fV4,;AvD@y]7wjX41}TF 7`;G p&򁁁^^/ 1=Q@Q_qC%5+B{{__NWh`>}󎏪Ji+JB@Dq-뺶]u]]]]ײ[۪RTJPZ5^H&eڽ?ndL@>|C292gy>2m49tPuzJ\AFmZғ{gHLL eeeڵ e7o&11 Z--=h:T@SёLgdD]XHcH+bF.z$P]$ s#F`Ν׻1TVVFUUp]}5T|G^%D?g|Й10;8y7 wO!YwBy`1cpw=Xףww ۱lh4>3Q^ K2ХZ܏'n`G||<QRRc^N m4xZ5޽6: $&&KII 粒M6ªڏcX?s,Q Ib2Cַ7J p JDWix Eg V1{m-*z{z ϥ]!`1&CBn>x_˧P  W@kk[ s?vɎ v<̥7.@:DQd$Z2{Tk;Ԍ1NkGjse^U<GRXXرc6lzM{Ak/\h45Jd]0 'M@jn4$+Q@k$''SPP@~~>ţ!/0XZLxꩧ?.dqUxM @@eʢJ|_v?GvFGt*O8P3WU_z\vBr΀ \` ˲CmSE6WP|neYd29vSՆ.?oC}}= 8Zn`V|HBvMl"|˾B#!6bEhh(3gdĈ477{Ȳ̞={z8tv;YX ڦzϟCo/q`'T>kPaQFN^^.&RRR3f aaajttti&TݎfsZu'Nފ_ԕj4L.,MRseYw A!8l<'4;Q9wRfNoaב@~ Ʋh"O0Aw}ǦMq\[ R>fݷ` 0fLzmd?v^ӹ ^5hJKK !/V+k֬7;r0Nov)L(43+e< xe6duBL.D110i>sc#toݮ<3foY~ ut{Zi'񫽫hkkpG=^)2pvG50@\H[$\=q a`]TOΨ;5hD3PСCIKK۷cX@RWWd}ele8RLDϦ>k$-HZ-N3>ߥkv3$NvTϧQ_7n8eN'$IbÆ ,_?x>BN%t+,ħ &`7eZAW[(~P$Q~:OEW~v ;\Cz{܅vJF`0FzS5CE3DGGԅvCર7%@*˚uq2k&&:TSPǖA2 g`Jv(#IG0nT3z]g& Q4''LvIiiG=nQ9v옣mff&FQ(`>9cjٿ# -蚟M`]=YE\t75# [$$$PPPj"P;]cD Idҥ}c74 mmmlٲƎKLLcQ7l8cU 9=CTUMM®7dl Dį^-EKu0uT233ٳgUUUTVV2rHFѯEEE klhh <rmj9>JJJ">>Gr:::30,>]ofh-":T: ]uOg/ET{~__?%K"wj~G|JaFGzC`5hNRݿ8 yCٵo0aHHO?Ar,G=A6QHv쒈˝Z oa˖-?~ǏsafϞͼycG6&RxVf$;S(MΟᛆN;w.lݺ6={8RSS v` m#5ca)2-xXDw?D %s khf:Ou܍5T:({ƍIKKcرl|r,%}ϺIKdnga'/`k o{Z0=2MƠYa zt.@㷡,E)'j\_qFJJJ<J lY|tF?m0FOk 藘=ETT_ ({ {|:yXV;6$8W-Y"9;_J/af֭[?͛=pۍQ|J"5JX]SMU3}|#s&`vV+,]3fxu[qFjkk{UwD>sXn{Cq S}QE/DEw&t.~v)@g_dOrBn' I&qӂ^ZZڵkI?bn:U6rϰ@)h}u} ].PT| ڈ?Rz-MˋPS?*P^G_:Q{z38pSz[kP'>fNZ.ꇞ 9]`s##]pO9v0> pư?DZ HG{0\ {,;b4\FIVRWzCYeu1Ԓ.?j*3up$St$$cfq-˫$97N߾6t F4 uuulذ۷Hz=rBݸ1w``^'xi hHX 3/=Sb QfJNxx8fbDDDxN~~>֭Up֬Y{籿5'Xx+ѝAq7T|@G ;b~.sɜ:MEH' e!F /D '%p=J@Kl,:J_޺ZC`Pa`<vӮg&KR ٞv}wp^d@`k0N""zow套]Cr6rNr5w5Wwq8Yyf;R^|E^~eݶS1)'Oǣ ̘B-c13i5Dwxv d *Im.&L.#99[QQׯg߾}n&b4) љz-||-%)-~ ɂ,X)S88 E/ajkk{ܣ$IlٲW^y'B]%c -G8S4"cCyhF0 xZ?A -|\H4+WranFX,xn?Jm|$p}"ng8s_hN@&S+Ægr @ͷDH 4b^Jד㘈nͯ<ܿ-,u1SL.*78@pp0grZw'?֩^҅aLڻy%&h̶DoY* @eU %dl6̞= .k|\EV+c!NȋE 4 J{BǍu۾w}uup$):f(,vI@U 'I 0DEEqUW1yd֮]ˁ<Vu֑˒%K:u/NxȽeVzH-}!=1#L2VQP֘GQRחՒIXf͒%K(,,d׮]􉢈db۶m;vl┝ В D!XM.>In4"X,h,$X1MAi6e4w_L0!Co>ʼ'R^^Npp0OFM~Oph^OĴ,3,1 8?nўdqU//~ ̙҅{ ^|Eor`ŀ2*t< ްy 8w˖Pmmi%,uY5Z-W^3ZL=3s(q}  ~` rrjj qqqtQ-dL@ ֑:"t( (z>8FaᤥǺu(++(\s ~m6mIJeP$vᆦ5!-u|Ffr' + I2vKu:h#>dRSSٿ?QsG@)2W` F$:"h;;+ccMb{'C2Θ&O;މ3N$)Ig̘AUUc mSS+W[qv (Ӷ;.J)mb-F_- 7ɓ=׵kײrJG\<;D{)Vz%Y<&=Oʯb 3qa7s0aڵJZTTDee%ÇgĈR5B{'$ahi#: ViMmd&ѫS9|2ŭC,7ԱD\\%%%۷> Wgg'ׯ?_9XNxQd* BEOqwp3j(r}YozK>,#kJ@"?nы-߻+"P 6@R¸qݳa]`0^|eYdrr"Q0_ zƥddɎ,HѱN h0fy,¸袋fƍqݵkc,XPƞ^'pe̟B[DB? ҋN % C`bV;'L^4[*f#009sP]]O?јQ0vXҺ eSx٬,5"՘bu} @S2I,P L8|0vdX,֯_Զ+4({ kN~MU(;(᭿q?In{cO g @%J=Szs!2vf\ε=; ]]M'5=!.KV$ =**D$'9t]k 0@``{h1biiiݻraěoƍ5j3>\ݮ|cH2,[DmM3$1JBl'}Ƕ} v8q͈wYaC: >|أ ׳i&RRR7n=Ɨ`NC<'e#HN?0e09rss9v)8Pjbݎ>>P1'.b= TUUyjJ 2I6{ _tE7z{Թb鴴j?,}V=;'ի`ڴi}0w((( 8$F,k.n0^u088W~W .I(A4eBv l༉:$\ ̼iʬq3]FJRw* iӦ1j(4i\r .ۂ@2)-bd66Ehm#ٚ/סY*N| HVe :ݻwSQQ㤤*ȑ#1 C`߯n$jLڣc舌Z- iMKSƍ]/n>㫯}oO@' joPځI&ᇙ;wIrUl޼_X˧Eo0{y۸v*_WҲGEE{ƌhlj{iOW-8F`, |}0Whjj?`y3z_^^Auթ{UBzZ)뀅=w<\3 1-;~M?1p]w1k,.~v#<ªUhm\ _Es`Ny 3 12v  !8ζa%‚$wv"##=~n*?`]"ǽ4 FGD;Vxk? ^ewc0ad?PhՌ2(^F) tޅw߱uV/^|J]]?TP -8=ovkx{J j@}jK?ZSSQ1=γ{8Y@~~ϡ!,RoA5^~QG޳^gxbzdK(/ā#fM2614U!IDky lh yVRwqcǺfP!I_~%=۶mI""Lo 0w2sxjE{S{vN3N\\\pӦM뱳wAhoo'77oZ-[S(_#So m$$1>{lhhAxaa`?,QMWYo { x#^;|'n&t x El$Ut+7ʃ'///nDqqqSO<'tȲ֭[6l{ gEW`5pe/رc_|1Æ #,, Yijjbٻ)S&r z_xNOPH$;.U+vE"36qrW4o31)K'_v3/<Ű!ziq?jZ? //kRQQ1,믿Ά +>goo̜h`ss'qJ:;FUTYy̙˩LRRR8tnUZJ61Dixf6@ * 泵T͞Mk .A/^̜9s(..b֬Yf;) O _HZ?(&Ei>\@q]wqW2n8k{BAA/fϣdM8ξNUp]ԋ|} wmaÇw tEGGQX΁=s(@e6lqz?qo/rϻL6^ 7mdȒ  zb/&+kTdYfg~m0x[{Gd0]MJ +7oW7!:3r͑DcV#=";Rö"3&1Kxw:!ݮNC?ĉSxꩧ2e \rVbxf^yLFJ"FKyQL&S 6Đe M^$It:Əϐ!Cˣa uQUUȑ#5j:AZkNH@`M-_oKcEQ 8Ę1c뮻f3ٳr6mԃb Ԁ42+7ݞfP!lP {a.dғbaŊR,[M0ݕ5u$xe f̙TWWw^z| &#Cn nangk@p (`hn!y.D49{COHHƍ# FKK Ga޽,_Bl6[[5 F%%:`FYB$N= 9$3?|y(u 逸 tW^ȑ#faڰXX>F{{;a8\v;VㆯbъJ6+'IOO#-#Q+qcHJJ1/vJ>__u7\$pScW}uE={w[UȂ H(uV|M.xMc=4Xl`>kP1| f%ᴴJ) ~*? 55|֬Yʊ+ؼy3_~9Æ I =I-A\8g,{i2fV=Qff Տ {ğn.Ck!CÇ9rVu555ߒBNN!!!nDi::GtϠd @QLٗ?Gkj2?lgR;~-=Ա=aodΜ9ҷC*^0LTWW[kxQ@ K bɌ8bI2"ܨd 5RdV ()Sx3gI ֮]쩉[zؿBz{3.c#ۻ;-Of|ȒϯОAzHƇ+?bz ,˔A^r:;={Cwv~y{[+w}{L:cԏ *BM? \8;Aç#ImrM:::h42sZFN0u M gT :3$IBדCFF林-?p***rҶl'8wxkH02$)d|YR7fDfNdDذ18~<޽7|Ʉhh4Mzz:$ahmm(oCl6ƒ45\:3i!JjT!ztM5$K(B>K,[na޼y~c=TVVsy[D>xcvA*$[ z\eO>}=z44XY9t0_y: ^U.&6rR)ٳkI99szh4(=^ymm-6lDhhChjlt9v?W_} *(-;~G; X/69[0>[#V^y:_Hٲ,S]]͆ زeOEQd…̞=' +:@t+n")NRL# QN~uq^2,pȲ@x*A!aZ,9^UͪOWG) uu_MiG7ؾ})KQ$I@@ }>޽{{Y|(31sܕΧv"9pQ_D9lH[(BmH s \uUL*'&2,Ǽy())8q­! l۶2uTbbb،Fg|ֈ(2#?_CDO|y3f2ysP=wNr5x0 \tEL6իWqF\~Tdb,[A(..رcaJvVޕ;kaҤIg|WK/c݋? T` '־yZ.JS:.m-p}yStfA (H; g L@u]zBLtGTcEE6B1 @1RU xq^)4??=\讠׋$Y|]f3\uI(QZ^Le inn&66crJkb&' U6ª^=Q]BĂgLE8h$''ihhpkЈngϞ=:t8ƌøq8sk+Yhq ,Z{k3}Q6mF/]? \vO9t(q q66Vڃ[vI1d;-BII)fY,V,=~Hxp ::kxPݜ])aA dNs++sb6m"##ѣGpJQd(#Z@QOL52w {( /=:&0\HNNfĉSVV 'MMMl۶b`7N4Q7{|E=_AS`6d٩E oYh4ǓfqIDttt1#Ét)|@SD71S"WBXx>$7B[;BL sFDD0{lX0I`2ضm(˰a81cqqqظq#>Nzg;rKI3 !>>Ma[pz];:;1phټ8M0bI_ WɤE%;AzDAt? bvI4~Kff&G>7>VǴl=׷qz?41Z> Y:J- 0**ǓDee%&c\ݻwSXXHDDnCZA/0{z &md>#6XN&P5PSĒw( p 7~@dd$iii =8z(ĠedXi ݾO ¼^{w HJDx ]W2ydƌÑ#G<EQfǁ #22ܩرcyDB4%gicٱvylvbʲ@A41HHHp{{ԅu`0n<0| }uZ[[)-)A%{z@>#6%ZWHE= 䒋Bn2k.xVXaG'o~)F"eVRRRUV۷S__Oll[eIP a)yh"y%c[D $!̇D24BDN%r YK˲V%66v 'C#GhFDVVHX"xl)EcG>94>aj;}؛ܹs&??'~)//'&&S",l6O=Wl7pྺه3}4U݆bq,a ӌ^#.Nb;XT: Q4= T67sοTV R.@8 AAT<{sI ,|״1iҤS@@&{t}̎<+O1@9Zjg\$4"3~gbP : &`(//^bۉx p^0Dx}%%y$WW T d$X>Z#]Ðv͎0Nn!9XU@@III?bHJJRFB|l D+ȯ⿑a[.?8 ] E%KwA --sh8pGزe mmmy7o}קdFcEISRfcY{]u%dzf3:xpUؗ@P<Cn} @VgE#@#:@ibOxMbY> sH$rss9z(&L **.y38iFJ-F=)Xxw/ !8H;>2}s=캲˺(bٵʪ(u]+EVP+ jB۔L;'3sf2L401drg2's=}Ͳ/YHbHj 1h l6~mۆN#--gxVĮa:E[z/x x;F gHmeїdZpl7/'%%zFO"`Xؼy3 yyymrv f3O  Hgiww#dg#3W Tো>;P[II 7of̘1!uV_-^)6-`X0QktxVt%0;'0A(o\RG6>r u# Cv0/|7ݛ}Ta`_ϼR d+5abk%UvRD{!Er2;NM8Ç'//NFm۶qN8m@j=F&k&0zDrHvq˄* |IIIՋ(uuu|455^P猂_B¶H_GJ0>ZpM0q"{HoCx~#/71e!--qƑݻ"pwl_^^)++usȭ NEEte{v;2 @Q`n5RHpkbf5sq({ut:Lj#X,~;vM6a6HLP1x.W%bV.=?KƧZF$f>hcQQQdee1x`Ǝ˰aè'ڵM62j23 >W!> µWF7H/B_Flk@AN(!"zbܸqT*}HĤI0`.̙{CeO\223|N@B'HN_JMzZ[`WCtA;'0 8܃P"558,Q IDATN 48z(vQU/JRFY} (w;vj*v_](1+˄JɓR}f$4WZno/ס7beXLqq1555>YRsN429ViU fZ-)))e?ӷ0JZvk:FĒD^^׏t$N>}8|pF#6m|Wc0z#Skߋ+ ?k",YpJ"\z+#܉0pdft+(..fĈQ^^Nnn.7t ;Rv;wdƌ455:!S#߄y2Z·.ɝqɛ[ͨTjRӈw{v=z4R 9A$bP^ | Ԯ# liGWVQWK ȑO8d_puuu\ 6B~~O܉@Whx&[xpz En=ZPsɸzcٱS/+W$ }#ѣ !"۷SRRBRRO}@b+/_Q f;"+τK{ӫ m즶݃P\S&#BL,`O3g!]vY"5j##8>7Z"ENca yygͮ\˿V3*QMjjȓt&ˁ 9A$tw]I{ @ii)C5lmBQt?OUU55a;} lX,r?=ҥKٽ{7999~;)Q՗3dһ@VZ~sgJ"60DRUlib#9djs?o>`DGG;{:tG7RSSCJJO}@|mjs8sVJJ3-`&D/o休QV=۷/FfQRRСC袢= uGdQj#8A9s|4ÆZ0L8s(?B<1}^222ZmV^c=櫯 I3.EHOOw{]ٌ(@LNԝD HMM%??/I677SVVDTtj hrq&` sng>SӧO'qJ 'KCFڵZ0:RD.>/Ͼ6p等dgjjN'1V >ܩ@ii)7oh4e, Έv#2ij.??byf4,k!%[pLo :j***|Ʈ]زe a@$}´76p5Fa /FkBX6l['! ܥEi())u!R81,#-=l%Y\=S G*[߶  ")))G=cw繫U6*--tQ:9nKHv g@aTSSKuUX*|!3Nj2ظq#_~% 7w|7>hf#iPr؂Zȟ&ųa?ϸ1XR>:t(vUUU>'>`߾}ܹV۩@z;յVheglak∋S?|րD^눢HJJ Ç#GN׳a:Dvv6}pp#=($% @f6?_G:}u嗂wX:({̝;BQل8S-|d 8o;z>R Tv nx͛%pKK+C%Eeh;Mmm-UF-LzV\իIKKW^8`Ix]?> />Jc<6#mհi\7IIIaԨQdggsa_pn}9*`1z}{vؑ~o%ll%Z o/ѣUK q ZMnn.F"..w @f& 臐 *x~X`pZhh@{(prwvVTaD84+#%%٭qX-`6# }pE#6 "FNxNҲ2AV4T"(ʋK8Wm]+*؀uTVVtRvAAAyyy5HKQ3jX4v ]DCHUsx$E|5OMno#<ƎKtt4Kyf?VZrqVo0q[rcEt|-[M$9^|k/#&Zl6sСN5d͚5h4ɛ @a<:->Fjn~w%Ib֬YXa;mOecȓ 3og) Pn, *],77EqK#4 H!sLdSM* c NR!**cQx ߚXP YPKSvҥKtp1\:>~Z^W~RϪw(c6i"Dzs]Ah4ߟ: Y{s-++c  XJ"}{kѨvm鹍<9#m{&N`:jk-)yM+8쑇 gZjO?}vIKKsF5}oCxi6!,Bm!/Eؿv!`aƍw}L>2LhH1%h~lYHNg(ߣlA'(/z}$M$RYD#ЕtG;;*ʝ444PQ^wsBXw{O h2ذa/FVӯ_5r@HJPaje+.̇+ kGNC0$^[@fuo2F~Xoqw7x?yRRRҩ>@vv6Q:χ|g"Ţ38(#!1_r~u@l r eë% XݓD GHII!// uO'@cV 팀VF+ {24;:,5d˳\۟9(llR;v ع `1[#]A0RȊڄp\WPQQE@;@Ks@ + P/ji&>#bcc۷o cwЧӋZyt`ZŽU<~_:cϊo/T3&L :_Sm2|pȱchllp {uV4 A*YpÄ8n:/Cۖ㯪W1X˭'V 44ٸ$ z/+VM>}vwIWŻ~NK̼/L5*$Ƌx\V#=7ϨaZ2\jjj*cƌ!== (L&v={JPF :}Q|wQ#kݩfɿ>gV~{a {i9,5ej<t:g/"pq֭[Gss3ƺ(|\NVz5k|6/>00^ .ٱRN`XILL$))[Hx3'$p:099|8&RI8t6mBRa ,re7|C=K8.B00TjPD\`X'm#0/9ۈ$`ALrsspL---TVV"j<Q-*ioi Ȣ`4$,X@cc# ) =Mŏ Y,fxq,˾jezzkD02=%‚ Z-EEE >Ai&Z[[&*ch.bq2~0΋YKB5OǒL,Fj=@||`׮]޽8RRR|Gqojj;СC{x->00^䮬.|!$&$dN;v," l[ar8b%vpkYRUPHm!,"c"AWb^`Ȑ!̛7/hEt|07'&Պ$ 7Ȼw{ .aP4 y}dgNr/_s=ǚ5k|$ĉWV+4nqJl3j^̼88~9ʷkZ(9qBRQ\\ϔ)Sv]2͛Ǜo,3tRxy[tR֯yL5+wm$yt #,P'V~5 &@8# @Te@^#Gǹ ـ} .f39K.>}to3DV`hZZ|7>jaYZ6o7zG5nرcIII: l۶}Jjjj%zjielieh.~:.瞧zOh!N'18MZ&??QFj;ذaz޽{vU=z[nŧ(r!E^slA.",<E! BO$%%7zY 4@^=GC'MN{ | i{:>CvAQQQN+piьC$bH45ٹ8 \? }BRQXXȘ1c$#GtcӦMTUUE||Ƌ*Q`2RDZ[%(Mbn#}| >AFoyϬ蓧fF.;/$FTTdذaN{dI:$$a49ۧ:>,_|CJ[ӓv' 6 Q (@.V$''w{ 2"i4P'4`Co + WmQp~ jY5p*\w u0oh/\W ;:t571&n6Y>|-I ʏ[kB@ 4CRSSCMMѣGٸq#f٧>@% -2zx }{kf]ﮊ?-lY5__J#6FDT\0ZG~åf'Aw`gqI1gGزe }FZۀݡQc<ELL vEf@ '[@ x B{MWD(Eo HNN&''' @T-P`0p.;O!O ۯ6Xv-s!''}ugf(z)vv;6Zۉaz00hvbb"F#G;(XV@LL >vGY{$roZm;XϬSɒϪ'3SnHd;<8+(11HG|DE9r$iii9rF „ :Ma L6]|$@֧@Bff,!): н G j@i4oؐX:"B[]@0 f 7:?_g}Ƨ~JӧOP2xoH Y r "S?mӯ\va dee1vX9x3 m6KZZiii^ONTqŅqs-?1%VZSSkc &'Zd\Njz>|͆Jc*8aŊ<Ӿ+@u80޽{ݶK=̀Xr@b`"HR߆sIII.t@S]7`&dtQP[[… ٽ{7dffknOGF]*_CN |o/%5Y*anj}2zhv; $ӡ8~8^jnLV_94 (+5Ty|F*jqF4Yj F}aw2Y >sgwrM7Q]smYЧ]2`:*Ŋ$$N!9ݱ IDATȽU;`PIB^Ƃ/约p>/ŋxbfΜwAV_ gZ vlMZʰ,yK<G{O41cưdӡNv;ׯgΝ\|Ō?ާP`iQuSEb^y"}uTwDq+vXF^Brss;:3 8.\Ⱦ}|R <38n 1_9޾1ۉ"J #1`F5`Jr~o28tЧAI%$`GoNӯ_? lXM34y2cz[ ˾h|U,ge ,T[a,3-`Zٳg#++2IJ`h.ͥEIdehX{e*Kň~],Ir2/;˲8¾}4ip/YBO"}A@׊M(B"z`ń9 g~nUο~M1DSzdd[ZZ[y饗x饗7n\)c&}dJADˡ0ʻ<n^l ?6UJ\İa(**bݺuX(2|~j 8{h] ϯO\+ R]igs I j_!I/;!lfQp:ʹZ}޻㤑؁Dvvv"N+` 3;V ;26_D> +++Y`G`l-)zcVr2UdeQ. ،4tZQO蓧bܘXpJ%>NFO>1[ w$tjjjظq#UUU|)0lH4I[#*,eP-;1c Ets `L/گypsD'tD:1 6!("S)H`0Nj Pt.g JXJJuېMxNV#\6,}v̙Ctt4 Z( 6aDrZ4W^CHNȀ>:9#gWBsmqOOWC4WgEQcٝ*KfC퀻@EEE8 1T*yp0B?.a;Sםp#8 @QdwA I<|Ơ 0-EŴ??38*n^YmշO#d2jJldp?56}m_{ŝwԩS88&K,a̙_ާ9NvGϦsȘNA ~)Lh8'+2'6 /đΥ e^BSE%* QڬWweFns*,Dvh4xb{ T5:ļ8^kϑ yn60fc"CO*+o.bc3e}@vv6F"55Rz}? 33ǜq+Q993jP^^W_`;w'p0 Q]]jm&&  'EPE2pr/DVVV@DADV;M~\W "U6we [JhB&5_#<_xQϟOyy90vCEQ#m\5LOxfol+uWsh5V+}:{n v4ҥK9s&6my|W_jO? 'W?%9ADr_VV-?/w'} N Ap@ Roh /Y*/cT}<}hFn2.}-//+`͚5-4݆Jj"Ffx,sӕ 掇jذ+)Gvذu.} =mFjjjD7|tKV|j*,Y*{12'*UKMpx@DŽ+{`'ͨNr}]1@weMk*N*0|]yw}ǹٿ?xz, />ºfo/M1:.:O.]X$j'kji5C^&+1117L0V!qJJJ={66Ş f޿{!vMzB]C KrJ Rsun x8DJ %&&0 @EE=/*%}قFP_4p8 _ؼy3:ݛT 8NV 4YY5LWO|yc,\ȋo5\uYX?nEuŊDGGS\\1L]˻>ȑ#N_FXowwuA` ]H{YBFC}mF@n /N^)`]x;C3Bp8Yȩ?wf@ C@";;)yWOIhoR4#wD5BB6B!^`Yj/&'' iV  DlsjYĜ=ʨQ:!bcDn.K/HXd0Di~!l MvfϭgP_5>ALHTjjN;BlŠ+8~xEz͛ǷuG0O##aFp"7p'Pkk\-!!#ɢp[NRN_I,\Y>uQe-{crˑs~_}{.w}7v Z۴CEa2K:{,lceX$yOa3:h~j?)Ϙ=\|AZ#Ⱦ}5k.AyqF^yg!4fDB>'hc*JA_BpsQ}u^_YBN==W`*rSg_#F/:ߝČ? VDص̮}Yk`#Ugr699 &3vXVkw~{1֮ ]d2vvGȮ=:B>iK P̭a.!mȾ!HwFR"P7_\u]#q:'6$o ^Z}akk+_ XhQPLERTKlul f|.l|uq"3H/d1gV6I".jBBw&O<@QQfsǛhGG@_|R hNI|NPԊޡW*BA`_'#F=w=oLs#!Q ,G֧{r 7p7zjL&S/&.0νǎ3i3oF~ؠ܆F޴|j"MԩSIII I~:jNrCU=h6*]rxJrKdّ28Y X荹f(VD"? FB+W䢋.>wŀ*^}< ωu-58c8?ONvVuu"**ѣGs׶kw 4 W_}uP wLs S'RG=WI;Ib;-HG8'2M$$$2@  8}T*E (l+EZ7\ $d{~CZ6o… t呐31^1\pN,} [|5c1XjX?#O=NvtކE9r$ "_|1g}v߃7/\y啾1x`S6ܚUr HII!6U`'s_* x:p FԂ ^Fng_e]… OUWXek78Ziw*U> dddp-#0d.䒠_s=a=z=|NhT(sّjS#7K`T d?R:8"3tkϞ=zz뭬^1xF`*7;n7gGn;R߿?wuW@Z : x.fz!BV8S )l[;A@6#oZyd~D-H >tIrQgˋ>qg)@z@  $p~X?iӦq3xDtLH ec!'Of#@!rFO$ZqsG_3$ Glaǩp\ n'{'p `09׌$I?9={6d-+Fŋm6_f4 |NɤkbTF]s4AXV`:0Y#8jWȋ uKRTn sP)=C bt.<]566裏2qD{⦆:8O/1&yϪ)3rW @͑r,_rF[%l{7``T% h]\AH=%2D/p!.~'&O̭ʕ+1BȮ?Or$svXQ cNPznw8YéLXdGɉEWyR4.2H3}CNE@\ܜv+V+{e۶m^x ]6o̳>z`&!hڃBPR1Xi:P_iӐn7K/x Cz+$uuu̜9>o=Qt=";|"~uّBn]vg5.#;#Mk x~[Q8тY[~'2w28e6yWs%ILB zIP=Dme5sc=#}@BЧ;5AFȵo &րApPp%$Dd7k쁟8/Y8v&OW_}TO|嗼 #/C3_BDMhL'JDkk#/"O* BX,@6iqYRT|D=;ap+'ϙ0a{/[n >"GeԩَA福R7\Ʉl"7Ba@hf1<"ĥpCee@=A{Z̛7/zCkNx:q***|քU=p @T)7n'y~buto6Fv9*ߘfh /ʿߕǷa"1AghB~ ]UUUOr5oSWW1 V9s;tv!ү!PTn-IGF| Ңoii P@cyf 0tǀG].? mn @waYb?~6B}A )rnuYu҂^#>C놆ƮzKS*R6_؎?ߋ˹+>}:[l)lXnSNE{;Dp] #{@YUVVmB$]e#=;v}hvRno$ 90#^_h6[o1qD~i=1v [nꫯҧxPp(/|*sܾ3*?Qݿ`@k(C:GMݾco VB}t rx jϟ1ի8q"55eD)5Z.ϝsNs*N|nhh 9vJt~nllV%8|wg(˝:[?| Qlhu .nwIꫯ}wvUV1eGe?{Ϻ!@׳pBzl#TZ4BNssEi3K.Z;RmG][[KCCC3мƒ0 'X y+ j= A@a \ljL&ϟ_ĉ3g;vzzСCL>ɓ'wfPcKPՃ T,vL3~`0@]]n`qn6Iy/666)??'pE$}-) XF_@?///@ k9s1b!555|̜9={ZD߽s[Еy~k. F(ZU*6RVZԩSyר뾮E&2_te=8v#7 $''d66 ͊jf|رlH JA$55 TUU٪VO%IDATEz":wTTTv$-}( ]GU}B0x 8'qE}'|'Hff&~:]t "558Nݳg֭cҥ46vɱY۰w{<hu:ʧQͯeJW"f**++KOyb̬}I&v6O(ӅF !\D+>`#PaNf'NEEZ ]A@VV+$uLFI= <@[{馕i'@BKv;5Z,g肿Ɍx~I}}ˡp(jW]zW*4vock@r$|gT~žVl6[wU=da?!躨Ŏk;(t$&$I:S]]2d_z+++ՙnQVv7RB`lEzQC ?qMDЃȩݜ)VPTx9ۣZseez`:Mȧz@נ$kjj,$#(#X9(냋'CH"vg6t5i dyLNQSY_1q:zTx{vn$6d_ z4]G$Iޗ$ ͦKKKP Ib[8KKvҳÎlY#(wwUupNK;M-!n,mM0јE _n1^j4^ ^x%z/2qq]͐YPZ=ӖB7'9iiN=dG'|8UeS?Im{^SOVA@sUYphX_xfEQd||SSSw_%'3332f.,\*jJcB^-S5k'ٚ$MuBHқ MbI^vI+kIV޷ǵ{Tje;UkL5jI*T Z.+Tрk$VRvn}IC}G##'?vС՝_4[`|_/n}`k=d$©kf͚^[>TW/%y<ˏvNr' "7$l7͢hhvujt5wJezM˽oT];p۸?GlJU-H58dh_SLY|S윞,"eQN?tw߻wz#OLxIENDB`klog-1.8.6/hamlibclass.cpp0000644000175000017500000006532014166020421014432 0ustar develdevel/*************************************************************************** hamlibclass.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "hamlibclass.h" #include #include #include #include HamLibClass::HamLibClass(QObject *parent) : QObject(parent) { //qDebug() << Q_FUNC_INFO << QT_ENDL; timer = new QTimer(this); //my_rig = rig_init (RIG_DUMMY); //my_rig = rig_init (RIG_MODEL_DUMMY); retcode = -1; //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } HamLibClass::~HamLibClass() { if (rigLaunched) { rig_close(my_rig); rig_cleanup(my_rig); rigLaunched = false; } } void HamLibClass::initClass() { //showDebugLog(Q_FUNC_INFO, "Start"); strings.clear(); retcode = -1; rigLaunched = false; pollInterval = 300; errorCount = 0; readOnlyMode = false; justEmitted = false; reading = false; freq_old = 0.0; connect(timer, SIGNAL(timeout()), this, SLOT(slotTimer()) ); clean(); } void HamLibClass::clean() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << QT_ENDL; myrig_model = 1; //Dummy equipment bauds = 9600; dataBits = 8; stopBits = 1; shandshake = RIG_HANDSHAKE_NONE; sparity = RIG_PARITY_NONE; serialPort = QString(); sdtr = RIG_SIGNAL_OFF; srts = RIG_SIGNAL_OFF; networkPort = 4532; networkAddress = "127.0.0.1"; rigLaunched = false; //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void HamLibClass::setPoll(const int _milsecs) { //showDebugLog(Q_FUNC_INFO, "Start"); if (_milsecs>0) { pollInterval = _milsecs; } } double HamLibClass::getFrequency() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << QT_ENDL; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running" << QT_ENDL; return 0.0; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... " << QT_ENDL; return 0.0; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... " << QT_ENDL; //retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Freq: " << QString::number(freq) << QT_ENDL; errorCount = 0; reading = false; return freq/1000000; } else { reading = false; //qDebug() << Q_FUNC_INFO << " error on readFreq - END"; return 0.0; } } bool HamLibClass::readRadio(bool _forceRead) { //showDebugLog(Q_FUNC_INFO, "Start"); return readRadioInternal(_forceRead); } bool HamLibClass::readRadioInternal(bool _forceRead) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << QT_ENDL; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running" << QT_ENDL; return false; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... " << QT_ENDL; return false; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... " << QT_ENDL; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Freq" << QT_ENDL; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Freq: " << QString::number(freq) << QT_ENDL; if ((freq_old > freq) || (freq_old < freq) || (_forceRead == true)) { emit freqChanged(freq/1000000); freq_old = freq; //qDebug() << Q_FUNC_INFO << ": EMITING; " << QString::number(freq) << QT_ENDL; } //qDebug() << Q_FUNC_INFO << ": read: " << QString::number(freq) << QT_ENDL; } else { reading = false; //qDebug() << Q_FUNC_INFO << " error on readFreq - END"; return errorManage(Q_FUNC_INFO, retcode); } retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Mode" << QT_ENDL; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Mode: " << hamlibMode2Mode(rmode) << QT_ENDL; if ((mode_old != rmode) || (_forceRead == true)) { if (justEmitted) { justEmitted = false; reading = false; //qDebug() << Q_FUNC_INFO << " - justEmitted END"; return true; } mode_old = rmode; emit modeChanged(hamlibMode2Mode(rmode)); justEmitted = true; } } else { //qDebug() << Q_FUNC_INFO << " - Error on readMode END"; reading = false; return errorManage(Q_FUNC_INFO, retcode); } //qDebug() << Q_FUNC_INFO << " - END"; reading = false; return true; } void HamLibClass::slotTimer() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << QT_ENDL; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": Isn't running..." << QT_ENDL; return; } readRadioInternal(false); // We don't force the radio reading. //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } void HamLibClass::setMode(const QString &_m) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setMode: " << _m << QT_ENDL; if ((!isRunning()) || (readOnlyMode)) { return; } // Check if we are already in a mode that should not be changed (CWR should not be changed to CW and so on) retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (RIG_OK != retcode) { //qDebug() << "HamLibClass::setMode: ERROR: Could not get mode: " << QT_ENDL; errorManage(Q_FUNC_INFO, retcode); } QString currentMode = hamlibMode2Mode(rmode); if (_m == currentMode) { return; } retcode = rig_set_mode(my_rig, RIG_VFO_CURR, rig_parse_mode(_m.toLocal8Bit()), rig_passband_normal(my_rig, rig_parse_mode(_m.toLocal8Bit()))); if (RIG_OK != retcode) { //qDebug() << "HamLibClass::setMode: ERROR: Could not set mode: " << _m << QT_ENDL; errorManage(Q_FUNC_INFO, retcode); } errorCount = 0; //qDebug() << "HamLibClass::setMode - END true " << QT_ENDL; return; } /* rmode_t HamLibClass::mode2HamlibMode(const QString &_m) { if (_m == "USB") { return RIG_MODE_USB; } else if (_m == "LSB") { return RIG_MODE_LSB; } else if (_m == "CW") { return RIG_MODE_CW; } else if (_m == "FM") { return RIG_MODE_FM; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } else if (_m == "") { return RIG_MODE_; } return RIG_MODE_NONE; } */ bool HamLibClass::isModeADIFMode(const QString &_m) { //showDebugLog(Q_FUNC_INFO, "Start"); QString _mode; _mode = _m.toUpper(); if ((_mode == "AM") || (_mode == "CW") || (_mode == "FM") || (_mode == "LSB") || (_mode == "USB") || (_mode == "RTTY") ) { return true; } else { return false; } } QString HamLibClass::hamlibMode2Mode(rmode_t _rmode) { //showDebugLog(Q_FUNC_INFO, "Start"); switch (_rmode) { case RIG_MODE_NONE: return QString(); case RIG_MODE_AM: return "AM"; case RIG_MODE_CW: return "CW"; case RIG_MODE_USB: return "USB"; case RIG_MODE_LSB: return "LSB"; case RIG_MODE_RTTY: return "RTTY"; case RIG_MODE_FM: return "FM"; case RIG_MODE_WFM: return "FM"; case RIG_MODE_CWR: return "CW"; //TODO: Check with ADIF case RIG_MODE_RTTYR: return "RTTY"; // TODO Check case RIG_MODE_AMS://TODO: Check with ADIF return "AM"; case RIG_MODE_PKTLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_PKTUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_PKTFM: return "FM";//TODO: Check with ADIF case RIG_MODE_ECSSUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_ECSSLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_FAX: return "FAX"; case RIG_MODE_SAM: return "AM"; //TODO: Check with ADIF case RIG_MODE_SAL: return "LSB";//TODO: Check with ADIF case RIG_MODE_SAH: return "USB";//TODO: Check with ADIF #if defined(Q_OS_OPENBSD) #else case RIG_MODE_FMN: return "FM"; //TODO: Check with ADIF #endif default: return QString(); } } bool HamLibClass::stop() { //qDebug() << Q_FUNC_INFO << QT_ENDL; timer->stop(); if (!isRunning()) { //qDebug() << Q_FUNC_INFO << " - ALready stopped - END" << QT_ENDL; return true; } int errorCode = rig_close(my_rig); //qDebug() << Q_FUNC_INFO << " - 10" << QT_ENDL; if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_close OK" << QT_ENDL; errorCode = rig_cleanup(my_rig); if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_cleanUp OK" << QT_ENDL; rigLaunched = false; //qDebug() << Q_FUNC_INFO << " - END true" << QT_ENDL; return true; } else { //return errorManage(Q_FUNC_INFO, retcode); errorCount++; //qDebug() << Q_FUNC_INFO << " rig_cleanup NOK: " << QString::number(errorCode) << QT_ENDL; } } else { errorCount++; //qDebug() << Q_FUNC_INFO << " rig_close NOK: " << QString::number(errorCode) << QT_ENDL; } //qDebug() << Q_FUNC_INFO << " - END false" << QT_ENDL; return false; } bool HamLibClass::init(bool _active) { //qDebug()<< Q_FUNC_INFO << ": " << getNameFromModelId(myrig_model) << QT_ENDL; if (!_active) { //qDebug()<< Q_FUNC_INFO << ": not active, exiting" << QT_ENDL; rigLaunched = false; stop(); return false; } if ((getNameFromModelId(myrig_model)).length ()<1) { //qDebug()<< Q_FUNC_INFO << ": no rig model!" << QT_ENDL; rigLaunched = false; return false; } if (rigLaunched) { //qDebug()<< Q_FUNC_INFO << ": Already init" << QT_ENDL; return true; } rig_set_debug(RIG_DEBUG_NONE); //qDebug()<< Q_FUNC_INFO << ": set Debug NONE" << QT_ENDL; my_rig = rig_init(myrig_model); //qDebug()<< Q_FUNC_INFO << ": set after init" << QT_ENDL; if (my_rig == nullptr) { //qDebug()<< Q_FUNC_INFO << ": Init failed, hamlib returned fail!" << QT_ENDL; return false; } else { //qDebug()<< Q_FUNC_INFO << ": rig_init went OK!" << QT_ENDL; } // Code of DG1VS (Thank you!) if (myrig_model == RIG_MODEL_NETRIGCTL) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_NETWORK" << QT_ENDL; // network based communication my_rig->state.rigport.type.rig = RIG_PORT_NETWORK; QString netAddPort = QString("%1:%2").arg (networkAddress).arg(networkPort); qstrncpy (my_rig->state.rigport.pathname, netAddPort.toLocal8Bit().constData(), FILPATHLEN); // the other stuff is hardcoded in hamlib! } else if (myrig_model == RIG_MODEL_FLRIG) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_RPC" << QT_ENDL; my_rig->state.rigport.type.rig = RIG_PORT_RPC; //my_rig->state.rigport.type.rig = RIG_PORT_NETWORK; QString netAddPort = QString("%1:%2").arg (networkAddress).arg(networkPort); //qDebug()<< Q_FUNC_INFO << ": " << netAddPort << QT_ENDL; qstrncpy (my_rig->state.rigport.pathname, netAddPort.toLocal8Bit().constData(), FILPATHLEN); } else { //qDebug()<< Q_FUNC_INFO << ": !RIG_PORT_NETWORK" << QT_ENDL; //qDebug()<< Q_FUNC_INFO << ": serialport2: " << serialPort.toLocal8Bit() << QT_ENDL; my_rig->state.rigport.type.rig = RIG_PORT_SERIAL; //strncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); qstrncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); //qDebug()<< Q_FUNC_INFO << ": rigport: " << my_rig->state.rigport.pathname << QT_ENDL; my_rig->state.rigport.parm.serial.rate = bauds; //qDebug()<< Q_FUNC_INFO << ": serial rate: " << QString::number(my_rig->state.rigport.parm.serial.rate) << QT_ENDL; my_rig->state.rigport.parm.serial.data_bits = dataBits; //qDebug()<< Q_FUNC_INFO << ": data bits: " << QString::number(my_rig->state.rigport.parm.serial.data_bits) << QT_ENDL; my_rig->state.rigport.parm.serial.stop_bits = stopBits; //qDebug()<< Q_FUNC_INFO << ": stop bits: " << QString::number(my_rig->state.rigport.parm.serial.stop_bits) << QT_ENDL; my_rig->state.rigport.parm.serial.parity = sparity; //qDebug()<< Q_FUNC_INFO << ": handshake before" << QT_ENDL; my_rig->state.rigport.parm.serial.handshake = shandshake; //qDebug()<< Q_FUNC_INFO << ": after handshake " << QT_ENDL; // Config done } //qDebug()<< Q_FUNC_INFO << ": Rig model config " << QT_ENDL; // Config done retcode = rig_open(my_rig); //qDebug()<< Q_FUNC_INFO << ": retcode: " << QString::number(retcode) << QT_ENDL; if (retcode != RIG_OK) { //qDebug()<< Q_FUNC_INFO << ": Can't open: " << rigerror(retcode) << QT_ENDL; rig_cleanup(my_rig); return errorManage(Q_FUNC_INFO, retcode); } //qDebug()<< Q_FUNC_INFO << ": Rig open!" << QT_ENDL; errorCount = 0; rigLaunched = true; freq_old = 0.0; timer->start(pollInterval); //qDebug()<< Q_FUNC_INFO << ": END TRUE" << QT_ENDL; return true; } bool HamLibClass::isRunning() { //showDebugLog(Q_FUNC_INFO, "Start"); return rigLaunched; } QStringList HamLibClass::getRigList () { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::getRigList: StringsList before filling it: " << QT_ENDL; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's rig_set_debug (RIG_DEBUG_NONE); //qDebug() << "HamLibClass::getRigList-01" << QT_ENDL; // and continue... strings.clear(); //qDebug()<< "HamLibClass::getRigList: StringsList after cleaning it: " << QT_ENDL; //qDebug() << "HamLibClass::getRigList-02" << QT_ENDL; rig_load_all_backends(); //qDebug() << "HamLibClass::getRigList-10" << QT_ENDL; rig_list_foreach (addRigToList, this); //qDebug() << "HamLibClass::getRigList-11" << QT_ENDL; strings.sort(); //qDebug()<< "HamLibClass::getRigList-12 - Strings length: " << QString::number(strings.length()) << QT_ENDL; return strings; } int HamLibClass::addRigToList (const struct rig_caps *caps, void *data) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::addRigToList" << caps->model_name << QT_ENDL; QString name; //qDebug()<< "HamLibClass::addRigToList-10" << QT_ENDL; //HamLibClass *r = (HamLibClass *) data; HamLibClass *r = static_cast (data); //qDebug()<< "HamLibClass::addRigToList-11" << QT_ENDL; name = caps->model_name; //qDebug()<< "HamLibClass::addRigToList-12" << QT_ENDL; r->rigName2RigId[name] = caps->rig_model; // We fill the equivalences between name & Id //qDebug()<< "HamLibClass::addRigToList-13" << QT_ENDL; r->rigId2RigName[caps->rig_model] = name; //qDebug()<< "HamLibClass::addRigToList-14" << QT_ENDL; r->strings << name; //qDebug()<< "HamLibClass::addRigToList-END" << QT_ENDL; return -1; // not 0 --> we want all rigs } int HamLibClass::getModelIdFromName (const QString &_name) { //showDebugLog(Q_FUNC_INFO, "Start"); //HamLibClass *r (HamLibClass *) data; int i = -1; i = rigName2RigId[_name]; return i; } QString HamLibClass::getNameFromModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::getNameFromModelId: " << QString::number(_id) << "/" << rigId2RigName.value(_id)<< QT_ENDL; return rigId2RigName.value(_id); } void HamLibClass::setModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setModelId: " << QString::number(_id) << QT_ENDL; rigLaunched = false; myrig_model = _id; } void HamLibClass::setPort(const QString &_port) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setPort: " << _port << QT_ENDL; serialPort = _port; rigLaunched = false; //strncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); //qstrncpy(myport.pathname, serialPort.toLocal8Bit().constData(), serialPort.length()+1); } void HamLibClass::setSpeed(const int _speed) { //showDebugLog(Q_FUNC_INFO, "Start"); bauds = _speed; rigLaunched = false; //qDebug() << Q_FUNC_INFO << ": " << QString::number(bauds); } void HamLibClass::setDataBits(const int _data) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": rec: " << QString::number(_data); if ((_data >= 5) && (_data <= 8)) { dataBits = _data; } else { dataBits = 8; } rigLaunched = false; //qDebug() << Q_FUNC_INFO << ": final: " << QString::number(dataBits); } void HamLibClass::setStop(const int _stop) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << QString::number(stopBits); if (_stop>0) { stopBits = _stop; } rigLaunched = false; } void HamLibClass::setFlow(const QString &_flow) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _flow; flowControl = _flow.toUpper(); if (flowControl == "HARDWARE") { shandshake = RIG_HANDSHAKE_HARDWARE; } else if (flowControl == "SOFTWARE") { shandshake = RIG_HANDSHAKE_XONXOFF; } else { shandshake = RIG_HANDSHAKE_NONE; } rigLaunched = false; } void HamLibClass::setParity(const QString &_parity) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _parity; parity = _parity.toUpper(); if (parity == "EVEN") { sparity= RIG_PARITY_EVEN; } else if (parity == "ODD") { sparity = RIG_PARITY_ODD; } else if (parity == "SPACE") { sparity = RIG_PARITY_SPACE; } else if (parity == "MARK") { sparity = RIG_PARITY_MARK; } else { sparity = RIG_PARITY_NONE; } rigLaunched = false; } void HamLibClass::setFreq(const double _fr) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setFreq: " << QString::number(_fr) << QT_ENDL; if ((!isRunning()) || (readOnlyMode)) { return; } freq = _fr * 1000000; int retcode = rig_set_freq(my_rig, RIG_VFO_CURR, freq); if (retcode != RIG_OK) { errorManage(Q_FUNC_INFO, retcode); } else { errorCount = 0; //qDebug() << "HamLibClass::setFreq OK: " << QString::number(freq) << QT_ENDL; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::setFreq read: " << QString::number(freq) << QT_ENDL; } else { errorManage(Q_FUNC_INFO, retcode); } return; } } void HamLibClass::setRTS(const QString &_state) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _state; if (shandshake == RIG_HANDSHAKE_HARDWARE) { // Note: An attempt to control the RTS signal in the HardwareControl mode will fail with error code // set to UnsupportedOperationError, because the signal is automatically controlled by the driver. return; } if (_state.toUpper() == "TRUE") { srts = RIG_SIGNAL_ON; } else { srts = RIG_SIGNAL_OFF; } rigLaunched = false; } void HamLibClass::setDTR(const QString &_state) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _state; if (_state.toUpper() == "TRUE") { sdtr = RIG_SIGNAL_ON; } else { sdtr = RIG_SIGNAL_OFF; } rigLaunched = false; } void HamLibClass::checkErrorCountAndStop() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO; if (errorCount > 10) { //qDebug() << Q_FUNC_INFO << ": Error>10 - calling stop"; stop(); } } void HamLibClass::setReadOnly(const bool _r) { //showDebugLog(Q_FUNC_INFO, "Start"); readOnlyMode = _r; } void HamLibClass::setNetworkAddress(const QString &_address) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _address; networkAddress = _address; rigLaunched = false; } void HamLibClass::setNetworkPort(const int _port) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_port); if ((_port>0) && (_port<65535)) { networkPort = _port; } rigLaunched = false; } bool HamLibClass::errorManage(const QString &_func, const int _errorcode) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _func << ": error: " << QString::number(_errorcode); if (RIG_OK == _errorcode) { //qDebug() << Q_FUNC_INFO << " - RIG_OK"; return true; } switch (_errorcode) { case (RIG_EINVAL): //qDebug() << Q_FUNC_INFO << ": Error: 1 invalid parameter"; break; case (RIG_ECONF): //qDebug() << Q_FUNC_INFO << ": Error: 2 invalid configuration (serial,..) "; break; case (RIG_ENOMEM): //qDebug() << Q_FUNC_INFO << ": Error: 3 memory shortage"; break; case (RIG_ENIMPL): //qDebug() << Q_FUNC_INFO << ": Error: 4 function not implemented, but will be "; break; case (RIG_ETIMEOUT): //qDebug() << Q_FUNC_INFO << ": Error: 5 communication timed ou"; break; case (RIG_EIO): //qDebug() << Q_FUNC_INFO << ": Error: 6 IO error, including open failed"; break; case (RIG_EINTERNAL): //qDebug() << Q_FUNC_INFO << ": Error: 7 Internal Hamlib error, huh!"; break; case (RIG_EPROTO): //qDebug() << Q_FUNC_INFO << ": Error: 9 Command rejected by the rig"; break; case (RIG_ETRUNC): //qDebug() << Q_FUNC_INFO << ": Error: 10 Command performed, but arg truncated"; break; case (RIG_ENAVAIL): //qDebug() << Q_FUNC_INFO << ": Error: 11 Function not available"; break; case (RIG_ENTARGET): //qDebug() << Q_FUNC_INFO << ": Error: 12 VFO not targetable"; break; case (RIG_BUSERROR): //qDebug() << Q_FUNC_INFO << ": Error: 13 Error talking on the bus"; break; case (RIG_BUSBUSY): //qDebug() << Q_FUNC_INFO << ": Error: 14 Collision on the bus"; break; case (RIG_EARG): //qDebug() << Q_FUNC_INFO << ": Error: 15 NULL RIG handle or any invalid pointer parameter in get arg"; break; case (RIG_EVFO): //qDebug() << Q_FUNC_INFO << ": Error: 16 Invalid VFO"; break; case (RIG_EDOM): //qDebug() << Q_FUNC_INFO << ": Error: 17 Argument out of domain of func"; break; default: //qDebug() << Q_FUNC_INFO << ": Error: ?? Unknown error"; break; } if (_errorcode == RIG_EINVAL || _errorcode == RIG_ENIMPL || _errorcode == RIG_ERJCTED \ || _errorcode == RIG_ETRUNC || _errorcode == RIG_ENAVAIL || _errorcode == RIG_ENTARGET \ || _errorcode == RIG_EVFO || _errorcode == RIG_EDOM) { //qDebug() << Q_FUNC_INFO << ": Soft error: Invalid parameters - No reason to re-initialize the hardware"; } if (errorCount<10) { errorCount++; //qDebug() << Q_FUNC_INFO << ": RIG NOK for Mode: - " << QString::number(errorCount) << QT_ENDL; return false; } else { //qDebug() << Q_FUNC_INFO << ": RIG NOK for Mode" << QT_ENDL; //qDebug() << Q_FUNC_INFO << ": Calling stop"; stop(); return false; } } /*void HamLibClass::showDebugLog(const QString &_func, const QString &_log) { #ifdef QT_DEBUG //qDebug() << _func << ": " << _log; #else #endif } */ klog-1.8.6/dxcluster.cpp0000644000175000017500000007561714166020407014203 0ustar develdevel/*************************************************************************** dxcluster.cpp - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "dxcluster.h" DXClusterWidget::DXClusterWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget" << QT_ENDL; dataProxy = dp; constrid = 1; awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities; saveSpotsFile = new QFile(); initClass(); //qDebug() << "DXClusterWidget::DXClusterWidget - END" << QT_ENDL; } DXClusterWidget::DXClusterWidget(DataProxy_SQLite *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent) : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget2" << clusterToConnect << QString::number(portToConnect) << QT_ENDL; constrid = 2; util = new Utilities; saveSpotsFile = new QFile(); initClass(); server = clusterToConnect; port = quint16(portToConnect); dxSpotColor.setNamedColor("slategrey"); //defaultColor.setNamedColor("slategrey"); //neededColor.setNamedColor("slategrey"); //workedColor.setNamedColor("slategrey"); //confirmedColor.setNamedColor("slategrey"); //newOneColor.setNamedColor("slategrey"); dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); tcpSocket = new QTcpSocket(this); dxClusterListWidget = new QListWidget(); inputCommand = new QLineEdit; sendButton = new QPushButton; clearButton = new QPushButton; inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server")); dxClusterListWidget->setMouseTracking(true); sendButton->setText(tr("Connect")); clearButton->setText(tr("Clear")); QHBoxLayout *bottonLayout = new QHBoxLayout; bottonLayout->addWidget(inputCommand); bottonLayout->addWidget(sendButton); bottonLayout->addWidget(clearButton); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(dxClusterListWidget); layout->addLayout(bottonLayout); setLayout(layout); connect(sendButton , SIGNAL(clicked()), this, SLOT(slotClusterSendToServer()) ); connect(inputCommand, SIGNAL(textChanged(QString)), this, SLOT(slotClusterInputTextChanged()) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); connect(dxClusterListWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemEntered ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemEntered( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotClusterDXClusterWidgetItemSelected() ) ); //void QListWidget::itemDoubleClicked ( QListWidgetItem * item ) [signal] // TO BE DELETED addData(); //TESTADDSPOT(); //qDebug() << "DXClusterWidget::DXClusterWidget2 - END" << QT_ENDL; } void DXClusterWidget::initClass() { dxClusterConnected = false; dxClusterAlreadyConnected = false; showDxMarathon = false; showhf = true; showvhf = true; showwarc = true; showworked = true; showconfirmed = true; showann = true; showwwv = true; showwcy = true; saveSpots = false; myQrz = QString(); currentLog = 0; saveSpotsFile->setFileName(util->getSaveSpotsLogFile()); } void DXClusterWidget::setMyQRZ(const QString &_qrz) { if (_qrz.length()>2) { myQrz = _qrz; } } void DXClusterWidget::addData() { //qDebug() << "DXClusterWidget::addData " << QT_ENDL; /* QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); i = world->getQRZARRLId(_call); aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); */ dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Click on connect to connect to the DX-Cluster"), awards->getDefaultColor()); } DXClusterWidget::~DXClusterWidget() { //qDebug() << "DXClusterWidget::~DXClusterWidget" << QT_ENDL; } void DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: " << item->text() << QT_ENDL; QStringList ql; ql.clear(); if (item) { ql = readItem(item); //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Length: " << QString::number(ql.length()) << QT_ENDL; if (ql.length()==2) { ql << "double"; //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: EMMITED" << QT_ENDL; emit dxspotclicked(ql); } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-1" << QT_ENDL; } } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-2 (no item)" << QT_ENDL; } } void DXClusterWidget::connectToDXCluster() { //qDebug() << "DXClusterWidget::connectToDXCluster" << QT_ENDL; if (dxClusterConnected) { //qDebug() << "DXClusterWidget::connectToDXCluster: - Already connected!!" << QT_ENDL; return; // If we are connected we don't want to start another connection } connect(tcpSocket, SIGNAL(connected()), SLOT(slotClusterSocketConnected()) ); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(slotClusterDataArrived() )); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotClusterDisplayError(QAbstractSocket::SocketError))); connect(tcpSocket, SIGNAL(disconnected()), SLOT(slotClusterSocketConnectionClosed()) ); connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClusterClearLineInput()) ); //openFile(); // This functions opens the file to save the DX-Cluster activity. The file will be closed when the DX is disconnected. tcpSocket->connectToHost( server, port ); dxClusterListWidget->setSortingEnabled (false); //dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Trying to connect to the server") + "\n", awards->getDefaultColor()); dxClusterListWidget->addItem (new dxClusterSpotItem(dxClusterListWidget, tr("Trying to connect to the server") + "\n", awards->getDefaultColor())); } void DXClusterWidget::slotClusterDisplayError(QAbstractSocket::SocketError socketError) { //qDebug() << "DXClusterWidget:displayError:" << QT_ENDL; switch (socketError) { case QAbstractSocket::RemoteHostClosedError: break; case QAbstractSocket::HostNotFoundError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The host was not found. Please check:") + "\n\n" + tr ("- your network connection;\n" "- the host name and port settings.")); break; case QAbstractSocket::ConnectionRefusedError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The connection was refused by the peer. " "Make sure the DXCluster server is running, " "and check that the host name and port " "settings are correct.")); break; default: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The following error occurred: %1.") .arg(tcpSocket->errorString())); } } bool DXClusterWidget::checkIfNeedsToBePrinted(const QString &_DXEntity, int const _band, const int _mode) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; QStringList qs; qs.clear(); qs << _DXEntity << QString::number(_band) << QString::number(_mode) << QString::number(currentLog); //bool isConfirmed = false; bool status = awards->isThisSpotConfirmed (qs); //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Status: " << _DXEntity << "/" << QString::number(status); if (!showconfirmed) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is confirmed? ("<< QString::number(status)<< ")" << QT_ENDL; if (status) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: It is confirmed: DON'T' print: " << _DXEntity <<"/" << dataProxy->getNameFromBandId(_band) << QT_ENDL; return false; } } if (!showhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF?" << QT_ENDL; if (dataProxy->isHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is it WARC?" << QT_ENDL; if ( (showwarc) && dataProxy->isWARC(_band) ) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is WARC, print!" << QT_ENDL; return true; } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF: DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT HF" << QT_ENDL; } } if (!showwarc) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC?" << QT_ENDL; if (dataProxy->isWARC(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT WARC" << QT_ENDL; } } if (!showvhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF?" << QT_ENDL; if (dataProxy->isVHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT VHF " << QT_ENDL; } } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: returns TRUE and will be printed: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return true; } void DXClusterWidget::setCurrentLog(const int _log) { if (dataProxy->doesThisLogExist(_log)) { currentLog = _log; } else { currentLog = -1; } } void DXClusterWidget::slotClusterDataArrived() { //qDebug() << "DXClusterWidget::slotClusterDataArrived" << QT_ENDL; QStringList qs; QString dxClusterString; QString dxCall; QString dxFrequency; QString spotBand; spotBand = "-1"; //bool isADXSpot = false; int dxEntity = -1; while ( tcpSocket->canReadLine() ) { dxClusterString = tcpSocket->readLine(); dxClusterString = dxClusterString.trimmed(); // Remove BELL-string if exists dxClusterString = dxClusterString.remove("\a"); saveSpot(dxClusterString); QStringList tokens = dxClusterString.split(" ", QT_SKIP); if (tokens.size()<2){ return; } // It is a "DX de SP0TTER FREC DXCALL" //0 = DX, 1 = de, 2 = spotter, 3 = Freq, 4 = dxcall, 5 = comment //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << "DXCLUSTER->" << dxClusterString << "\nTOKENS: " << tokens << QT_ENDL; if ((tokens[0] == "DX") && (tokens[1] == "de")) { //qDebug() << "******************** DXClusterWidget::slotClusterDataArrived: DX DE" << QT_ENDL; //isADXSpot = true; QString spotter = tokens[2]; spotter.truncate(spotter.size() - 1); dxFrequency = tokens[3]; // Convert KHz to MHz... //dxFrequency = QString::number(abs (dxFrequency.toFloat())/1000); dxFrequency = QString::number( (dxFrequency.toDouble())/1000); dxCall = tokens[4]; dxEntity = world->getQRZARRLId(dxCall); // spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-2: " << QString::number(dxEntity) << QT_ENDL; dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } //qDebug() << "DX de ->" << "Spotter: " << spotter << "Freq: "<< dxFrequency << "DX: " << dxCall << QT_ENDL; } else if ((tokens[0] == "To") && (tokens[1] == "ALL")) { //qDebug() << "DXClusterWidget::slotClusterDataArrived: TO ALL" << QT_ENDL; dxSpotColor = awards->getDefaultColor(); } else if ( (dxClusterString.length()>=5) && (world->checkQRZValidFormat(tokens[1])) && (tokens[0]!="login:")) { // Freq / DXCall / Date // time //_qs << QRZ << Freq in MHz << lognumber; //qDebug() << "DXClusterWidget::slotClusterDataArrived: LENGTH >= 5" << QT_ENDL; //qDebug() << "DXClusterWidget::slotClusterDataArrived: token0=" << tokens[0] << " / token1=" << tokens[1] << QT_ENDL; //isADXSpot = true; dxCall = tokens[1]; dxFrequency = tokens[0]; dxFrequency = QString::number( (dxFrequency.toDouble())/1000); qs.clear(); spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); dxEntity = world->getQRZARRLId(dxCall); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-1: " << QString::number(dxEntity) << QT_ENDL; qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } } else { //qDebug() << "DXClusterWidget::slotClusterDataArrived: DEFAULT" << QT_ENDL; dxSpotColor = awards->getDefaultColor(); } // qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); //qs << dxCall << spotBand << "0"; //dxSpotColor = awards->getQRZDXStatusColor(qs); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Call/dxSpotColor: " << dxCall <<"/"<< dxSpotColor.name() << QT_ENDL; //dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, dxClusterString, dxSpotColor); //TODO: Change the "-1" by the mode if (!checkIfNeedsToBePrinted(QString::number(dxEntity), spotBand.toInt(), -1)) { //qDebug() << "DXClusterWidget::slotClusterDataArrived - Not to be printed!: " << dxCall << QT_ENDL; return; } // QString flagSt; // QString aux; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); item->setText(dxClusterString); /* if (dxEntity>0) { flagSt.clear(); aux = dataProxy->getISOName(dxEntity); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(dxEntity) + ".png"; QIcon flagIcon(flagSt); item->setIcon(flagIcon); } */ dxClusterListWidget->insertItem(0,item); //dxClusterListWidget->insertItem(0,item); //QListWidgetItem *item = new QListWidgetItem(); //item->setForeground(QBrush(awards->getQRZDXStatusColor(qs))); //item->setText(dxClusterString); //dxClusterListWidget->insertItem(0,item); } //qDebug() << "--------------------- DXClusterWidget::slotClusterDataArrived: " << dxClusterString << QT_ENDL; //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << dxClusterString << QT_ENDL; } void DXClusterWidget::slotClusterSocketConnected() { //qDebug() << "DXClusterWidget::slotClusterSocketConnected" << QT_ENDL; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connected to server")); dxClusterListWidget->insertItem(0,item); // dxClusterSpotItem * item = new dxClusterSpotItem(dxclusterListWidget, i18n("Connected to server"), awards->getDefaultColor()); dxClusterConnected = true; inputCommand->setFocus(Qt::OtherFocusReason); if (( dxClusterConnected ) && (!dxClusterAlreadyConnected) ){ bool ok; QString callsignText; if (myQrz.length()>2) { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, myQrz, &ok); } else { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); } //QString callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); QString passwordText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your password to connect to the cluster:\n(Just hit enter for no password)"), QLineEdit::Normal, "", &ok); QTextStream os(tcpSocket); if ( callsignText.length() > 2 && ok ) { os << callsignText << "\n"; //TODO: Check the DXCluster answer and enter the password if needed. sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); dxClusterAlreadyConnected = true; } else { os << tr("Not logged on, you may need to enter your callsign again.") << "\n"; dxClusterAlreadyConnected = false; } inputCommand->setEnabled(true); inputCommand->setToolTip(tr("Enter here the commands to be sent to the DX-Cluster server.")); } } void DXClusterWidget::slotClusterSocketConnectionClosed() { //qDebug() << "DXClusterWidget::slotClusterSocketConnectionClosed" << QT_ENDL; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connection closed by the server")); dxClusterListWidget->insertItem(0,item); dxClusterConnected = false; dxClusterAlreadyConnected = false; sendButton->setText(tr("Connect")); inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server.")); //connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); disconnect (inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); } void DXClusterWidget::slotClusterSendToServer() { //qDebug() << "DXClusterWidget::slotClusterSendToServer()" << QT_ENDL; if (!dxClusterConnected) { connectToDXCluster(); return; // If we try to connect... } if (( inputCommand ->text().length() < 1 ) && ( sendButton->text() == tr("Disconnect") ) ) { //qDebug() << "DXClusterWidget::slotClusterSendToServer() - Disconnecting" << QT_ENDL; QTextStream os(tcpSocket); os << "bye\n"; return; } else if ( inputCommand ->text().length() < 1 ) { //qDebug() << "DXClusterWidget::slotClusterSendToServer() - Empty" << QT_ENDL; return; } // write to the server QTextStream os(tcpSocket); os << inputCommand ->text() << "\n"; inputCommand ->clear(); } void DXClusterWidget::slotClusterClearLineInput() { //qDebug() << "DXClusterWidget::slotClusterClearLineInput" << QT_ENDL; inputCommand->clear(); } void DXClusterWidget::slotClusterInputTextChanged() { //qDebug() << "DXClusterWidget::slotClusterInputTextChanged" << QT_ENDL; if ( ((inputCommand->text()).length()) <= 0 ) { sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); } else if (dxClusterConnected) { sendButton->setText(tr("Send")); clearButton->setText(tr("Clear")); } else {} } void DXClusterWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL; // Just to pass the colors to the awards class awards->setColors(_newOne, _needed, _worked, _confirmed, _default); } void DXClusterWidget::setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ) { //qDebug() << "DXClusterWidget::setDXClusterSpotConfig " << QT_ENDL; showhf = _showhf; showvhf = _showvhf; showwarc = _showwarc; showworked = _showworked; showconfirmed = _showconfirmed; showann = _showann; showwwv = _showwwv; showwcy = _showwcy; } void DXClusterWidget::slotClusterDXClusterWidgetItemSelected() { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemSelected " << QT_ENDL; QListWidgetItem * item = dxClusterListWidget->currentItem(); QStringList ql; ql.clear(); ql = readItem(item); if (ql.length()==2) { ql << "selected"; emit dxspotclicked(ql); } else { } } void DXClusterWidget::slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemEntered" << QT_ENDL; /* This code comes from slotClusterDXClusterWidgetItemDoubleClicked */ QString tip; tip.clear(); QStringList ql; ql.clear(); if (item) { ql = readItem(item); if (ql.length()==2) { tip = world->getQRZEntityName(ql.at(0)); item->setToolTip(tip); } else { } } else { } } bool DXClusterWidget::isConnected() { return dxClusterConnected; } QStringList DXClusterWidget::readItem(QListWidgetItem * item) { //qDebug() << "DXClusterWidget::readItem" << QT_ENDL; QStringList fields; QString dxClusterString; //int currentEntity; QString dxCallsign, dxFreq; bool FirstFrecOK; if (item) { fields.clear(); dxClusterString = ((item->data(0)).toString()).simplified(); fields << dxClusterString.split(" "); (fields.at(0)).toFloat(&FirstFrecOK); // Just to see if the first string is a frecuency if ( (fields.at(0) == "DX" ) && (fields.at(1) == "de" ) ) { // DX de EA0XXX: 21200.1 EA0K The comment 1550 if ( world->getQRZARRLId(fields.at(4))> 0 ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: ARRLid: " << QString::number(world->getQRZARRLId(fields.at(4))) << QT_ENDL; dxCallsign = (fields.at(4)).toUpper(); (fields.at(3)).toFloat(&FirstFrecOK); if (FirstFrecOK) { // The frecuency is valid dxFreq = fields.at(3); fields.clear(); //TODO: Change FREQ into bandId fields << dxCallsign << dxFreq; return fields; } else { // the frecuency is not a number! dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // The callsign is not from a valid country // TODO: if it is from a new entity/prefix it would not work. //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Entity not valid" << QT_ENDL; dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } //else if (( isAFrecuency(fields.at(0) ) ) && ( isACall(fields.at(1)) ) ) else if ( (((fields.at(0)).toDouble()) > 0.0 )&& ( world->getQRZARRLId(fields.at(1))> 0 ) ) { // 14205.0 EA0K 5-Mar-2012 1500Z dxCallsign = (fields.at(1)).toUpper(); dxFreq = fields.at(0); fields.clear(); fields << dxCallsign << dxFreq; return fields; } else { dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // No Item } return fields; } void DXClusterWidget::setDXClusterServer(const QString &clusterToConnect, const int portToConnect) { server = clusterToConnect; port = quint16(portToConnect); //qDebug() << "DXClusterWidget::setDXClusterServer: " << server << ":"<< QString::number(port) << QT_ENDL; } void DXClusterWidget::setDXMarathon (const bool _enable) { showDxMarathon = _enable; } void DXClusterWidget::setSaveSpots (const bool _enable) { saveSpots = _enable; } bool DXClusterWidget::openFile() { if (saveSpotsFile->isOpen()) { return true; } if (!saveSpotsFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = tr("It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return false; } else { return true; } } void DXClusterWidget::saveSpot(const QString &_spot) { //qDebug() << "DXClusterWidget::saveSpot: " << _spot << QT_ENDL; if (!saveSpots) { //qDebug() << "DXClusterWidget::saveSpot: Not saving" << QT_ENDL; return; } else { if (openFile()) { //qDebug() << "DXClusterWidget::saveSpot: File Open" << QT_ENDL; QTextStream out(saveSpotsFile); out << util->getDateTimeSQLiteStringFromDateTime(QDateTime::currentDateTime()) << " - " << _spot << QT_ENDL; saveSpotsFile->close(); } else { { //qDebug() << "DXClusterWidget::saveSpot: File NOT Open" << QT_ENDL; } } } } /* void DXClusterWidget::TESTADDSPOT() { //qDebug() << "DXClusterWidget::TESTADDSPOT " << QT_ENDL; ; // Just a test spot QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setText("DX de SP0TTER 14.000 DX1CALL"); dxClusterListWidget->insertItem(0,item); } */ /*************************************************************************** ** This is an auxiliary class intended to provide color to the DX-Cluster ** ** spots. ** ** It may be moved to a self .h & .cpp archives ** ****************************************************************************/ dxClusterSpotItem::dxClusterSpotItem( QListWidget *parent, const QString& spot, const QColor& color ) : QListWidgetItem( parent ){ //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Constructor" << QT_ENDL; spotColor = color; setText(spot); // Experimenting with fonts for the cluster QFont f("Helvetica"); f.setFixedPitch(true); setFont(f); } dxClusterSpotItem::~dxClusterSpotItem() { //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Destructor" << QT_ENDL; } klog-1.8.6/searchwindow.h0000644000175000017500000001336114166020407014314 0ustar develdevel#ifndef SEARCHWINDOW_H #define SEARCHWINDOW_H /*************************************************************************** searchwindow.h - description ------------------- begin : sept 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "searchmodel.h" #include "awards.h" //#include "elogclublog.h" #include "utilities.h" class SearchWindow : public QWidget { Q_OBJECT public: explicit SearchWindow(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SearchWindow(); void createlogPanel(const int _currentLog); void clear(); void refresh(); void selectAll(); void clearSelection(); void setStationCallsignInHeader(const bool _h); void qslSentViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaDirect(const int _qsoId); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); //void setProxyModel (const bool _p); void sortColumn(const int _c); void setFilterString(const QString &_st); QList getSelectedQSOs(); void setNeedingQSL(bool const _q); void slotToolSearchQSL(const int actionQSL); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); signals: void actionQSODoubleClicked(const int _qsoid); void actionDeleteQSO(const int _qsoid); void updateAwards(); void updateSearchText(); void updateSearchLineEdit(); void requestFocus(); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private slots: void slotDoubleClickLog(const QModelIndex & index); void slotRighButtonFromLog(const QPoint& pos); void slotQSLSentViaBureauFromLog(); void slotQSLSentViaDirectFromLog(); void slotQSLRecViaDirectFromLog(); void slotQSLRecViaBureauFromLog(); void slotQSLSentMarkAsRequested(); void slotQSLRecMarkAsRequested(); void slotQsoDeleteFromLog(); void slotQSOToEditFromLog(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotCheckQRZCom(); void slotCheckDXHeatCom(); void slotQSLSentViaDirectMarkDXReqFromSearch(); void slotQSLSentViaBureauMarkDXReqFromSearch(); //void slotQSLRecMarkAsRequested(); void slotQSLRecViaDirectMarkReqFromSearch(); void slotQSLRecViaBureauMarkReqFromSearch(); private: void createUI(); void createActionsCommon(); void createActions(); //void deleteQSO(const int _qsoID); void rightButtonFromLogMenu(const int row); void showMenuRightButtonFromLogCreateActions(); //void slotToolSearchQSL(const int actionQSL); void searchToolNeededQSLToSend(); void setDefaultData(); void setColumnsToDX(); //void qslRecViaDirectMarkReq(const int _qsoId); //void qslRecViaBureauMarkReq(const int _qsoId); //void colorTheList(); bool qslingNeeded; DataProxy_SQLite *dataProxy; SearchModel *searchModel; Awards *awards; //eLogClubLog *elogClublog; //QTableView *logView; QTreeView *treeView; QLabel *logLabel; QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; QAction *checkQRZCOMFromLogAct; QAction *checkDXHeatFromLogAct; QAction *qslSentRequestedAct; QAction *qslSentViaDirectMarkRcvReqFromSearchAct; QAction *qslSentViaBureauMarkRcvReqFromSearchAct; QAction *qslRecViaBureauMarkReqFromSearchAct; QAction *qslRecViaDirectMarkReqFromSearchAct; QAction *qslRecRequestedAct; int currentLog; Utilities *util; bool showStationCallsignInHeader; }; #endif // SEARCHWINDOW_H klog-1.8.6/logviewsortfilterproxymodel.cpp0000644000175000017500000002002314166020407020060 0ustar develdevel/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "logviewsortfilterproxymodel.h" LogViewSortFilterProxyModel::LogViewSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { //setDynamicSortFilter(true); } bool LogViewSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { QVariant leftData = sourceModel()->data(left); QVariant rightData = sourceModel()->data(right); QString leftString = leftData.toString(); QString rightString = rightData.toString(); //qDebug() << "LogViewSortFilterProxyModel::lessThan (leftString): " << leftString << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan (rightString): " << rightString << endl; QDateTime leftDT = QDateTime::fromString((sourceModel()->data(left.siblingAtColumn(1))).toString() + (sourceModel()->data(left.siblingAtColumn(2))).toString(), "yyyy/MM/ddHH:mm:ss"); QDateTime rightDT = QDateTime::fromString((sourceModel()->data(right.siblingAtColumn(1))).toString() + (sourceModel()->data(right.siblingAtColumn(2))).toString(), "yyyy/MM/ddHH:mm:ss"); //qDebug() << "LogViewSortFilterProxyModel::lessThan - DateTime: " << leftDT.toString("yyyy-MM-dd / hh:mm:ss") << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - Columns: " << (sourceModel()->data(left.siblingAtColumn(2))).toString() << endl; /* * if (leftData.type() == QVariant::String) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - QString" << endl; } */ //qDebug() << "LogViewSortFilterProxyModel::lessThan - Left column: " << QString::number(left.column())<< endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - Right column: " << QString::number(right.column())<< endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - date: " << leftDT.toString("yyyy-MM-dd--hh:mm:ss") <<"<==>" << rightDT.toString("yyyy-MM-dd--hh:mm:ss") << endl; if (left.column() == 1) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left: " << (sourceModel()->data(left.siblingAtColumn(1))).toString() << endl; //QDate leftD = QDate::fromString((sourceModel()->data(left.siblingAtColumn(1))).toString(), "yyyy/MM/dd"); //QDate rightD = QDate::fromString((sourceModel()->data(right.siblingAtColumn(1))).toString(), "yyyy/MM/dd"); if (leftDT.date() == rightDT.date()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME" << endl; if (leftDT.time() < rightDT.time()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME - (time) TRUE - Left" << endl; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME - (time) FALSE - Right" << endl; } return QString::localeAwareCompare(leftDT.toString("hh:mm:ss"), rightDT.toString("hh:mm:ss")) < 0; //return leftDT.time() < rightDT.time(); } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT: " << endl; //return leftD < rightD; if (leftDT.date() < rightDT.date()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT - (date) TRUE - Left" << endl; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT - (date) FALSE - Right" << endl; } //return leftDT.date() < rightDT.date(); return QString::localeAwareCompare(leftString, rightString) < 0; } } else { //return leftData < rightData; //qDebug() << "LogViewSortFilterProxyModel::lessThan - No column 1: " << leftString << " / " << rightString << endl; return QString::localeAwareCompare(leftString, rightString) < 0; } /* if (rightData.type() == QVariant::DateTime) { //if (rightData.type() == QVariant::Time) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - 1" << endl; return leftData.toDateTime() < rightData.toDateTime(); } else { QString leftString = leftData.toString(); QString rightString = rightData.toString(); if (left.column() == 1) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left Column == 1" << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData/rightData: " << leftString<< "/" << rightString << endl; if (leftD == rightD) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData == rightData: " << leftString<< "/" << rightString << endl; QString leftN = (sourceModel()->data(left.siblingAtColumn(2))).toString(); QString rightN = (sourceModel()->data(right.siblingAtColumn(2))).toString(); QTime lT = QTime::fromString(leftN, "hh:mm:ss"); QTime rT = QTime::fromString(rightN, "hh:mm:ss"); return lT < rT; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left != right" << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData != rightData: " << leftString<< "/" << rightString << endl; return leftD < rightD; } } //qDebug() << "LogViewSortFilterProxyModel::lessThan - 2: " << leftString << "/" << rightString << endl; return QDate::fromString(leftString, "yyyy/MM/dd") < QDate::fromString(rightString, "yyyy/MM/dd"); //return QString::localeAwareCompare(leftString, rightString) < 0; } */ } klog-1.8.6/locator.cpp0000644000175000017500000003655414166020407013626 0ustar develdevel/*************************************************************************** locator.cpp - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "locator.h" #include Locator::Locator(){ } Locator::~Locator(){ } bool Locator::isValidLocator(const QString& tlocator){ /* -------------- Subroutine ----------------------- Check valid locator (VALID: AA00AA -> RR99XX) Input : char *locator = 4 - 8 characters word wide locator. returned value == -1 No error. (Valid locator). returned value == 0 Error. (Invalid locator). Note: also string "END" is considered a valid locator, but returned value is -2. ------------------------------------------------- Wikipedia: Character pairs encode longitude first, and then latitude. The first pair (a field) encodes with base 18 and the letters "A" to "R". The second pair (square) encodes with base 10 and the digits "0" to "9". The third pair (subsquare) encodes with base 24 and the letters "a" to "x". The fourth pair (extended square) encodes with base 10 and the digits "0" to "9". The fifth and subsequent pairs are not formally defined, but recycling the third and fourth pair algorithms is one possible definition: BL11bh16oo66 */ //qDebug() << "Locator::isValidLocator: " << tlocator << QT_ENDL; //int lenght_of_locator; QString testLocator ="A"; testLocator = tlocator.toUpper(); //lenght_of_locator = testLocator.length(); Locators up to 8 digits! //IN, IN70, IN70DD, IN70DD20, IN70DD20 QRegularExpression rx; rx.setPattern("^[A-R]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 2: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 4: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}[A-X]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 6: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}[A-X]{2}[0-9]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 8: " << testLocator; return true; } else { //qDebug() << "Locator::isValidLocator: NOT VALID: " << testLocator; return false; } } } } } double Locator::getLat(const QString& tlocator){ //qDebug() << "Locator::getLat: " << tlocator; // Read formula from: https://unclassified.software/files/source/MaidenheadLocator.cs //Revisar las formulas porque salen distancias erroneas if (!isValidLocator(tlocator)) { return 0.0; } if (tlocator.length() == 2) { //qDebug() << "Locator::getLat - num: " << QString::number((tlocator.at(1)).toLatin1() ); //qDebug() << "Locator::getLat: " << QString::number((((tlocator.at(1)).toLatin1() - 65) * 10) - 90) << QT_ENDL; return (((tlocator.at(1)).toLatin1() - 65) * 10) - 90; } if (tlocator.length() == 4) { return ((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0' + 0.5) - 90; //return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) - 90; } else if (tlocator.length()== 6) { //qDebug() << "Locator::getLat: " << QString::number(((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.5) / 24 - 90) << QT_ENDL; return ((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.5) / 24 - 90; //return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) + (((tlocator.at(5)).toLatin1() - 65 + 0.5) / 24) - 90; } else if (tlocator.length()== 8) { //qDebug() << "Locator::getLat: " << QString::number(((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((tlocator.at(7)).toLatin1() - '0' + 0.5) / 240 - 90) << QT_ENDL; return ((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((tlocator.at(7)).toLatin1() - '0' + 0.5) / 240 - 90; //return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) + (((tlocator.at(5)).toLatin1() - 65 + 0.5) / 24) - 90; } else if (tlocator.length()== 10) { //qDebug() << "Locator::getLat: " << QString::number(((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((tlocator.at(7)).toLatin1() - '0' + 0.0) / 240 + ((tlocator.at(9)).toLatin1() - 'A' + 0.5) / 240 / 24 - 90) << QT_ENDL; return ((tlocator.at(1)).toLatin1() - 'A') * 10 + ((tlocator.at(3)).toLatin1() - '0') + ((tlocator.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((tlocator.at(7)).toLatin1() - '0' + 0.0) / 240 + ((tlocator.at(9)).toLatin1() - 'A' + 0.5) / 240 / 24 - 90; //return (((tlocator.at(1)).toLatin1() - 65) * 10) + ((tlocator.at(3)).toLatin1() - 48) + (((tlocator.at(5)).toLatin1() - 65 + 0.5) / 24) - 90; } else { return 0.0; } } double Locator::getLon(const QString& tlocator) { //qDebug() << "Locator::getLon: " << tlocator; if (!isValidLocator(tlocator)) { return 0.0; } if (tlocator.length() == 2) { return (((tlocator.at(0)).toLatin1() - 65) * 20) - 180; } if (tlocator.length() == 4) { return ((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0' + 0.5) * 2 - 180; //return (((tlocator.at(0)).toLatin1() - 65) * 20) + (((tlocator.at(2)).toLatin1() - 48) * 2) - 180; } else if (tlocator.length()== 6) { //qDebug() << "Locator::getLon: " << QString::number(((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0') * 2 + ((tlocator.at(4)).toLatin1() - 'A' + 0.5) / 12 - 180) << QT_ENDL; return ((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0') * 2 + ((tlocator.at(4)).toLatin1() - 'A' + 0.5) / 12 - 180; //return (((tlocator.at(0)).toLatin1() - 65) * 20) + (((tlocator.at(2)).toLatin1() - 48) * 2) + (((tlocator.at(4)).toLatin1() - 65 + 0.5) / 12) - 180; } else if (tlocator.length()== 8) { //qDebug() << "Locator::getLon: " << QString::number(((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0') * 2 + ((tlocator.at(4)).toLatin1() - 'A' + 0.0) / 12 + ((tlocator.at(6)).toLatin1() - '0' + 0.5) / 120 - 180) << QT_ENDL; return ((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0') * 2 + ((tlocator.at(4)).toLatin1() - 'A' + 0.0) / 12 + ((tlocator.at(6)).toLatin1() - '0' + 0.5) / 120 - 180; } //else if (tlocator.length()== 10) //{ // return ((tlocator.at(0)).toLatin1() - 'A') * 20 + ((tlocator.at(2)).toLatin1() - '0') * 2 + ((tlocator.at(4)).toLatin1() - 'A' + 0.0) / 12 + ((tlocator.at(6)).toLatin1() - '0' + 0.0) / 120 + ((tlocator.at(8)).toLatin1() - 'A' + 0.5) / 120 / 24 - 180; // } else { return 0.0; } } int Locator::getBeam(const double lon1, const double lat1, const double lon2, const double lat2){ double lon_a,lat_a,lon_b,lat_b, bearing; //qDebug() << "Locator::getBeam1: " << QString::number(lon1) << "/" << QString::number(lat1) << QT_ENDL; //qDebug() << "Locator::getBeam2: " << QString::number(lon2) << "/" << QString::number(lat2) << QT_ENDL; lon_a=lon1*PI/180; // Convert degrees to radians lat_a=lat1*PI/180; lon_b=lon2*PI/180; lat_b=lat2*PI/180; //earing_Distance( double lon_a, double lat_a, /* Lon/Lat of point A */ // double lon_b, double lat_b, /* Lon/Lat of point B */ // double *bearing, double *distance )/* From A to B */ //{ double cos_gc_arc, /* Great circle arc A to B */ cos_bearing, sin_bearing, /* cos/sin of bearing A to B */ lon_diff; /* Difference in longitude of B from A */ //double gc_arc; /* Longitude differnce of B from A */ lon_diff = lon_b - lon_a; /* Calculate great circle distance A to B */ cos_gc_arc = cos(lon_diff)*cos(lat_a)*cos(lat_b) + sin(lat_a)*sin(lat_b); //gc_arc = acos( cos_gc_arc ); /* Distance in km */ // *distance = eradius * gc_arc; /* Calculate bearing A to B */ cos_bearing = sin(lat_b) - sin(lat_a) * cos_gc_arc; sin_bearing = sin(lon_diff) * cos(lat_a) * cos(lat_b); bearing = atan2(sin_bearing, cos_bearing); /* Correct negative (anticlockwise) bearings */ if( bearing < 0.0 ) { bearing = (2*PI) + bearing; } bearing = 360 - (180/PI*bearing); bearing = 360 - bearing; //qDebug() << "Locator::getBeam: " << QString::number(bearing) << QT_ENDL; /* Convert to degrees */ return int(bearing); } int Locator::getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem){ //http://en.wikipedia.org/wiki/Haversine_formula //qDebug() << "Locator::getDistanceKilometres: MyPos("<< QString::number(lon1) << ")" << QT_ENDL; // << QString::number(lat1) << ") - DxPos(" << QString::number(lon2) << "/" << QString::number(lat2) << ")" << QT_ENDL; double lo1,la1,lo2,la2; // TODO: Is it needed to check if the longitude and latitude are correct and/or between the magins? // if (!( (checkCoords(lon1, lat1) ) && (checkCoords(lon2, lat2)) )) // return 0; lo1=lon1* DEG_TO_RAD; // Convert degrees to radians la1=lat1* DEG_TO_RAD; lo2=lon2* DEG_TO_RAD; la2=lat2* DEG_TO_RAD; if (!_imperialSystem){ //qDebug() << "Locator::getDistance (Km): " << QString::number((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)) << QT_ENDL; return int(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS); }else{ // In milles //qDebug() << "Locator::getDistance (Milles): " << QString::number(((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS))* 0.62137) << QT_ENDL; return int(((acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)) * 0.62137); } } bool Locator::checkCoords(const double lon1, const double lat1){ //qDebug() << "Locator::checkCoords" ; // Checks if a coordinates is correct. if ((lat1 > 90.0 || lat1 < -90.0) && (lon1 > 180.0 || lon1 < -180.0)){ return true; }else{ return false; } } QString Locator::getLocator(const double lon1, const double lat1) const{ /* -------------- Subroutine ----------------------- Calculate locator from longitude and latitude Input : lon = Longitude in decimal degrees (+ = West; - = East). lat = Latitude in decimal degrees (+ = North; - = South). Output: locator = 6 characters world wide locator. ------------------------------------------------- */ //qDebug() << "Locator::getLocator: (" << QString::number(lon1) << "/" << QString::number(lat1) << ")" << QT_ENDL; QString locat = ""; //NO locator double lo, la; int alo,bla,clo,dla,elo,fla; lo=(-lon1+180)/20; la = (lat1+90)/10; alo=int(floor(lo)); bla=int(floor(la)); lo=(lo-(double(alo)))*10; la=(la-(double(bla)))*10; clo = int(floor(lo)); dla = int(floor(la)); elo = int(floor((lo-double(clo) ) * 24 )) ; fla = int(floor((la-double(dla) ) * 24 )); //TODO: Test if locators are calculated correctly. // generation function has been changed because of the QT4 migration locat = locat + QChar(alo+'A'); locat = locat + QChar(bla+'A'); locat = locat + QChar(clo+'0'); locat = locat + QChar(dla+'0'); locat = locat + QChar(elo+'A'); locat = locat + QChar(fla+'A'); // locat.at(0)=QChar(alo+'A'); // locat.at(1)=QChar(bla+'A'); // locat.at(2)=QChar(clo+'0'); // locat.at(3)=QChar(dla+'0'); // locat.at(4)=QChar(elo+'A'); // locat.at(5)=QChar(fla+'A'); return locat; } /* void Locator::degTodms(const double deg){ double temp; double ddeg; ddeg = 0; ddeg += 1.0/7200.0; // Round-up to 0.5 sec int ideg = (int)ddeg; temp = ( deg - (double)ideg ) * 60.0; int imin = (int)temp; temp = ( temp - (double)imin ) * 60.0; int isec = (int)(temp); } double Locator::dmsTodeg (int deg, int min, int sec) { return (double)deg + (double)min/60.0 + (double)sec/3600.0; } */ int Locator::getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2) { //qDebug() << "Locator::getBeamBetweenLocators: " << tlocator1 << "/" << tlocator2 << QT_ENDL; if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getBeam(lon1, lat1, lon2, lat2); } } int Locator::getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem) { if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getDistance(lon1, lat1, lon2, lat2, _imperialSystem); //return getBeam(lon1, lat1, lon2, lat2); } } klog-1.8.6/world.cpp0000644000175000017500000013152014166020421013273 0ustar develdevel/*************************************************************************** world.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "world.h" /* QHash worldPrefixes; To insert a (key, value) pair into the hash, you can use operator[](): hash["EA"] = 130; hash["EA6"] = 131; hash["EA8"] = 132; */ World::World(DataProxy_SQLite *dp, const QString &_parentFunction) { //qDebug() << "World::World(0)" << _parentFunction << QT_ENDL; constrid = 1; worldModel = new QSqlRelationalTableModel(this); numberOfEntities = 0; progressBarPosition = 0; cqz = -1; ituz = -1; ret = false; continentId = -1; lat = 0.0; lon = 0.0; utc = 0.0; klogDir = ""; klogVersion = ""; locator = new Locator(); created = false; dataProxy = dp; //awards = new Awards(Q_FUNC_INFO); //qDebug() << "World::World(0) - END" << QT_ENDL; } World::World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_parentFunction) { //qDebug() << "World::World(1): Dir" << _klogDir << _parentFunction << QT_ENDL; constrid = 2; klogDir = _klogDir; klogVersion = ""; worldModel = new QSqlRelationalTableModel(this); numberOfEntities = 0; progressBarPosition = 0; created = false; cqz = -1; ituz = -1; ret = false; continentId = -1; lat = 0.0; lon = 0.0; utc = 0.0; //flagsDir=":/flags/"; locator = new Locator(); dataProxy = dp; //qDebug() << "World::World(1): - END" << QT_ENDL; } World::World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_klogVer, const QString &_parentFunction) { //qDebug() << "World::World(2): Dir" << _klogDir << _parentFunction << QT_ENDL; constrid = 3; klogDir = _klogDir; klogVersion = _klogVer; //qDebug() << "World::World(2): 1" << QT_ENDL; worldModel = new QSqlRelationalTableModel(this); //qDebug() << "World::World(2): 2" << QT_ENDL; numberOfEntities = 0; progressBarPosition = 0; created = false; cqz = -1; ituz = -1; ret = false; continentId = -1; lat = 0.0; lon = 0.0; utc = 0.0; //appDir = QString(); //flagsDir=":/flags/"; //qDebug() << "World::World(2): 2" << QT_ENDL; locator = new Locator(); //qDebug() << "World::World(2): 3" << QT_ENDL; dataProxy = dp; //qDebug() << "World::World(2): - END" << QT_ENDL; } World::~World() { //qDebug() << "World::~World" << QT_ENDL; } bool World::recreate(const QString &_worldFile) { //qDebug() << "World::recreate: " << _worldFile << QT_ENDL; QSqlQuery query; if (query.exec("DELETE FROM entity")) { //qDebug() << "World::recreate: EMPTY entity" << QT_ENDL; if (query.exec("DELETE FROM prefixesofentity")) { //qDebug() << "World::recreate: EMPTY prefixesofentity" << QT_ENDL; if (create(_worldFile)) { return insertSpecialEntities (); } } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY prefixesofentity" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return false; } } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY entity" << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return false; } return false; } bool World::create(const QString &_worldFile) { //qDebug() << "World::create: " << _worldFile << QT_ENDL; //klogDir = _worldFile; //qDebug() << "World::create: 2 " << klogDir << QT_ENDL; if (readCTYCSV(_worldFile)) { created = true; //qDebug() << "World::create: TRUE" << QT_ENDL; }else { created = false; //qDebug() << "World::create: FALSE" << QT_ENDL; } if (created) { created = insertSpecialEntities(); } if (created) { //dataProxy->updateISONames(); if (dataProxy->updateISONames()) { //qDebug() << "World::create: updateISONames TRUE" << QT_ENDL; } else { //qDebug() << "World::create: updateISONames FALSE" << QT_ENDL; } } //qDebug() << "World::create: END" << QT_ENDL; return created; } void World::createWorldModel() { worldModel->setTable("entity"); worldModel->setRelation(Entity_Continent, QSqlRelation("continent", "id", "shortname")); worldModel->setSort(Entity_Name, Qt::AscendingOrder); worldModel->setHeaderData(Entity_Name, Qt::Horizontal, tr("Entity")); worldModel->setHeaderData(Entity_Continent, Qt::Horizontal, tr("Continent")); worldModel->select(); } QStringList World::processLine(const QString &_line) { //qDebug() << "World::processLine: received: " << _line << QT_ENDL; //QString queryString; QStringList aa; QString line; line = (_line).simplified(); if ((line).count('\'')) // Replaces ' by _ //The error comes from "Cote d'Ivoire" that breaks the SQL { line.replace(QChar('\''), QChar('_')); } //qDebug() << "World::processLine: Received: " << line << QT_ENDL; //QSqlQuery query1; nullValue=-1; if ( (line.count(':') == 8 ) ) // First line of an Entity { //United States: 05: 08: NA: 43.00: 87.90: 5.0: K: //qDebug() << "World::processLine first: " << line << QT_ENDL; numberOfEntities++; list.clear(); list << line.split(':'); entityName = list[0]; cqz = list[1].toInt(); ituz = list[2].toInt(); continentName = (list[3]).simplified(); continentId=-1; lat = list[4].toDouble(); lon = list[5].toDouble(); utc = ((list[6]).simplified()).toDouble(); //utc = ((list[6]).simplified()).toInt(); prefix = list[7]; currentPrefix = prefix; continentId = dataProxy->getContinentIdFromContinentShortName(continentName); //queryString = "SELECT id FROM continent WHERE shortname=='" + continentName + "'"; //query1.exec(queryString); //query1.next(); //if (query1.isValid()) //{ // continentId = (query1.value(0)).toInt(); //} //qDebug() << "World::processLine Query - Read/continenId: " << continentName << "/" << QString::number(continentId) << QT_ENDL; //queryString = QString("INSERT INTO entity (id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) VALUES (NULL,'%1','%2','%3','%4','%5','%6','%7','%8','%9');\n").arg(entityName).arg(cqz).arg(ituz).arg(QString::number(continentId)).arg(lat).arg(lon).arg(utc).arg(numberOfEntities).arg(prefix); aa << entityName << QString::number(cqz) << QString::number(ituz) <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); line = line.remove(';'); if (line.count(',') == 0) // Only one prefix in the final line { prefixAndZones = readZones(line, _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //readZones returns a QStringList: prefix, CQz, ITUz //Returns QStringList: prefix << dxcc << cqz << ituz OR CurrentEntity as a number return aa; } else // More than just one prefix in the final line { //qDebug() << "World::processLineP Query (MORE one final)(line):" << line << QT_ENDL; _list.clear(); _list << line.split(','); aa.clear(); //queryString.clear(); for (int i = 0; i < _list.size(); ++i) { // PROCESS THE LINE //qDebug() << "World::processLineP LastLine prefixes" << _list.at(i) << QT_ENDL; //readZones returns a QStringList: prefix, CQz, ITUz prefixAndZones = readZones(_list.at(i), _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //return aa; } //qDebug() << "World::processLineP: END" <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); if (line.endsWith(',')) { line.chop(1); } if ((line.split(',')).size() == 1) // Only one prefix in the middle line { // Not usual, added this check for sanity reasons only //qDebug() << "World::processLine Query: (only one middle) " << QT_ENDL; line = line.remove(','); prefixAndZones = readZones(line, _cqz, _ituz); aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); return aa; } else { //qDebug() << "World::processLine Query: (MORE than one middle) " << QT_ENDL; list.clear(); list << line.split(','); //queryString.clear(); aa.clear(); for (int i = 0; i < list.size(); ++i) { // PROCESS THE LINE prefixAndZones = readZones(list[i], _cqz, _ituz); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //ret = query.exec(queryString); } } } //aa.clear(); return aa; } QStringList World::readZones (const QString &pref, const int _cq, const int _itu) { //Returns a QStringList: prefix, CQz, ITUz //qDebug() << "World::readZones: (" << pref << "/" << QString::number(_cq) <<"/" << QString::number(_itu)<< ")" << QT_ENDL; QStringList result; int cq = _cq; int itu = _itu; QString azone; QString aux = pref; if (aux.startsWith("=")){ aux = aux.remove(0,1); } if(aux.count('[')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED [ !!!!" << QT_ENDL; azone = (aux.midRef(aux.indexOf('[')+1)).toString(); //qDebug() << "World::readZones (ITU)-1: " << aux << " right of " << QString::number(aux.indexOf('[')) << " = " << azone << QT_ENDL; itu = (azone.left(azone.indexOf(']'))).toInt(); //qDebug() << "World::readZones (ITU)-2: " << azone.left(azone.indexOf(']')) << QT_ENDL; aux = aux.left(aux.indexOf('[')); //qDebug() << "World::readZones (ITU): " << pref << "/" << QString::number(itu) << "/" << aux << QT_ENDL; } if(aux.count('(')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED ( !!!!" << QT_ENDL; azone = (aux.midRef(aux.indexOf('(')+1)).toString(); cq = (azone.left(azone.indexOf(')'))).toInt(); aux = aux.left(aux.indexOf('(')); //qDebug() << "World::readZones (CQ): " << pref << "/" << QString::number(cq) << "/" << aux << QT_ENDL; } //qDebug() << "World::readZones (Pref/CQ/ITU): " << pref << "= " << aux <<"/" << QString::number(cq) << "/" << QString::number(itu) << QT_ENDL; result << aux << QString::number(cq) << QString::number(itu); //qDebug() << "World::readZones (Pref/CQ/ITU): " << result << QT_ENDL; return result; } int World::getPrefixId(const QString &_qrz) { //qDebug() << "World::getPrefixId: -" << _qrz <<"-" << QT_ENDL; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number if (_qrz.length() < 1) { return -1; } int entityID = 0; QString aux = changeSlashAndFindPrefix((_qrz).toUpper()); while ((entityID <= 0) && (aux.length()>=1) ) { //qDebug() << "World::getPrefixId: in the while before calling dataProxy: " << aux << QT_ENDL; if (aux == "KG4") { if (_qrz.length()!=5) { aux = "K"; } } entityID = dataProxy->getDXCCFromPrefix(aux); //qDebug() << "World::getPrefixId: in the while After calling dataProxy" << QT_ENDL; //qDebug() << "World::getPrefixId: in the while" << aux << " = " << QString::number(entityID) << QT_ENDL; if (entityID<=0) { aux.chop(1); } } //qDebug() << "World::getPrefixId: END: " << _qrz << QString::number(entityID) << QT_ENDL; return entityID; } QString World::getQRZEntityName(const QString &_qrz) { //qDebug() << "World::getQRZEntityName: " << _qrz << QT_ENDL; if (_qrz.length() < 1 ) { return QString(); } //QString queryString; //QSqlQuery query; int prefixIDNumber = getPrefixId(_qrz); return getEntityName(prefixIDNumber); } QString World::getEntityName(const int _entityN) { int prefixIDNumber = _entityN; if (prefixIDNumber<=0) { return QString(); } return dataProxy->getEntityNameFromId(prefixIDNumber); } int World::getQRZCqz(const QString &_qrz) { //qDebug() << "World::getQRZCqz: " << _qrz << QT_ENDL; if (_qrz.length() < 1 ) { return -1; } int i = -1; QString aux = _qrz; while ((i <= 0) && (aux.length()>=1) ) { i = dataProxy->getCQzFromPrefix(aux); if (i<=0) { aux.chop(1); } } return i; //int prefixIdNumber = getPrefixId(_qrz); //return getEntityCqz(prefixIdNumber); } int World::getQRZItuz(const QString &_qrz) { //qDebug() << "World::getQRZItuz: " << _qrz << QT_ENDL; if (_qrz.length() < 1 ) { return -1; } int i = -1; QString aux = _qrz; while ((i <= 0) && (aux.length()>=1) ) { i = dataProxy->getITUzFromPrefix(aux); if (i<=0) { aux.chop(1); } } return i; } int World::getEntityCqz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getCQzFromEntity(_enti); /* QSqlQuery query; QString queryString; //queryString = QString("SELECT cqz FROM prefixesofentity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(prefixIDNumber); queryString = "SELECT cqz FROM prefixesofentity WHERE dxcc=='" + QString::number(_enti) +"'"; query.exec(queryString); query.next(); //qDebug() << "World::getEntityCqz: " << QString::number(_enti) << " = " << (query.value(0)).toInt() << QT_ENDL; if (query.isValid()){ return (query.value(0)).toInt(); }else{ return -1; } return -1; */ } int World::getEntityItuz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getITUzFromEntity(_enti); /* QSqlQuery query; QString queryString; queryString = "SELECT ituz FROM prefixesofentity WHERE dxcc=='" + QString::number(_enti) +"'"; query.exec(queryString); query.next(); //qDebug() << "World::getEntityItuz: " << QString::number(_enti) << " = " << (query.value(0)).toInt() << QT_ENDL; if (query.isValid()){ return (query.value(0)).toInt(); }else{ return -1; } return -1; */ } int World::getQRZARRLId(const QString &_qrz) { //qDebug() << "World::getQRZARRLId" << _qrz << QT_ENDL; if (_qrz.length() < 1 ) { return -1; } int prefixIdNumber = getPrefixId(_qrz); return prefixIdNumber; } QString World::getQRZEntityMainPrefix(const QString &_qrz) { if (_qrz.length() < 1 ) { return ""; } int i = getQRZARRLId(_qrz); return getEntityMainPrefix(i); //QString queryString; //QSqlQuery query; /* queryString = "SELECT mainprefix FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return ""; } else { query.next(); //qDebug() << "World::getQRZEntityMainPrefix(id/qrz): " << QString::number(i) << "/" <<_qrz << " = " << (query.value(0)).toString() << QT_ENDL; if (query.isValid()){ return (query.value(0)).toString(); } else { return ""; } } return ""; */ } QString World::getEntityMainPrefix(const int _entityN) { if (_entityN <= 0 ) { return QString(); //return tr("NONE"); } return dataProxy->getEntityMainPrefix(_entityN); /* QString queryString; QSqlQuery query; queryString = QString("SELECT mainprefix FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_entityN); //queryString = "SELECT mainprefix FROM entity WHERE dxcc=='" + QString::number(_entityN) +"'"; if (!query.exec(queryString)) { return ""; } else { query.next(); if (query.isValid()){ return (query.value(0)).toString(); }else{ return ""; } } return ""; */ } bool World::isNewCQz(const int _cqz) { return dataProxy->isNewCQz(_cqz); /* QString queryString; QSqlQuery query; queryString = "SELECT id FROM log WHERE cqz=='" + QString::number(_cqz) +"'"; if (!query.exec(queryString)) { return false; } else { query.next(); if (query.isValid()){ return true; }else{ return false; } } return false; */ } bool World::isNewEntity(const int _entityN) { if (_entityN <= 0) { return false; } return dataProxy->isNewEntity(_entityN); /* QString queryString; QSqlQuery query; queryString = "SELECT id FROM log WHERE dxcc=='" + QString::number(_entityN) +"'"; if (!query.exec(queryString)) { return false; } else { query.next(); if (query.isValid()){ return true; }else{ return false; } } return false; */ } QString World::getQRZContinentShortName(const QString &_qrz) { //qDebug() << "World::getQRZContinentShortName: " << _qrz << QT_ENDL; //QString continentNumber = getQRZContinentNumber (_qrz); return getContinentShortName (getQRZARRLId(_qrz)); } QString World::getContinentShortName(const int _enti) { //qDebug() << "World::getQRZContinentShortName: " << QString::number(_enti) << QT_ENDL; //QString continentNumber = QString::number(_enti); if ( _enti < 0 ) { return "--"; } QString a = dataProxy->getContinentShortNameFromEntity(_enti); if (a.length()!=2) { return "--"; } else { return a; } /* QString queryString; QSqlQuery query; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(_enti); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + continentNumber +"'"; if (!query.exec(queryString)) { return "--"; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZContinentShortName: NO VALID" << QT_ENDL; return "--"; }else{ //qDebug() << "World::getQRZContinentShortName: VALID" << QT_ENDL; return (query.value(0)).toString(); } } return "--"; */ } QString World::getQRZContinentNumber(const QString &_qrz) { //qDebug() << "World::getQRZContinentNumber: " << _qrz << QT_ENDL; int i = getQRZARRLId(_qrz); return QString::number(getContinentNumber(i)); /* QString a; QString queryString; QSqlQuery query; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(i); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return "-1"; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): NO VALID" << QT_ENDL; return "-1"; }else{ //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): VALID" << QT_ENDL; a = (query.value(0)).toString(); } //qDebug() << "World::getQRZContinentNumber(qrz/i/Cont): " <<_qrz << "/" << QString::number(i) << "/" << a << QT_ENDL; return a; } return "-1"; */ } int World::getContinentNumber(const int _enti) { //qDebug() << "World::getQRZContinentNumber: " << QString::number(_enti) << QT_ENDL; if (_enti <= 0) { return -1; } return dataProxy->getContinentIdFromEntity(_enti); /* int a = -1; QString queryString; QSqlQuery query; int i = _enti; queryString = QString("SELECT continent FROM entity WHERE (mainprefix NOT LIKE '*%') AND dxcc='%1'").arg(i); //queryString = "SELECT continent FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return -1; } else { query.next(); if ( !(query.isValid()) ) { return -1; }else{ a = (query.value(0)).toInt(); queryString = "SELECT id FROM continent where shortname=='" + query.value(0).toString() + "'"; if (query.exec(queryString)) { query.next(); if(query.isValid()) { return query.value(0).toInt(); } else { // Value not valid return -1; } } else { // Error in the query return -1; } } return a; } return -1; */ } double World::getQRZLongitude(const QString &_qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getLongitudeFromEntity(i); /* QString queryString; QSqlQuery query; queryString = "SELECT longitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLongitude: NO VALID" << QT_ENDL; return 0.0; }else{ //qDebug() << "World::getQRZLongitude: VALID" << QT_ENDL; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getLongitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLongitudeFromEntity(_enti); /* QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT longitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLongitude: NO VALID" << QT_ENDL; return 0.0; }else{ //qDebug() << "World::getQRZLongitude: VALID" << QT_ENDL; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getQRZLatitude(const QString &_qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getLatitudeFromEntity(i); /* QString queryString; QSqlQuery query; queryString = "SELECT latitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLatitud: NO VALID" << QT_ENDL; return 0.0; }else{ //qDebug() << "World::getQRZLatitud: VALID" << QT_ENDL; return (query.value(0)).toDouble(); } } return 0.0; */ } double World::getLatitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLatitudeFromEntity(_enti); /* QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT latitude FROM entity WHERE dxcc=='" + QString::number(i) +"'"; if (!query.exec(queryString)) { return 0.0; } else { query.next(); if ( !(query.isValid()) ) { //qDebug() << "World::getQRZLatitud: NO VALID" << QT_ENDL; return 0.0; }else{ //qDebug() << "World::getQRZLatitud: VALID" << QT_ENDL; return (query.value(0)).toDouble(); } } return 0.0; */ } QString World::getQRZLocator(const QString &_qrz) { if (_qrz.length() < 1) { return ""; } return locator->getLocator(getQRZLongitude(_qrz), getQRZLatitude(_qrz)); } QString World::getLocator(const int _entityN) { if (_entityN <= 0) { return ""; } return locator->getLocator(getLongitude(_entityN), getLatitude(_entityN)); } QString World::getQRZEntityPrefixes(const QString &_qrz) { int i = getQRZARRLId(_qrz); return dataProxy->getEntityMainPrefix(i); } bool World::readCTYCSV(const QString &_worldFile) { //qDebug() << "World::readCTYCSV(): " << _worldFile << QT_ENDL; QString tq; tq.clear(); QString entityNumber; //entityNumber = "-1"; //QString fileName; qint64 beginingOfFile; int numberOfLines = 0; //int errorCode = -1; QFile file( _worldFile ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "World::readCTYCSV() File not found: END FALSE" << fileName << QT_ENDL; return false; } else { //qDebug() << "World::readCTYCSV() File found: " << fileName << QT_ENDL; } beginingOfFile = file.pos(); while (!file.atEnd()) { if ( (file.readLine()).contains(';') ) { numberOfEntities++; } numberOfLines++; } //qDebug() << "World::readCTYCSV() - numberOfEntities: " << QString::number(numberOfEntities) << QT_ENDL; // The file is readed twice: 1: Main entity data; 2: prefixes. // Starts with main data: file.seek(beginingOfFile); progressBarPosition = 0; QProgressDialog progress(tr("Reading cty.csv..."), tr("Abort reading"), 0, numberOfLines, this); progress.setWindowModality(Qt::ApplicationModal); numberOfEntities = 0; // Reset this variable to reuse it and assign the "dxcc" to the entities (temp solution) QSqlQuery query; // Entity information QSqlQuery queryP; // Prefixes information query.prepare("INSERT INTO entity (id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); QSqlDatabase::database().transaction(); QStringList T9StringList; T9StringList.clear(); QStringList stringList, stringListPrefixes, stringListProcessedPrefix; int entN; //entN = -1; while (!file.atEnd()) { progress.setValue(progressBarPosition); progressBarPosition++; if (progress.wasCanceled()) break; stringList.clear(); stringListPrefixes.clear(); // // 9Y,Trinidad & Tobago,90,SA,9,11,10.38,61.28,4.0,9Y 9Z; // 5A,Libya,436,AF,34,38,27.20,-16.60,-2.0,5A; // MainPref / Name / dxcc / Cont / CQ / ITU / LAT / LON / -UTC / prefixes // 0 1 2 3 4 5 6 7 8 9 tq = file.readLine(); //qDebug() << "World::readCTYCSV(): Line: " << tq << QT_ENDL; tq = tq.simplified(); //qDebug() << "World::readCTYCSV(): Line simplified: " << tq << QT_ENDL; tq = tq.trimmed(); //qDebug() << "World::readCTYCSV(): Line trimmed: " << tq << QT_ENDL; tq.remove(QChar(';'), Qt::CaseInsensitive); //qDebug() << "World::readCTYCSV(): Line without ;: " << tq << QT_ENDL; stringList << tq.split(','); //qDebug() << "World::readCTYCSV(): Line stringList-0: " << stringList.at(0) << QT_ENDL; if (( stringList.at(0)).contains(QChar('*'), Qt::CaseInsensitive)) { // This is a special Entity. Not really an ARRL Entity but interesting for the DXer. // From http://www.country-files.com/cty-dat-format // (A “*” preceding this prefix indicates that the country is on the DARC WAEDC list, and counts in CQ-sponsored contests, but not ARRL-sponsored contests). //entN = -1; entN = (stringList.at(2)).toInt() + 1000; while ( (dataProxy->getEntityMainPrefix(entN)).size()>0 ) { //qDebug() << "World::readCTYCSV() entN: " << QString::number(entN) << QT_ENDL; //qDebug() << "World::readCTYCSV() dataProxy->getEntityMainPrefix: " << QString::number(entN) << QT_ENDL; entN = entN + 1000; } entityNumber = QString::number(entN); } else { entityNumber = stringList.at(2); } //qDebug() << "World::readCTYCSV(): Line stringList Length: " << QString::number(stringList.length()) << QT_ENDL; if (stringList.size()>=8 ) { //(id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) query.addBindValue(QVariant(QVariant::Int)); query.addBindValue(stringList.at(1)); // name query.addBindValue(stringList.at(4)); // CQ query.addBindValue(stringList.at(5)); // ITU query.addBindValue(stringList.at(3)); // Cont query.addBindValue(stringList.at(6)); // Lat query.addBindValue(stringList.at(7)); // Lon query.addBindValue(stringList.at(8)); // UTC //query.addBindValue(stringList.at(2)); // dxcc query.addBindValue(entityNumber); // dxcc query.addBindValue(stringList.at(0)); // Mainprefix //qDebug() << "World::readCTYCSV(): Entity name: " << stringList.at(1) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity cqz: " << stringList.at(4) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity ituz: " << stringList.at(5) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity cont: " << stringList.at(3) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity lat: " << stringList.at(6) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity lon: " << stringList.at(7) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity UTC: " << stringList.at(8) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity ARRL: " << stringList.at(2) << QT_ENDL; //qDebug() << "World::readCTYCSV(): Entity Pref: " << stringList.at(0) << QT_ENDL; if (query.exec()) { //qDebug() << "World::readCTYDAT(): Entity data added: " << stringList.at(1) << QT_ENDL; } else if (query.lastError().nativeErrorCode() == QString::number(19)) { //qDebug() << "World::readCTYDAT(): Entity data added: error19: " << stringList.at(1) << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } else { //qDebug() << "World::readCTYDAT(): Entity data added: error else: " << stringList.at(1) << QT_ENDL; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "World::readCTYCSV(): Entity data NOT added" << QT_ENDL; //qDebug() << "World::readCTYCSV(): LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "World::readCTYCSV(): LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "World::readCTYCSV(): LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "World::readCTYCSV(): LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } //qDebug() << "World::readCTYCSV(): Entity ADDED or NOT" << QT_ENDL; if (stringList.size()>8) { tq = stringList.at(9); stringListPrefixes << tq.split(' '); tq = stringListPrefixes.last(); QString prefAux = QString(); for (int i = 0; i < stringListPrefixes.size(); ++i) { prefAux = stringListPrefixes.at(i); //queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); // 0 1 2 3 4 // (id, prefix, dxcc, cqz, ituz) //qDebug() << "World::readCTYCSV(): Prefix: " << stringListPrefixes.at(i) << QT_ENDL; queryP.addBindValue(QVariant(QVariant::Int)); //readZones (const QString &pref, const int _cq, const int _itu) //Returns a QStringList: prefix, CQz, ITUz stringListProcessedPrefix.clear(); stringListProcessedPrefix << readZones(prefAux, (stringList.at(4)).toInt(), (stringList.at(5)).toInt()); if (prefAux.at(0)=='=') { //TODO: Maybe there is a better way to identify exact calls instead of prefixes , identified with a = before he call. prefAux.remove(0,1); } queryP.addBindValue(stringListProcessedPrefix.at(0)); queryP.addBindValue(entityNumber); queryP.addBindValue(stringListProcessedPrefix.at(1)); queryP.addBindValue(stringListProcessedPrefix.at(2)); if (queryP.exec()) {// T9 is the former prefix of Bosnia and Herzegovina; it moved to E7 on 7 August 2007. // YZ and 4N belonged to Yugoslavia, along with 4O (which went to successor state Montenegro) // YT and YU (which went to successor state Serbia) //qDebug() << "World::readCTYCSV(): Prefix added: " << stringListPrefixes.at(i) << QT_ENDL; } else if (queryP.lastError().nativeErrorCode() == QString::number(19)) {} else { //errorCode = queryP.lastError().nativeErrorCode(); emit queryError(Q_FUNC_INFO, queryP.lastError().databaseText(), queryP.lastError().nativeErrorCode(), queryP.lastQuery()); //qDebug() << "World::readCTYCSV(): Prefix data NOT added" << QT_ENDL; //qDebug() << "World::readCTYCSV(): Prefix LastQuery: " << query.lastQuery() << QT_ENDL; //qDebug() << "World::readCTYCSV(): Prefix LastError-data: " << query.lastError().databaseText() << QT_ENDL; //qDebug() << "World::readCTYCSV(): Prefix LastError-driver: " << query.lastError().driverText() << QT_ENDL; //qDebug() << "World::readCTYCSV(): Prefix LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL; } } } } //qDebug() << "World::readCTYCSV() tq: " << tq << QT_ENDL; progress.setLabelText("Reading cty.csv ... \nNow reading " + currentPrefix + " data"); //qDebug() << "World::readCTYCSV() - progressBarPosition: " << QString::number(progressBarPosition) << QT_ENDL; } QSqlDatabase::database().commit(); progress.setValue(numberOfLines); if (created) { dataProxy->updateISONames(); } //qDebug() << "World::readCTYCSV() END TRUE " << QT_ENDL; return true; } QString World::changeSlashAndFindPrefix(const QString &_qrz) { //qDebug() << "World::changeSlashAndFindPrefix: -" << _qrz <<"-" << QT_ENDL; QString aux = _qrz.toUpper(); if ((aux).count('\\')) // Replaces \ by / to ease operation. { aux.replace(QChar('\\'), QChar('/')); } else { return aux; } if (aux.count('/')) // / found! Checking different options { int iaux1, iaux2; if (aux.endsWith("/") ) { // We look for calls ending in slash "/" or "\" aux.remove(aux.length()-1,1); } iaux1 = aux.indexOf('/'); //qDebug() << "World::changeSlashAndFindPrefix: Slash found at: " << QString::number(iaux1) << QT_ENDL; iaux2 = (aux.length())- iaux1; // iaux2 is the length of the second part if (iaux2 < 0){ iaux2 = -iaux2; } if ( iaux1 < iaux2 ) { //Like in F/EA0XXX, we can simply take the first part as the prefix aux = aux.left(iaux1); } else { aux = aux.right(iaux2 -1); } } return aux; } bool World::checkQRZValidFormat(const QString &_qrz) { //qDebug() << "World::checkQRZValidFormat: -" << _qrz <<"-" << QT_ENDL; QString aux = changeSlashAndFindPrefix(_qrz.toUpper()); if (aux.length()<3) { return false; } // The format of a Call is defined here: // http://en.wikipedia.org/wiki/ITU_prefix_%28amateur_stations%29 //bool prefixEnded = false; //int callLength = _qrz.length(); //int sepPos = 0; int barPos = aux.indexOf('/'); // If barPos > 0 we have a complex call like F/EA0K QCharRef c = aux[aux.length()-1]; if ( c.isDigit() && (barPos<=0) ) { return false; } //prefix = prefix + aux.at(0); if ( ( aux.at(1) ).isDigit() ) { // W3 A6 if ((aux.at(2)).isDigit() ) { // A60 //prefix = prefix + aux.at(1); //separator = aux.at(2); //sepPos = 2; } else { // W3A //separator = aux.at(1); //sepPos = 1; } } else { // EA 3D 2M if ((aux.at(2)).isDigit() ) { // EA0 //prefix = prefix + aux.at(1); //separator = aux.at(2); //sepPos = 2; } else { // 3DA if (aux.length() < 4) { //prefix = prefix + aux.at(2); return false; } if ((aux.at(3)).isDigit()) { // 3DA0 //prefix = prefix + aux.at(1); //prefix = prefix + aux.at(2); //separator = aux.at(3); //sepPos = 3; if (aux.length() < 5) { // 3DA0 //prefix = prefix + aux.at(3); return false; } } else { return false; } } } /* for (int i = sepPos+1; i < aux.length(); i++) { suffix = suffix + aux.at(i); } */ return true; } QStringList World::getEntitiesNames() { //qDebug() << "World::getEntitiesNames" << QT_ENDL; return dataProxy->getEntitiesNames(); } int World::getHowManyEntities() { return dataProxy->getHowManyEntities(); } bool World::insertSpecialEntities() { //https://en.wikipedia.org/wiki/Non-ITU_prefix //qDebug() << Q_FUNC_INFO << QT_ENDL; // T9 to E7 // 4N & YZ to 4O int entityID = dataProxy->getEntityIdFromMainPrefix("E7"); int cqz = dataProxy->getCQZFromId(entityID); int ituz = dataProxy->getITUzFromEntity(entityID); QString queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("T9").arg(entityID).arg(cqz).arg(ituz); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : T9 not added " << QT_ENDL; return false; } entityID = dataProxy->getEntityIdFromMainPrefix("4O"); cqz = dataProxy->getCQzFromEntity(entityID); ituz = dataProxy->getITUzFromEntity(entityID); queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("4N").arg(entityID).arg(cqz).arg(ituz); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : 4N not added " << QT_ENDL; return false; } queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("YZ").arg(entityID).arg(cqz).arg(ituz); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : YZ not added " << QT_ENDL; return false; } return true; //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL; } bool World::hasSpecialEntities() { // Checks if T9 is added to the list of prefixes to validate if special prefixes have been added. //qDebug() << Q_FUNC_INFO << QT_ENDL; QString queryString = QString("SELECT dxcc from prefixesofentity WHERE prefix='T9'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ((query.value(0)).toInt()>1) { query.finish(); return true; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } klog-1.8.6/startwizard.cpp0000644000175000017500000015560614166020407014541 0ustar develdevel/*************************************************************************** startwizard.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "startwizard.h" //#include StartWizard::StartWizard(const QString &_klogDir, const QString &_softVersion, QWidget *parent) : QWizard(parent) { //qDebug() << "StartWizard::StartWizard: v=" << _softVersion << QT_ENDL; //licAcepted = false; version = _softVersion; klogDir = _klogDir; inMemory = true; //fileOrMemoryPage = new FileOrMemoryPage(); ctyPage = new CTYPage(klogDir, version); setWizardStyle(QWizard::AeroStyle); setPage(Page_Intro, new IntroPage); setPage(Page_Lic, new LicPage); //setPage(Page_Mem, new FileOrMemoryPage); setPage(Page_CTY, ctyPage); setStartId(Page_Intro); QAbstractButton* finishButton = this->button(QWizard::FinishButton); QAbstractButton* cancelButton = this->button(QWizard::CancelButton); connect(finishButton, SIGNAL(clicked()), this, SLOT(slotButtonFinishedClicked())); disconnect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect(cancelButton, SIGNAL( clicked() ), this, SLOT( slotCancelWizard() ) ); //connect(fileOrMemoryPage, SIGNAL(exeInMemory(bool)), this, SLOT(slotRunInMemory(bool) ) ); //connect(ctyPage, SIGNAL(downloadTheFileSignal(bool)), this, SLOT(slotDownloadCTY(bool) ) ); QList layout; layout << QWizard::Stretch << QWizard::BackButton << QWizard::CancelButton << QWizard::NextButton << QWizard::FinishButton; setButtonLayout(layout); setWindowTitle(tr("KLog - The free hamradio logging program")); //qDebug() << "StartWizard::StartWizard: - END" << QT_ENDL; } void StartWizard::setVersion(const QString &tversion) { version = tversion; } /*void StartWizard::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "StartWizard::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; ctyPage->updateProgress(received, total); } */ /* void StartWizard::slotDownloadFinished() { //qDebug() << "StartWizard::slotDownloadFinished" << QT_ENDL; //close(); } */ void StartWizard::slotCancelWizard() { if( QMessageBox::question( this, tr("Quit Setup"), tr("Setup is not complete yet. Are you sure you want to quit setup?"), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { // allow cancel reject(); } } void StartWizard::slotRunInMemory(bool checked) { if (checked) { inMemory = true; } else { inMemory = false; } } void StartWizard::slotButtonFinishedClicked() { //qDebug() << "StartWizard::slotButtonFinishedClicked " << QT_ENDL; if (inMemory) { setResult(1); //qDebug() << "StartWizard::slotButtonFinishedClicked: done 1 " << QT_ENDL; } else { //qDebug() << "StartWizard::slotButtonFinishedClicked: done 2 " << QT_ENDL; setResult(2); } } /* bool StartWizard::doTheDownload() { //qDebug() << "StartWizard::doTheDownload" << QT_ENDL; int downloading = 1; int i = 0; int ret; QMessageBox msgBox; QString str; msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); i = dl->download(); if (downloadValueResult == 0) { return true; } return false; } void StartWizard::slotValueReturnedFromDownload(int value) { //qDebug() << "StartWizard::slotValueReturnedFromDownload: " << QString::number(value) << QT_ENDL; downloadValueResult = value; //close(); } */ IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Welcome to KLog!")); topLabel = new QLabel(tr("Welcome to KLog! " "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); welcomeBrowser = new QTextEdit; welcomeBrowser->setReadOnly(true); QString welcometxt = "" + tr("Welcome to KLog") + "" + "

" + tr("This looks like it's the first time you've run KLog on this computer.") + "

" + "

" + tr("KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows.") + tr("It is designed to provide general purpose DX, and contest logging.") + "

" + "

" + tr("It supports QSL management, import and export of ADIF ") + tr("and Cabrillo file formats and many other features...") + "

" + tr("Before you can start using KLog, you will be asked to:") + "

    " + "
  • " + tr("Acknowledge to the terms of the license.") + "
  • " + "
  • " + tr("Download the DX entities information.") + "
  • " + "
  • " + tr("Enter your callsign, CQ zone, etc. and main configuration.") + "
" + "

" + tr("Enjoy KLog and contact the development team if you have any suggestions!") + "

" + "

73 de EA4K

"; welcomeBrowser->setHtml(welcometxt); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(welcomeBrowser); setLayout(layout); } int IntroPage::nextId() const { return StartWizard::Page_Lic; } LicPage::LicPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("KLog License information")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Welcome to KLog!" "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); licenseBrowser = new QTextEdit; licenseBrowser->setReadOnly(true); QString gplLic = "" "GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)" "" "" "

GNU GENERAL PUBLIC LICENSE

" "

Version 3, 29 June 2007

" "

Copyright (c) 2007 Free Software Foundation, Inc.

" "

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

" "

Preamble

" "

The GNU General Public License is a free, copyleft license for software and other kinds of works.

" "

The licenses for most software and other practical works are designed " "to take away your freedom to share and change the works. By contrast, " "the GNU General Public License is intended to guarantee your freedom to " "share and change all versions of a program--to make sure it remains free " "software for all its users. We, the Free Software Foundation, use the " "GNU General Public License for most of our software; it applies also to " "any other work released this way by its authors. You can apply it to " "your programs, too.

" "

When we speak of free software, we are referring to freedom, not " "price. Our General Public Licenses are designed to make sure that you " "have the freedom to distribute copies of free software (and charge for " "them if you wish), that you receive source code or can get it if you " "want it, that you can change the software or use pieces of it in new " "free programs, and that you know you can do these things.

" "

To protect your rights, we need to prevent others from denying you " "these rights or asking you to surrender the rights. Therefore, you have " "certain responsibilities if you distribute copies of the software, or if " "you modify it: responsibilities to respect the freedom of others.

" "

For example, if you distribute copies of such a program, whether " "gratis or for a fee, you must pass on to the recipients the same " "freedoms that you received. You must make sure that they, too, receive " "or can get the source code. And you must show them these terms so they " "know their rights.

" "

Developers that use the GNU GPL protect your rights with two steps: " "(1) assert copyright on the software, and (2) offer you this License " "giving you legal permission to copy, distribute and/or modify it.

" "

For the developers' and authors' protection, the GPL clearly explains " "that there is no warranty for this free software. For both users' and " "authors' sake, the GPL requires that modified versions be marked as " "changed, so that their problems will not be attributed erroneously to " "authors of previous versions.

" "

Some devices are designed to deny users access to install or run " "modified versions of the software inside them, although the manufacturer " "can do so. This is fundamentally incompatible with the aim of " "protecting users' freedom to change the software. The systematic " "pattern of such abuse occurs in the area of products for individuals to " "use, which is precisely where it is most unacceptable. Therefore, we " "have designed this version of the GPL to prohibit the practice for those " "products. If such problems arise substantially in other domains, we " "stand ready to extend this provision to those domains in future versions " "of the GPL, as needed to protect the freedom of users.

" "

Finally, every program is threatened constantly by software patents." "States should not allow patents to restrict development and use of " "software on general-purpose computers, but in those that do, we wish to " "avoid the special danger that patents applied to a free program could " "make it effectively proprietary. To prevent this, the GPL assures that " "patents cannot be used to render the program non-free.

" "

The precise terms and conditions for copying, distribution and " "modification follow.

" "

TERMS AND CONDITIONS

" "

0. Definitions.

" "

This License refers to version 3 of the GNU General Public License.

" "

Copyright also means copyright-like laws that apply to other kinds of " "works, such as semiconductor masks.

" "

The Program refers to any copyrightable work licensed under this " "License. Each licensee is addressed as you. Licensees and " "recipients may be individuals or organizations.

" "

To modify a work means to copy from or adapt all or part of the work " "in a fashion requiring copyright permission, other than the making of an " "exact copy. The resulting work is called a modified version of the " "earlier work or a work based on the earlier work.

" "

A covered work means either the unmodified Program or a work based " "on the Program.

" "

To propagate a work means to do anything with it that, without " "permission, would make you directly or secondarily liable for " "infringement under applicable copyright law, except executing it on a " "computer or modifying a private copy. Propagation includes copying, " "distribution (with or without modification), making available to the " "public, and in some countries other activities as well.

" "

To convey a work means any kind of propagation that enables other " "parties to make or receive copies. Mere interaction with a user through " "a computer network, with no transfer of a copy, is not conveying.

" "

An interactive user interface displays Appropriate Legal Notices " "to the extent that it includes a convenient and prominently visible " "feature that (1) displays an appropriate copyright notice, and (2) " "tells the user that there is no warranty for the work (except to the " "extent that warranties are provided), that licensees may convey the " "work under this License, and how to view a copy of this License. If " "the interface presents a list of user commands or options, such as a " "menu, a prominent item in the list meets this criterion.

" "

1. Source Code.

" "

The source code for a work means the preferred form of the work " "for making modifications to it. Object code means any non-source " "form of a work.

" "

A Standard Interface means an interface that either is an official " "standard defined by a recognized standards body, or, in the case of " "interfaces specified for a particular programming language, one that " "is widely used among developers working in that language.

" "

The System Libraries of an executable work include anything, other " "than the work as a whole, that (a) is included in the normal form of " "packaging a Major Component, but which is not part of that Major " "Component, and (b) serves only to enable use of the work with that " "Major Component, or to implement a Standard Interface for which an " "implementation is available to the public in source code form. A " "Major Component, in this context, means a major essential component " "(kernel, window system, and so on) of the specific operating system " "(if any) on which the executable work runs, or a compiler used to " "produce the work, or an object code interpreter used to run it.

" "

The Corresponding Source for a work in object code form means all " "the source code needed to generate, install, and (for an executable " "work) run the object code and to modify the work, including scripts to " "control those activities. However, it does not include the work's " "System Libraries, or general-purpose tools or generally available free " "programs which are used unmodified in performing those activities but " "which are not part of the work. For example, Corresponding Source " "includes interface definition files associated with source files for " "the work, and the source code for shared libraries and dynamically " "linked subprograms that the work is specifically designed to require, " "such as by intimate data communication or control flow between those " "subprograms and other parts of the work.

" "

The Corresponding Source need not include anything that users " "can regenerate automatically from other parts of the Corresponding " "Source.

" "

The Corresponding Source for a work in source code form is that " "same work.

" "

2. Basic Permissions.

" "

All rights granted under this License are granted for the term of " "copyright on the Program, and are irrevocable provided the stated " "conditions are met. This License explicitly affirms your unlimited " "permission to run the unmodified Program. The output from running a " "covered work is covered by this License only if the output, given its " "content, constitutes a covered work. This License acknowledges your " "rights of fair use or other equivalent, as provided by copyright law.

" "

You may make, run and propagate covered works that you do not " "convey, without conditions so long as your license otherwise remains " "in force. You may convey covered works to others for the sole purpose " "of having them make modifications exclusively for you, or provide you " "with facilities for running those works, provided that you comply with " "the terms of this License in conveying all material for which you do " "not control copyright. Those thus making or running the covered works " "for you must do so exclusively on your behalf, under your direction " "and control, on terms that prohibit them from making any copies of " "your copyrighted material outside their relationship with you.

" "

Conveying under any other circumstances is permitted solely under " "the conditions stated below. Sublicensing is not allowed; section 10 " "makes it unnecessary.

" "

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

" "

No covered work shall be deemed part of an effective technological " "measure under any applicable law fulfilling obligations under article " "11 of the WIPO copyright treaty adopted on 20 December 1996, or " "similar laws prohibiting or restricting circumvention of such " "measures.

" "

When you convey a covered work, you waive any legal power to forbid " "circumvention of technological measures to the extent such circumvention " "is effected by exercising rights under this License with respect to " "the covered work, and you disclaim any intention to limit operation or " "modification of the work as a means of enforcing, against the work's " "users, your or third parties' legal rights to forbid circumvention of " "technological measures.

" "

4. Conveying Verbatim Copies.

" "

You may convey verbatim copies of the Program's source code as you " "receive it, in any medium, provided that you conspicuously and " "appropriately publish on each copy an appropriate copyright notice; " "keep intact all notices stating that this License and any " "non-permissive terms added in accord with section 7 apply to the code; " "keep intact all notices of the absence of any warranty; and give all " "recipients a copy of this License along with the Program.

" "

You may charge any price or no price for each copy that you convey, " "and you may offer support or warranty protection for a fee.

" "

5. Conveying Modified Source Versions.

" "

You may convey a work based on the Program, or the modifications to " "produce it from the Program, in the form of source code under the " "terms of section 4, provided that you also meet all of these conditions:

" "
    " "
  • a) The work must carry prominent notices stating that you modified" "it, and giving a relevant date.
  • " "
  • b) The work must carry prominent notices stating that it is " "released under this License and any conditions added under section " "7. This requirement modifies the requirement in section 4 to " "keep intact all notices.
  • " "
  • c) You must license the entire work, as a whole, under this " "License to anyone who comes into possession of a copy. This " "License will therefore apply, along with any applicable section 7 " "additional terms, to the whole of the work, and all its parts, " "regardless of how they are packaged. This License gives no " "permission to license the work in any other way, but it does not " "invalidate such permission if you have separately received it.
  • " "
  • d) If the work has interactive user interfaces, each must display " "Appropriate Legal Notices; however, if the Program has interactive " "interfaces that do not display Appropriate Legal Notices, your " "work need not make them do so.
  • " "
" "

A compilation of a covered work with other separate and independent " "works, which are not by their nature extensions of the covered work, " "and which are not combined with it such as to form a larger program, " "in or on a volume of a storage or distribution medium, is called an " "aggregate if the compilation and its resulting copyright are not " "used to limit the access or legal rights of the compilation's users " "beyond what the individual works permit. Inclusion of a covered work " "in an aggregate does not cause this License to apply to the other " "parts of the aggregate.

" "

6. Conveying Non-Source Forms.

" "

You may convey a covered work in object code form under the terms " "of sections 4 and 5, provided that you also convey the " "machine-readable Corresponding Source under the terms of this License, " "in one of these ways:

" "
    " "
  • a) Convey the object code in, or embodied in, a physical product " "(including a physical distribution medium), accompanied by the " "Corresponding Source fixed on a durable physical medium " "customarily used for software interchange.
  • " "
  • b) Convey the object code in, or embodied in, a physical product " "(including a physical distribution medium), accompanied by a " "written offer, valid for at least three years and valid for as " "long as you offer spare parts or customer support for that product " "model, to give anyone who possesses the object code either (1) a " "copy of the Corresponding Source for all the software in the " "product that is covered by this License, on a durable physical " "medium customarily used for software interchange, for a price no " "more than your reasonable cost of physically performing this " "conveying of source, or (2) access to copy the " "Corresponding Source from a network server at no charge.
  • " "
  • c) Convey individual copies of the object code with a copy of the " "written offer to provide the Corresponding Source. This " "alternative is allowed only occasionally and noncommercially, and " "only if you received the object code with such an offer, in accord " "with subsection 6b.
  • " "
  • d) Convey the object code by offering access from a designated " "place (gratis or for a charge), and offer equivalent access to the " "Corresponding Source in the same way through the same place at no " "further charge. You need not require recipients to copy the " "Corresponding Source along with the object code. If the place to " "copy the object code is a network server, the Corresponding Source " "may be on a different server (operated by you or a third party) " "that supports equivalent copying facilities, provided you maintain " "clear directions next to the object code saying where to find the " "Corresponding Source. Regardless of what server hosts the " "Corresponding Source, you remain obligated to ensure that it is " "available for as long as needed to satisfy these requirements.
  • " "
  • e) Convey the object code using peer-to-peer transmission, provided " "you inform other peers where the object code and Corresponding " "Source of the work are being offered to the general public at no " "charge under subsection 6d.
  • " "
" "

A separable portion of the object code, whose source code is excluded " "from the Corresponding Source as a System Library, need not be " "included in conveying the object code work.

" "

A User Product is either (1) a consumer product, which means any " "tangible personal property which is normally used for personal, family, " "or household purposes, or (2) anything designed or sold for incorporation " "into a dwelling. In determining whether a product is a consumer product, " "doubtful cases shall be resolved in favor of coverage. For a particular " "product received by a particular user, normally used refers to a " "typical or common use of that class of product, regardless of the status " "of the particular user or of the way in which the particular user " "actually uses, or expects or is expected to use, the product. A product " "is a consumer product regardless of whether the product has substantial " "commercial, industrial or non-consumer uses, unless such uses represent " "the only significant mode of use of the product.

" "

Installation Information for a User Product means any methods, " "procedures, authorization keys, or other information required to install " "and execute modified versions of a covered work in that User Product from " "a modified version of its Corresponding Source. The information must " "suffice to ensure that the continued functioning of the modified object " "code is in no case prevented or interfered with solely because " "modification has been made.

" "

If you convey an object code work under this section in, or with, or " "specifically for use in, a User Product, and the conveying occurs as " "part of a transaction in which the right of possession and use of the " "User Product is transferred to the recipient in perpetuity or for a " "fixed term (regardless of how the transaction is characterized), the " "Corresponding Source conveyed under this section must be accompanied " "by the Installation Information. But this requirement does not apply " "if neither you nor any third party retains the ability to install " "modified object code on the User Product (for example, the work has " "been installed in ROM).

" "

The requirement to provide Installation Information does not include a " "requirement to continue to provide support service, warranty, or updates " "for a work that has been modified or installed by the recipient, or for " "the User Product in which it has been modified or installed. Access to a " "network may be denied when the modification itself materially and " "adversely affects the operation of the network or violates the rules and " "protocols for communication across the network.

" "

Corresponding Source conveyed, and Installation Information provided, " "in accord with this section must be in a format that is publicly " "documented (and with an implementation available to the public in " "source code form), and must require no special password or key for " "unpacking, reading or copying.

" "

7. Additional Terms.

" "

Additional permissions are terms that supplement the terms of this " "License by making exceptions from one or more of its conditions. " "Additional permissions that are applicable to the entire Program shall " "be treated as though they were included in this License, to the extent " "that they are valid under applicable law. If additional permissions " "apply only to part of the Program, that part may be used separately " "under those permissions, but the entire Program remains governed by " "this License without regard to the additional permissions.

" "

When you convey a copy of a covered work, you may at your option " "remove any additional permissions from that copy, or from any part of " "it. (Additional permissions may be written to require their own " "removal in certain cases when you modify the work.) You may place " "additional permissions on material, added by you to a covered work, " "for which you have or can give appropriate copyright permission.

" "

Notwithstanding any other provision of this License, for material you " "add to a covered work, you may (if authorized by the copyright holders of " "that material) supplement the terms of this License with terms:

" "
    " "
  • a) Disclaiming warranty or limiting liability differently from the " " terms of sections 15 and 16 of this License; or
  • " "
  • b) Requiring preservation of specified reasonable legal notices or " "author attributions in that material or in the Appropriate Legal " "Notices displayed by works containing it; or
  • " "
  • c) Prohibiting misrepresentation of the origin of that material, or " "requiring that modified versions of such material be marked in " "reasonable ways as different from the original version; or
  • " "
  • d) Limiting the use for publicity purposes of names of licensors or " "authors of the material; or
  • " "
  • e) Declining to grant rights under trademark law for use of some " "trade names, trademarks, or service marks; or
  • " "
  • f) Requiring indemnification of licensors and authors of that " "material by anyone who conveys the material (or modified versions of " "it) with contractual assumptions of liability to the recipient, for " "any liability that these contractual assumptions directly impose on " "those licensors and authors.
  • " "
" "

All other non-permissive additional terms are considered further " "restrictions within the meaning of section 10. If the Program as you " "received it, or any part of it, contains a notice stating that it is " "governed by this License along with a term that is a further " "restriction, you may remove that term. If a license document contains " "a further restriction but permits relicensing or conveying under this " "License, you may add to a covered work material governed by the terms " "of that license document, provided that the further restriction does " "not survive such relicensing or conveying.

" "

If you add terms to a covered work in accord with this section, you " "must place, in the relevant source files, a statement of the " "additional terms that apply to those files, or a notice indicating " "where to find the applicable terms.

" "

Additional terms, permissive or non-permissive, may be stated in the " "form of a separately written license, or stated as exceptions; " "the above requirements apply either way.

" "

8. Termination.

" "

You may not propagate or modify a covered work except as expressly " "provided under this License. Any attempt otherwise to propagate or " "modify it is void, and will automatically terminate your rights under " "this License (including any patent licenses granted under the third " "paragraph of section 11).

" "

However, if you cease all violation of this License, then your " "license from a particular copyright holder is reinstated (a) " "provisionally, unless and until the copyright holder explicitly and " "finally terminates your license, and (b) permanently, if the copyright " "holder fails to notify you of the violation by some reasonable means " "prior to 60 days after the cessation.

" "

Moreover, your license from a particular copyright holder is " "reinstated permanently if the copyright holder notifies you of the " "violation by some reasonable means, this is the first time you have " "received notice of violation of this License (for any work) from that " "copyright holder, and you cure the violation prior to 30 days after " "your receipt of the notice.

" "

Termination of your rights under this section does not terminate the " "licenses of parties who have received copies or rights from you under " "this License. If your rights have been terminated and not permanently " "reinstated, you do not qualify to receive new licenses for the same " "material under section 10.

" "

9. Acceptance Not Required for Having Copies.

" "

You are not required to accept this License in order to receive or " "run a copy of the Program. Ancillary propagation of a covered work " "occurring solely as a consequence of using peer-to-peer transmission " "to receive a copy likewise does not require acceptance. However, " "nothing other than this License grants you permission to propagate or " "modify any covered work. These actions infringe copyright if you do " "not accept this License. Therefore, by modifying or propagating a " "covered work, you indicate your acceptance of this License to do so.

" "

10. Automatic Licensing of Downstream Recipients.

" "

Each time you convey a covered work, the recipient automatically " "receives a license from the original licensors, to run, modify and " "propagate that work, subject to this License. You are not responsible " "for enforcing compliance by third parties with this License.

" "

An entity transaction is a transaction transferring control of an " "organization, or substantially all assets of one, or subdividing an " "organization, or merging organizations. If propagation of a covered " "work results from an entity transaction, each party to that " "transaction who receives a copy of the work also receives whatever " "licenses to the work the party's predecessor in interest had or could " "give under the previous paragraph, plus a right to possession of the " "Corresponding Source of the work from the predecessor in interest, if " "the predecessor has it or can get it with reasonable efforts.

" "

You may not impose any further restrictions on the exercise of the " "rights granted or affirmed under this License. For example, you may" "not impose a license fee, royalty, or other charge for exercise of " "rights granted under this License, and you may not initiate litigation " "(including a cross-claim or counterclaim in a lawsuit) alleging that " "any patent claim is infringed by making, using, selling, offering for " "sale, or importing the Program or any portion of it.

" "

11. Patents.

" "

A contributor is a copyright holder who authorizes use under this " "License of the Program or a work on which the Program is based. The " "work thus licensed is called the contributor's contributor version.

" "

A contributor's essential patent claims are all patent claims " "owned or controlled by the contributor, whether already acquired or " "hereafter acquired, that would be infringed by some manner, permitted " "by this License, of making, using, or selling its contributor version, " "but do not include claims that would be infringed only as a " "consequence of further modification of the contributor version. For " "purposes of this definition, control includes the right to grant " "patent sublicenses in a manner consistent with the requirements of " "this License.

" "

Each contributor grants you a non-exclusive, worldwide, royalty-free " "patent license under the contributor's essential patent claims, to " "make, use, sell, offer for sale, import and otherwise run, modify and " "propagate the contents of its contributor version.

" "

In the following three paragraphs, a patent license is any express " "agreement or commitment, however denominated, not to enforce a patent " "(such as an express permission to practice a patent or covenant not to " "sue for patent infringement). To grant such a patent license to a " "party means to make such an agreement or commitment not to enforce a " "patent against the party.

" "

If you convey a covered work, knowingly relying on a patent license, " "and the Corresponding Source of the work is not available for anyone " "to copy, free of charge and under the terms of this License, through a " "publicly available network server or other readily accessible means, " "then you must either (1) cause the Corresponding Source to be so " "available, or (2) arrange to deprive yourself of the benefit of the " "patent license for this particular work, or (3) arrange, in a manner " "consistent with the requirements of this License, to extend the patent " "license to downstream recipients. Knowingly relying means you have " "actual knowledge that, but for the patent license, your conveying the " "covered work in a country, or your recipient's use of the covered work " "in a country, would infringe one or more identifiable patents in that " "country that you have reason to believe are valid.

" "

If, pursuant to or in connection with a single transaction or " "arrangement, you convey, or propagate by procuring conveyance of, a " "covered work, and grant a patent license to some of the parties " "receiving the covered work authorizing them to use, propagate, modify " "or convey a specific copy of the covered work, then the patent license " "you grant is automatically extended to all recipients of the covered " "work and works based on it.

" "

A patent license is discriminatory if it does not include within " "the scope of its coverage, prohibits the exercise of, or is " "conditioned on the non-exercise of one or more of the rights that are " "specifically granted under this License. You may not convey a covered " "work if you are a party to an arrangement with a third party that is " "in the business of distributing software, under which you make payment " "to the third party based on the extent of your activity of conveying " "the work, and under which the third party grants, to any of the " "parties who would receive the covered work from you, a discriminatory " "patent license (a) in connection with copies of the covered work " "conveyed by you (or copies made from those copies), or (b) primarily " "for and in connection with specific products or compilations that " "contain the covered work, unless you entered into that arrangement, " "or that patent license was granted, prior to 28 March 2007.

" "

Nothing in this License shall be construed as excluding or limiting " "any implied license or other defenses to infringement that may " "otherwise be available to you under applicable patent law.

" "

12. No Surrender of Others' Freedom.

" "

If conditions are imposed on you (whether by court order, agreement or " "otherwise) that contradict the conditions of this License, they do not " "excuse you from the conditions of this License. If you cannot convey a " "covered work so as to satisfy simultaneously your obligations under this " "License and any other pertinent obligations, then as a consequence you may " "not convey it at all. For example, if you agree to terms that obligate you " "to collect a royalty for further conveying from those to whom you convey " "the Program, the only way you could satisfy both those terms and this " "License would be to refrain entirely from conveying the Program.

" "

13. Use with the GNU Affero General Public License.

" "

Notwithstanding any other provision of this License, you have " "permission to link or combine any covered work with a work licensed " "under version 3 of the GNU Affero General Public License into a single " "combined work, and to convey the resulting work. The terms of this " "License will continue to apply to the part which is the covered work, " "but the special requirements of the GNU Affero General Public License, " "section 13, concerning interaction through a network will apply to the " "combination as such.

" "

14. Revised Versions of this License.

" "

The Free Software Foundation may publish revised and/or new versions of " "the GNU General Public License from time to time. Such new versions will " "be similar in spirit to the present version, but may differ in detail to " "address new problems or concerns.

" "

Each version is given a distinguishing version number. If the " "Program specifies that a certain numbered version of the GNU General " "Public License or any later version applies to it, you have the " "option of following the terms and conditions either of that numbered " "version or of any later version published by the Free Software " "Foundation. If the Program does not specify a version number of the " "GNU General Public License, you may choose any version ever published " "by the Free Software Foundation.

" "

If the Program specifies that a proxy can decide which future " "versions of the GNU General Public License can be used, that proxy's " "public statement of acceptance of a version permanently authorizes you " "to choose that version for the Program.

" "

Later license versions may give you additional or different " "permissions. However, no additional obligations are imposed on any" "author or copyright holder as a result of your choosing to follow a " "later version.

" "

15. Disclaimer of Warranty.

" "

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY " "APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT " "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY " "OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, " "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR " "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM " "IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF " "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

" "

16. Limitation of Liability.

" "

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING " "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS " "THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY " "GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE " "USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF " "DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD " "PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), " "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF " "SUCH DAMAGES.

" "

17. Interpretation of Sections 15 and 16.

" "

If the disclaimer of warranty and limitation of liability provided " "above cannot be given local legal effect according to their terms, " "reviewing courts shall apply local law that most closely approximates " "an absolute waiver of all civil liability in connection with the " "Program, unless a warranty or assumption of liability accompanies a " "copy of the Program in return for a fee.

" "

END OF TERMS AND CONDITIONS

" ""; licenseBrowser->setHtml(gplLic); aceptLicCheckBox = new QCheckBox(tr("Acknowledge")); aceptLicCheckBox->setToolTip(tr("Be aware that KLog is free software.")); registerField("licAgreement*", aceptLicCheckBox); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(licenseBrowser); layout->addWidget(aceptLicCheckBox); setLayout(layout); } int LicPage::nextId() const { return StartWizard::Page_CTY; //return StartWizard::Page_Mem; } /* void LicPage::setNextButtonActive(const bool _active) { } FileOrMemoryPage::FileOrMemoryPage(QWidget *parent) : QWizardPage(parent) { runInMemory = false; setTitle(tr("File or Memory")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Please select whether you prefer to run the DB in memory or in a file:" "
    " "
  • Running KLog in memory will be much faster, specially when managing several thousands of QSOs.
  • " "
  • Running KLog in a file will be much secure and you will not be forced to save the file before exiting or opening the logfile when starting KLog.
  • " "
" "Please know that in this version this feature is still not fully-implemented so KLog will run in file.")); topLabel->setWordWrap(true); memoryQCheckbox = new QCheckBox(tr("Run KLog DB in &memory")); fileQCheckbox = new QCheckBox(tr("Run KLog DB in a &file")); //memoryQCheckbox->setChecked(true); memoryQCheckbox->setChecked(false); fileQCheckbox->setChecked(true); memoryQCheckbox->setToolTip(tr("Recommended for day-to-day logging")); fileQCheckbox->setToolTip(tr("Recommended for contest logging")); connect( memoryQCheckbox, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedMemory(bool))); connect( fileQCheckbox, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedFile(bool))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(memoryQCheckbox); layout->addWidget(fileQCheckbox); setLayout(layout); } void FileOrMemoryPage::slotRunningModeSelectedFile(bool checked) { if (checked) { exeInMemory(false); } } void FileOrMemoryPage::slotRunningModeSelectedMemory(bool checked) { if (checked) { exeInMemory(true); } } int FileOrMemoryPage::nextId() const { return StartWizard::Page_CTY; } */ CTYPage::CTYPage(const QString &_klogDir, const QString &_version, QWidget *parent) : QWizardPage(parent) { //completed = false; dl = new DownLoadCTY(_klogDir, _version); connect(dl, SIGNAL(actionReturnDownload(int)), this, SLOT(slotDownloadFinished(int))); connect(dl, SIGNAL(actionShowProgres(qint64,qint64)), this, SLOT(slotUpdateDownloadProgress(qint64,qint64))); connect(dl, SIGNAL(actionError(int)), this, SLOT(slotDownloadError(int))); connect(dl, SIGNAL(downloadStopped()), this, SLOT(slotStopProgressBar())); setTitle(tr("Country data download")); topLabel = new QLabel(tr("KLog needs country data...")); topLabel->setWordWrap(true); progressBar = new QProgressBar; progressBar->setEnabled(false); downloadButton = new QPushButton(tr("&Download")); ignoreDownloadButton = new QPushButton(tr("&Ignore")); // downloadButton.setText(tr("Download")); connect(downloadButton, SIGNAL(clicked()), this, SLOT(slotDownloadButtonClicked() ) ); connect(ignoreDownloadButton, SIGNAL(clicked()), this, SLOT(slotIgnoreDownloadButtonClicked() ) ); hiddenCheckBox = new QCheckBox(); registerField("downloadSelection*", hiddenCheckBox); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(progressBar); buttonLayout->addWidget(downloadButton); buttonLayout->addWidget(ignoreDownloadButton); ctyBrowser = new QTextEdit; ctyBrowser->setReadOnly(true); QString st = tr("Country data needed"); QString gplLic = ""; gplLic = gplLic+st+"

"; st = tr("KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information."); gplLic = gplLic + st + "

"; st = tr("You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do."); gplLic = gplLic + st + "

"; st = tr("Click on Download to download now."); gplLic = gplLic+st+"

"; ctyBrowser->setHtml(gplLic); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ctyBrowser); layout->addLayout(buttonLayout); setLayout(layout); } void CTYPage::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "CTYPage::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total) << QT_ENDL; progressBar->setValue(received); } void CTYPage::slotDownloadButtonClicked() { //qDebug() << "CTYPage::slotDownloadButtonClicked" << QT_ENDL; progressBar->setEnabled(true); progressBar->reset(); progressBar->setRange(0, 0); dl->download(); //completed = true; } void CTYPage::slotIgnoreDownloadButtonClicked() { //qDebug() << "CTYPage::slotIgnoreDownloadButtonClicked" << QT_ENDL; //ignoreDownloadButton->setChecked(true); slotStopProgressBar(); hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); //completed = true; } void CTYPage::slotDownloadFinished(const int ret) { //qDebug() << "CTYPage::slotDownloadFinished: " << QString::number(ret) << QT_ENDL; slotStopProgressBar(); if (ret == QNetworkReply::NoError) // No error { hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); //progressBar->setValue(progressBar->maximum()); //hiddenCheckBox->setChecked(true); //qDebug() << "CTYPage::slotDownloadFinished: (no error): " << QString::number(ret) << QT_ENDL; } else if (ret == -1) // File could not be created! { //qDebug() << "CTYPage::slotDownloadFinished: (file could not be created): " << QString::number(ret) << QT_ENDL; } else { //qDebug() << "CTYPage::slotDownloadFinished: (another result): " << QString::number(ret) << QT_ENDL; } } void CTYPage::slotDownloadError(const int ret) { //qDebug() << "CTYPage::slotDownloadError: " << QString::number(ret) << QT_ENDL; int errorCode = ret; int i; slotStopProgressBar(); progressBar->setEnabled(false); if(errorCode == QNetworkReply::NoError) { } else if(errorCode == QNetworkReply::HostNotFoundError) { i = QMessageBox::warning(this, tr("KLog"), tr("I can't find the host. Please check your network and try again\n" "Do you want to try again?"), QMessageBox::Retry | QMessageBox::Ignore); if (i == QMessageBox::Retry) { slotDownloadButtonClicked(); } else { slotDownloadFinished(-1); } } else { //TODO: Add a message showing the error that has occur. errorString()? } } void CTYPage::slotStopProgressBar() { //qDebug() << "CTYPage::slotStopProgressBar" << QT_ENDL; progressBar->reset(); progressBar->setRange(0,1); progressBar->setValue(1); } klog-1.8.6/qso.h0000644000175000017500000002155614166020407012426 0ustar develdevel#ifndef QSO_H #define QSO_H /*************************************************************************** qso.h - description ------------------- begin : may 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "utilities.h" class QSO : public QObject { Q_OBJECT public: QSO(); ~QSO(); void setBackup(const bool _rt); bool getBackup(); void setModifying(const bool _mod); bool getModifying(); bool setData(const QString &_adifPair); void clear(); bool isValid(); void setLoTWUpdating(bool _lotw); bool setCall(const QString &_c); QString getCall(); bool setBand(const QString &_c); QString getBand(); bool setMode(const QString &_c); QString getMode(); bool setDate(const QDate &_c); QDate getDate(); bool setTimeOn(const QTime &_c); QTime getTimeOn(); QDateTime getDateTimeOn(); bool setDateTimeOn(const QDateTime &_c); void setRealTime(const bool _rt); bool getRealTime(); bool setQSOid(const int _i); int getQSOid(); bool setLogId(const int _i); int getLogId(); bool setBandRX(const QString &_c); QString getBandRX(); bool setRSTTX(const QString &_c); QString getRSTTX(); bool setRSTRX(const QString &_c); QString getRSTRX(); double setFreqTX(const double _f); bool setFreqRX(const double _f); double getFreqTX(); double getFreqRX(); bool setQTH(const QString &_c); QString getQTH(); bool setGridSquare(const QString &_c); QString getGridSquare(); bool setName(const QString &_c); QString getName(); bool setRXPwr(const double _f); double getRXPwr(); // QSL TAB bool setQSL_SENT(const QString &_c); QString getQSL_SENT(); bool setQSLSDate(const QDate &_c); QDate getQSLSDate(); bool setQSLSenVia(const QString &_qs); QString getSentVia(); bool setQSL_RCVD(const QString &_c); QString getQSL_RCVD(); bool setQSLRDate(const QDate &_c); QDate getQSLRDate(); bool setQSLRecVia(const QString &_qs); QString getRecVia(); bool setQSLVia(const QString &_qs); QString getQSLVia(); bool setQSLMsg(const QString &_qs); QString getQSLMsg(); // eQSL tab bool setClubLogStatus(const QString &_c); QString getClubLogStatus(); bool setClubLogDate(const QDate &_c); QDate getClubLogDate(); bool setEQSLQSL_RCVD(const QString &_c); QString getEQSLQSL_RCVD(); bool setEQSLQSL_SENT(const QString &_c); QString getEQSLQSL_SENT(); bool setEQSLQSLRDate(const QDate &_c); QDate getEQSLQSLRDate(); bool setEQSLQSLSDate(const QDate &_c); QDate getEQSLQSLSDate(); bool setLoTWQSL_RCVD(const QString &_c); QString getLoTWQSL_RCVD(); bool setLoTWQSL_SENT(const QString &_c); QString getLoTWQSL_SENT(); bool setLoTWQSLRDate(const QDate &_c); QDate getLoTWQSLRDate(); bool setLoTWQSLSDate(const QDate &_c); QDate getLoTWQSLSDate(); bool setQRZCOMStatus(const QString &_c); QString getQRZCOMStatus(); bool setQRZCOMDate(const QDate &_c); QDate getQRZCOMDate(); // Comment Tab bool setComment(const QString &_c); QString getComment(); bool setKeepComment(bool _k); bool getKeepComment(); // Others Tab bool setDXCC(const int _i); int getDXCC(); bool setPropMode(const QString &_c); QString getPropMode(); bool setSOTA_REF(const QString &_c); QString getSOTA_REF(); double setAge(const double _c); double getAge(); bool setIOTA(const QString &_c); QString getIOTA(); bool setKeepOthers(bool _k); bool getKeepOthers(); bool setVUCCGrids(const QString &_c); QString getVUCCGrids(); // My data Tab bool setTXPwr(const double _f); double getTXPwr(); bool setOperatorCallsign(const QString &_c); QString getOperatorCallsign(); bool setStationCallsign(const QString &_c); QString getStationCallsign(); bool setMyGridSquare(const QString &_c); QString getMyGridSquare(); bool setKeepMyData(bool _k); bool getKeepMyData(); bool setMySOTA_REF(const QString &_c); QString getMySOTA_REF(); bool setMyRig(const QString &_c); QString getMyRig(); bool setMyAntenna(const QString &_c); QString getMyAntenna(); bool setMyVUCCGrids(const QString &_c); QString getMyVUCCGrids(); // Satellite Tab bool setSatName(const QString &_c); QString getSatName(); bool setSatMode(const QString &_c); QString getSatMode(); bool setKeepSatTab(bool _k); bool getKeepSatTab(); bool add(); private: QString satName, satMode, callsign, stationCallsign, operatorCall, propMode, band, mode, gridsquare, myGridsquare, qth, name, RST_tx, RST_rx; int qsoId, logId, dxcc; QString qsl_rcvd, qsl_sent, qslSenVia, qslRecVia, qslVia, qslMsg; QDate QSLRDate, QSLSDate, QSLLoTWRDate, QSLLoTWSDate; QDateTime qso_dateTime; double freq_tx, freq_rx, pwr_rx, pwr_tx, age; QString lotw_qsl_sent, lotw_qsl_rcvd, sota_ref, my_sota_ref, my_rig, my_antenna, vucc_grids, my_vucc_grids; QString clublog_status; QDate clublogDate; QString eqsl_qsl_sent, eqsl_qsl_rcvd; QDate eQSLRDate, eQSLSDate; QString QRZCom_status; QDate QRZComDate; QString comment; bool keepComment, keepOther, keepMyData, keepSat, modifying; QString iota; Utilities *util; bool lotwUpdating, realTime; bool backup; // DataProxy_SQLite *dataProxy; /* ADDRESS, ADDRESS_INTL, AGE, A_INDEX, ANT_AZ, ANT_EL, ANT_PATH, ARRL_SECT, AWARD_GRANTED, AWARD_SUBMITTED, BAND, BAND_RX, CALL, CHECK, CLASS, CLUBLOG_QSO_UPLOAD_DATE, CLUBLOG_QSO_UPLOAD_STATUS, CNTY, COMMENT, COMMENT_INTL, CONT, CONTACTED_OP, CONTEST_ID, COUNTRY, COUNTRY_INTL, CQZ, CREDIT_SUBMITTED, CREDIT_GRANTED, DARC_DOK, DISTANCE, DXCC, EMAIL, EQ_CALL, EQSL_QSLRDATE, EQSL_QSLSDATE, EQSL_QSL_RCVD, EQSL_QSL_SENT, FISTS, FISTS_CC, FORCE_INIT, FREQ, FREQ_RX, GRIDSQUARE, GUEST_OP, HRDLOG_QSO_UPLOAD_DATE, HRDLOG_QSO_UPLOAD_STATUS, IOTA, IOTA_ISLAND_ID, ITUZ, K_INDEX, LAT, LON, LOTW_QSLRDATE, LOTW_QSLSDATE, LOTW_QSL_RCVD, LOTW_QSL_SENT, MAX_BURSTS, MODE, MS_SHOWER, MY_ANTENNA, MY_ANTENNA_INTL, MY_CITY, MY_CITY_INTL, MY_CNTY, MY_COUNTRY, MY_COUNTRY_INTL, MY_CQ_ZONE, MY_DXCC, MY_FISTS, MY_GRIDSQUARE, MY_IOTA, MY_IOTA_ISLAND_ID, MY_ITU_ZONE, MY_LAT, MY_LON, MY_NAME, MY_NAME_INTL, MY_POSTAL_CODE, MY_POSTAL_CODE_INTL, MY_RIG, MY_RIG_INTL, MY_SIG, MY_SIG_INTL, MY_SIG_INFO, MY_SIG_INFO_INTL, MY_SOTA_REF, MY_STATE, MY_STREET, MY_STREET_INTL, MY_USACA_COUNTIES, MY_VUCC_GRIDS, NAME, NAME_INTL, NOTES, NOTES_INTL, NR_BURSTS, NR_PINGS, OPERATOR, OWNER_CALLSIGN, PFX, PRECEDENCE, PROP_MODE, PUBLIC_KEY, QRZCOM_QSO_UPLOAD_DATE, QRZCOM_QSO_UPLOAD_STATUS, QSLMSG, QSLMSG_INTL, QSLRDATE, QSLSDATE, QSL_RCVD, QSL_RCVD_VIA, QSL_SENT, QSL_SENT_VIA, QSL_VIA, QSO_COMPLETE, QSO_DATE, QSO_DATE_OFF, QSO_RANDOM, QTH, QTH_INTL, REGION, RIG, RIG_INTL, RST_RCVD, RST_SENT, RX_PWR, SAT_MODE, SAT_NAME, SFI, SIG, SIG_INTL, SIG_INFO, SIG_INFO_INTL, SILENT_KEY, SKCC, SOTA_REF, SRX, SRX_STRING, STATE, STATION_CALLSIGN, STX, STX_STRING, SUBMODE, SWL, TEN_TEN, TIME_OFF, TIME_ON, TX_PWR, UKSMG, USACA_COUNTIES, VE_PROV, VUCC_GRIDS, WEB */ }; #endif // QSO_H klog-1.8.6/AUTHORS0000644000175000017500000000114114166020407012507 0ustar develdevelJaime Robles, EA4K - (2002-today) Juan Carlos Reig, EA5WA - (2021-today) Ladislav Foldyna, OK1MLG - (2021-today) Akihiro Koda, JL3OXR - (2016, 2020) Andrew Goldie, ZL2ACG - (2009-2010) Translators: Catalan - Josep Ma Ferrer, Catalan KDE Translation team (before Luis, EA3NM - 2016) Croatian - Kristijan - M0NKC Danish - Joe Hansen (debian-l10n-danish@list.debian.org) German - Burkhard Lück (lueck@hube-lueck.de) Finnish - Kristjan Lorents (debian-i18n@lists.debian.org) French - Christophe, F4HWL Italian - Simona - IU5HIU Japanese - Aki, JL3OXR Polish - Piotr, LA7RRA Spanish - Jaime, EA4K klog-1.8.6/global.h0000644000175000017500000000011014166020407013043 0ustar develdevel#ifndef GLOBAL_H #define GLOBAL_H extern bool g_callsignCheck; #endif klog-1.8.6/klog.icns0000644000175000017500000244751614166020407013277 0ustar develdevelicns ONic127PNG  IHDR@@iqiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4VIDATxZtUֿ3̤@z' )J/ b$n(0" PDIJ""JYEEi҂ĄZH HL2I2a2qy!z))%466@_}CIsSn Y.)`]Gl233Im EXkKKܬ[WWGMMMBzR*Q!:hk;gO#@ppdqbxA{[[XyEʑJKKz2PNHJcZj-isW/|ZڙvahCx`` хXX@ЮɨKX[׻$3GՂKUU \q,UꋵĚŸ?`i6Zm"NIZ~w\\_2ߟ ʨ>9nAmJo+!I fV}_CD]怾]TCڈ?VmMqSq{C fegOY۫ ?ZpȒ%2c{Mсwٳ;okK652"=;[t=H(ӧC"7ӛZ}<eߜI{QK^U^Zo/ En„WB-{w7p& j*.!GPqr+IL+6LW4hH,/rΜs۶}7|p̐Vfeeۺ˸uo]Mk9`9cw#ȩ: .4a&J\fLgtԆ0WSUܜoޠԷ! $ I*kkə$#L& %+ҿ_.BrWvӁ>>>qFFF/_Y^^KdTk@bkk+##5k֜B;|5:޳ 9ydMJbby< #Pߓ# B#uұ0'#K:E]Z[Ѐ,:کCD%8@}}}7D'OցKjMLLOgs'* w/ׯ&Ο6m 2돗|ʕ.G+/xܧL giAAeXT\_|Aٳٙ֞=T ~f! $ڛ7I_?eB}m;ydOڵ:;w̵sk/+/KZܼr>Bv_z Vb]QVV6*E5kKo[vuo#1)ԯ4r bM8r$THP60e y YCX{xЭsgёI zVV'1!k/\$yќt͜3b/("]E.w2<~pWLytԫnuڪVE :QC='BICARY @&Qw~dž:0טCDuR׽Ml_`r1 k\W/ʊ0'ˋL==%]HcƎљ]|261n8tbf>'';C}7ӥH\}Y_ӻeT} sxĪa˕ yu `GeJ|qU=9-Yy2C\O8KHH8AM -[6 s߻r@RҙK~~~<`/ιvm󤉃 !' ɉ .|,X@z8-h7"I!ncOv2rl,*&3p[ b1Gdk,ŦMҲ{{$[|;S {B ;mDkvM윹`sq仡jaLXr%YP6,4ĈktɥKر6.zf̘AtꫯØw\l\;;{ߙ3gVZ`fFƵ*?ߴ~e D˖-[m32KKsT4콇._nyU9/*=8fl*LsTr ˸qX}YJxT!.s߿NVO?)VVUkgkW2qtܹs;6(wjmZ PZRRWY^u';nذaܔ)SH%I$8| dl×.|F>]>Ou ]J&0s0y"GQ.)Ѷѓ0/&CCQm NMJ ߛPpd$ڵkG߾}IANKPִV%à2/<+%~g?}jC9%0#{{ !I! q#CS 6)\[^6ϟOQQTH{i-9m;SMihd,Qըo-QAVJ0dKHY>;4fHhOmA>qbx@ӎ>-M<-Xncʕ͛i>KoaׯH8S 8\GΥHrX ?Cw!咥,*fz;u5u{@$i7$NSA֖'T#"{  ׯ 1d_*֨oiIJaa%&Jѣd|Cz-O_  = գ0q4k1ڌUgee,"Qz_Pԡ%bp '+EqI/̴!?O]?lƎJYY&Ze:XpûwSLN BudsRwD~y-F.(E@۬0;G;N7 @~Uvq*a#Th[E/+^yx*-+f%&#logw.Lbxbchx`38̞5vlFݼN)c#ĴAn-!쮫s"0M 3r\rzgvF(,e%KE8fmPzx .2@&e, 6nÇ&OLem% : %yg6 M@{Y6Pa2=Jzi9uIR]ڿc5- |4~+V_U-\۽!ojnŒw.Hq)ߑm" ܠ}LNL(DMf ;SV9m)9i'=;[JÆxSMKE>6)naD<'NlHu.E@Rla7!+7mcaaU"N}Zz ,jް*P,1qq9єHnN:t9ҙ4O 7B?eIGž4~RՀ-x Md =[xQN^_ЃX_ɑؚڵZwWwfD*F\#GG /ʼ6ס%O]F1N?]8OcP5xfM6K{A3?•ְXOӃi>y^3] ؊ UUO9H?$/)͈0"ss+:*jN󾭤' _O rCB$/o'O:|NFv>ۨdtAw_n\ἱ%a"6pVHu`LMC#'/ Ȭf1b7BB`=fzIfTU+{|`7DvZT=XOBꁳ{ ЀQv:"qG>7r\E!r{@ "TϾZMaiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4?IDATx]x>Wz @EP@XbC,ٰ(&]z=Z n6lnMnlɶٙ3^+X{=`kX{=`kX{y_spp߿xpppm`QQ_~Ag~~[Qa]aaaiqqqAIIIga\ffÇ8 *TpJ6}k߾}G[ve16A ]}1p9XPXhCjj}3fO?յ]h@s]09RFmqII18ZZZo#;?܉rs5.`ߒNLKsIY 666{{RH hĂ/4(rJhӦM@=Ga`Fمqsŋ̙3rA5.l m*СCH-999݇YF Y,gϞ g?GAm+oʿ0nacPܲj䔿?thߊZжm^o@^|Y`BhQF)gHpP'N7b\tk5 Q_kUUI7z}<&e"xw?РmEA<DD0 :<#I|-'d] $BwjYz)폁tIkP Yh2p3齣C?glq[_` h{uGj^F}wQ5jC}<]O2n$p:[/8a-uԝGѨFQ0Ie.^_荡xxICǼl&k2(A^< L F*}uwzhX8zL_kCtX4ºV5&F|GM4fz9Kk LHnj|T~i/VTݤJ,⵻}S~f"{yD%Q3ZM85}l,|_> thadgfO5y>|l)H t&x|4;~BիWڣGGr-;~Z]ܤͷޒ-^ӻϵ8FYPYP6Es梳W)Omc0u.Y}+ro$'x;|:kHUc6(P|P\pE6{qYfπ^A$R; > j;q$v h" 5zMn+"u:rːs[o0Jæ͛gW&fK:m/|R<7;+ 0_77@=vMA ?Rn!{KPsMaa`(+Vø +VWWpp1 tɾ Ɏپm;`j+2+.]vm?U4\4Ǐ**2F ׳}Q񍋫V^aկ8|7@ 0:RO%AW`=m-RRX A]\9 |ٸYf:L3ݺu-.--`p-gL0 "ټyږ-[6Iê=Cݳ#П@=yw)2~h%~0} 6)fq.-I}";vʩſ]Ӽ#K׉-#})2+WɥC ~7;DG>qR:uCrb>X ^4P:Tj,ba]:ae޽{߁~,Xn1P{-g^۱C/^n݈[UH&[ى`;=o -5kmJ)%uA)2-k .'aB6@!_\3 i@C{|0hdA /1w|ĉsXΞ۪UIm]lmml۶}aT /o}>0 G~/jbp'}}]ӂ2N־1S_Ff Zw\b89J=Rx]T22$r`or9`)h~@bR$>͚ +iSD@`m^DGG": A<bp0 N˗oIHHE:k s ^[38@WL)//q{c`R)8nw)=^KmݪdD_nWLM> >^u\p\m90NB$ P%_B{&{QP)!A=m xޯuxY|%,X ;v쨇s;C~ +"X"8C_kstG|˳ݪU栌%"UWUݫETtn3:uϾSp'#֡hdg%@{/.p͓Әr]ūEsIWƮrj"}` 9îV2NۺL?X)Aaϼ~`qɀ"%VŤ$`wJJJSqcq=1]t \BFC1@g u[{M{j[nݻ<</Ʒj U40,uǎ۟z Ly3@=$M1O?_֍{VX.V} Ċr\䠁{;* ՙ<5}XVE[0s49rf C,"Q$pLB?qNOVeB(ˍGx{owHGGbY,,. 7//ku̳ƿ֤IS^HIℍZvwx^Yi߁|ZC~vl:ΥFK)po|";%'g:-G0$z+sb{^c A)X49A!/]*OC?/$ {ٯcɾtQN'4?VDM| ĕ m'` 6z>|tffJl_={nArx‚"[www{װaJNOotú@رcgDFD|uvrr‚BY[WGJ<̀ _!,`p;>xҬ2þQN|[g.ACE"]^~Yڎ}\ꃽ~>2o ^f4Ҁ?%AăA?( C5t"M?XJՃ~`Fsמ]tD< Yr2$#1ω1̜JШQFmbb%u9[vl!]][ܜS'Lk6&  76:fx@ȼR/.[!C\lڴiMAϐfP̹bg>,{iFQD/_cXFn$cy'OJd/Ձ'g7܅pd#KR#I~4x)8{Nv8Q61 V 8OI,Cc 7cg5dΥ;vs@AA3/E&MmA9@ [jm7fefˆoHe! ؉c7lAk2=owLtnK& jR쾯5dp(K#gq JE}Rup@rd>0AC(8 )egJ򂅒]?0V`))w({@,i-GG܁}ӀAׯq&8 hoVV\q٤]:B]_L{v=SP_rl߾]m o޳K))-b^Ϝ* >eŞTYt6X}^Z0'f66!^맳iB_C.\M9;I}_I䈻խ9xG2 &4p5'7ty?˦'28BG2Ў=hb @^W/Οt!0ђOKZ%|)*=mk3:th??q R=~ؽcJ>4Y k)8AL jBO 璋A5r"HAf χTQA>(V yH 9rTrѧamke܅fa~qQB/ q{h$-X ;~[nFq+$z`ǎ@_92;vH|-T<㻸Dˡ#By"@6(ybj-vhliӺ)S$?L8Q }L6M>q7 Wv\||!L<s)79/u•bZ"""[(|5]sݣ&'w+BgH۶ff=fw9+e|Gvt ?]_|!&NRQ?z | ܹBY]Cǒmt[o}]ن|3qup+X:.@?A7u߸q@7mt7["5Yw7N=ΕGB_kpQIQ+M]_! ca%@q =?ä VLAngIkzK4v `@زeQr 7|SڠArEVk=~;8v_I= b@rz왇 KjL#pv`#+9r+ߏ4P<X"+"aYy¹!?`9l,6KaAx7H{16}*ޙ gf?kdyg>LI`V[J!, Յ-iI͗e# ?A 9i .СC9(6Z̓, xO(TΌ4P$޶m9s n:uvaQ$&%3cƯ={p0!G3Ϟ5g”^k|'KgE-2@pY5x.$+$[<#o_#ӳVr3`.-/VlO6]P<6cog1a= \Aի#l̟_UZhݾ]ua7=stw-81zEE2{ҟETzU!;̹*Nj/yZ 8uXd'tfH"yw1S}tU-qTX&LA裏Vy;Ӽr:#kah?dώ݈CD&t}B ېn{ƌq?֡CgB a(kPx`bt!|ӗ9Prl ?kvBi\]iR‹JV܈3 !0^2eJ?H"_25V )?f>yDHu~(maQRc!$+_ HRz+ x sH/(!c:C:w^.Ep A@gK5|.4rD+˫]vJ",ރA 3 $l |);H ĕ+ٖ>bpp9j$N)U g+R O ~ arr3g @Lʼモx|g^{m%hc4OE (~(Q|iӦq ?q1&"vl1!O(ip k&ƑAa[ tרL: Mlhij=/t=vr8ϑh ۘcB*E_BQ#K݋ $Q9д)ShZ﷦J9?I29EYǦG6\`{T&x駟zRj0(rÆX|屉" =#ePnho= r ? ';'VAQ8n5hRےI6urjn/[z(fv><wUbMPȑEUYd Hŗ_“GB1 fc܅Ե/K` .eu٭aڦNĤP|g}6<8UڢKjX 'KqFxmoh=3b%.*``` CA0`i Q&td s5HE[;>'$`})Q'~S^E=PTXJֽ8A&kG/0'SE^±9w~7u%L {lg^9]K ixMMxuAݡLK_X5 Kㆁ]jX6!j 9*,)-Si:r<M5/^,?:{~ihXau8~B< h'ڽ zC9X8B.sO0?HƂ+| qh"f4.T/]%0U]a\/s ܂\ILX՝̸L9NrGA򥍑As[ ШYNJ^NFp/H'fGY{߫Y]3&:jL(6BCZge ʻG_ & Y 40;~3d_~QUOCupplYN-@LG5L|lvmW\=c?[D\$E.a"cpa{8I#|vЯcscCE}O_?{sp=p_;: _Pw ta:&j"\\Zh Ԫ.Ur͖_@ cH򼣓Cq\ GeeSӤ3l5H A!Ȫaȷ \U5U=Ai!:@b;~~0f#QYh?"|v Uݦ髍jtNeJsdJ)2  T8]Fiko @)hP#EvTh8ت jig3Ʌ]$-X*dHPUtd4Azꉓd3bpOiKl>MYj,lC%kEhy88p h >_b2.`7r8;?=d:pikm59=  a{22pa} qK %5:8L4dhc@Ÿֲ8#>B=:J|o/,fS&>/v ~>~\9Y;Q] ዺ8PèSw|xξe? iHDZ)p57h׸ps<)/Kz4 ia/ ev~K&-[J]`8g-9&#+ ׯWAB`nMuGlz yXoov9V)}]sQd70׀? 1I r)Fɀi-OXL҄򞠯L F<k@R 2 &Zg1P'pQí= p4KbKdd Dp!j!8r)7e|>g7Sb*9F^x?Vշ܍A$U=8(VZ5`Hi#'ʍ rX;on;|?y|* qSmk8g2 ၣ8~@dC4#OZ^y9tT$=u>@CHl53qP艉X!뎎n(vyɂ`y>*i~(bq"y5\RtAČp, p47whWz׵Vv+3@Sn&MOƠt>o)qnrFh2:j BYRD@y gINF)ɪm˗r1.K7x΃?֙uD}{e_,!E7 crc& XvP/&-[0Ц IhQ\ j1} x,aHK~a^'-n SYBJطi$nޢL4$M1.gVڥ<րuj*s)]$Ju d/b0f[IUau4m;. t-/Sǵ ڣtX:BSs8~i8$ 97xO[N@9 |fHȓ"qXj_ r'pb$Ö}q~IŭMB[p󍠬+Ywl"cl@/ktᒬ@H ̢E:їgʽGI|z2u D'MUg7K'fM$ ET6ЊG$עI&1]N.Xa;]jxS&/.fRDQOr. 'oS /k1\ӧu)2EvW̃3Z(gDznJ-^$ (5 dcDn f0*svcZN'AEqiq?cPͩWWM?R#!1,xA:ʴ/VihIyEa&Apv㆏ȫm*Պ:zńd}.nlOٲNBB#f'‡p$z@a{7Ec 9ڧS:c0S!D2>>XP  5S4* z3 m͕Ȓ󵓾 zx _5}TII2 xc]*Բx?! _/d$%AHe#!S9$I{() L0\W22ٚ|'V]y>m8+e37?L2 \Ag͊cǎ!Fw+ *?- ;[? B]lh?(U=82A JdɚqsGlkҥA"ņIn,a!ҵxc%}%q&vR`Qx!w؆^&KE§ƗB YH$pfM^K@cKx3@05#bzSIN`5@m=}K|Q7ӏbC4]_qj8( 8\ÏTI&wZ>Iڵć=eٲ~[DGH~:-[B|0NQ'h{(u2{Aj F^]PlA|An ‡bu4A$sOc0NÁCKa6SbIV hOh4mLmԩX+':xԭ9n ʒ 4Y \f"wX ~PSReao8]U,a NR39'V>>C"B9XKv-˽ Zp 'ѿ\ ܮ$N6 3g35Jn5Ai/s 6N9&#_P.0|@{q+A*vҶ> l0&1VjGM? EHzf;EK nɓNm :|C~p1%.xr0A `5Q;@V$.lw*9z,!`FɧέQ@O| [YFE#'~yWٜ'GObvJ.aQczI9M[ٲ;_`\J+[($5T`D?Ő(2P  BurIII=U8/d  D5`ߘب3gѸ5!_PNjCXh1`mH ƒH]Յ W`8xH)H-cԬYr5U#qJ?`TYFjq$| 4malXl\lA [r-Ly8f}9XB@6$53¦o1*l#)Пv/(**\?pǏS:;dl) 3SZq~}ПjCA\+=;*3-挣[Atg 0X \q10T UJ$YkH-**y[ 8Us]y>`L'#ҕgk`7+.. %<^DZH£+9ed)>$FȉynzmcW% `\ WX sI6eʶ94S-0 tox(`ι"Pq}+Qw\. 葘AG٨k͡DbNGV-%rې6X_Jd'O[n',֧E f}+dz:s`6@BUoF 1=D%rKck!m˯t*@/h={ˎ~3w~Wkwz;S!у_=]o@gŗeROއa3uҤIʝJƃcvX }%ۿrk43 y MiM/cL=@?9@\q`hiz^V2VDq ??G4g\iGY%_gƩugw >17Ks\=OQpq$+lf d3 5!V@; XAdmy^S ʖOPvB̀@!ʠn@gڧI:/nKZďP !bS@!? )Sepl^tl~ֶk!΍7qهCs3\fdMz>@@)qb `CgH-b@QB3[;WiU=2 ^0A)~0xT:32>倛oݳd ו+Ogӟd uvO(Qj V)`ooi-*CŃ 0T?_{71Y>@Tuǵ@տ :8\gaZ_s :Q p:Z WJp7r."ԯWWPOgϟPq@'I|{=y:ܧu%yP%WPʍ)SM("V}0QTP,n_] @51YPJ7%@5fʟ 8*ḿO0~@NӼ7n@T: 8`R~v}eM~.aYUK B1ZqdULKrV?G\ PQV$}R%\k\_`+fp0?_( ~@#4++YpmfUv#̿Iˑ26ϯT{F(PA<&RsF;8}4=!i| p|- @Пk UH45.>I1 D; 580;*5C}Q> `#P'DU-?3 鳮byh-r@h|<+`<6~l"-By2koI%Feζ.+|332N]>BWd}VKzTN!3vClὤ5Fp8mq͚"1t(BŮnp'B8S7[ <=V b9 ?g?֦=`kX{=`kX{=`kX{=`kX{=`kz^ IENDB`ic13׉PNG  IHDR\rfiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4@IDATx|'JB .-T@BPwNhRhiqwwIM\KrO^voevvvޛgƘZ @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-P>-T> <@0êl#@! 0 L9`0#CkbDDDݻh޼yFUTiZ`jjCVpPPTVvvpvVVPvvvPvNa߰oms32R p]RRRo޼yÎ;Vu6~V0JaQ 6xquUVU@[GAA&=-fddI%70`I9&>)3vQߩwܹdϞ=sf1] \Z-`~|C ӢExАfB(^vރtP@"yoXφ9d a0}kvrr,9TT` @6N8SOҥUTlDINµ:G} ` | ~c 5h>G2?@1UTXXX+3A!Dx[Gw'FOH`4J`31ވ[r0kmKu2cr`YY)kzX_@y݈#OHH I>p _xmSRL [gn}V `40)f,t0 =1)1!L`H#@Yo8smvdj:3j/@6۔Ts`~dvC[l1֯Fa[~WIRSpJ{Hy \+oPhɘÇNCIIAm°"!v g7Yzʈ/)!%kG@6oCɟٯ_[!!-=&x{5bd/Y/'lc:M*_~{[Sz-(k׮֨Quʁ2it ^[f5{--p¶9^d-`%k7_ ӧڷzM"|1W\ix-p8;_b@|4e˖{VXߋ#:ά]lܰ"0tp(׽jC|h|X>ck+.&|o۶ͬXrZf:[pq;8;W}l^@*m_:۷T4uap"_`A\0))"|6 iLz]< a(GjѦujT>]Bg-Q(b{ZL)%+_TmSJ]r\IJzxXXS&غ@@ HCF/7>5/@6a?fEYeBl{ Y+[ )0MZ0W`P3`?{QNý_8s2DRAeC <@' |Ib`/lb`"8FyǏ[;[;y`jkwϷC9v8tdG,{{ d_ QV#P9v{[-衙rPrk_;}R{h CUP:thHPle e_&)Jzi8IN}4 ~5*qrdtfHs}nb[޹O7`Cmښm"[11IV=3L -PY_#漋5h6'oJ%B?@̡(ۊOARtJrJ8c iy"tp<@7)X|J-.Mk^E#r!^d?e0k@uhYөʻcљS`70"ƊfBUeGaY(Ya Ͽ4o*Fo 1>I=$NioH58TĊ?{Y74"}@&P^>3-=zhڗ#Dx1xy H/Vw$_WǗN\FHk9n T3A Uo^w AΪĂ Mph׻ٷeIٴY[ϰ0FTr+ &Q[Ƀ 4y Ww/zڐ-yxXJn\t/'?? _ǖ+Lzy yFAi3Ҵ<:ή묕tmOLJݜ8v9LD|ӥ5;pJLy{ YYM}Y1 ~N`oHkK_⨌/i.MV" חbO߲)ks=}իoa ׫D ~Uä502GwoRw6+m=e<`.Bbc}?wu7Mi&|c|e\lJK翅FJP*AJUHݬ8<>lҾ=Z|oS,~1|S3 c?t9DXTd YL0ux9@Z5M/7 2 }t)'Os? dLA$PA&5/o<-)k7O-QxӑQƊ x`)">Ӱo_K4J`OY֤Xemt81jx sW0gkoz [\4!x;tH / b֚rCUi!\|1KEUxZ%fq?=ܠ3OzDvnĕڵ};.tW10^'L0\7y$ "ݻ;ōzG1cԤ{X]`3*}h@ CQp&žo(ǫD>`c,|<,w_k䢺|L]PcGsSOg]ﺨ;E%\+M_6DԭcΞv7ol>}z+wSCCC'*nӐ1 d9؂~#,d{&b H|;@߲x :]⫏ygʢonb%~bIo* #DԨa:\r9oLa 0q͚5bT A}J}>\s ]\ +{L-nE򘆘a%t7P`>JkD[ĵ8-Z0#(7I~*&y6Sl}nm5jdu'чyfNz'l$e˖m4iH]MfMxT+4xMTTJ"uUf?peS+ Bn>Ŏ_ j(Kh'3`4A5 0^uy!Hlٲl۽Tz:{l1~Iuiڴ5h?j=>g_֜zMc{|Hܬ 8\G"C-7h`&N(|@#+G|2hqvC+zb⡃l/ sVB%ӆ.PL\qݺ6d_XptTe >jUW$/n(R=iҬIتUkz{i f͛ѳgϚZnFfA~e"vdkԯ|HLI<8_;ϗjۋ.?$Zev|j42 ԑR%89 90&E%ٳr${p]رϚ]p(c*k8[{ooO$!\xGMev۷O.Q9<#T2ӑƟvک-CN'e~[{G8t#-3hF/'?!&IU~m]~o`ZSS'SԽNO7>DfAɷbhAs2<4Iܼz8C=X,!;Li(丼b%OLu۶f)6.ڏ>E.y!X^LTmੁKU`EGs9q?u5WKeI%Jh@=G?i7BHY&@o]gf;͖1I*5qɗ|e"ȭ[- _?x≦n.fi"{w0s $'DP3@K%A56G@6pM+5_~i1TиqbxXxh촩>uUw0I!6 +Ƀ Bo?P* N&R9}܂D6xk׮ 3gD6 wQ%9A6KN:_-3cŊO=6x1jP*>aO?!##ssTp82޽;[&$4uZ6>>>kرW^}'?K9V_}@Wgӈ4?!{2v\|e00+| Ǜzu,vΚe"-Dc׃v.\,CY:kg>pI$Xv5ʷ}ˢ)pdx 00Z/. XCsz뭷.Pu?)FsZ1O>abq#F$$?I} (džo5<1y+\1 ;dfIy/0g֯m`er_3GxS!83̃fZ S׮5a6OKK\?< WK|͵ׁwpW2ئL6mu:=111&~msL\l*[lJXzR]A}|.=Gž}zkYE*I?vD)CׂۂQ?8GMK/1HȽ{RU?m2~Gbox̀\;@~"<%ŷǟrb!zt7uiS6L)lRst/p 1 ?fEiZ*$4;$h`XF>[Vxk̢E@qe;)w @RAY*D:LZJ\U@[6ׯ9eʔQy**p81F{M4\mѿZjY?ڸqc~)GzUF(?1uU=#&l^yϨUysR,;-D{Ct rm% e(D߀)[d">0T+}bޫlݸ2tb#u$:H.ȄSt&tMHEאҿڵsK˖-`_n `"[09)+HPѠOfmT 5k,y~rpb7[x1ҳlͪU .U$g\Pȩ oM@T!]v V4z F_D2 b/CKGݪ[|>._MDxJB O4$&-%w " e|,{H!?BHөI:ԫvO;c X3^z# >o  m/Rsﳘ a|)j+oAm1Vت3C_ap+ x{?%le>y/$zgl PloqD5vtVQ0$Hp ` [Ï<ԹIa/);@K/U)EH,{|̧eZg6Mq it7ތ>ui߇b|Wo(QhVaBfF 1%wㄟM#h4dDĝc1[ك=A \aΪGj̿Y9D4gN#߫k׮iZb P>xE@1q ?Lƒb8:`테tΠU52*$:&*z_Ŀp`\}+N=֫?udg7޸QFG8 X2{{y͖A>^7g>u_,<C\"<.P\|{,49;X7[~m"X+ 7_a* :Tg*5<@ф(~+KHgQmn9͚-Zge°lV8WE9~q?ըlg0k39l@BN9s܂'DkϕXs:ujG_mYH$;F[jy{u|MT%KO#Jbٽkwn 0SŅ:0XysCBS>Ix )h%fwK aC1:nTӨ~_.ϓd:qً+ݸQ*q_33s~WKmwL06$#Eb"I1 NA &Y^HIA7j_=MhaimIۗ6NYyj+L7^UN։gI-9l J. xWf񮇜t_ӢW^Q䒋$v 'jl!&7]\Տ9 }vV_իf#c==4R>}o}Q)]_N:R@$`1~$Q{)Sر ֊f|9 6nmCT\Vr $BX_xKp>iE/Ӝ8x-UQ#sN~3\I>-8 |/n/4Vt]羣ѻZ #05;!K^{Dg!Q9n_X u?fYfǤފNa0 AP`ec'z5Ǭ5 <0vS35Ő<Ӟ.K%Az6m‰N<]Tc_|ǮU5DLj(W/Vْ~-/b1o%1ɂLI*垊V.~vmG hBhb-[́Ln4g\(%5(^$b4N G X|Oݧ?Ԇ 6j#0?lak'=45"D"Cȵ$x!&%߳} 6:F"K/>PI4'aJostSgw =֮&oH;{\5]>[di0uO_ǦpAfMbU!!H9=)@dDatBBPV#5nTomo߶c)uR&Pea.m֤1c3AQiY&o~&4,]*_8?@Zl8I?T+0rZR.|3Fb҃2Ē)oԧl-$WGuMپì+&l[4w/,lb=eyՊ6Ͽف(^IABpo_~<#W;w9jG 5L**LDzQmæ+k65q.YlOᆊj7oo,EP:'5Jk1)(#qIcn޼lr75DG՚8q"Ssxy<xSh@o3MSL{ wb.7h^{O8n4#'ZGE5!tJ a9u'!سbBK51lC4V'1ۉa>Y="l%8iuVgmW\%FX*\ j~)&{'<@o1ZAy |qm}zRѪ֢bQ:7 K1.R.YlVY!&NR_;DlբuCYϨA$iIM9h:SCh%UHH.-W^,qjڵk;E[JWz4`T$yW`W_zѴꭸu{T: _@硈.ݙȝ~G?ӈt uZ3λƘ}+{2t]:0ݶwA҂wϚhH5$*r]Cxyـ:_u1K[=*N٠~\dBJ1'a;Pϱ?"'6!A!q&ւ*Um ;FH //hءcl>r ~5d8mmÑ4 n)TYMC[m3S,.Tw@L\[M /c.*tĉf#,}[&X=ۿ̯įSf>Ln-0]WO._!y?UPfjck\s~ҸHt=teDn y˯4ke*[ }ǽabO<w5kH7L*q`NH޲wwkW_1 w1qvn=>.{,wXa}:%6++L\]*ڕ9 @Դfs{busuR"i-A @͛rf݆ufmViVW%$ۗEmc3-n o]pbNힰ#{QLY*ʻtz^U~cR+=<" f+6EDzt5tG5"G7Xˮ hKx}\qSOE F}))hd Ƹx,C> n,j~L!ʎe$ ;vJKT+JS{?8P?:ZHFs! ;,% #J xTe)qhlr2:1'1Eq)Bt Vޙd毗wM~ :$2ŠeB#Xk "b}h\lj Уth6}ifk(Qs'k#/aDy|/8y0e,߱sg:3VoFy A?ٹ{9!2 zig׷,IaŸ'{=jԨY!2q: Cm!uAA.Bu`O1bg 1t~!]v1jviHK`7FY5fIZX8n%{X;plÔ)fr`ףy؊(UV 1B\||05i/,q?W̓-?Йb_.k5Y({7)ROK+R!;uͨ*fؔ>\RyyQ"d6oڔ'¯PQ `-nݻ֨[nR# HᄀEd!3qqݻ?tPF2U.v oΫrrÍV]ηbcL;E0\FgGfbODrŇHF+~a쀣M8yjk>le__DS\v]<]:5W/6N:f*ђ jgr*1Dj?@aoȩ׉w-ZA+T؇/~,dHĵ$q_A6$W?h$k׭~7V$Kzq`hЯThaF.,+a[m=v(|0aQJ:C'uAEP_(~ Uvɳ^;H/:k|C sիPR.IH-x @q=iΙ.77:ug$߀G)nfxB,-B$%H4 "M`/<:l~bz4Nu6VKeF>р ևظicyٲ#(gx 4B2O>126ba'$;ƛMRKQ]T . b?8o0qj3 s)LuT,*\ >P߮ZjPQ_ߞvׯ]`ު[h΂KXJYKpV:],MF%ڼecϼA2.PϭH 맙3f5ـ=B*hQFa0J` ^ ]_bذo?V{qExi Bnc FLٶdȳr7!$Xp!>OHtԣ޳.,dGnp$Hi5q#\YSk*e`cXf56_\>yRkI#%\fo^%o!ϟo`P"X6 C]\+kK/ӦƠ}:=zXDbDd*$"4bpyp,s7#\pNˌ }f^UBKnOaΛ岾{ ?H}]Iڵf-2aU̒ý~=Ta*>N:B *-i+amz}!oƹ=5<7pLs+E#1(sct7zG2+M&nO<צaꫯMntkk$'q6L&#ZY*{ϰ<&ٱ?(Ǐҫ+q"u֗!Y">/[5:@V7<^k+@Q(q>^FaY#lsV1Y/_NjQJ=Y׈! 3?bLPT7gD?M[tOhvɖ+K?'Tc7PpKNaL "qrU&謻|ƟsY5~tIOr<[lByڲlٲX@*#^D;b۷/2DM.V5,rsu֍X# &^"?>+/0Vf)Wze5!=xG|Ͷ"NaEgl$ڳ׿ ln`ёlM4: =MZW^5P lPLB#LsϭTC1=+W/d6Qo'رc Aeysgjy"(7^Y){;H.uT8 R l:`A1o0_Dy DL]:v Vm۷*..'$t80JۚgqFpȰt윿>yeJi &px@7h0k- Uc %=ro;|pWOS)k+faC[o1,dHSf%r"q܃hSV3QW~lΘ E3d̽DQ0ZJ?(w-)2M:.Faa:烥D L{i_+2N 3MjZ-Y  X ݺ}ۿoU.,?7.$"B2 gnzQAwԔ/1ΐgDž|m]K+~0vL*FÇ7ӗ:)P();hE 蹝TLwٜ~"sYXIA""kPs"@Ȩ*DR3e߹kg$߰ƉS.8zu9uN@껋U'^9L/6XB $ekL-9yZ/8ŚCU9͂; ` 9da;oB"z+D:Yl#bF5Ba wQUۃ.e)VJ 2" gg -BRg&S֬Zf=!rI7;Nhp[x̐ǒ -̕f7֏g|"-7 s[ A3cn']s sZ$ǐnfn0> Ǜ];K kY{A>zEXGoڴ!_EA|k#R1ыy!Ĝ}l+CLšH*t7z>4xWN8+4d«TYq@L%\b{Kq,P9cXȻ#B ) }}yo;?l;rm`as1%^awBGDog$" *AZ4:Ox_u2g &@)2yJDYA?2ԣAyo//rnνh:H B8y%nKӫW{&*D* UvHqV Atؼ)B Xw] @ 꺢(˱mKW<{u8zPu  e+`ˉW]m! (NUdLsrɥaǐɃHsp<\40 N[aֲaed[ 1É'ye$x'xH/ȅ-XϢX5ye(:}AEm ,Do O5֬BoYij9ˈ+s;΃%B"Zyh9>awuiä)dNY%K 6&SQ6ܩaBz n4<{)}\Mi į=p[}V`ӃzOc~" }U WfW %5Km5^il W 11O<-Q׫LƱc%~4@z#S۠}gQ24p M4])K@­[&eZuQP eK6#;,1͌ (Nt\ uDYهF[q?Rc?J1wB vSk'>d:o;:2)4 k0 dDE}ec}dm"U%jq!b>3;ӳ9/ UPb$|5du@ÇxV+l)H78M_E u7~a1;[>TAy{U,Wr32ɢ @ MT*fn)b5;a %@;2a(t~1\[T"r3Zgِ|L@i?CTi}@=[Q$ 0ޅ4B4 ~Q{j4b֟% /~ c.(*Mz :یz )t'cZLf٥|`z4eB;<okimN~]>}O:Њ_jzDf ?r߃NJW~g׉'{]|b;hDh3%~@r 1K#\[S)`kA g܁\s0\ØT ,x&bSQ_$AT~%f/s[A0GKBd 1: m1[PCQrrSmV41D1b~5b([,qߣ+˾,ZqV-܅2R ;5Ԋ-s暙,s 2jaW' F}m9_+\cGSvܻ)ɓMUd&P?a49ܨ+z:`fdt6QӒSk)բhK0c~g;mPDF-Mo쭧Z쭮~/, 4MEJz fC>pKe9* 4B)Mi"\P6ADD,FTy3To%뙉+Y~ FL\6(Hw㋜@{@H ƥoe^|Õa4s3F6'I 1 ш4]?y &:P.@2돪7pRrk~ TCTp2؃X-}6( ,>>}%;H-]_#~xNuyH-rG w;w0jԨB6Ao[NPY=!s6Ey2z3>8[dPzim"ٰ]pɵhMyA5Y/J ceJM3VbwF_0sC&&DdDͳm#j-!F幊"~E0W{HzN7K}OI>Yp(Wo<N仾5tha-QV}ƈִw1[er^5G"4K+59PeڷQf:Ez:%O eҚ$d)CD{/ǕKeBVI~Ϙ/lQn@ۅcu;rM~}:mʒqK8'Rś'x(;AtA:HMd'(~*C˗[F u{:8N2DҶ?v搵ool hMMO5)i)&`P\W.pd1R/%~}U^.Bu*+'/@}*kٜ/B5}X2:Vf[rX[w ׉v }V6D}0RJ;ख़n }}]a*Gեvp[t]_Sq53Pyt: ¦ hwq^_ne4H?;GƬ1]P}F݊"}NRwS7:#K=[ljEP#ImWĪʽ;aN/zqmS=kg[& `rrZZ/7QARXlZOs5^/!߹o]?mWbD8_A9mPqh3+]/P+'Ybnw;ZQ{=p5#ϝDЌ?/Ruu_:|Y5G}A(uH1Z{oMVԤ6bK9}[*_1S@w qv7Fl޷oqFtL6ONj:V ߖĽdbzy:.T@ Nanv9ZhB8 `ZW5[媑fv>F=Mꫯ +'[M7}Dx QzQذOf# ӚMJ0oxb}i2*pg3Ʊǚ~x.V sH"ؾŵu Tq?8ux.PNJZ5M~}Q[S޷^c"t`3crjH8$(;| 4Clf_ ƾy':WB}͸_ uZZ~g[%P]nkzkbbe(C^j;F.60|GWNՔ%(w9ǟp1#yA̺Ez=,:F>EBK5'du޵)jOO3eLlWA "Fe2m7rHP๠zE{ƀA[]j}gCKQv; { ~kļ鼷cf 1\."׌@)9zq/ k9g 6ż]ȑ#KeV:$9 i[r:c/_7I -i#lզ52^ݸ F0^B:/IF@zY |eCCS0_×֐=eIsK m@[80K0ܳYw.N·[]gӇ}o ϵ|۳\p+ߠ~1ȋ^N /FAlu*oq61C*!hx>TЖ"\7? lm;HLݹ.л2e}s\ OE.3#oLPME.d)omz5M7̋nhϗΧLұFdM,Na."^@5}s+?tKFd4,:;ii;q/6y订RdXj1 Q۰/g&'d,s]DHJXgپ HWKQP7 5XbILOMb_&hlQ(jb(bF, łJKg3޾Ess;39g9sf*KŰsS[peQ>4 |]HM:.S ޔߍCa|5KdwP_Ne#7U z^bP 7 'KQpM0݈ A'5i^{H7n:}BtlԼ@]}k8/KJ&?B*f:rJiyBkcf!AVi[mƙ?-+ժ՝;YBHt)^iP jkkKs̅YФF ه;o }c)E_l}1]/oe_}xÿ|Ą9U NRxe^j?_RoߔUs54=c!)B<.] a|OcnK/Fyu9 ρ=_Ə -ŤNGp-[LP}BU_LA/.Jʀ>G@>|-[v.+/gga>uwlm:q}|wn@?[ٽk3G!>?ve BL0&t:|aXʫ%#pֱ.lu%߳οNZ5Ԫc9{$i65_&xLD~i$BF? @&Ƈ0 ݰE *X&*ߧ 9i*3Hؚ"d3#H/l=ȩ'/H9r-'"Ҏ晟{h8"yXѤ54B*gN&NϠcl/9]}/\d%کh]mo~m? u!} B.?a #4f c-<8.yo|-~ /n1v#?]dǽVR8 6Bkkf~Z*"<"vCJ`ğ#dh(3 y +S=Kֹ =^5Ynr Rך]pA0y*P #DsW-="*_ 6DddԁAh30mqʎ^akq'ڂ]vqUmEZ}]mEV/ɴ s$p4gc.6!jڜ>B,&HǢ|s>k,7_+̀61fG{b[Mp>dGB|9rvVd H,)\ji{ /NzS2%Ўdn` s46o *jOAuI;=)'\*PCGx#8RAxD ߇X%%yc|cx(=#{*E-³Uph+,pAeNgോlϾ_tm~6⥕Xi5ZSOm ~t0`;{G*&GLgd5 ԁ$`$lo.vt,@W G:>eF=҆an_S\3_ Ij=>pI$nfhlH"y B8^.ʒ)`ך]*(V#;9A2a~p_R1_Vy qU &ܛ("PD`z?#yu":'Ҿ}G_C6'@^.!SBjl3 OcdOyKO gta`C,ߍDC u3uԯ(_jW|p E0G9|Ԃz>>x`u1߳u#`M:`{<@GcHg/Dh -129@RךOpLWV찣Oϰ-e:쿅0L}_ LW' P 9 z_OȗN"])-I:(9C]D*M䥃{P&Fy`4~M?+3*;8հ}P A,fu5Ix#SWX )v}#lf HLc#R_6S/O]ZeY l'ANC +8f8Ex0S+J_b=+KJA/" [ܣxa я}|5N: S& ! "`V,92{@$T 4Kgz l3is*#k+ꇺj6E03|}xV\85=v6Hn61[:h~x{AV!!8|mV#3!% s`RsЁAY 6l;//=jdd];V[3I,ʨS_ VV&C!<_x/dGSl!/aV.At:=ϸxPq]'I\v*Hhᗇ0 '(D/ át͏{0^mŽlE;JlG,׏3;a3N,??X!g8J5;zӮc~fC߭(v/NCUpFiwxA7WW@!nTP~(C!A>@  *Գ/?7J6[\!3fcԵpӁ<@yߗ/s>rI:nJLB %^lӰ)8f H.@@1WXV:}q:3&LbKK+ls</׏9;ob= :h#K rmH_i&\gu=t6wliʣ f4E5HzIp]DC!:jčtG G~^7#u<87 ثoy$`dߏGn{|JIJݧO:ovZP.@<;#A/KJO4~OYu/~DKa ]q#N![{mms$x-~ӇY"?}?w]SOom>]`1N}sfl~/$%:&wom:){=o{Mوm]@NS&5ݩ2!Bm;MxςU}kl= YlchZ)Gsg~h GU:MuS-JB#3K9J`{1ߝQ]}#K/u޿jSZ*{E9f=evоmgΆ jchgQ՘x7 }o.*rƒb#AFU}nvվ_+^:̍這l@*68 s*`j=WLgkk#0[8U쨀,/"l~u=J}M'a%xL9KQVR%"za"]ߍ1g~>u;ﲣ]pojM*hBI.SNo/@캳1 B8 gD aOkfe1f'2&W_} gЧ&vbގFW;h,21]a~NEaN#2MVT6jҰF=1խ9s[{1aI:G+gޜQcϼ))~wh;];['`JS [Wcpyb IBߧ`LM@0~o^0}ZU۪xi*3H 1=&B$TǨݬT.,K[f^n"x0HqEEc'`& Ջ4_XOZ,艹^ZMBg/\]Py }fK`{$u4ZkOs|ɦ꘥_ih |檼w +T۵v­Ԑ z*'spFk6r8Ӈ΍~('_J, ^{+.֒-o5zh`XhK4VCMHD_]g,t>H$}Ex'1K(wFDx&2Kx98;ٟ>>"6]B`,YEbE3!5m] Ͽ2OT6uSN%9&ٝtvdއ-]Ny2m3'P4LO>ɢF,yzpYg^Zi}ζ^nKӔ_yA]enG /$ji +=\שTMޥ6osp ۽54V$lc>'~D/@e@{cֶ$l}t}\cL'dtA&y;lI fei?sa~Wv+md-o?plyA:c#|3?[+GRdo "գ03k~zmͮeHB { Y\09^h}y*TϞ&;ږ[ u#s>omĵ6]N^?qO.%5;!)} JLgEtDfMoangO֖#*7|vغ.zS|G>f~Hx .]еsLR7FɆѬ:uuheQXE #$^p?jS: FA=}E["/ٴ u{eoڈ,fT>ɧS8")ǘ%]|zxPqOC ءƈ.K}X>oHdK8zqZovMX(yOm'& $NwsӚ¿+NhN|EPBpSBNb ͧБn~^TZs>+1{],^$ oЊ~_ӾF{57y˯4i Pm5OZfч,MF^:[ؖfdsDF 0?=MTq1?#?3LyTg}H?:\9+lF#/?#0=?(x8d<;kpi==bi+S|f V#'yJm)t i/X}Z~-vgf%꼩 u]n`{x}u)Y6jdg֡~ۗgۛzǻ]Q5U\cfbWQe(@^qX>tlFf÷-8Aomʒ\~k#7%4iڏhh 3l`E3f:"2,`z4 vÙ=ThDD]Z؃)ONF鑪ݏhf`|q.s+c кPRDZ9?tDF[!$,85ǗWؐ rUTUUaWdg `Hra5UT(8k߽mӭ_Xw(DkT[ʕH茓!qJaӉtδDpY4_AHZ x}S tE3HL/$W0mH$} 5,mqz:b3L?%Vab^_yuC,@V` %6HMe?(|b9$JmjouiceEΕl"1&< ˶cGq 5JVZe9l5pUs{@ZBm(tZg0[Z[x)$ᇆ_{KlH)ᯇېPH']wvi+,Ƞ.8)/t-Y4ի ik>FC>4D6oR}HYU>3#of܄;cSN`|D'Omru i ri:GxR!숓.\6s]> 髥T0z`d ,?@X1ƅRͦ`M{Kqem2ANе /K(#?_Ш"0!z= T"_'o_+t;G&aىOÇRK~|8&vT^RiI-(O[n5̙06w1mPtpB,#>49ALB }:@CeԀjt9ͪ@>G {Sv+ĈFҁd-k|Vۅ rbå#L~ I u0 #)}FboAri[ .%mjLVYPfK8 SlF,VD\8"{jAbm{Xb 솛H3 R1GHYT.FQp4Χ{ xF0zm l4AԩS. 0:lh\4AݠɪHkۻ @`h1L:͏ɽ{驰W!DB5Z[a?ӱt+gUL-m%KGyĭdMLzoVj]::;j{OEv?Oڶ[bӧc ڎ ], F\8A;u,R촂%˜b1}en[6Ou`0X[[FuVgovRWZў{H."E#YFIyv Sd̄ D9|pq_Dw)k| 1-:^^w˂e` k[~kP`qCt!Ҳorcn'k^B /`FqA=8`tFӆ[+ӻ(̃=Jeӯ{ٟ7ڐc<?j*MF-uTldV̛ٵ4hn?fJ³0"ˁdAa8V62^vzXkW{ƌ6Ĵ!M)'(F|C'd`Xӣ47!rK.qc }:-iiv@]k4\RX~DD#-r٥䌙ܦ32{BDBi nqSϙ!Vm}о:B[ir>z}J', ֊nY@aU~}N[+kیc;ObCut Zv*@@DT~[&o5* Y<8Ɋ>R_{V_-Ax}~οTI^`A0 U TVTM0_ d.?9]ʼ{r#OazhYpnRh2HWke֬ٹVf;A<%|M$t|cDfg Ȋc/ƭ[^Z7L_XȎٽԮi‹UDeǮfgD`W3zф@Ue-(^$UFζB,E *,oƙWI9sqU:yJI4jVEW]#jTXjmo[r ] M(;W=#OZV+#sA[ p}Fv1 @Edn ~C*LBȃdg${bG M'P&:X,Z%׭L=~¸M ţWfP-D0UŒh^~Vc>ie#E{&LQ)ɼL*7%Z'D.'h1ipF 8Mfn]Ԇ6 Q. C+G ;is⪫G?ǫ!hn6C(ts/_>Ge $TO'>Wk5 Ra PH6kkcx4KEh%G`"<ĮAÇ<`KȨ^amb`rh2rHAs&B0'?N:F /+l߱v֔%AL={Fj`C }_"6Ixjo5{l\QB_>Ƕu]Uʥ5=a kdzBz*uÝ$(`8SK/B:ܞi oj(hLh*OZ 5'=E-{Zn3[co*aDDP6uv"9R}ׇ,[ȏ?[gCez,qݫV[;"!:v;}~jT.>5*K9|*g*LL"rl׭X|#P.-\sDi 2’Lt/$0c_^o%)@2UͰ("smX!AC5+_3QU^}45BWiLF|S'mBF?g)鸉FmBZ08%.]^&rCM.4 ~ @`*d`R'L:z:/k m?L'!&H즛n S^)|+HQ;``?709`-ki1\8՝0&jz %PNUA׼hI w6W+\u\ C"^q8v-vƝ>c|;|tulqc0 >B_8? a`3VXcYfG}ZB`|Z8 `G@H0#߀{}Vcp/e;t?թ&"\/USOU/T Рi@Y#c>m=s LPSr02֙&M& ?LFVTV9#5h4ӣqn6k|Q~,4*/o6.fA-HC֭_Ymv}%Ё^Ty:&_5ZRzks&;wa*Mj<35щ :6q3'KYѐB[B7Tr ͧpl5 e1 Fi%RS: *X:@j @^ヒ>/dC&  O7l.~ 9)1(/O-+t6 x3?Xco&kkvs;b 0+uV?Pb&b?Xt4evwxKݵ3?5@{htQFd{D;9? akUom>u@rX<L5{Jcl_(@] iΦTyh!@( lwg~;G ; 0 32g0@|h0*0uNXY[',zob 4 ̷3[)Nw/sɶ *bꐭYxĮ ammOӺZ?i!=rnQETJh&z\43[)ƪG2ź?m=C<ıҪ#PHZf04-'\*_kO?Y&xbG#~Nŏ;\,Y~3؋\ ;@C7)BV_/,}MG?WiAWC0U :(rjMl*1OK'+hŋ6+^W 74BSQ3#u kgFC,q;Iy0ȟ*u>&B h l/=tij##Fc*K# {zggfB[`#S4M( `lZrf+9x0@?\9\ė4U"f0pP7A@F"3sWZTG^!!+E|1;W( 4]>A!ZZa{1 jkk"!m)Tv5{ۣ\j <o>K?@nZ]f_.d:^{nP%t1$P#h95T3 o.d{$x#;ީOM1. )%%~vĹ9ʔ v:`0ۑ[RihM>҈`˵W!yl[5;mO?ȃo igvߧ1xqgu!l;Tf!g4hp #5T;60Pfp\ "oY~m|D:llxJ.ʖ<}*q ?Va>> #PU}$4}x"زQ-W"Du3}').;_Iy Mp# ?OV酡%YOCS)إ*Q.0ᾜ};c\\/@ d hx虀mZ 49]ge*#=lې ; ƥ}#K`Rc @K@\uR+S+m޽mwq40*̈@$¶!G)-Y M2uCb1b3<=b5MEp Р1 9Q UTS^- 6yÄF˄q4i;KGOKl€i>f N=okchxiP q)8-; N:c > R﫱>xA?!k^.'tb+l)i9@+4 },n03qpha]OgBbKIKU!S, {J_:XyUh, ]$-ʇ:o2{\:'(LH XBCp1hi-Ac3!n%d,apuQnxHˎeȬ oH,斗\rI2S8;7vȫ/ GѠ1@\Է@ OXؐ!_V,@c %[9]x&sB &iUQhB߸~tLB8\LF,#h=RQ,x dB2Uo}[-4O2CB̈́#ā\Ld^R~G -;#) Tn}/KUf¦Ab193w N9[(c nEgOƾ\=x!V!oрDÏEz?n}@`>.F21>ǝ< ?~E`F>}݁2^k.|5}B0[߇οɼkR;!3H8MYOCAIl @9m\ܫ '&GaP_wX[|a݈ =[*"lq(ƐO#p+.ݴ<8Ub7~˧|٘BmQgczMG$n+6y7nx&|Wt6n+N;ʷ% =c1 iB1R] # >4;wYyA ߨؒ?&~3%;srq>Gv1{*}n̫/3Pb "ދ9}79Mߗ{R$ysKB);g{DT#2#?"hS\$ru}K²-L̞=A; -{ #6/Åw09FK눞tK1z&gU^u^co-<(-L 42h#,eA׀_M^NkhAi*$P\B<\N1B%6jiV &rV 8Aj]8F|sЄ癟t8hEt:  \騖3e^/l>G w—#NP \1!@,#u`C7oՑo+.]zG2f ΚkVhì"ጜ^Q| {83WX)$5D q$Xp SbG4$$3jrB}.VԷgȉ[6Y8^~h䀺{M{\"Az `IgFe}ui9G`Z(gV)uGT@YD-M^#M>a_)l3I͛>ݺu?bW+;9\~=@3EQ  ܬL/ixRӀOgcV{n.xv1. V**i[n5]gwҹƢs)-ˏc!P/R-=0Z8Pxe 6B\ީ]۶)>F_~ʧ|fG#(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q`):xIENDB`ic08׉PNG  IHDR\rfiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4@IDATx|'JB .-T@BPwNhRhiqwwIM\KrO^voevvvޛgƘZ @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-h@ Z @-P>-T> <@0êl#@! 0 L9`0#CkbDDDݻh޼yFUTiZ`jjCVpPPTVvvpvVVPvvvPvNa߰oms32R p]RRRo޼yÎ;Vu6~V0JaQ 6xquUVU@[GAA&=-fddI%70`I9&>)3vQߩwܹdϞ=sf1] \Z-`~|C ӢExАfB(^vރtP@"yoXφ9d a0}kvrr,9TT` @6N8SOҥUTlDINµ:G} ` | ~c 5h>G2?@1UTXXX+3A!Dx[Gw'FOH`4J`31ވ[r0kmKu2cr`YY)kzX_@y݈#OHH I>p _xmSRL [gn}V `40)f,t0 =1)1!L`H#@Yo8smvdj:3j/@6۔Ts`~dvC[l1֯Fa[~WIRSpJ{Hy \+oPhɘÇNCIIAm°"!v g7Yzʈ/)!%kG@6oCɟٯ_[!!-=&x{5bd/Y/'lc:M*_~{[Sz-(k׮֨Quʁ2it ^[f5{--p¶9^d-`%k7_ ӧڷzM"|1W\ix-p8;_b@|4e˖{VXߋ#:ά]lܰ"0tp(׽jC|h|X>ck+.&|o۶ͬXrZf:[pq;8;W}l^@*m_:۷T4uap"_`A\0))"|6 iLz]< a(GjѦujT>]Bg-Q(b{ZL)%+_TmSJ]r\IJzxXXS&غ@@ HCF/7>5/@6a?fEYeBl{ Y+[ )0MZ0W`P3`?{QNý_8s2DRAeC <@' |Ib`/lb`"8FyǏ[;[;y`jkwϷC9v8tdG,{{ d_ QV#P9v{[-衙rPrk_;}R{h CUP:thHPle e_&)Jzi8IN}4 ~5*qrdtfHs}nb[޹O7`Cmښm"[11IV=3L -PY_#漋5h6'oJ%B?@̡(ۊOARtJrJ8c iy"tp<@7)X|J-.Mk^E#r!^d?e0k@uhYөʻcљS`70"ƊfBUeGaY(Ya Ͽ4o*Fo 1>I=$NioH58TĊ?{Y74"}@&P^>3-=zhڗ#Dx1xy H/Vw$_WǗN\FHk9n T3A Uo^w AΪĂ Mph׻ٷeIٴY[ϰ0FTr+ &Q[Ƀ 4y Ww/zڐ-yxXJn\t/'?? _ǖ+Lzy yFAi3Ҵ<:ή묕tmOLJݜ8v9LD|ӥ5;pJLy{ YYM}Y1 ~N`oHkK_⨌/i.MV" חbO߲)ks=}իoa ׫D ~Uä502GwoRw6+m=e<`.Bbc}?wu7Mi&|c|e\lJK翅FJP*AJUHݬ8<>lҾ=Z|oS,~1|S3 c?t9DXTd YL0ux9@Z5M/7 2 }t)'Os? dLA$PA&5/o<-)k7O-QxӑQƊ x`)">Ӱo_K4J`OY֤Xemt81jx sW0gkoz [\4!x;tH / b֚rCUi!\|1KEUxZ%fq?=ܠ3OzDvnĕڵ};.tW10^'L0\7y$ "ݻ;ōzG1cԤ{X]`3*}h@ CQp&žo(ǫD>`c,|<,w_k䢺|L]PcGsSOg]ﺨ;E%\+M_6DԭcΞv7ol>}z+wSCCC'*nӐ1 d9؂~#,d{&b H|;@߲x :]⫏ygʢonb%~bIo* #DԨa:\r9oLa 0q͚5bT A}J}>\s ]\ +{L-nE򘆘a%t7P`>JkD[ĵ8-Z0#(7I~*&y6Sl}nm5jdu'чyfNz'l$e˖m4iH]MfMxT+4xMTTJ"uUf?peS+ Bn>Ŏ_ j(Kh'3`4A5 0^uy!Hlٲl۽Tz:{l1~Iuiڴ5h?j=>g_֜zMc{|Hܬ 8\G"C-7h`&N(|@#+G|2hqvC+zb⡃l/ sVB%ӆ.PL\qݺ6d_XptTe >jUW$/n(R=iҬIتUkz{i f͛ѳgϚZnFfA~e"vdkԯ|HLI<8_;ϗjۋ.?$Zev|j42 ԑR%89 90&E%ٳr${p]رϚ]p(c*k8[{ooO$!\xGMev۷O.Q9<#T2ӑƟvک-CN'e~[{G8t#-3hF/'?!&IU~m]~o`ZSS'SԽNO7>DfAɷbhAs2<4Iܼz8C=X,!;Li(丼b%OLu۶f)6.ڏ>E.y!X^LTmੁKU`EGs9q?u5WKeI%Jh@=G?i7BHY&@o]gf;͖1I*5qɗ|e"ȭ[- _?x≦n.fi"{w0s $'DP3@K%A56G@6pM+5_~i1TиqbxXxh촩>uUw0I!6 +Ƀ Bo?P* N&R9}܂D6xk׮ 3gD6 wQ%9A6KN:_-3cŊO=6x1jP*>aO?!##ssTp82޽;[&$4uZ6>>>kرW^}'?K9V_}@Wgӈ4?!{2v\|e00+| Ǜzu,vΚe"-Dc׃v.\,CY:kg>pI$Xv5ʷ}ˢ)pdx 00Z/. XCsz뭷.Pu?)FsZ1O>abq#F$$?I} (džo5<1y+\1 ;dfIy/0g֯m`er_3GxS!83̃fZ S׮5a6OKK\?< WK|͵ׁwpW2ئL6mu:=111&~msL\l*[lJXzR]A}|.=Gž}zkYE*I?vD)CׂۂQ?8GMK/1HȽ{RU?m2~Gbox̀\;@~"<%ŷǟrb!zt7uiS6L)lRst/p 1 ?fEiZ*$4;$h`XF>[Vxk̢E@qe;)w @RAY*D:LZJ\U@[6ׯ9eʔQy**p81F{M4\mѿZjY?ڸqc~)GzUF(?1uU=#&l^yϨUysR,;-D{Ct rm% e(D߀)[d">0T+}bޫlݸ2tb#u$:H.ȄSt&tMHEאҿڵsK˖-`_n `"[09)+HPѠOfmT 5k,y~rpb7[x1ҳlͪU .U$g\Pȩ oM@T!]v V4z F_D2 b/CKGݪ[|>._MDxJB O4$&-%w " e|,{H!?BHөI:ԫvO;c X3^z# >o  m/Rsﳘ a|)j+oAm1Vت3C_ap+ x{?%le>y/$zgl PloqD5vtVQ0$Hp ` [Ï<ԹIa/);@K/U)EH,{|̧eZg6Mq it7ތ>ui߇b|Wo(QhVaBfF 1%wㄟM#h4dDĝc1[ك=A \aΪGj̿Y9D4gN#߫k׮iZb P>xE@1q ?Lƒb8:`테tΠU52*$:&*z_Ŀp`\}+N=֫?udg7޸QFG8 X2{{y͖A>^7g>u_,<C\"<.P\|{,49;X7[~m"X+ 7_a* :Tg*5<@ф(~+KHgQmn9͚-Zge°lV8WE9~q?ըlg0k39l@BN9s܂'DkϕXs:ujG_mYH$;F[jy{u|MT%KO#Jbٽkwn 0SŅ:0XysCBS>Ix )h%fwK aC1:nTӨ~_.ϓd:qً+ݸQ*q_33s~WKmwL06$#Eb"I1 NA &Y^HIA7j_=MhaimIۗ6NYyj+L7^UN։gI-9l J. xWf񮇜t_ӢW^Q䒋$v 'jl!&7]\Տ9 }vV_իf#c==4R>}o}Q)]_N:R@$`1~$Q{)Sر ֊f|9 6nmCT\Vr $BX_xKp>iE/Ӝ8x-UQ#sN~3\I>-8 |/n/4Vt]羣ѻZ #05;!K^{Dg!Q9n_X u?fYfǤފNa0 AP`ec'z5Ǭ5 <0vS35Ő<Ӟ.K%Az6m‰N<]Tc_|ǮU5DLj(W/Vْ~-/b1o%1ɂLI*垊V.~vmG hBhb-[́Ln4g\(%5(^$b4N G X|Oݧ?Ԇ 6j#0?lak'=45"D"Cȵ$x!&%߳} 6:F"K/>PI4'aJostSgw =֮&oH;{\5]>[di0uO_ǦpAfMbU!!H9=)@dDatBBPV#5nTomo߶c)uR&Pea.m֤1c3AQiY&o~&4,]*_8?@Zl8I?T+0rZR.|3Fb҃2Ē)oԧl-$WGuMپì+&l[4w/,lb=eyՊ6Ͽف(^IABpo_~<#W;w9jG 5L**LDzQmæ+k65q.YlOᆊj7oo,EP:'5Jk1)(#qIcn޼lr75DG՚8q"Ssxy<xSh@o3MSL{ wb.7h^{O8n4#'ZGE5!tJ a9u'!سbBK51lC4V'1ۉa>Y="l%8iuVgmW\%FX*\ j~)&{'<@o1ZAy |qm}zRѪ֢bQ:7 K1.R.YlVY!&NR_;DlբuCYϨA$iIM9h:SCh%UHH.-W^,qjڵk;E[JWz4`T$yW`W_zѴꭸu{T: _@硈.ݙȝ~G?ӈt uZ3λƘ}+{2t]:0ݶwA҂wϚhH5$*r]Cxyـ:_u1K[=*N٠~\dBJ1'a;Pϱ?"'6!A!q&ւ*Um ;FH //hءcl>r ~5d8mmÑ4 n)TYMC[m3S,.Tw@L\[M /c.*tĉf#,}[&X=ۿ̯įSf>Ln-0]WO._!y?UPfjck\s~ҸHt=teDn y˯4ke*[ }ǽabO<w5kH7L*q`NH޲wwkW_1 w1qvn=>.{,wXa}:%6++L\]*ڕ9 @Դfs{busuR"i-A @͛rf݆ufmViVW%$ۗEmc3-n o]pbNힰ#{QLY*ʻtz^U~cR+=<" f+6EDzt5tG5"G7Xˮ hKx}\qSOE F}))hd Ƹx,C> n,j~L!ʎe$ ;vJKT+JS{?8P?:ZHFs! ;,% #J xTe)qhlr2:1'1Eq)Bt Vޙd毗wM~ :$2ŠeB#Xk "b}h\lj Уth6}ifk(Qs'k#/aDy|/8y0e,߱sg:3VoFy A?ٹ{9!2 zig׷,IaŸ'{=jԨY!2q: Cm!uAA.Bu`O1bg 1t~!]v1jviHK`7FY5fIZX8n%{X;plÔ)fr`ףy؊(UV 1B\||05i/,q?W̓-?Йb_.k5Y({7)ROK+R!;uͨ*fؔ>\RyyQ"d6oڔ'¯PQ `-nݻ֨[nR# HᄀEd!3qqݻ?tPF2U.v oΫrrÍV]ηbcL;E0\FgGfbODrŇHF+~a쀣M8yjk>le__DS\v]<]:5W/6N:f*ђ jgr*1Dj?@aoȩ׉w-ZA+T؇/~,dHĵ$q_A6$W?h$k׭~7V$Kzq`hЯThaF.,+a[m=v(|0aQJ:C'uAEP_(~ Uvɳ^;H/:k|C sիPR.IH-x @q=iΙ.77:ug$߀G)nfxB,-B$%H4 "M`/<:l~bz4Nu6VKeF>р ևظicyٲ#(gx 4B2O>126ba'$;ƛMRKQ]T . b?8o0qj3 s)LuT,*\ >P߮ZjPQ_ߞvׯ]`ު[h΂KXJYKpV:],MF%ڼecϼA2.PϭH 맙3f5ـ=B*hQFa0J` ^ ]_bذo?V{qExi Bnc FLٶdȳr7!$Xp!>OHtԣ޳.,dGnp$Hi5q#\YSk*e`cXf56_\>yRkI#%\fo^%o!ϟo`P"X6 C]\+kK/ӦƠ}:=zXDbDd*$"4bpyp,s7#\pNˌ }f^UBKnOaΛ岾{ ?H}]Iڵf-2aU̒ý~=Ta*>N:B *-i+amz}!oƹ=5<7pLs+E#1(sct7zG2+M&nO<צaꫯMntkk$'q6L&#ZY*{ϰ<&ٱ?(Ǐҫ+q"u֗!Y">/[5:@V7<^k+@Q(q>^FaY#lsV1Y/_NjQJ=Y׈! 3?bLPT7gD?M[tOhvɖ+K?'Tc7PpKNaL "qrU&謻|ƟsY5~tIOr<[lByڲlٲX@*#^D;b۷/2DM.V5,rsu֍X# &^"?>+/0Vf)Wze5!=xG|Ͷ"NaEgl$ڳ׿ ln`ёlM4: =MZW^5P lPLB#LsϭTC1=+W/d6Qo'رc Aeysgjy"(7^Y){;H.uT8 R l:`A1o0_Dy DL]:v Vm۷*..'$t80JۚgqFpȰt윿>yeJi &px@7h0k- Uc %=ro;|pWOS)k+faC[o1,dHSf%r"q܃hSV3QW~lΘ E3d̽DQ0ZJ?(w-)2M:.Faa:烥D L{i_+2N 3MjZ-Y  X ݺ}ۿoU.,?7.$"B2 gnzQAwԔ/1ΐgDž|m]K+~0vL*FÇ7ӗ:)P();hE 蹝TLwٜ~"sYXIA""kPs"@Ȩ*DR3e߹kg$߰ƉS.8zu9uN@껋U'^9L/6XB $ekL-9yZ/8ŚCU9͂; ` 9da;oB"z+D:Yl#bF5Ba wQUۃ.e)VJ 2" gg -BRg&S֬Zf=!rI7;Nhp[x̐ǒ -̕f7֏g|"-7 s[ A3cn']s sZ$ǐnfn0> Ǜ];K kY{A>zEXGoڴ!_EA|k#R1ыy!Ĝ}l+CLšH*t7z>4xWN8+4d«TYq@L%\b{Kq,P9cXȻ#B ) }}yo;?l;rm`as1%^awBGDog$" *AZ4:Ox_u2g &@)2yJDYA?2ԣAyo//rnνh:H B8y%nKӫW{&*D* UvHqV Atؼ)B Xw] @ 꺢(˱mKW<{u8zPu  e+`ˉW]m! (NUdLsrɥaǐɃHsp<\40 N[aֲaed[ 1É'ye$x'xH/ȅ-XϢX5ye(:}AEm ,Do O5֬BoYij9ˈ+s;΃%B"Zyh9>awuiä)dNY%K 6&SQ6ܩaBz n4<{)}\Mi į=p[}V`ӃzOc~" }U WfW %5Km5^il W 11O<-Q׫LƱc%~4@z#S۠}gQ24p M4])K@­[&eZuQP eK6#;,1͌ (Nt\ uDYهF[q?Rc?J1wB vSk'>d:o;:2)4 k0 dDE}ec}dm"U%jq!b>3;ӳ9/ UPb$|5du@ÇxV+l)H78M_E u7~a1;[>TAy{U,Wr32ɢ @ MT*fn)b5;a %@;2a(t~1\[T"r3Zgِ|L@i?CTi}@=[Q$ 0ޅ4B4 ~Q{j4b֟% /~ c.(*Mz :یz )t'cZLf٥|`z4eB;<okimN~]>}O:Њ_jzDf ?r߃NJW~g׉'{]|b;hDh3%~@r 1K#\[S)`kA g܁\s0\ØT ,x&bSQ_$AT~%f/s[A0GKBd 1: m1[PCQrrSmV41D1b~5b([,qߣ+˾,ZqV-܅2R ;5Ԋ-s暙,s 2jaW' F}m9_+\cGSvܻ)ɓMUd&P?a49ܨ+z:`fdt6QӒSk)բhK0c~g;mPDF-Mo쭧Z쭮~/, 4MEJz fC>pKe9* 4B)Mi"\P6ADD,FTy3To%뙉+Y~ FL\6(Hw㋜@{@H ƥoe^|Õa4s3F6'I 1 ш4]?y &:P.@2돪7pRrk~ TCTp2؃X-}6( ,>>}%;H-]_#~xNuyH-rG w;w0jԨB6Ao[NPY=!s6Ey2z3>8[dPzim"ٰ]pɵhMyA5Y/J ceJM3VbwF_0sC&&DdDͳm#j-!F幊"~E0W{HzN7K}OI>Yp(Wo<N仾5tha-QV}ƈִw1[er^5G"4K+59PeڷQf:Ez:%O eҚ$d)CD{/ǕKeBVI~Ϙ/lQn@ۅcu;rM~}:mʒqK8'Rś'x(;AtA:HMd'(~*C˗[F u{:8N2DҶ?v搵ool hMMO5)i)&`P\W.pd1R/%~}U^.Bu*+'/@}*kٜ/B5}X2:Vf[rX[w ׉v }V6D}0RJ;ख़n }}]a*Gեvp[t]_Sq53Pyt: ¦ hwq^_ne4H?;GƬ1]P}F݊"}NRwS7:#K=[ljEP#ImWĪʽ;aN/zqmS=kg[& `rrZZ/7QARXlZOs5^/!߹o]?mWbD8_A9mPqh3+]/P+'Ybnw;ZQ{=p5#ϝDЌ?/Ruu_:|Y5G}A(uH1Z{oMVԤ6bK9}[*_1S@w qv7Fl޷oqFtL6ONj:V ߖĽdbzy:.T@ Nanv9ZhB8 `ZW5[媑fv>F=Mꫯ +'[M7}Dx QzQذOf# ӚMJ0oxb}i2*pg3Ʊǚ~x.V sH"ؾŵu Tq?8ux.PNJZ5M~}Q[S޷^c"t`3crjH8$(;| 4Clf_ ƾy':WB}͸_ uZZ~g[%P]nkzkbbe(C^j;F.60|GWNՔ%(w9ǟp1#yA̺Ez=,:F>EBK5'du޵)jOO3eLlWA "Fe2m7rHP๠zE{ƀA[]j}gCKQv; { ~kļ鼷cf 1\."׌@)9zq/ k9g 6ż]ȑ#KeV:$9 i[r:c/_7I -i#lզ52^ݸ F0^B:/IF@zY |eCCS0_×֐=eIsK m@[80K0ܳYw.N·[]gӇ}o ϵ|۳\p+ߠ~1ȋ^N /FAlu*oq61C*!hx>TЖ"\7? lm;HLݹ.л2e}s\ OE.3#oLPME.d)omz5M7̋nhϗΧLұFdM,Na."^@5}s+?tKFd4,:;ii;q/6y订RdXj1 Q۰/g&'d,s]DHJXgپ HWKQP7 5XbILOMb_&hlQ(jb(bF, łJKg3޾Ess;39g9sf*KŰsS[peQ>4 |]HM:.S ޔߍCa|5KdwP_Ne#7U z^bP 7 'KQpM0݈ A'5i^{H7n:}BtlԼ@]}k8/KJ&?B*f:rJiyBkcf!AVi[mƙ?-+ժ՝;YBHt)^iP jkkKs̅YФF ه;o }c)E_l}1]/oe_}xÿ|Ą9U NRxe^j?_RoߔUs54=c!)B<.] a|OcnK/Fyu9 ρ=_Ə -ŤNGp-[LP}BU_LA/.Jʀ>G@>|-[v.+/gga>uwlm:q}|wn@?[ٽk3G!>?ve BL0&t:|aXʫ%#pֱ.lu%߳οNZ5Ԫc9{$i65_&xLD~i$BF? @&Ƈ0 ݰE *X&*ߧ 9i*3Hؚ"d3#H/l=ȩ'/H9r-'"Ҏ晟{h8"yXѤ54B*gN&NϠcl/9]}/\d%کh]mo~m? u!} B.?a #4f c-<8.yo|-~ /n1v#?]dǽVR8 6Bkkf~Z*"<"vCJ`ğ#dh(3 y +S=Kֹ =^5Ynr Rך]pA0y*P #DsW-="*_ 6DddԁAh30mqʎ^akq'ڂ]vqUmEZ}]mEV/ɴ s$p4gc.6!jڜ>B,&HǢ|s>k,7_+̀61fG{b[Mp>dGB|9rvVd H,)\ji{ /NzS2%Ўdn` s46o *jOAuI;=)'\*PCGx#8RAxD ߇X%%yc|cx(=#{*E-³Uph+,pAeNgോlϾ_tm~6⥕Xi5ZSOm ~t0`;{G*&GLgd5 ԁ$`$lo.vt,@W G:>eF=҆an_S\3_ Ij=>pI$nfhlH"y B8^.ʒ)`ך]*(V#;9A2a~p_R1_Vy qU &ܛ("PD`z?#yu":'Ҿ}G_C6'@^.!SBjl3 OcdOyKO gta`C,ߍDC u3uԯ(_jW|p E0G9|Ԃz>>x`u1߳u#`M:`{<@GcHg/Dh -129@RךOpLWV찣Oϰ-e:쿅0L}_ LW' P 9 z_OȗN"])-I:(9C]D*M䥃{P&Fy`4~M?+3*;8հ}P A,fu5Ix#SWX )v}#lf HLc#R_6S/O]ZeY l'ANC +8f8Ex0S+J_b=+KJA/" [ܣxa я}|5N: S& ! "`V,92{@$T 4Kgz l3is*#k+ꇺj6E03|}xV\85=v6Hn61[:h~x{AV!!8|mV#3!% s`RsЁAY 6l;//=jdd];V[3I,ʨS_ VV&C!<_x/dGSl!/aV.At:=ϸxPq]'I\v*Hhᗇ0 '(D/ át͏{0^mŽlE;JlG,׏3;a3N,??X!g8J5;zӮc~fC߭(v/NCUpFiwxA7WW@!nTP~(C!A>@  *Գ/?7J6[\!3fcԵpӁ<@yߗ/s>rI:nJLB %^lӰ)8f H.@@1WXV:}q:3&LbKK+ls</׏9;ob= :h#K rmH_i&\gu=t6wliʣ f4E5HzIp]DC!:jčtG G~^7#u<87 ثoy$`dߏGn{|JIJݧO:ovZP.@<;#A/KJO4~OYu/~DKa ]q#N![{mms$x-~ӇY"?}?w]SOom>]`1N}sfl~/$%:&wom:){=o{Mوm]@NS&5ݩ2!Bm;MxςU}kl= YlchZ)Gsg~h GU:MuS-JB#3K9J`{1ߝQ]}#K/u޿jSZ*{E9f=evоmgΆ jchgQ՘x7 }o.*rƒb#AFU}nvվ_+^:̍這l@*68 s*`j=WLgkk#0[8U쨀,/"l~u=J}M'a%xL9KQVR%"za"]ߍ1g~>u;ﲣ]pojM*hBI.SNo/@캳1 B8 gD aOkfe1f'2&W_} gЧ&vbގFW;h,21]a~NEaN#2MVT6jҰF=1խ9s[{1aI:G+gޜQcϼ))~wh;];['`JS [Wcpyb IBߧ`LM@0~o^0}ZU۪xi*3H 1=&B$TǨݬT.,K[f^n"x0HqEEc'`& Ջ4_XOZ,艹^ZMBg/\]Py }fK`{$u4ZkOs|ɦ꘥_ih |檼w +T۵v­Ԑ z*'spFk6r8Ӈ΍~('_J, ^{+.֒-o5zh`XhK4VCMHD_]g,t>H$}Ex'1K(wFDx&2Kx98;ٟ>>"6]B`,YEbE3!5m] Ͽ2OT6uSN%9&ٝtvdއ-]Ny2m3'P4LO>ɢF,yzpYg^Zi}ζ^nKӔ_yA]enG /$ji +=\שTMޥ6osp ۽54V$lc>'~D/@e@{cֶ$l}t}\cL'dtA&y;lI fei?sa~Wv+md-o?plyA:c#|3?[+GRdo "գ03k~zmͮeHB { Y\09^h}y*TϞ&;ږ[ u#s>omĵ6]N^?qO.%5;!)} JLgEtDfMoangO֖#*7|vغ.zS|G>f~Hx .]еsLR7FɆѬ:uuheQXE #$^p?jS: FA=}E["/ٴ u{eoڈ,fT>ɧS8")ǘ%]|zxPqOC ءƈ.K}X>oHdK8zqZovMX(yOm'& $NwsӚ¿+NhN|EPBpSBNb ͧБn~^TZs>+1{],^$ oЊ~_ӾF{57y˯4i Pm5OZfч,MF^:[ؖfdsDF 0?=MTq1?#?3LyTg}H?:\9+lF#/?#0=?(x8d<;kpi==bi+S|f V#'yJm)t i/X}Z~-vgf%꼩 u]n`{x}u)Y6jdg֡~ۗgۛzǻ]Q5U\cfbWQe(@^qX>tlFf÷-8Aomʒ\~k#7%4iڏhh 3l`E3f:"2,`z4 vÙ=ThDD]Z؃)ONF鑪ݏhf`|q.s+c кPRDZ9?tDF[!$,85ǗWؐ rUTUUaWdg `Hra5UT(8k߽mӭ_Xw(DkT[ʕH茓!qJaӉtδDpY4_AHZ x}S tE3HL/$W0mH$} 5,mqz:b3L?%Vab^_yuC,@V` %6HMe?(|b9$JmjouiceEΕl"1&< ˶cGq 5JVZe9l5pUs{@ZBm(tZg0[Z[x)$ᇆ_{KlH)ᯇېPH']wvi+,Ƞ.8)/t-Y4ի ik>FC>4D6oR}HYU>3#of܄;cSN`|D'Omru i ri:GxR!숓.\6s]> 髥T0z`d ,?@X1ƅRͦ`M{Kqem2ANе /K(#?_Ш"0!z= T"_'o_+t;G&aىOÇRK~|8&vT^RiI-(O[n5̙06w1mPtpB,#>49ALB }:@CeԀjt9ͪ@>G {Sv+ĈFҁd-k|Vۅ rbå#L~ I u0 #)}FboAri[ .%mjLVYPfK8 SlF,VD\8"{jAbm{Xb 솛H3 R1GHYT.FQp4Χ{ xF0zm l4AԩS. 0:lh\4AݠɪHkۻ @`h1L:͏ɽ{驰W!DB5Z[a?ӱt+gUL-m%KGyĭdMLzoVj]::;j{OEv?Oڶ[bӧc ڎ ], F\8A;u,R촂%˜b1}en[6Ou`0X[[FuVgovRWZў{H."E#YFIyv Sd̄ D9|pq_Dw)k| 1-:^^w˂e` k[~kP`qCt!Ҳorcn'k^B /`FqA=8`tFӆ[+ӻ(̃=Jeӯ{ٟ7ڐc<?j*MF-uTldV̛ٵ4hn?fJ³0"ˁdAa8V62^vzXkW{ƌ6Ĵ!M)'(F|C'd`Xӣ47!rK.qc }:-iiv@]k4\RX~DD#-r٥䌙ܦ32{BDBi nqSϙ!Vm}о:B[ir>z}J', ֊nY@aU~}N[+kیc;ObCut Zv*@@DT~[&o5* Y<8Ɋ>R_{V_-Ax}~οTI^`A0 U TVTM0_ d.?9]ʼ{r#OazhYpnRh2HWke֬ٹVf;A<%|M$t|cDfg Ȋc/ƭ[^Z7L_XȎٽԮi‹UDeǮfgD`W3zф@Ue-(^$UFζB,E *,oƙWI9sqU:yJI4jVEW]#jTXjmo[r ] M(;W=#OZV+#sA[ p}Fv1 @Edn ~C*LBȃdg${bG M'P&:X,Z%׭L=~¸M ţWfP-D0UŒh^~Vc>ie#E{&LQ)ɼL*7%Z'D.'h1ipF 8Mfn]Ԇ6 Q. C+G ;is⪫G?ǫ!hn6C(ts/_>Ge $TO'>Wk5 Ra PH6kkcx4KEh%G`"<ĮAÇ<`KȨ^amb`rh2rHAs&B0'?N:F /+l߱v֔%AL={Fj`C }_"6Ixjo5{l\QB_>Ƕu]Uʥ5=a kdzBz*uÝ$(`8SK/B:ܞi oj(hLh*OZ 5'=E-{Zn3[co*aDDP6uv"9R}ׇ,[ȏ?[gCez,qݫV[;"!:v;}~jT.>5*K9|*g*LL"rl׭X|#P.-\sDi 2’Lt/$0c_^o%)@2UͰ("smX!AC5+_3QU^}45BWiLF|S'mBF?g)鸉FmBZ08%.]^&rCM.4 ~ @`*d`R'L:z:/k m?L'!&H즛n S^)|+HQ;``?709`-ki1\8՝0&jz %PNUA׼hI w6W+\u\ C"^q8v-vƝ>c|;|tulqc0 >B_8? a`3VXcYfG}ZB`|Z8 `G@H0#߀{}Vcp/e;t?թ&"\/USOU/T Рi@Y#c>m=s LPSr02֙&M& ?LFVTV9#5h4ӣqn6k|Q~,4*/o6.fA-HC֭_Ymv}%Ё^Ty:&_5ZRzks&;wa*Mj<35щ :6q3'KYѐB[B7Tr ͧpl5 e1 Fi%RS: *X:@j @^ヒ>/dC&  O7l.~ 9)1(/O-+t6 x3?Xco&kkvs;b 0+uV?Pb&b?Xt4evwxKݵ3?5@{htQFd{D;9? akUom>u@rX<L5{Jcl_(@] iΦTyh!@( lwg~;G ; 0 32g0@|h0*0uNXY[',zob 4 ̷3[)Nw/sɶ *bꐭYxĮ ammOӺZ?i!=rnQETJh&z\43[)ƪG2ź?m=C<ıҪ#PHZf04-'\*_kO?Y&xbG#~Nŏ;\,Y~3؋\ ;@C7)BV_/,}MG?WiAWC0U :(rjMl*1OK'+hŋ6+^W 74BSQ3#u kgFC,q;Iy0ȟ*u>&B h l/=tij##Fc*K# {zggfB[`#S4M( `lZrf+9x0@?\9\ė4U"f0pP7A@F"3sWZTG^!!+E|1;W( 4]>A!ZZa{1 jkk"!m)Tv5{ۣ\j <o>K?@nZ]f_.d:^{nP%t1$P#h95T3 o.d{$x#;ީOM1. )%%~vĹ9ʔ v:`0ۑ[RihM>҈`˵W!yl[5;mO?ȃo igvߧ1xqgu!l;Tf!g4hp #5T;60Pfp\ "oY~m|D:llxJ.ʖ<}*q ?Va>> #PU}$4}x"زQ-W"Du3}').;_Iy Mp# ?OV酡%YOCS)إ*Q.0ᾜ};c\\/@ d hx虀mZ 49]ge*#=lې ; ƥ}#K`Rc @K@\uR+S+m޽mwq40*̈@$¶!G)-Y M2uCb1b3<=b5MEp Р1 9Q UTS^- 6yÄF˄q4i;KGOKl€i>f N=okchxiP q)8-; N:c > R﫱>xA?!k^.'tb+l)i9@+4 },n03qpha]OgBbKIKU!S, {J_:XyUh, ]$-ʇ:o2{\:'(LH XBCp1hi-Ac3!n%d,apuQnxHˎeȬ oH,斗\rI2S8;7vȫ/ GѠ1@\Է@ OXؐ!_V,@c %[9]x&sB &iUQhB߸~tLB8\LF,#h=RQ,x dB2Uo}[-4O2CB̈́#ā\Ld^R~G -;#) Tn}/KUf¦Ab193w N9[(c nEgOƾ\=x!V!oрDÏEz?n}@`>.F21>ǝ< ?~E`F>}݁2^k.|5}B0[߇οɼkR;!3H8MYOCAIl @9m\ܫ '&GaP_wX[|a݈ =[*"lq(ƐO#p+.ݴ<8Ub7~˧|٘BmQgczMG$n+6y7nx&|Wt6n+N;ʷ% =c1 iB1R] # >4;wYyA ߨؒ?&~3%;srq>Gv1{*}n̫/3Pb "ދ9}79Mߗ{R$ysKB);g{DT#2#?"hS\$ru}K²-L̞=A; -{ #6/Åw09FK눞tK1z&gU^u^co-<(-L 42h#,eA׀_M^NkhAi*$P\B<\N1B%6jiV &rV 8Aj]8F|sЄ癟t8hEt:  \騖3e^/l>G w—#NP \1!@,#u`C7oՑo+.]zG2f ΚkVhì"ጜ^Q| {83WX)$5D q$Xp SbG4$$3jrB}.VԷgȉ[6Y8^~h䀺{M{\"Az `IgFe}ui9G`Z(gV)uGT@YD-M^#M>a_)l3I͛>ݺu?bW+;9\~=@3EQ  ܬL/ixRӀOgcV{n.xv1. V**i[n5]gwҹƢs)-ˏc!P/R-=0Z8Pxe 6B\ީ]۶)>F_~ʧ|fG#(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q @D" D(Q`):xIENDB`ic04ARGBQu+@ =0dGNʾ ߅zp[]{ 3\ 2ysہ$`fh3v\ fRhW< "=hX /2RWZ_sl{FMTKJW]_kóH]GP\RKX_fAO_U@S_iؑCJaYKժ%ܑ~%¸pqP_!IL?JӀ84:!)(@eS:X /zûsl{÷kóѣϸσ[⌧DJȫȘ=]&?&ŲLrP_"KM?JӀ84:!)*@eS:~X .z»sl{¶kóУη΃[ԿԿ⌥BJǫȘ=]$?}$شSLpN_ YK?JӀ74: )(@ic14ʰPNG  IHDRxiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4@IDATx]|UKy4B{! +6VꪻݵUW]{&TD)){M$/{K9|ySfs=^Da@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@ڜ6\@32 @ p;4&Q % $P€2 >ɖ0qNW Dt 1L~8F+jDy{{kkX߀,O_QQQURRRQZZZ )(,,N.i,da@h'h'2€bCCC;u}hlllN:EC@SL^^~~~^PƪB[V(k/Mic;ef~WUVz8,k}=@kU.5SK,j.0,Tu5 eeeU_5 9b/ (zngJE<U0 q4r8Xt@ " -`@ &dm~ze?[nPHo(W/(BM5P)\WN~ AOK^ B% -g-N|HSHc@ €6HHH4rȔpDGG/).VC)6_Sk^ [qo6ǎdzyAW.)6L>>lZ:e4 جPf0 VXa@ǀ€`T/}*0*...,**ʄ7WYi衼4QqVNe;H6+kƆv,FA%*tOxx 1߀ϟ,W " x<bx+ 8OF1bƨQ  75\T[3nch5k7kky0W{}]CK _t׮]gސw^{^4)VmV2EEEaklR @1 =sc2HLL<3%%%.Me_XTU\T&eiT)5L)Kd}VW{- |ky~4 inwkۮ__GK/2]s`U(+C8 @g0 g]t17k]‚˝QJ۸qޖ,՗:Ov 75Okqֽ>M7sn0@^gF:T ]8'ދ0 OVˑ ;?3ϼhȐ!'7ږژ=*#5lo\n[5\- Ni=,8F_![+Z{<"}L&n z \)| rH[G?=˖*}>teciqRdK 0V VSn LBٳfͺ`1TВpS|oZZx 3= F>+tW")r \6Ưɥ5co+\^= pBa܀YP#;ď#㱖Ժõ=+FoXoL!qx<|>;tu<3Sa_On HA"0:Fm}< <5 9J#=Dd@ |li3.;vu&MۣG_o `m)|]pٜяJ>IuQ e"1@@ B\:#5*ƒ^"€K1 K=.ɬHA9sfb[sͼio곩Q?>NB۫|n;ߠZPACf%4Dg@ DA3ZӧOi̘1 zn%=Pk5}߇$$ by xɂNEɆ0`1"ݐ?bq1\k*}rc4thQnȡR W@78g_8Mv ƀF\5.ׯ߭gq޽{c]o9H8ŨmY{٣~;tf-5 ULl< pAaiidā "12Ƒ087s7왏؆Owm.z|X,R"!ADg@ 2`=7=:fg{kZ~;T:D2b0N`?qj^L̀͸\-[wCdeeic ׍Kvݵ>۷m\mYIs!}q XXڋ1ڋiN[0>࿛={<(ތ=oo*}322(}#" 5C/O"@1 @Q-r >cƌ A{|071*}^jD " t0Mȋ\+q02{w۰a1,Oɓ&ߘȇM~aYz|O 7t`蠠 YY~޴u]F;z0  K^y0pp8gtЩS'?MNW{o+{p>]{vREX\N@T/.G 2PcEDpb8EI-tԩvLۨ791E$Ma`h2\WN@&j=bxʓv XגAa@ ypRR5]ХόyQHЕ|yy6.'ѷi?a@e_ G;eEh1 Gv9h ~ը]_2/??_S6D܋v .;np88}w z?N~Q8ˈ}VXM@3 H 8 o n?&GbdY{.٥)ora`4 Jǀ5:bLȲ-  TQVË^~mA .p«fx2r !' f+˃T[O 4cƎǀnY|T|++*gW?Vv6~3 ߡ?8`'Fd`.{/4#/ i @`p  p uf@ ~u*'B%)a@p0JaI`;@7%-ɸ bCs, ?B8Y$;€0``@ & Xk-Āxn[49Ho(0(3€3߫? ,1W'βdd/=D% G"݆/h3u:;+b@ z?"tSc"€0j սvCW`@ nxE_wB* $% 4~ 8wUcDܜ1;"|&>t`0 t$08hfR ##n{h{   nJA2#=;`p1p˝fKw$6 H k*Ypَ9ajs(O.'qXfp]e7 )o0M"nF.8S$/c}:.AIɭyEwEL}L^TZ3\'WpbGpHXmD(o NŮ)|, ` X d"@w\v<@c`2P!@lM0P<:f8VvbCj,5>8(Xg^:k,!"NkaD@!B@ j8Z ,e﹈3 !٢೼TS3::". I Y=l&w@C1&~`E\1\90˝g@7(p,=^p@:|lç;ƀ{2ۚ LR`@ $! ؀5Eê0 <)3I~ t$By " xԋ"Ϥ9| =[>kl/v}a Л@K G$d #``行1xPA~(8_12 |u%/81 2(08gM7i})́:]RPTmTT'b'?OiiipUUAAǏg/]XaVK +@@}*#Fc%v'Q{d4{W+JK Íٟݚo`LI.ǣUXDfS/sn#.Ε 7/nb!p+ߌݞ]9pb8oPwFX ,4YenД<,/T-N s[]~ Wp*+ۻ'>$w"1@xad-~V䍸q]rg[D~98>P&Lnu]bcc0BJ+a<v0=ˑC=x?a)b?8/\V J LhT8 xD܌[Qp1]RPh_Fou4~۴M?UƍUqqڳgOϿʟUYՏb'QG7Y6w^|wI\RdBqƖ%o3-{=\ 1]NPY dm`kwX[?*65lذ:5~{`ÇУL̟1gBTm~~)g`mIp9G.{701`2W}QQW |fK{IUqTPL V2(u#{0*a,%qUUX@뻹xĉ, Rda x;l o:b€9ɹs=񃸍%gc? nB ,{lck^TU/Q*;5}]N2GD(sdK%¿ >S@ػw_smgi4`U[hH`j-H<.b97 y;bH{0 @{ܶϨ+vǨfih.e,]q=@P0u߿moT6%ƒgiWR{_Bkcyi!лkׄJ4)?A6yU&H'=0<RlJc"/34]# ^4&E:S%@e@.j>@ P5C~*̹s܍Djl l^^^s$(3S#؏zũv*NܹsQ  _:o֛L&Fd#؂,tI A0X`#d#  Npqd8)lk^0WVVN է;Z^A&?Ѽ%^ 6Txd5e NHP99PccS@: qFa㤩SSǍ;dTkIh0F/d8[3[TԸ1h '48`چW^UkenZO&L_h'@!VpyDDn, e^cτz{G0=Ϧ { zM{Qn…Gښ՘{Ix*𴯗׫$-XqG#GTĉQ2'aIIZ@h$}@k`<f3UO O曛?CYreQjGwdʔ(CT([\:bKr9paK_.p- 25ڭ1$—]8o'o\IZ9Nf EEڼ^Uj]0W,kqty nݺ'}yX 40`lA :Al11Q|kחV ,:N )@k;=1ډh]J}ݬH TZ8j %&6}?ޘzw7~^Q+;@s_0pom.ۯØ{p@ ޺MڙG\'^k-v8^ ?Kb FMiEQK}+y=WAl$2k_j87#?>v@ m8A0X럋)jPl:8VS ̈At &叮vN ӧ6?=Qa[AD_R'MR0 bb9p#n{_O=M`3]]7@n^N"``5=؉oHէ\3AȊH;1`S!Ny4y nj^}T?t2ߝeVFor{/8ͣ2XuJV㵮Ĺsv~3i0~<V%˖)NPTiiiOkK6?`Ld%쨪I 4ޟ0/z%1! Oz2:$vQ1\B Y p oo>Enl3ھG?ѵu>{`A7(sx'h/bݺA_"oU~, c;j`cǎ*6ApbsEaaQP{zE69ϘrsOÖ!0 RۑooӁx JsC@ h $\g/E\xX;BG`Le^C908]=(g`Y lDڐv}mxpEmz A-ҥk`()Llj „=Y_s xޔ^0!uQP9eJ8 -`$+IQQڷoM0PuŞ'HGy$aqfi4&Lf{p_g#e CϯH2Юʤ ݓ 1ኯtJ=q7gzh\qKZlF;L l^`|@4 ކ}a;3[^n?P7&T5aE??3k"j&؎eE`9׫k<}*sU8\ç%X 4Vxy^t/0{B܄K+*_Dcú`auKףCb1b"f>FJL09?u1cjۨ/r|2/`O=`3`: # hx| Ç%m^10W4v@ZD l|> m,kaCO.B800*FSK}6ȯ;hyxU앃#$a=*חZe3 0aB"o sxNc>CE8f `,'#sG@ Q1,kCyg  Vi>ێlW?̶\(lRP6.ֆ5ql{(1 *PQ|hjU̝[<9%K-5U޷CLtcK@eee=wC-8n&ʕMf`r pF <}@<ƳdL[J9^y܈!b!L5ujÏ_:p.p'>x ɐE;TcWEms{HTS8* DQFa!gImHh<|F go56lؠx>V||Ujj*<&mJ} ͌*QC%A37/]-"0F7im@lpI:ftcP&SRW^6`AnDf<7WXZ:YZ?1 ɓ٪d:ԵB j""@H87T+l`,Pslr1|7A_~9H{}iwk%%B[J\=)ݩm| 0,H|867űG{<{_me3˔Yv܅)TqqM(:zD76҇1ֽ: &'9Smyyulm"Dks z*UZZj, > \< е .}igC$[ͤrhU`x?r46!Kg@Jz1(H,`SuXc9gYy{U T&qO4U7>k&llA4c QO=R äC1ؒ!Ȑ馥i3 6lli9@ˡw^ŖP~[* h?4<v:Hʯ9jo||54ۼMe_EXfi.lrcI}\M\ E7?1(<DICgi><|/4& X֗m7o נ)t8}&mF,E?66L[n=C"|^'>{VlެլZr |eh#p1&wd[5UP|co&&FۺK]8>,PgΞURRZr*Z $F *qNb3fصvs5f!S`dz ]=65q\U@c]<\Ҽb_T}zU׮(d6h2&GʀMqc)6ѣ‡a6(Ztrƍj6_ԠI5Y6t?x jky嗩@]-Pm^m2ahnfP aK%FԦ^7|^}pmp3*w.6o3 $&v0`?[qb@Er6 ѝ ո8ñ#J+x-J0flUCp'-K $98P%28`䈑Ѭ0ʙnJ}pt:v*3ԆA1T ut<X 沚Q_z{6./?P\g3@[TZsNEZEkld~ja授;1)]Z맪jtg9K-|,to\N[l):u'<l .h^mMu ;9ebȄ B0 E7um埮nj222rn*]ktp;PCD3g7PуJ)6s)wC  f!ݻԩ עzHU작sݪ27n޷x42^)ta )3@6+P21v3U9pPU)0B82E8\߯qHd\ҭ&s`\bo*ܳ4lA6aaӔ/ 12WTaa4|'s >}:|/XlDYfQ`ݻgc铒L/.7{TT `|rC{8{W^ׯ@ !*zJ%'0fvjjjy睗6P$~Zx/޼?ߩ OJrX+pOqfyBͶ_~QG1t +K6 )5ykcƪQ#/Tlo*<1~o)3psI{3Uoۏ1^̨v=6H pihmwY a@\C=c`=?^_c`!65)-MMuʔ)'N99u(?`ubL9w"[֮];'99oСz6~cKt?=X)2p/~,mg@ ۹rԑ,Yq9gEN?1^e }i cb@_i_3}~e*5eA @VI?ؓ#GnU\\RTЫeo, "OXt{ң0 \Wø:ӧl0~8-毯B1IʌyWj=Ii"1` !_M4_8@uVc:0>ZWVW=f6PNjsM~'Ixz޽'tsJK-ް@SXH.% =Ue2(A!h6<&=x ߺӛ07SWps֚3zgsռߠ˭^X䢋.:}h񺒰1Q ֖snOztꖚZ3c쳨Al+D-_ (Zhдxg6G0@q#xВU]n@BN3~x@m [FμaxG_z6=?쓞R (Xha_ζUh s_Bz2++댊 ttE/fN"} *w?99mhGC_^yy hԮ+|}i bN3z誳:+mxü`4ZJiݧx2sZ3:Ao\Ap?9W_+ v@GPQRePV܆9Swk֨=8Y'1iCA1_z&[r8$Q5ds7k68<$W3}|NsذaoFo\o~0? m1[oGg0.sωh]Km z2;vJoi~ sjRO;ͩk'MQpٟE?RN^epZ/|Ԑ&kIU|(lAzE4DD'fW?.}i0`T 8O\b. S9٪c@6y0;=~I3|}++`]ULAוl|^A߭Y˦}nb|7w6~=jˆ@ 4saC*#GFh~rֽ6`<y(A=rEr$`^F.+,, }-"%%-\z 2 ,DSW|ZSFCV>%e;wB٪+^y`n̸uBRp)R9%EWRۈz&OLJ7L?ƉCA]nAMX@EzgEx ,;P̘ >wֲ|6~@{4TL1|n8Ay#|(tql>97ڹf/d< wgLH}ʟu`܌_36o޼q%@E˟Op_bsjY*P]05]qsl=q?xA}->쨡U4ڳ+`hq>ʲE׹nHYmaէAf*],Ѥb?rꇘ#UWLTw\B 3.חʸD4AiC7o&OɵDza]S)6&,G?⼇~8] 6v|o }`.`b4`7UDv+Nq9{UY9 d\ cxXQ{h.s]ؕEq&!Ļc51> fh9l(pp=/O9c 8_8?6e=2L(|j;Sa_TNN*MPOn]ƍSqVƎ[5~" p׳}1ҥK31J[w%ߛXkiV|0p ;߫P ޢ)fϪ{\f?k}6KDrr!)G{qga_v :Lnp_}ʠ(Ec{l'Oڸs eTi==>a 6(;ӂѿG_?4q$wv8lݦMUAqq*蒉6|`hꢧߴ[O#`2&cǎŒg -̧`DThf͚16@Ѝ}ɉ;߯]G &4 K,= )ɪh7:y LKKk1&ȻK#$[UM~==G j٫9-N`PO/y5tTL()VVR{_{]`ŮB""嗩.S(?(mRcG#ヌlj O^&i(|*&>a qEc5^S`sE>DDC+[knf~.w ֍A3{nXx'((>*_gݺuFRW͋|ق4믝Otʊ=rCΔM19S$/>zrMΜ9+ ?>Zu7۰/bƌ06v'|?7+f[~~5p޼j |z͜2yW>A`;ĥLV[z TF+8݉ԉ-[ohƭC\ - !ȯ]id-4(l`P\JмU!XM7hR**P_pyF˞Љ0~#9ʠA87hޱQIJJ? "^Cvc|}M S: ?2`$2;3q\!&>rJ:\6)`&'MT>e) ,+lE ܉U:\1!]?광_}]zm_I 0G~M6F g']6IK.V,?*ëVmmYG$w䅣IZ;!?OSeErˀ X-b*߮PyPT2f0[˵3ڲC{O` :o@j Fvr68;Z qtR=q|ˌ rs2~B=r!SnnFŜՁ* wz*70ؓ ^_DyV @ľz#QC5zQuo^ ۰~c QZW*##'ɽqC3Q^_ u}߿{eu$ ^}’Ū?ܾE= ר@i &ݬZPM;a0t,Œ0oii0زZa`B{deg]y**sd|@ƆEޅV\# C=.BќC丵Rx6h1;wx4^+*RiP cMfq u׌LaNJ]|('ǻCY:l@Bj 鲧E$9A%\yZcD16H_]$hC:̓iD)QTyʄ`BOQ;wOy d%KWUU@KxN,-9^` `UQxbj[рA|0VD{ ؖvBb#s\U)}kiVWY> /؉4n-S Tt`p_Y0*nΦl9k~QXk Sr6=J`~X"G4k-uB[~ь!/@j^WvҊƤ8h.B,CjD|ď-F X븣穠 %QѪruJFs08S n9h3~ Y8-_+ξqkFϦƍNƱe˖}AJxP\@嬥>?Ȋ {1!W~0ftk/gxԕ~vt^ĉo~P:BX^_`SC|ӍjHt{j i 5lr‹Ȳ [v=[ z^\F `ˋ1~W \HGvR1-SV8 @A6hʆ 0`42xǦh%#V<Л0&H;ؑT,i;>fZ6i1n$3/: 9|%_P-pËI/? 'x2!S󁧁dF%5UG'6kk'\/Y6RŌ>zvqA `XL>`*:Qo (~*m[hA4  [<~^'0"^?e lwAdp&_(2H9<= AHϳ樐TR 6J?xNMjSP@ 淦Mɠ:7V8:e;v\_Nё}S ؼcǎ >ޏ^6M]US6^]>m1xI<u^B2KH:k5/g͋Iy?mg爁lk^ܬ"(jwު8ꙕFit8cd35H;ڦ[Fu3{6emBFC~`BU/FH!e.F;M9%8.>+MgLWUσk6x.V9lqҲm >Lu5H)oTZ𡾝r9s4|IN+0q!G:λ;,y|?(i,ԩi.~ UmذaYg ƫ_׬W[*Y,o5-QA+_gA7FG?A8dpe)`ЃÇǀܚ\|-ͿCVu]X>4V) BJ%hL:KM\Dym%,^3M|]*Pt_U`tMϙ&hZ0^y#/ ha|Vf?`_(4aĜvƩ“?̠lz_x< B/p "J;0*Or4Ox%ճgm=[n_Vx+1b81qSWxs@cmZo3V?c0+A?+2//\Rtg \TTtan 4Xke.Ǐ'Z xh.1"ug*I_p ܳy4~g,MiMX,RZuJ}_fZ %m{x `a`tWVrƷ6v#B4">?!6 E/x_ص0u-O?| ԾMgO6_"? j0yYl*ֲ3``oiw  C1_} ״WxN5 lH[R@]i~3 ~vIݵ 1Dj< Lyh5pʉ~;IJLFoie iu>īR[P7@DcMQߌ_]mXq ö\e~ct ((8`@ZcڿEy#~=MX^\̏--iPϭ)8 3>q~>$ 5JR^p} 9]/cM^Dvr t/ HfX(JIc%(D;W V%^˿mGmXt֙55&) 9m1ͱMZ:g*]qXaz(N%ﭷM4cM#G& }spRRaaO .+eԞ_Vk4vZۑנd4O(m.|/}L`샸URR8VmP|g#/x9X5. ]`Ŀ*@B x@dncoj[aM})gzEnfK6.;8>gΜizK+V[ YTjj\6ҲRv,^+qlQQA+6lX-Kg۱"gH#@x``m5lĈqqA*]̘vNˠrD XrK<βmOϿEBk?3l@ Jzה֏.gq-D勫EPg`ӟNh ^}P:0,Ƽ g)}%j- U!Q͝y_xҾ[_Ug6hOK/ړ?@=W c UQP(nXbFcL3|/^zW5[= VDsY½ \ݝ G(U+0~Kd !M}-/g]#>4o9k~ǰPi%_~e nMp~P,o@$(DE 5bǾ;0+$ w߾B9ܧ[q__xᅆmP,$b 󥱋 r2ŢtT$'%%$&nI>mz Iu?ƒqàoVN#7_ZudXj]T%Hb5ϟIxd2{ Wj.y4jBY(PT Cs"xΝ  4'Nl+ >gxRȯqK ?B_'Mƌ5vT$ق}T4tqEm(-I14؛;Lxo44sђoa&A E9VڽkՊ1<~sH<_5G^={E9eve\jR0o 74M71ML]\/k*FQ||ZUةC$ Z?%=5M)P >ҢeO?D{VkؠQP|xg[b4+}眶l!Pk`-nC?LhsJiA 7#F O ($؆XEP8aN5G)Yet玦W۶!".7mvHƍ̂ 25ڶm[VxxX 1v4JXQcEd h@$}56=WDТflZu";0r !eS7uhiƽ{N*^NLDV>t;3~&4ijbY4JdGr'ɓ{wZM2PkKS!0m~Aa,AR/dXՑ>uM[PAᴧ1. 0]4NC6§.B:g͒?43e!p0qFM82*=Ctpܰeo,o@Zs޺Y65_,qK ( c`ȝ2SUCf\JIvP%8ت\vsD9iyF\ve9ySP$Ad֬YcVZmolF,><L{l4oc].y-֘֘+Vfka 2l늢K5i~IzT a-2lK~fEf_ԗX Ŵhn3 J ?uydc"Ъ/XDTM(:ğ~ zGE#5cߛ?brw ,ܵ{>"S-j$SUس`9Es{X"*?C.nk6kO k)٨d盈D7߷&Mʆ f|VdlhNrT7 =Ӡ- UW|Ι`M ];%Br2NATsAN:5KիW7es#l/oؿ[3"ݺt31pV6iji:vh gϞm9dAVXea#>"E@E$Y'SNuX׮]k'bWNǘLj[c@>*-°Zc=&>D2o8)qKpC%UՌlTB6J/ܣC(m4]oŕ>Ix*YǟB?ԺH?cp늪bY(}PTnVo1G2+ q:ZCbf5 "[XfL/ (>4 Lʚ5&WT5sL]>ij)(_ViZƷO/\@fuԀAb]yr-E0b}_qu=`=T؝t.}N%ةլe_#iDOxdt!X]dLmw髤R1puQ52[G!5 íxs$][Q]v%xÆ៛(+ ؋1 >JV%SIb,r $O9 ߾ ATCu栾ß~Vӯɦ*\Im"NwmuY# bSGV|1^E2D8qk"Rfac/x =/3 v{! /{$3 Az|dYb'm$InXp 2QBccctz.˙09_eoޜ+W6_Bp!("R!sxA隫M8Et=cQ'b=ŗ1Zħ믙C.R Գl+]ܬ`8mY:CX!-J|b7ŋqѲ"˖DR/*ع,+|lj%Q)1W+@nO5r%*j_UȤ-/rtJ#Ԁ֦mO6u  e c ja,] bfExep8q֗lu_Ը-8u\]'o655 pUAI𜹳 7q{Mh0م8$C9 .%B`*Pێ~\g;3q؏B#kYl% Ko!whi?NHEt)蜺QB4p/ Ry}*d8S(2& Z*8W\nz1L}IE-|Mnf."-jםMqע#ҷ@Zms+<;brʢ.sK/pddkJ= {;}@^eٲ&Fٴ"X%җ5 >.:4;rw1 t@]+^P:1r2;; ܹ3&;z B{eI`ُ(~5Vf0}Zkzz%mJkWϬȩKPdZޘXD`Yo ='`LEOab]("LEI+E~M.]ޣ{EE:."͍s(_1FBv]`w, I 9j_]_I{ :U[?tnbbk&ea9RPdR9[\3&y^$A`ڌ,E{#R.gg2)iʅuY'ruTD3itBC"^W@(\TVE&*U}S/ ׏wm#z=%_c y2Z<PcԇU0~zVWW41 4(MlR[W_m }lO$ɌRxꖛ.3r]fwMuIW!v7`Kހ|||L[;?^7$}) ߆73ps\m)rQANGfR$«U _븈L%ڍu9 P,6VC$d_"X؁M*la gAH5-"rE~ v .ۯOTcBwdKABrlD wmy%eohpIB|4ѯ܅Hg\T>Q&"HtasR<7JOSOyԢ*<ɧlXo-IL$Gd*Bo>涗^zIXNFU}ʚX=,jj|sN2e GX0NQxfעޅ岑$-^b]"xi ȎAnH2PAK-(b5h )a15M(of[DfUSLs4B2 @T@TirH5PJC(JuӪuːڱ0cZU2qJ,)Y&3T.QNܭ]i&5ulԾjuU ֝0.> ;{nݻECa/PQ!3O=ȆFTO3C-F d/P" [ J,>NJ& Ho c.$45=`9cښrې[l|B- N|1>YT}ޭ'sgφ: o6hGxY6s%Z+rOsL>צv<@IDAT׾{gK׭+ /ճ=έoƏ7۷<8Ehri>pD)ʼn(!@_of̙g,W:>tխVZa_.4 OT@_R T݂\0 Z/8ω1WQVj~~$q/&d'/J7 P5]%x2v%t]º-fNB-㘎rb YK/G8J"L:Lw1 ND5.JY59 Q` `D~;1*Q%QG9H!G*ѿ քIB$ eʝJw:b`R>tx]MnIj$ + v/PVՇ t.Ht^S}zq)OEul\].[q['&)NqFNh:xЩ&4 ?uH;_z4)~q*y柇5y- Rq)+oPPy3+w;+BjB[Ńgpᕇ)3)cj"[u8ZBb֭_gg:Gavmq}o{DXctZU+ɝD$L߂ e* `%B,T- ^D 8Q.b &3I)fuo@@hRY&*~)J?w~k1¶*^YGz3>jpPMϣ2TY w}P@HUWEwQ ->enVhv3Gi_~GGYa}(*aN+)SIMyMF(a_K"d#xe\nH=k5d"zғUφUYײ륵r!y"m\]~:Z.(ҟ4nsCK߼~6o:]ݼ@Y:JY[ Hc ;7x%DU@:f4qaJe،QyBEvOM4}*"dB`a+YCh˝wv0NbCaϞsfb\ Ҕ8y 6  -h!Ѧz›o&Z*żt?HKb#YҔ:!Llm!>4 qdrGZHeaE\>ҎH⬳ E8B3,20 M#:Iġc-.(iK"9+Lut)K9}Lm8,)U.ϮE1sX>op&,|g"0H׭HkGdc0[ﯨo1cjiSQ/-70wňf+*?A=!@ ٱc,$|-8v$-prñ;F)ʪ_ʮ]V|jG^E SJC\3&,<ԬZƥ)YW[~E!2ĕ+V7HO8uAZf'αb~Me)j_K"NX >3J,@@&Gǒ5!/S"(qj(ݔGK2ٵ< ,[^ /@ ifW* gK߲ۛr0Qh8%@8𖏮znIӑJ޷B۹ZQg6-+M= ^sOmEoV" IB u\זﱨ^_RPN$:O՗q0{ п km(9u.ݿiX1?~7z Vk͗N;b̜5\Ņ5p`qc""ӅktΕkr׷4թ'EWAxCB"ˀD 394lA\o'LVb$HPYT1M:YIyOr$.eoE"$8+"2"q]f쵮ڷ!Ŕ1'%I`KD&GE2HRLDt~0$t$ؕÀ͛ER#(Zz>Qa`&! Ro3q8rxz~8{|L=*\f?`C)v]v{UB}T=v@nߓk,r+,vyj(~=駾-  '/ rM]:6CfU+Oa\3czKÐukݦUT\8 jtL6&ɋdh\įb AV-4@ެf32yv]5"a~lOJ/;A/)rT7E0c?s=;6++;FNM:rv5[e!.KߣI+VȓTv(ejo4a)MU&J6׊ @*I lf8Xn&̜ͮ9;I%$~b!n};Z} &ҋM@jźnZQ"qfϿ eGPܫWbS &VQtߍÂ>6<׺(d$HY|QAٳdi:*flڒ lZv a[?ccMŸ=&))2uBAk5qNRm0.DZP"*`kSV$ FglZڵk|zí(czZ:\+.rB,qFBM`6 4$hL +18 wpqSM>#&7j#d[1]^l5&F'vE+Wx/A 1O^A|{ׇ꩎cOz!'yX{<bDΈxjNVpLa$J^v'=_(m5$N[Z W\1+>?D.]Lm SA~YgZcB!mfYf#H4sѢE2.9hzaהּm۵$`b( zz:[ .0a>VGk+Z2]Yg47d7|ȸvHxa*"">bʫry9 89 JeE 44k֮.E-J|}mtM4M:HlT$IE_ -io9 b'ROD) ;l"'#-"G (0ي 2f[(O}"vE+TQŏޣB]ȅ5MkSB seֿ@vJن$ }/ØL0W83(}{yޥ_cq')r{O?ݼDO tB%2j٪y(Vz&ٱ}3 [C[m8Ib lMRK"ΚWȿ?>{%%'F>bc<butPAzU]/?JQ&'>LE; UC8" dX(R/ATC(Mf-1Mܺ=+VT)M)-QL4E+"Y Ζ}ǂx-P`!lbI;M%teO"{Vzn9׫Edb`QęHXWl5V޻?BH[T"6 rH,wcWZg?㯒!S!x~Bh/ k)@[7k[ [DBrϖjv<"ֽ-!cmΝ˺iuN\!j$c]OEU KzQ, }GGcrЋYB9fMQQQڷҋ 0J-ي#1LMjM"tޑ( @_]p饗X遽?s3z_kd((E? ( "Udžb•& 8<r/c?=@gB0x9|/aH͔zFrX\;,[n63rYQCWVbv/2ڕBz!yזg07@| ՆH"*- Ns Ͽ/e]>w-u<=|+; :J#+`kn0kڮu^Y׭7kv1a53NdmĄ v'aC?ɇ)iӄp:kEkd'ulp6Iq侭uܑ#u1BWlBhw\Hh`'JJ-=kq4I؇Q`Xh} M~5y|O}698 ^1NwLm!믿n fj QQ3~ʇ]J+$X~C-Ti8Lܿ`ISM~eeuޝ5c'BFc2rEXҸKB`;1,6?,q_9lq}L25(rt8;T^b#-W/M !zM w"@T&e9/Y*M7s_~56dse[e*Z6o$;blJll#F@;o -Su g!2مV6n7!e'o} .IܚWjonߢ콙f f>\q{/K6:7)q=4\a楗Q#Gw !C._UiSt>1f a/` G5]*Z:C6ɦ\Ϫ q{_o8B3(7=[=qҦn1eQ%T$L,<]S] %R… ~WIX Sm\CYAqHDt׌=uaqUn5*num6^~cb^rټ v?^fu6?نW_'J`|uhb_aKfi{2UnO4Ow܄$&t¥oUW_YUVxuVgvbԺ}o85b,K;kEPvGq[0[m|]b)Z%eTt^ݸw'' IMM ٴqs&MG\㭱$/‹/I|<|2~:J~^&> N^ծcPZYHHΘj8'I rvhu),׎T(* Kc| p_UpZ_*h}lg CXr@םEÇ[/: D}㏽U.}ԠZcڕ!J6ؚxk)s=vEĢ1u:V;Ia𗜃w wgjj+bE25腎]f])ΝQ5Z*R Ԫ$IOT pKZzl Sn|HoO Ǔ|kD,\G={2K't~/.p9 қf D$k`ՏkAx:ƠdݣxKO?@??hXn|G]4`>+@s[\4Lj֭Q}ۑCvb lhbTcRƔ  p$:ue}gFA-bEƛ@T(뽜awPD wzlDzF-Za^uԺ.ծ@/I 0y Hy`RC%@Uxuo/_>#;9qۈ 5QgDyI$R4i:NH/$/}Q@5.vQKQ{թǥX1'Q}&cC\~&JS<୷L] wH;!nd?smĿ| sxcթ!ì` ,{M>,y 7D&Ӝ?2k _|E3h ku}q^oM?@w,ՙQZ^Z/1u]!d' _/! D;^:JOz>O)r|D5ZtT41T^QR˓9DYh$-^ W!W^Ga9($ifErmϱhտv>&Ξm&?Y{{V}mǵ}{\\rB@:RxDu%KLdƦQSoAa*E&G,J}}PI;$0n8;i@"_Xn/xXz~FRI&MTj-[Q H@]8vΜ9 #G6<*Ck~WB>凄QD?p|$(h_$ h(д/`p7TJ"zopE:aL][\Hut  Ejm?I-mX1'3H {YY_С6IQU/gP_D_(~ިK6UL?'|1X& _a| 7^& I-dߗ5=Xk"TnpUn`YHH.9rob9p V^ƃ[ҌHV/GcǗt(h4Q9R@΍b+Mɏ=JOE[#PC{S'`:x =_{tNp  Js;5T)w=#em_ 8&Mo3Oxb6J ^1N2N(_J9wpp@ݺuCHJ^GI{e}?@qegbX__~ ]q%WU;۽p< `'yS;+vG%$!\cT쪲}n"^83 M-CLs}au4f><VHw.\hh@"P+(5a6}&ټ8r("Y֢R{IQ-zraXdǹDױE6xET!F@^x_G/]TI%T( -Sj͚5ω΃DֽVeHx+lD;8G@\ :h_ d:^k~%mUoe_|!0v!ȣ&CJ8F9D;DRRGM=UA߾}Axʡ||\WjN>?+pHxqZ50_eV<"ɉ̳u}w9 %A ^U$ \WBOBH>N myƒ'Rg9? E M8Br ΰ~$-[fS#M~nm:piwFQ cPܼxp^FbPGį k_7nz!s0U־!xuՈNj3[t3II ;`PBBBRK lٲ{Gr"4P21p8~{괭^|݋Vo;ÿϺcǎ2A7sK[FR%D%t/7۵[Gq^pNb$Dѵ 8+L,Il}Q٦b:lzrqtۣ^\vR^B?*v]OiӦi~/N Z D'rFU._Zw 1o1Z.ƩTtu>0QyHEO楑V?>&uqcۃU=] $, 5 w9F"e]%pT 0 1}߸8%r9!k+'z"=4P0(J;JšAq(]5(|qԅh<1krr?Snf';v{w4P%sWfsϵYZEӍ76D7T m Oci3ĉ*мه>.?!j%sHÅHn0 So5`@~\V#i)Nyjq;!㞶b20C{e1zÁ'ܟ`!Yzcƌ/";iqWw;ٺ1]jժD\}6#r3P Id*b훺m%"# x2ՐlA3@q׍ivI'$"bTޥ/K Ac5ﻷzI >ǦBW&o5q\Ϙ1'N|qL*[㹟s~;YϞ=;Ö8׍2Cuk3{x;TXOքL7#N\kFoퟃOl ο/h{E&xŁ1^qFZPF@f6j1_oYzذaf**(7 FZG@eXD'ї3g̒/׃x:&WJaX+jI@kĈ_JB6ȂS/B/Ľ8/G[O/Queͪ +$ P`ʑv_N.OKD9/dF|Y߹"ɸ ͓ȺuLW8~40rkZJ4$Y7@TEbդPZv05OFAL8:뉟Ӑ·߱?7k=7<&!!KJίj@K|U(#D\FP._ꟃ;}gwG11} '\rɧ?S++P] %?[m`a pz9绗~JNZc@:g++/~(Pim#Ҋª_8B|nRd\0(;^xFUMEqTޏ>co}Qk?tsxƛaYp95kg+Olk߬gk>ټ놬vb5w} u<#OγAR irJI[Q 跊>PcyA:5={'vfGr[n% v"z_~yJ0JL[V +dS$Jzeҧ)"PP%& ђ5VJ=?Aco6?`{?WHUGi }^UH% HT%Lj~sJ>ẂuG?P-'2~ vE  ?kƺ_WN;l!pqB8SODCDC0"\Zׯ|a(Ե.ɊHz!5 qٸq &샚}M8ow)R䒸"8J $X7aELѤR Ћ++ u:v4MK6S̱[g`3\vsh1?4_i;'At9HAo:ͬGNRa(8%j$$guu+F@+FF+?o, ~;Xc<ch{tM9S"6C6Tz@[āK7"]j`r%` {/K^E3 t оtpfY$]C5PmSPV=K0IPHi%X Dd8;^X+QݾnT*֛N7lqzD*@K,# QGux,x=ĂUgNv.ɸ/F I2^DJ<;-6sY ~?%މ4kWbCLh<ė)))?Ud'S;[w\wÐl =Є6/$4 { Ew: ;'Yv|;vߖ-[k)r;@9?Sd}یҐ$@hF.c 1kWgN:\S YgY8\DuShCXڈxjsDǤ4 z%bJz+e,*HjF$ĴlejF򖔨m!q# WugYҊ8&hJ>!]xeb x" bk~i+ȏ\lD@!Fr$^)F +FRN (L"pt_׬5֯w8|71lV,휿N dKgr>#qS]#'~eїervJݪHM*w?^޸h!YDVOPsgs`" r7Tb~霟25!Nي Șn[qNTP|y%sV)akOiMYGYJO]gIOe62QsJu6= E᫯>P8 R3zc砤 =yT'/w4{ܤc\h )E$}RQYVPƞ gOǏe^ U1qZ&ˇ8\ڒ^Lpϙ3Ǭ3;?ē?У*q'#V<?ܝ DthΊEX&V~ 7o/?WKk[ -@\x' Ru`a5ہe:;vZ7`p&@#\ (}(-(bD5߉Ojެyφ M&z6 ;;R ̠̌V%Ϳ)r[@5,76q\6(P W ,d a6W_VWi3v,?L!7vT {t}x(aw,Tb =t?|Λ~C\L1PZ@3$jڂ>2Ϥwf0qB8{q$ B suS.2PvU='|8\n܃!R6z B`U>u ]7{-yDĉkӮŋW+ZKwiVXkڵvtA$ %*!*}R_! ܥ*fmkmRj c۵k7ҥڶPo4tq@ "18@,D4o!Yԩ0ňFÆ CAI/> nQ>3*~ڴ>)\W7nYڗE*HRؿMYU;xGon81+`l\6POV "'o#Sk7bF5އ޸L>쏇 rZ!Q[,o4#r"*f <;vIp颸O>rՑI4gwn9GY;l$x;#H^;$s Z `~g\NDT~]\fY`+Ȅ@*1Oݥ7 .駟BZ{cccTS:] Yy?~Ƃ ѷ`bMXT.鮕`Y)] uvތ*}=UK꾬};R-[jg>'ΡcjPy<~$g *"ET4o޼ږY3&8@> Og׼RGґW!p;T#ɔK)wQS /"𚑣^ʺU :tvz0ѕ\ 'L}1`tAdR=+$4\~ VtC=i?з#/4? ÕZ_@c!~2(; {gVn`ފ!@\j+M\kcWbW,o"< 3PAiVt.hV-zp"!iHXK١Ym]ϨMsrȁ7Ӕ[)~FJ DU:wzuTzZJ<'HNc\o D~G>867w^jܝڗE[ Trbǟs){=ه$7 _lP ZޟTG5 Jr߭kv#jwGb}D$]`@R{qb[qFDF͛'k{{ )룖"$qM_?@B<}N\- [0I;Je[ +o,=(4m>g!]jR(MmISE VA oG<L"_Kz41Y0(})N SJKζ9vz\*`!X87Ona n]aqLVØ_1㯨 U9E(WB~1\! Ћ9vzyx; Frbg`fOvx/_k@CyNp[(7w Z i7ںb FR,cG./ߪ߿?uK|H'_o}$)+;_5FֹRQMQwΥ ґR`~XA5uZH;W~ܐ>n};zDȭc$YqUE\ n9g#zBJXNo?pG7:X{5^*x>r~t tiӦyUi4ڕRp1`ь. Tb |t{-PC(QYԴ#Fp!_IWvcoVb'`ῷcÚ+N}.s-R䍅7]eZGCg;iP;$Qp.Yg1p1/(ȍ<׷oә@Eσ}wKovk%<,[ϙy;N:T)%rgna/?2F2rE: ,s }1^c5r)>t'UXX֠GәkrLx8_MuLܷgykU@$4V2֎|!{ hBBBbt^ssb58O :Ɯ5cA:+_>phQyiKORH @uJ1Y{#黃(9B`D$~DSOCksCPpo77>)d@PqU<֗L}:,B]WEqW,I9J#@!|%r.+.= abM2 :uӈ!B 5,dW~z ͍Q!/|\n  =ֹCmﱺG,w+9`,-u1^ eIEDcq B.^{բ嬥)(~^DӟxҌXϯ++idM{ůDg qM)>/iEC^XR.E?wiw\V8H|,+m! _]00}W6l .0O!hC%y0(90 7;kǐQ\{?{`E%#9 " #0tzgztfs8g:0(AAP"9~_WKyo]z=i{56t?_E“Pz_' h(Fj+ 4e{!O闁VJ{]+^')Ѧ2d]_qb4rY4R}?\Ŀ%=bD)x@a+2f~-k[5Ty7N&"A/L5 gOs+렙"m5RqTNFO#ۯx4I޽袜[4_]k,) N7R*$G24{?!20V#{ ~&6e>ݔ~I[o(ǪT5#,Q,|0ŐZlOe%npڝX[+Ajix aͳv$;.X/eyU='V~ʹ&=UvƾCϞ~ᑽ9uz{WҐd=D˯Iڶfcv+:U10J3~y/"OAuWh;mi|GaV+t(wkf68 !Lcȭ Ž:Ng̜xYǢ R1YE`&Gw۞?!֗oo>ʔ÷R%'>k ps:z4BH=JR Dz| -# Ӳҥ%fc ,`$3NGYیKٳ*9S_6l?+  Ro7 yZ~w1M@ڣ2˽fPӿ܁v;4E s>!а~ W1߿{E _a >!^0&12FWuОmLUu9aaF7Y'і83>nƧjUwaTqĻ&]zQ 1.aND6犁I {l0h9e?ȍC|Z̯,zsѰ5u~||͘Hw\ҷCjZ/qܪLu2^3:p,2 pwJUI;G#̍g$u 5ciHи# >D_۾7g 7D_PaU POs΀nDmgv>`~hVֺ_=Ly"1\i`k٤jG./Ǜ5d)U+Sot׵!*6'x.V`@]:-],7[D= jȱϕCb˦Z]b}t5nM |vaLѹމ2T7nN>#FpKJ3tP ӿ5md͍G,toTw (mp V,\1mg+&?P𖁷ZYUҒCh|ezF3rd2+N"@x$hT*J鯹B=gVo޳#Zc'n[u\p<1nG4Vni!{JYm\_;+ N׿HM0ZJDPB}*^?=rĸPlF!j57L#`6۽({J?(J+4};Џ:hKy޵.0QgngP56sL{q.pj?B\/BqM\:Y.@Ze ?P+@1e?i1|n}빅(CmNM{ۍQaoZ_^p_ ͔1B@O-ٴwC5 'iWI:{V¢ [|q ꑰ_[C aF`4Ԯ7lP#q+2uW?З0+1^ߟ:xW[x>=>C+()9‹A @XsAt rr _1x+I_mu۵mxd$7O`ET ޣ.0TLdջ%{尽1|+fK# W wנ(SD=ˬ Ea*-CEPCxK+3u֊ ߍtN:u_j׭Ӥg #ԾꞰwAo':˦zL(Dq@K7 ۰u+coѫio}}qM9&9L7?h }}`%9aό?Y`7ʅWYZtk:ʶt8fD<37;Fm|Aㅽ4T K/kܶ6vZJiv>HRy7nӺwd8C,ZJS6'wFP$S٧JXÕ^F@!ڞDem,a ,V)-#C':ۨ{%oZ|z+k|A9Ie7WGViѹRB xIfw;~r%]wO>z/?F`918Rgjzk=}B;4}O:-5(5~k&}~֏raƗICҬ?H!p%2܈8U&sLҺwZ0"5?}GI|<Ҁl̗aQEIIgx[fs!u$,GhfPu.=̘1$ɣ9F? VQ.-M aqw~{Hwoճ0BkGZ1Ճ,M$f2W:%윪v /ZRۉ6^VS2ӸT&Y3s1,cN[ >ӖF/zV9 N@d 6ܡށ}'K8 2~y&ॗ^P1bu C?~| S3ĉffi=h,3N.M!Lt0 6@ fKa}G f5jUŕ,(ӌfa썎{O@[ uLbceoY-5Vh/Jﶫk.ι  KҏX 8cntZq-];YkfJ>8\`5l\sC2ͳ.ߘG?6ҏq9BNI>_Y .B&JIߟǎ d,mOk @Uy>"ۍwSGF,ؿvb1NzαH uvWKq#|C0 :2[^HKv1d)Mʥuz+E&3qTTn WtWN?5\5Df!Xc~%if !_G+i9m8n&VoF >\3DJ6[hoz2 }vl}LʪwZCb@CY&RVݶQU0Cea"ic\0k8/M ӡߡ#PU`,Q 0mdw}RnV]YFt&alȻ|*6?+IѓiCk Kt]W‡Fzd0z^ 3!D[hBr$;I:= &/GV, `eԱ4N0ZQ,۱nb3@˗>I  *~#z^v2*!/HI?G(] K*gיJ?Q4](x`4 4L %(N0cU+gQR Z# ֦ҼC{(#0|ܨ dh\,A|/\t[4/Nfެcx1"XQ 8(EG+:/qbf*xAj{SbLm\@p5aF>:̙Bb)k/DaEx1 t`!@3 }zN]y] rlBY%.y1 m>>[uP1y Q}#eE({hfmqzŽ`V%K aY<<lDA꺤F+SM"2Wi V7Ia!w*C3[m7ڪ}8qqB2A AgOǻnt98O = jnNs =2홫HfXK??It }oϰև~D4~i;uV>/Rߑ*za6a>Y~]D3⑺^AApߠvD@f˂<2rHvs*q}4q 9!>TR3x4SуZN^b}>O5/ig BC`w,mq N=OѧAB$/VȅRaY_fĿL)pA+CGN0#QW?C1/Ї:C|g=2O59r2 1v *k22[[4@a@ i263~DW:/"޳?Lo|,eH:G C d^8(b sv p~mYjXGKt#d9nݓNt]$.F{ia3!>pb~{)I| Vq{i4b`YĜTx:(-o",,.* ĭ[:q1sw5~LwqQƇv󴢤')B"0#%Hz7Dmbu­bTegYAI!]y7>x >l_΄0e ,4RL@ǹ3ӷϧڿf e-7n*e xDz"HB>wi'i't{e?4H~̱nEul˒`q!ߵi~k+Izt׶1: `l},kvٺiWE#}_"y"X#$R ߛL%?Nޓqߗ}, hǖ"9WNxS.@'۽1g}>JO:'Xc=Q?37!5K:) I_|g$MjmkZNk6=Y|wU}hO!O^ N,#ژ4.I`H!:ݍ;a@E{Ӽ.fg.В:J I0yjw$OW ٗ[׀K! BޫD;*D #%JrW~ij\8:CsC`yx%zEz<ü5qMGðaK܆VQQKpŌak„/s\{06SE \sUg򈻯nxdTş6g-+l+LW4\|sn5[A5zQrWc1Y+c (~B@=¹8݈{+I42|;h~5XY.'< # cn f?"=d 1+Z\@CLK"i+߻ZZXN9%[K!kCۻ;!P; ;5ץn5l'Xõݛx5% ~Oh@ߴk)C%$)m^|:"kpoECJ6ώ0|`q EEIS'MXxI@NJ0/D|VB-{g;Yaֆ * `83GN\?[N.m5ӫτv^Uc9mƵ~/ Y2ꑁ8#R{:v?ýfN[M U|тV^$)o7H3oW&,EB&E8LbߡmF#LK.Pmo Vfȵ* `ϯ| ꧷F>` >/sNCKvFID4@~/kH3ia0rCwIl3_[ jDƩ?".?klc |p'a]]QeQ/w.3y'f"Q IƮsξЖõ77eE*SLX>jJ~Zn`x/U֬y3OZE{3]F?~=kXܥ "y Nsa" 1yW_f*w 3K):$ ,5$!c@7x`bWR<=ۣX]]vuM۶P9ҊO >Jq Ge (&> 2`XH(qG3zfqq/!9]lGmQ샠4˿G 4g *mm%d\׀!D};k/Ϻ2Əzlpi PLhm,{ۘl\‡tîC:^[!`^+OY 3 *oy3 'aYNf ?5ʇчk>3?\ < igQOJG CE 6 wqVw,?8kѣlFru-5+8SKG?`ór+jv: w +fKRx* AY% &? I{п).vȦRkz~ґ/n;H~pC9`ozv!̾BĈeLCaP{i )(g:Hy=iҏ:a8 UF| ?Ɖ:3B34 #y1db e.ahظ\d8?V2QZh˸CܺL!_v}wG}7fqp䁈`Zy0+=LLoVXZÎ?usW;I,w]Ўל0ì忓Gp#5$5LGƢ d} N^ZzFr&sg5:A1(נwp|R7ufٿwb{a=!5HzVϪ%~ V&?ε~eϔDi_gGNB dƹkW_aTٿN})k,P0`aCSW ^[]=3?s X: tgas2X%r褢C((bK JX5n6w \0`!㔮zIСCKgwakL GC]wIOR?? NB!wv ߑ>I ` FrJ[Fi۱C1E⮒F\ ]VZɭx:مM8KiW}{&,[N$\SѬk 2BiFm|,]oCekMJ+Jg5ڳcnȮ 5Ϯ͵0QU0e@^"۰E$QEh}\Dqo`BgX*Pn)ĝ@e "d hO3Raӓ:*|0-~@h- 58 _g9#| Υ3 İ|lZcZrI5.|㚎`)I\a)>0U^; %%%~'[&J( }?X8V~l >iB٘x\ˤ2W}z&˾ !*ZB"9*៥4F zW\pg{ JOh a @Uˊʭ+ 5qF3i0k|j.DH9яp( 5 qsvQO* 4[]@[ĺ~gY= ~{Żv"\RG}_F<^xэ鿮ֳ{콗krR?NIt贯  6B۠2 .R_|H3$*v !ZN3 `guk]\iY1ש.V|H z]2r o ͿpU!H@H"gLv CiӦIyŌ I?{ 312mvkk^TI«TsB]`|J]j;Q̟N`!-a5YK[G07/,KsK4>kAj'Uw:uX@1E f-,Q_Ia"~,ű4b#@K/ԋnI(r@+ɰL?sxϷ?VʴYgFnN]LRF#| Q$DhvۺiSy_/y;nژ}c ?_NB OXƜ| kjXȮjzcJh#O %4vj  e]#ԡŋ_IwuNP:$$~iJʎzu]sOkL]B  VIɡ`-:.m /РCzBRڡʷ8}:E%3Ls]Kv>un1Nآɠh {?J);Yoơ2z5׸t1RMwZ~h>37UC'5ЫG/We SK W-Hv?Y2뭇 yo0I֯_?7g7m47]R8Bd},tI›M<%h@IDAT`" 'ȽJyT[2qkTk$Êeha%h#Ca׸{f0ysOtNv0Ji8_B`u0'mp%%%*[V#a9%_47 `o, 8h>Q`8fࡇf,Zg~頃dVx/!t Yo_J$4{I@m}$|IvN°a"njۣdaKmr::E[QHCg!Q]Fw o"^OȴFzWC?N-x^rn=ps9L*}6qLcc7l]+?~\1 ciIT>2VWj+FbGjК aYa5a %(03%NXZqo G:\Z(ų6 jKek1ȯ`Ac7:+D4aȟr$7Tf_;H fI9o~LDw-rx>]RZVԚ{aOnRB4X@̑0rI,yc=0f0,z^$9Lqs?B׵q?i1"ƨ yp[a\Ϙ~#N F!@J5΁DŽ[:2ӏKftHk)ssy 8-3E0a H]_ 6htr*.UVe%fl 2gƤѓ\(0r g>Ai3/quluw’,pivØʄtRȷt VገYZUqU> %꟩xp+aP,d\fE%q! ~I0OiFH16Tk|\ } ,qhϐV +Bj30%ne\AL|^ZK,E0'نٵ1Ƀ{L/GӲEp7)ofrWQO<ͮz??|]+ݣ"ř~uhƬ:9kieoz8`󀿹2@vU.1]ocC>ԟ\ ̲ 0h$ <(0vX1@'mDnK$)|_`@w$ HQXPps!(MUg 7SU}t>$$&4)%P'7vExu>la>mp'8yev'e)4Vy.]eJQA.Eq6Vx6I H+l:+*Z`xdi.2&L&}EeAS'o'ns n!y\feQ9B yI,atְҋ pgvm ވCGvj*;ʬp(fVMisqSQa.)3ż =@x뒒o?I?~R 7PȮ?Bc2`+ <折)-Esou*_ k[xp.(!DhZw3& !P.2ky~AʖigKTR1KZd- !ݰk5. | (f6G~ hhE3KJHɮqM"&][>END߇[Re4\eWG۔y 4Ȗ;7[}|ryNp툚UXQ;kb2n$a?Y=#ϸ8V}f)P͙>"7A/p鮳l# @9sιwG%H[n4Ы@?B?vX|-,\"ˁ{Jӿ/LYEe Zo8UJEks ȖoK{ Wa `}-QMR'oRKN͘kቓ 'kts-<k|yv{XJW+²>41Dg@XDƇh@\p_u1kc{|֘@x'يԨq@iZ:y(cy~5pKyd*!yYQoԷ2rǺN8\[uO8}wܑnn;fJָZ7:n%yJʎmQ"f?~N~OǥHgLf4|~2+|Q?ܵOEP?*(dw)}yWQD{챇gW,7KظIK>j &%kR]Ŋ82]!` ua½|E+=X)4%*,,3q~x3{nq2۵ 㠅{ ]]'G/碐P$fݜ(Ӡ~ @(KŵJ0K aCFD4}zaD][#qm`pH!Xjޢ)˼a5_3!99` OmxE @}Yi=vv7\ϭ|5zdjv}z^y>xT7n]J{0l, 1_igqq Nž9[{B1ov+/r=٭z置o,ID^nǟvlSGq0UxKg?~`5u=5INL#in:mkzJ:MڵwE ,v,Q^7H{֘܋0PO_ G-cR;3&s 6}iKMć~v_Vd*. ^~ލFcpF o `ka.ۿ,<,0,Rjqq5h[Y,1V#R$/b8/ֵXg׈t!3藽juh}/j= `l3WtON)S_z-Fr+qk'h4^v<ا?~8!0JAG?ӽm%><J1P&iR*#8sBэh E]{YO-ɔ*<61mϭ΁`h!W+ >-Nrv>|G{<ҙ.\xp& sFG 񒱟??fʔE>LLXqmnԟ{}?A5gj`c)56e coH#0(3HCoC2D)gFPRR^\їXv8餓9!Cxf#.li&5|Q\\ˇv>mU(9X>k+?]v'űpTo6yY`WyaٯWem!̈́_.+ dBe)ZaXb\:*9 awU{khPk3Nr; 6?_Hk`K`2WAe4D?4!LE0\[YSغ?XtfE`m`I"XQd$_Qc=a&M 9::wV>gZ~qíR"~|c_on䦬3}vͤ_1 ʇ~@0b8D+p XVg85qx"9w:k.躯] )ʞu߫nTm0I7K*s ?}&Ji; W7Z[ӅLcX?UUA=!¶~ %[=??p9jx}xIZi0~v\0 MՋ@b41amX,aX '5ְoϘ!s ದK8 QT av%Z.K8Z'K7lw'd_\XM>,֗Rt~u+n@X:yM ka^v&ǻkr4Ġ`H~C]o%w|M裏zE0\u_8R 4 IR t[&+t-s\u'|-4rW7׶ESwx#XoSb˯]?y낳v,S56g "KtƎ}„H|W_и>Xn뭷T_xǹ1a\ج {;{*NpΛ /͙==1קGWQOK1tgNl.)7Qml2$bo1Ha*!rIk?_=B|7zE_~"DO:cP4%~gΚ&g]:ђ~ wzxjq m,>GߒaͅFâ亇nU/H.U$讁U1[P&`@JI34qĹJk`PXԓj-rXVIl= fp^U)udVNJ,P?`~6Ř׮ƫ\ os^al`0%$Zb_2#]b?<\)A!9`&4 C%Bu_X~@!a&C( v`J>Fq@Bd=N0t\p~ǹ-[MSewq s=f_?V}\K_Weac-'fr',*Jp!_!0},U@y; QT jAsPP@ & YiK6Fu3(ɔ-\ȍ3pgqе-L+u-tAmbvRqJb&ػ^\g\Ǻgq:t}=SO`C,g @$Bx^ >#:5h&6y\3@ۆL[3Nts:3_x9c!P񛍟Ys.3, e*|XG? ׇ{0a? q;uk}*.SJH``+kVlP;Qa7 Kx fꐶ]0LH# xcF}ҳx?P\un=69yyyԿ/;w&AK|nw`'wʏ)r W ¸(FX"dȌ:2xHA~c0륫P˦Xݜs2J;)N3nF?>`l#od]'.(}}g\YR <[>9[i<*Jlvd\D%)uХa?r1RfN/ChN$H)W]?8Z#.@@r-=Ki@r8"e'Wuw[вy5@vq|{7k.VxWZC UM_`_qqEìrV g(Z"0&"oA>e}H҅ ]+" _e[Bt se;]r׸$'ξQ7Omq_-˻:_"D3j XܟUVD#o_)kPG Ӆ (Ε+Dy]*?UoŻsfj}\w-þK $wI:)as1jC ƟUʵ_6|.C?m{VC3}\.8s15 m,fCbAʀL1cxB')M>r` , ,47ލy;7WO]3Ԫ*On{uy"݁@8Y10II`ē4U.q鐧 J礟,6z3g_`r(β,$ƌozС9[NK-)I:~7׮uswyzSz4X8@.(^ PL)HYK fqB  O)Mbi0g'K b%X sJUBš3€@xoK*2Ă@RD4A(PKa^60G;D3:,4H2s+сYP*\KGi`mw70[XC,ό<ۭ„a1nO ayM|ūU$TU|έ0!7؁n$ im FDIGb^\\ӲʅK?\7@G.vW]pk@;8leμۯJ鸬*%&Sẍ́g f`_<_ !*M0(D36BzJ17S[ BظӾ1s\7?~vVd[YDhpe;PK|*fXU/F|kp\Ckdŏ2pi[R<(5 ̨DObֱYgEeŋ'}i>oZJ2 v:ē7o >_b( Kt_ּ~gf?0ٯZ>XĻ@\}`&Y%T$ڟ{;l2.ec,@uyMWZ7kL-YDflpI3_C־ׅH,а8 Q]P+9xk¡l+I#p2PQFt Tl@2|?IhcsyxNX{C4%bpؖ 2fҹD_&Fְv3;u{Ƴkn(~ tf={aпQJԂr;9W㛸+~ܨ\0KМL\AyifX3=7MDHR'?õ|ꪋOm\ìuzm>kN$ )w h`\T,@@M MҬs ^$Wz?ݣ]6b(U˷rGۼ TT؈7`!3jjLޥaEΧX[x_Q RLI |6 ,0٥Ĉgcŷ{67 cסK>\\'r`>@sw'E*GEn+8LH e,XÚe["e5?\' @ P8Y=r0,@7pC?$OM_1&^kPTv(֓CNc`H"Ô\G<Mnq™D݈2)|S}unFgH {L2Ϲo~{wf!ȼJ/m̀ l4]4^Mܳ~B? z|2V &|kvk?ms"K{I`ʥR~U-~}bB4~(DuWep|Kx]ayB!W,2~,%z?}ksu(U 4’]GݤgтZ<rŹ;y,P¡\Tj Д0bP\pi)Ԁ:ldk|hl{f>Sތ\=GD%\i߿2ݾk3zh/7捰 @fwS7tTZ3%G3ʂ(Ē?'Pw]nr7}}1!/b(k.7~V{uzv-܈#ut^AZ@@ S"`[h:'5kr`p^h/`_}Uנbw]n+>^rr'=oQbj RI^-%\CvZBS.= ٻP9O /UNM ҭ1$ꗔ5`arH/~y@<&- z*›l%-X>֠.YB{f=!LjtX4η,aSc혙!DYEn&n-ߦ4rw=MC&}awM_Q6G f14V >ȏ5ktGZ6iiqs+=7f݀l{66uaaxL7_ׇگGKдq%si A-w0,kI?G7|WzX~閩xH] {J z{យU KfE»0J{;X).5j {?cgo󽁌pXy{!h#"RN|}k9H~;񒺗)K  Ng1t->n> oXˮn-]C]7vcvMQ^IMNφ23nҡ]+ibРm7~}0`c<9R#wXsxFJeP}oлkmMUbb|_-|DG5{O!S3+Hk!T %?  UFx)'|bKx&Ч>U0}q 17\,W~tRXאG>̚50g3(]Fү?f/HoY@JYHu|GO:[|kl[RyiEoof}#aVwqG1ao&i;j6c~ty/N= |ISW|]Xnq%VތA ¥ nv[.W4;-HBX/}\ /瞸;;Wϖ9d'&3]((dP'Mz@' MxPS /W6y%I ^0T2T?@Mcv4,EF,n<7Ima"n}nW2堲=TH\@x3l\ Yl@^-iO艻,: y؟~U~Oq^[J 6Z9ixr fB93Jw#epkǮ]=܌ӎwĀ.V sݞtn!:an^W2`ТG?⒱.c~wygsw {heFLZ|JS{产jګ) /b텼qZ]#1^8Lxi^gCv[j zKl?O#3׉ i`o\?0.m 3 g~ mWMZ>6x={eASğjPF 52e2-{Kg2ބN̬f$;]P ݸ .[o~ucf7251w~}ItSzQg=r.FKCIxlu-i1n~[SnOwSFmoG٤ɮ]w9Zw:ރ>nuj"^qxFz 9x-r\vk\C?(`⎮߆+ա H͍2X8W>F`4 ߄'5#Ŕp"c:s \'mZɄ5guYxoVWME(+ViX@%SU8JX~!PSP&MfhmlKf 81$?&hA =ViܡkۺȽiy<0ۣd:o4sk:=noNEzn"wKGA~z;KR{:Bvސk넧-gi᳣rouNϺ5&nQVYynNъqi=*[ta;ރcRRRRz\ ZQ$ :}2.ˎv(׼"^sS4\Н-bTr'O3t36$+9QKft,av?&Ch^y{kҸ;n; +Yam)hYv4 "D̺wm7O{=_և"=Gf`פn /¿u<YF\vk>fnF:&SΟ~:>[ز I } 6K(PdD5=g (YhHXnn5:vh2w}pR j7õo>c(9b'hž{ H]BEj am *FxxU?,Θ&b,_˻ٱ7)w$=17Ϯcǥ3ƒ5?\cpC:^J:HV4hKp4&hsV*)-o91۩,Lx3Qֳfޖs|mq3uڸWV"ewvu. '_oZ6_pY\>b.PU&qVCfhv6MͯwO쳎[R-.jm 4#GoZkUh$+,洓ZLQ@˘~V[m ; hxw#`im/W8kq4q_rJ#EϖȌhI-~֍in1z>|)TA ~(l# 5 gt~!B7$b-BqIΛ}2)#F= ~:f~t~2p$ՓVwNm[-p 8`_snw 3J$/ @͐hn㙳ݒܬջig\7gήiX7HN7cn kMGݒ˹JBU$rҧX~AI/&R^{`#_ޮJ4I>sM[͝|n WOol!Uv/'7A{sF\K37owS1zT~w‡7 -l)d.VERǫG 4i"FRd`2 %:32 t|cs.†:Rc;K 6mM&}n΀e5y.5sWhW8Ž1ͼ:me~ v䆰:ϣ2n a,x+ۊ]Bxb}-K&0^5PpD|+7 $-ڷm/@2^V JcrY)d$ /$M^1<`υ:iRT˧>{/ώ]޻ S)곋$ݽ7D;0ٽ;egvg9sڼ+ +e+7dF*T -b lMsʫ @{Ϲq?R&;}/{}􊋥j$)]s-lͫЧbJyhk2pUh׮ a]v. %ߟ@|͗wO.8 ׂ c\l# Qb{o({Ή {`MNH5 {4n6YAݱH[lq{>c(qm?XF҃,w[D |JI52պ*f<|hxF˝:oY_$'jw3F{~9i MPFQs5*/Ko_|7ލ?a/a6T?E6_ ]LU}fJ+?tR%hr=]Z-I~a*}/sDViD6\YrͽU83ug558_v.@\@mz/I^*u6H22dhޢϞ"ƭ,gy٠G_:OO u\g o&P{oHzz'Z?=QlX:ԍ;.{׭ggUH^5i\Lj!ma͔(zzv]t+yvӬUROٷv xD6crz.\`lz:u] @,МLvMZz< %vy75$ H60 {>{?쳎Q𿣎Omν^|U^rdgD-_b*A:2/.:jmTƀ_)os%) T$NWNI=s?!Jo*q)\y.!Q5|=eVKwVuL1L>/GZeqo'c]U)ZT+,+ (@IDAT:Y(нǶv%ʉ=22#UlIN>,)\VС} uZhדO=1 !<T7uGE טnbYNp5Q#]_߿˙grGW_}5mh絻ԳR}CBFݭi^;{]&٥dT.E< AM1:HDA.3q͕q`Qm^;ۗ^ks,ZbY)Vʐhv`šXI RQ?[ CAmgT7^>o3<\%~bx= (慭,v"+dsepD%-BynQJp.Wb(UWŚ*SȎc=pS ..ғg ǖ ܋$O[g=N.Cp9i(u츖mV;.]Z\i K\m6ذob~V 2*UE ӖP>}zêߋ.9ݫOJ H I駟vtAn-=˅F )VúֹSgFXl-ٻ#Z $a-Z>϶ח9 1bH Gb_O|3㶬ig`eK2  ϴ:EKl2Ө>~ikkd~6:)AWfяmBb}(.2ھͱ?C^4m6OcO0Qh[Vd|3^1J>R?;4mmjOuLm~+Q Vr\iM.k-Ye?{y'믿vzmqp<!͚"!B_}=Pu&O@]J?M>8y +kHDμVGɽNJI3C[[<}0^|߹IVff $gÝcnec' GƋcMCƧ(fU{JeeJ+-{Ϸk/?o#G+6Vw(XR^̀(Ŕcbfeya<5|_sI7[Zק:T(9K@-Nðv̀2rNyZ . $j{al*TBO^~'OԹG PLB$У:8Wooe`ėK$jL_-9ZkGam-AtTvm<;hr{֩m}{蹙6k^(π=}/eIp׭@{Go{VtD=/?A1g1;dL ෱㍗ٴ>VGU/pHZ H-`ZFTUęVDy3nb{nCxU)=*2%݅^hp@+<@"b61ejKVUjI370 [su%\9N#;Ku& KeϓS~R;wq߿3* *3њ(2]"0V7n\Rs^ײmi[oTbIOm gng#kam%_guw+¥zO>141 '\X=y| $lb p,Y?_AbmvN:FCـE+l^QEvWiCbMvTfUOw[NPzJi[I} C:ꨌ?>P3Q0Bʣ]*'9-(Q*Dh?z9 6 dܛ3\2{OF1PedH[oPf 7o%sa ~z-őNQp>xQ p&\k?QN 6!h>A0arb;6ld]~7Y}H^>X}Ht]Ի~/-a+ZE7Nv̷')jxu;[ڌ9l~2eb*fFWD"Åc{֪vQPDkX[ u{IH#.0~&),֫"ʴs.W>b]TgBX3g>`;S'TX:t=cqe0^I  /X-k+|.u|"s_Ɵs%LBq=XT̝]ʄ+dfǟB/z^_"·< eGvM{l _$\LIL6M81| UpD([g!ܟ1?,yuQ:v-siε~^jq h-Y;<.N}A\uUocٻ[97͵s/ie. |O{w)$"jdzw ͻâȨmrڹͰF*QϨьYw79zjg6@lrն4ѿη?.pQ*s7ףp;E_z7'ʨ9+=#{Qvƀ7Ƭ0V1׶AFPR7i@?0f?귻$TY7h5iWY??]lZԱ6DX`Q]pl[5M}g nqsy/wt][@IGvߧe_bWdw>цg !G/h"N UG^٧*aA\Q$.wHx-~v}mqҩq-};|:s߃Tqeĵu֊ĸfWRSoO&r7D7k0!F~ҹJ++>CW^{5gTݤTQSdU>gQLko+a|y<_&ї{_`*M6ؾCO':e7nT%eY>{i*϶8Jv:?uKau ?Ao Hf=s+sxeW1Bo*y*R=`6Tbb aJCp_ٳ_.Ǿ}:pv-.g&-vllxfmy#{BWغ (8+u#~wgLw:]rl\ZG[C#-[nCm{Cx=!H 9Be+ ~7iM4/B;&H_6Լ;EZP>89f@WAhðx7Ə'cOZNkUwGql-Urd y`聜'G~l?b pv}O?QΚUsVĩnPzvk[umv}N96ɵDNOKvSzvK"x ! [f+^@;Hnyx͞y[oO6!F=@ʔF>ovxw4VQC7odP;=ΕB~7u{Aonݕ3{/ /=Ҝ1cƸUD9I?3c:iHU*=pʱ{ AR W_[l:67$r̀HD $!C4^ +# I/ 1Fup~6a_F6b=X t)1,U/kIuRx [VCgz$ʷȹoo{&=^~.r 7@ḵOJ;vhj~NUOŷFlm!0EUDmڶmZ;剰㏇-|isT (h';!&Sy/+v  PzpQS Ν37j "F %mIMJ֍l,^ºZd)&}P >'Wkoi=D|Sϗww҈V]3?+n> <(h/F![hgo~c͛,c~~ip-@Vv9)UJay@_>~V/pF" *uU(at6m el uזoG|ag[W[ s B5 Ļ? 8\"YTWH{S! (LXhKV }}4 w&W?WF&BaD?E{sͧ}uqј1V x{~&݁:nO[~"cr\K|TsIV*  cVgPN[" 6yR334Cs{onyh"w6-syolNC8'/bt @I^u=I:u AMc~1}tG?aRcryu΃' AJDRKQ]3U.ȶf]:O[6=l7N9*f^cw%ŷ\d-[Եi ֯һCxXyл>E!ofq!Q}kݛ=OY^r\n>~ݨzCtOGa˱ OQxgU1/((pX37E0=l>@s&_|m?ptH!/b"Lv׳i,|NqSV4j`u׷MdE3Gp%8cLFmeJ#!aUc0NIs9FG'=S _T6y֩uIX^}102ŁNXbw27J ;R  8JųHiǻ@ 5HzƧGcP(aBܗ |}+fNrRK5q@PCWtpݶB\ UrY61n[ JA \|ɄSޅh"'A\ZWH8Gr$RIըm㣺P-!TN쳈+WYd< phkcTy 4Tvl hެSgEmsÀfZ6Kphas9Evc}[%\0bt+ a|D'G+ABF%9uᴙ276?2+q{Z[#'ﱼ_Z[ݢbVV[Tc?XAQ!-1~FѩmأmaKܶtmlr~T G_LUXաbA-qc޾uHpO!mk?n| VS`&2f%57ٲsNu| noim|eV6M wG=m͉YX]@m1x`4Y{=!zH:0+) {4M{6Ͼm?5HU~Ǵs3dN>_c= "'Mbxb<`ڴiglMOug3V7n.ZT=FITr-k+W/_:nBIL.x7I50 UƉd@HT w^+P3'= dڛƍ$ng83f#c6xѩ-c\׵u?|=R Jla4d }"(F}Gݮx bn\H).Pͳ9l!6V?khG=FT lww~KKjOV@ }&l( r3[LXa'I'~= ʦNRPTvӱVv;f*}:駟vvQw0:0qb zpl ;Թ ŸշjYg9brq=SUßjGi,1(2/vY ǀߏ a%[mS ? 6kZnk6>:&[׵Zv㝬@m:>=%YGM$h":ps[߳}0;&bd0_"}@Tݜt +B[ڭpEOa~*s/Wi,Ty, &rM5p+*ͺwKeJ 3t0f0xτqfHe\y n>Y͗ TѼ748a< m:FTeítƕ/W\Q=)??? )o~a"eMwh}[Ony}5~U*&~l^k Yb^_ƶذ;ob7ޯZVq2:`|ƸqPh"i;.bʶ9uc&[A%n?~k ,uq %y_D:s\pDnܚ`;w{fwgog~j 5ok|9fw?d%mJ=,quw%}JMl-vS) 8i 6l(`ujDbl<OM.acQ1_L?AֆOX.W;Qsp,# [ڠAC<-eIg~P$Q3H%Ƹ tblk<\d'6^4vAAnGI50oA}]צCu3 ! @ߏnC8FqGG*<zH+x˽rK\xIbw>?L C{,qVV8fu |*uY.~{7j}0F WLs殶+6;Vfytl5$WjW[[ @휚(uwdBH 8tpvK|s$@W ϩ bEq@ݯYv>P3r!,LjʹEЄ^zS11SEj[Nxj.Y#IƁ 1x.okQ+b{Jɳ\ 7f, '2P$*|̼Tu:g e @ •v -m-E!x ;]XalaM>x> 3}s+^G@в${bE#d J7"̠ZpRe^uegˑ]6Q8DNZⲋ,Λ>-l $KLYU I7l3e* W#vC:˜`&(M"U` tI Ʈ,lXhAU?W ~{&~uSj)T}Zj̖i;K4NSi^@aD9 lLj`@FZ5`滞?t"6tQ+UkQOZh#GA ,VϾnt 歴?/OM: uqR ܂!,Q{ [ڑ(s.;ow+FXd^V 63e}K{ퟭc_F`,c`!mkY9sqD . fTB p=H :S%:])4Rۯ~%${uK1ةBeB6SrD|cx SCCaxH6`h`~ NV' D{1DY0D; ިg©KhIڵkHP֯KH%j0@%6|tG=BW0y0d2@nN$P:@0/ˤTR{vniIqe(mqdÞ6n`^zk\6+^X͔W3 нF-ޔ1H.@8=b+z@ ݶodr;ڦ}vֵ_TCYZKam k(^ve|LEh2$`'b& vSׁbBF y$6^ j䑧JH xVR!ak}ٙ=#?^<_3<(i ͒}q@-Dw2* B,<"jr*)T٧Gԥk ~l*0qoTOaUfMut8명*Άv}͕?y#y\OFl1bb6 {SWuϛ)?Q3D-h&C@[fXlW< |b5goSi1DmZE x21}ѣG;<(OTݺ1F|I)O ظW4 =/WԙngKM)0(ECڄ5j  VĥWYIfiŕxks%Kgh+RWckH"Zvl%o $.j*lf3GE|;)[4PKjh/F9H|;sRXa` Lip,8Kq{'Zg-d&=]^m`-ɺ@zRI5?0Y6 +^*/Sjx[}x_iJLA!RV&mnucXfLPFB`pid`uj+f>c%O<( dDK~Qb$Z@>|DFAN~b PmyN%3&TgXUAe[wo\pD|9XYU+pm;\gT??.600wduyc)t ~2Ťc0~|]p2tCWV0Y%7 gz 8yvމ-lR)f}{Bgځr1l-1p2Hu=1g`IDՄE/q^}!m QArRqԵEֻh/P'*' G+o޽{謌Y22+ FB(3.-wOU۵yy\pϙ= UƃN=G $@{ɊZ;< e %d0/H5N~Ƙ81\iMU+[0:wSH69?T*9bN۴n}a%~￟@=nk7XU_JXܥjMd6l:O_X8 馅)СJl*+6 Ƹ {,J*u/q!j H#N{Ӿ l-)Ou`69hKo-w>F"BxAͬ w"Nqzޏ p'( #{\AZh+r^3].ilVv>nuGRQ$A'y/Po0R8w;ʣހ @Ϊ,ޤ"FR۶<#O rY*R⵷7$ynR,D'ѳc<9 Jgt$qڭL>sq*z(_`u0VjOr*XN u{' ٧tc`WK_ƕ\sy}\o9SAq<єpuU"B3"f_CyCn6H)!@IKhcy E[yuR !)(_kߤO};o(\?m ٖ'|C(wi `C3p 9сcm'̘1B|v:!4Ev3_ԶߪZƴ=VCAڷm.F<@ [:5\[,g>`}GaVf}ַD|*u:[⸣lMX '>F DtcMVJnx/p%tq, 3O'IHSOBN`W-x@1 0['}èSԳ_t=mVm`ڨX2*$8w3 6u@ȹ'>3<0_- >RR,|G<_u%;Tϊ ,AVKXmc+qi?Shvܦ@ȎU+, k!y(@@Q<ȑ2D܃00+SN WA 5Z&mWδo~u*/ڏ4$ ` P*?꙱ѫ/u-oBG5?ϼj%nh />6Jn Dȶޤu2&B't 2/@VlUx\TmPSq$젾b2m|lFӖ0 |&N8uhh|wRYtIk'^Įsv+2"([zu+q:png` ԏ[yspϿCϷ; 鱗 B]=cνzB9kyAU#D/L#c V W:#FT`Ja=eM;ptob%N}fHh0" ik^4u{Mv@[B.psӭ!LS0ܩ 33<ӑx xڟSX-:$#N?PL+ B uH-m͖!5螙0t8\e( OxXbp_3܆ ߮{~=RȺڝW~NXl7_ƚ6N8>#X@IDAT< n6B0@PQ@ ODe+Jo{ᒛfwoA?YjWͲ|][]1 6&ݩw$UcB ~3Va-J7,+/Yb"Zw\nR2f=ߎTX jYO3` pR$נLnbH gq ~Hq'7:PNZ[V'SxŮ8d[ǩ&W/A\M^JJ#iJRZWRZcde #X}M `BD5w62Xl3&Km!aQq4G>q8{d_H\ y(F d6Ij$Y'іA +sr{&=^cW7j? s#'`vvxRhx /s83XP`S$i?`3upNVu/#w! p).-t_Gҁ0)jt]J/+JM虉&x<1K{@w޻g} 6v t.yϊP~:j{SYpX7l i_01e|2C cl)?|}u3؁76#_gS{wS#I6Xc` {aGV0)Qs G&1֭,fGf%m17u`^b`n+fmAR$c@0VO? Pֵe T$(椖JQ?IٵXO=;mo@6#1S&; [%ȕ@9ϛ'Sin~}VJ~`9R F˺>J2"6c cnec`wGԫ  s|sGs c͏Kmf ` -nbyaSŏ< xH XEx&[ڇ6H;ɍ􁈂>uֶɋ$V䅋V yL0vrwiaPoc p8: F`ʳl_V!ɍ Uv|ty-Ai;W;k6kVJ g1P oNADiOXH"8KuQV )Wur6uq\7ȹbwv+I<869UD2/ox-7Uyܵp}FF1> x"On/[v!;'=q1S*+^کYS2N1u&;9MepҢy ee3L-eW<k mW V`)aB=C:=I.(!:ZUkb 2z_tREFZ"z#мYZe<sp<>xqIPo!׻zv>0${A0>;]qx5` :/zx~T36@|G[K6Wzm.y#dJ`Nؑx 1}' CKzlU|{){F`vv 8)@)y˼8ٗ}'N!ܳ31:*PFN^xJ QxJ e%1(qv"ts>s1 U㐊;A^\/W# %\\c1gϊgڵ6 @'/%:pp@E Tiqx:V \PΤ-]ɟT=I?a'[xL1uщ` y>QCw&ABF]l￿ӛgT]OZf_ o\G/꿋VS\{Uj5:B@p^{U:\?{G3 Cb8ara@<1+TqNl 7C9:ˁ >61թ}XxlT.;׏(swb5aK)⬖&<_mw\d&our]v^u_t=WOuK( SL? aOkǭ m*r<Up 0it [.m6SPG]X +"tޯVQ 2Hu#2U w[1F\+❈Bi;T8aX*fu%odZRG\[kp¼2&ԥʣb^PwL $!HjA[( 8T7V7,?WzN  c(LvX1I\E#~/_';@ ls=+cjѣ]E(9dHSW8\l\1{>j7Sa0t|ヅq;Hz{ #CtUVAAWnx\>h'Ai*ߒ_%U+t' 1T0DZldW!eKjc0iV'@1y F|;` }F E2P3 0TSwK4:#*6 >%2$eg)vxG@aw 6$9xQ @HY}#QkדB=ߋpzTsiۆ"7 OnavW*3W-dzbQ yaVfhe?ak~nyR1DT믾 (w3ܗi5_*l~CUW GmcЎVK6 A/=BR1,* XaTPUVPyJXbF)#rFdm`ʹC G?Εp˵ t:=:cps {tܓyc5KH^$!qH% @o_wNĒ^$Uq~LcVʼn[MO즚+C:Yuh U*jrmf+Er֠|&PKO[BT ߞU۴I-:;/pF'qb?no:tyJ  mҤCz={=]JS^[q ԨaJsƲ~/ڑ llNDvH0ؠ ;$o!jdqnF}\"/05#6F`#}yp[5il=3a d{6O uM3w)CASRBV_IΊ ߁X`IJi$|e-Z"_0/FEyRT%ADGVNS^vF)L[8XN&DTUQދ,Tk(uSrt58po_2c j'9@v9#plD@?M첋F  0_i=d< (m2,*z$߃~`S610My/:֠ERCwQSlpXy?]J==LCU8e6ZY9ݿl$@sFW:qv;冩lp WJ͙7S""a(Zn*5 xA-b>JFxĎ;rHYTXa 0G}S1:0 X'Mn7v >гCx"bcρӎSP&w @o=|d!\6~-O)e*%mW?H 묳.@gmtdB|E`@@b V6JJ5iǃhʼ xUU'Ƃ J(]tRFs11cwqKS5 eJ:%6{ {B}N| ҃+j\-nFaxk +IteN@BR Gb̂Ǫ>pUm _BȪ5EvBF+ڪ•jxl">r{h"cuvsJĶ6F]6 <VD`s`̘1mU" =A{4Q0{BGՍn.BxSsyP:N,rAyEWHl9Lp W*#~^DKD#i7&AȻoP|Q}r1=XB1;~YKkWnXNf֥P8V] m\ wUϠdA5u(rtFsٺkq8Wq?d)& c=z /۲{AB+-Px_]t)K/`BUdYZUpEkh+a?};PR!̙C·>vjvzξ!J@=&b ԢE^=3y"z3ߗA$殸W]Jda@ 1U?+ qB^^x[wf vJkGM sP^IaoQ\ 3hMޠۆxVR/rQ@xZ CZMGz36-s\_{zmQ;euwWsF g7'*^`Sss8) s1d\tPEzQZR"F8p^z61ցEF*8\>0zp! b0~yIlDa %uf7Xc8(n3z`A">v%K1dvXD8Q=?w]O'΅,uSkX+3Z[EXbjژZ/VdOU,#ΜfSgUF/]w5#Y['ݦ{CW%3-xGEronFl*@I%'yZWܫHkNf R'j/yV@@{@SI 8'?,W{Q'(_`~UBw=+6"70v{6]5rƁu;x0'Z_r|r!ll N۔qa$A$*B);> y 7x3|?5sn30;M黈].tss\/s)-pGQU{lWu Qk~_5u=aݲ2$38A!IA0e.'@S/aRk?+e#KapP\)V^@~绍zЛLj+ԫ $Q/w=Qƀ K ·?ZВHWN8;3XTpO_` ^dž;6Veϫ#e? ,^ 5a?aN8Cx)RҟKf8ꏬj|f=R<-4IG?)iP`Ɔo 0_3PuGw] `^Rf=3`}^{e 2k1H؆xky _gr 9UW~vBzX>nz` [69su<8#@~ةPd>\Olΰ1yʻL)Ŕ_V9^.-<ɸ|S%xezp5 5Ĭ䨾WBJP∍G CY@$)]1T֤v5GJQi-`NW< e`D!$(.!_{wEYm0xvEsP+gq7.sĬT/WSolԓ- t#FqXӿZvm9i=JU5WİtLn[*Y ϹmK]5=QyRpdCYp_-1+9*_%TT:ҙ[;&bys Wy#РP"<l_}\a~+@ea› mIC=/ˍp@AcΛ.5E3,n)v)S=bl<@ :?y#Fڻロz7u__ ~e/iӝYv`=mr,MZ跿NAAYչcJI/JcquPL;YqLd:Bl%$(7c{ X 2m Ȏh|L y#zJi‰A:m,A^/ړy6֦<'g\1 Qh"eF.#/̷>Zq*Ưlm).T#x6|3v΀,PzSl2WjIߪZ&VꩿT9L F`zvX91-LP.: Y5@G38p8D&Hb *j7&rq!FM[&׫I&*F%`bDO1F Q-~_UWOϜ9=[ϙswWuu-U$_ `E hhQYt9ꨣ̨Q~3Tͅ-,@j5koZeg }(qma@m^X]~xRw?-;2|+o&Ol+lzi~Uwk;˂Z߉->/Q3-?/Cu8#u.C[$f!>.bR>^{-2.X̎>ASXm:w7{Jijn yذav@>YsD@;;D| YNx'Y|[N.&SLt$W43O|vU@^jW^`l`%8FJ;MDj@θK&mUV{vJ-?ܞOUkU^8+Sˡ?r 7` ҫ:+m),h~u~?s^֛WGXpNȬ^썎K`-z#(}5G6sg}hkYn 9YU$svGIwD lMY \;8?җdWx\J_$-Vxi WLJ1sy)My6?p 4_!Q ept-4p zv;+2[8s G DOxHB יa MvH}m0e;s5y?kngYQ^X8Ќ7ήK 3g4s _<$׻:H.~[̇mT2p*< 8ez᧕vF-V[Bc;`W!M#]akZj4Z8k}VɤdlpL(γG>=]'։%$!+\s93l׶uO=y } 6c`?aX@:t<*qb'OKa?>y_Z{ Y͇~ʧ5&[9XةU(B vƺWAcw,%9?Ř@- Xr#F:,Xߌub2ُ=Ͳ6/ia/4c(!M5O?Ʌ MafرcB%+e9㷕~7q sg_񆅿G`+ ;Wȓy?j{)&zB -w/0@| vA)#g\ïǎU--|LTvqW틽۟ }%({(OiӦa&qWS =̨}ݤAMz<愣zu8{ono apM=gGȑ#^{Uth"s!|#Sر 9S("HT6"[mi+ǭ5mP@T8vT6oϏ-T=zsi8л[NRs?h3 El-1;_d9jsWw˩iXE\kUFr*}Ϗ#'8{0诠+d͚56t pX];pB!}Ylx ; kg+YYaec1{b&!;/~ޥf!UR}BCtoO8p~vIDe H]OSܶ4l9~1@c9*OA sJo4:?5iibr7 a$ǞƤ zch,Yp9cURs3sEͫK6`hu3z/â+vieY=z\w뭷fK_$IV+bFg zܢF u! wq>]oS@`4.χVgU/Y:ohYAa@xľ ۦ P>@; poA/rXo{5klwqǙ]v%D<ȳhaA>|f/mcZ`6k;?ѦZx#f,&svZ*ch#6O5(YfKi>f;:PASfxsګxcE^L?9V[~ޒN3*Q$qBaI܇|w~'6:+,Y&Լfûfzӻw|woW[0NۗS"(@>U&SZ? O{Elli +Vv:hh(y♺v5~[o<83<9ƮqwDLcqOXJh~|Nx̘1fԩv]_WөFi3ӧo4e-[fN=|sIy$}"5CK=#ޖq%*1d>"tR yTZ #A; )O qڏ3T5ƣUjUR7rz t4K_|N>BȞII{v2wÿN9#]RD?ڽЏr2 JW? ;-RN:sfmC|[?Ą?|ύnb1 1GhUߕ!G:[68͙giM+'Lc4>pI9l/ϗC(.Ʈ\Lq#|! ٚ{\rfKd~;Wz N [*-z Q\/be>6Tnu]'j3=,A P%oѮ6xW>Xizc^q{\t{˛B5AsJGXskz`*mz|!{s \sn7=:z2qy+.sOAaF)Y~ؤ#ɕj/9송YNM`-BY8.a)S7.MS c Wڕڞ͵Z;:ml{WC#Aav'P'ć6 i2)0J* /c 'B߀քt acr6mVq>.Ra)F3J}\R4V^0'x#Ⱥ-[ ٳgb(鋅sPDn< >fJue} x؇eY2!CAwο+W?[8%d薨/hwfqF[zv6R)8*?Q J\28>\y晬 |wY2S-.<]c㈛'^QH'^NURa}, ~:Bʇ @kVRtpZg!{ٱH}a ZtC`64IMf`F+LΆp3 ;N<|4\rYx1NT]ĉ[oSV#f")Q*}D'C GFz*6?|)cw&S6_w鈵2 J;BX=z4v".^r?r- 5%\#Cv(4s ||?xdUi~<\y*!P>Gi)c3bS{;A<4R{(?\(+h=9?Y5.fΜi=k%#ͳyl= {DΜDVqii+pEW@A Azwrιo/RuQ؁3o͉s Ip-D w#$Öhaq,~j߅Ӊy|nj( Zw4ԵTMVsmvon-eDw#ፍ av^K:LBG@95^7|Ӝhm\X׹<#wD_ 6'\~;)6m2{&V`e?v딢 @իW&R&|[Zy DhJs\haN8v]m_h}MA\}-d vLoF6~5\HcccM;&p ]2?C'CYX>uȑ#m<==y 1qܸq\ۑN:EWɶmMy#C]m}hOn>Owwm}gReNa,}=z4hPY\ @`0Po׌KTK,Nst6S w}Vio;vWj f P )?vq {_H>O\CRz[>4P~c |)ߋq\c-p.ְi'  C577O˞k֮-ʡ-ߟ[r)}7}?:+~] )l;C =?nNsM7 X[)[;J-[f_9r)fҤI6p+21;llݸS[sa0nRj+k6 1F8咘lA~o| I tz<je jk#\Hp&jLvZ&;CWubDA-HhlgEʊ+[jFa bnϞ=lZ9O?c ۹ t@ LIK&p=riɹyb ӿ10]!-|X ː0N @U,t~'>jmm@Dš+Nm#q$9rsТ9??)|e@mhpV9/0)pQP.$nmQԖWAwhCxlj^2r 2$g&J)nlLGh(pUFd޽>z}_Z-C/m3)OŸPЁKV~)(\MƺV9%oOG Kp~.!iq?D-1: +3q8sE5 vmmp9Crf:<<u(:;nV[x_cNPק(Y'6>/p_"mǡ9]1;uw|8 wl:Po! xtdzF>+h cӇaرѮ'Bd2Y+LN%x(_kX򑮜JPVH.򕅤cxn-S{6lK}VP'g+"l0Օ}PU?ODpKj!?Up ֛oy޽{YDYhKkhJBfa uUV_KR;ӡM~=B? -.g +K,08MO]Ix F3&j1 QVŸuh=̖JoM`feoywP钢 @i?;;,MhN8xϢC%ΰ2[O>BmhG9?\bUL[\đ8mvq.LO7#P|}J[ ͫCYtUAWίTߐhstCwj+u,WeNPػ]L_~ 19kSPL5L,en7O>VY VAgp+tc| @9C&oZGm(> -PIMA߆ vi[ _.|'.%#j2Nc+PVFP>xԄ@쯆_ˊydss5WQfͦRhSfE@D Bn #-A%ICC}맟n *)63ܽVe8W566B+_/Wv ([@%eEӮ# pg}m'j9h{R mfk(זN@V!tgmYc_̗seILhVy)%VX9{`/"l[bp߭[] y7veǫAv.YG7@D}TM= Cx,_zy/N|{s(۬ثW/3h<8?6%#/ P֡1$v cG464FFzCcƆ랅?C9'l*H`0&(ՀGe[D\ujxӧx"@' MPzIENDB`ic09ʰPNG  IHDRxiCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4@IDATx]|UKy4B{! +6VꪻݵUW]{&TD)){M$/{K9|ySfs=^Da@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@ڜ6\@32 @ p;4&Q % $P€2 >ɖ0qNW Dt 1L~8F+jDy{{kkX߀,O_QQQURRRQZZZ )(,,N.i,da@h'h'2€bCCC;u}hlllN:EC@SL^^~~~^PƪB[V(k/Mic;ef~WUVz8,k}=@kU.5SK,j.0,Tu5 eeeU_5 9b/ (zngJE<U0 q4r8Xt@ " -`@ &dm~ze?[nPHo(W/(BM5P)\WN~ AOK^ B% -g-N|HSHc@ €6HHH4rȔpDGG/).VC)6_Sk^ [qo6ǎdzyAW.)6L>>lZ:e4 جPf0 VXa@ǀ€`T/}*0*...,**ʄ7WYi衼4QqVNe;H6+kƆv,FA%*tOxx 1߀ϟ,W " x<bx+ 8OF1bƨQ  75\T[3nch5k7kky0W{}]CK _t׮]gސw^{^4)VmV2EEEaklR @1 =sc2HLL<3%%%.Me_XTU\T&eiT)5L)Kd}VW{- |ky~4 inwkۮ__GK/2]s`U(+C8 @g0 g]t17k]‚˝QJ۸qޖ,՗:Ov 75Okqֽ>M7sn0@^gF:T ]8'ދ0 OVˑ ;?3ϼhȐ!'7ږژ=*#5lo\n[5\- Ni=,8F_![+Z{<"}L&n z \)| rH[G?=˖*}>teciqRdK 0V VSn LBٳfͺ`1TВpS|oZZx 3= F>+tW")r \6Ưɥ5co+\^= pBa܀YP#;ď#㱖Ժõ=+FoXoL!qx<|>;tu<3Sa_On HA"0:Fm}< <5 9J#=Dd@ |li3.;vu&MۣG_o `m)|]pٜяJ>IuQ e"1@@ B\:#5*ƒ^"€K1 K=.ɬHA9sfb[sͼio곩Q?>NB۫|n;ߠZPACf%4Dg@ DA3ZӧOi̘1 zn%=Pk5}߇$$ by xɂNEɆ0`1"ݐ?bq1\k*}rc4thQnȡR W@78g_8Mv ƀF\5.ׯ߭gq޽{c]o9H8ŨmY{٣~;tf-5 ULl< pAaiidā "12Ƒ087s7왏؆Owm.z|X,R"!ADg@ 2`=7=:fg{kZ~;T:D2b0N`?qj^L̀͸\-[wCdeeic ׍Kvݵ>۷m\mYIs!}q XXڋ1ڋiN[0>࿛={<(ތ=oo*}322(}#" 5C/O"@1 @Q-r >cƌ A{|071*}^jD " t0Mȋ\+q02{w۰a1,Oɓ&ߘȇM~aYz|O 7t`蠠 YY~޴u]F;z0  K^y0pp8gtЩS'?MNW{o+{p>]{vREX\N@T/.G 2PcEDpb8EI-tԩvLۨ791E$Ma`h2\WN@&j=bxʓv XגAa@ ypRR5]ХόyQHЕ|yy6.'ѷi?a@e_ G;eEh1 Gv9h ~ը]_2/??_S6D܋v .;np88}w z?N~Q8ˈ}VXM@3 H 8 o n?&GbdY{.٥)ora`4 Jǀ5:bLȲ-  TQVË^~mA .p«fx2r !' f+˃T[O 4cƎǀnY|T|++*gW?Vv6~3 ߡ?8`'Fd`.{/4#/ i @`p  p uf@ ~u*'B%)a@p0JaI`;@7%-ɸ bCs, ?B8Y$;€0``@ & Xk-Āxn[49Ho(0(3€3߫? ,1W'βdd/=D% G"݆/h3u:;+b@ z?"tSc"€0j սvCW`@ nxE_wB* $% 4~ 8wUcDܜ1;"|&>t`0 t$08hfR ##n{h{   nJA2#=;`p1p˝fKw$6 H k*Ypَ9ajs(O.'qXfp]e7 )o0M"nF.8S$/c}:.AIɭyEwEL}L^TZ3\'WpbGpHXmD(o NŮ)|, ` X d"@w\v<@c`2P!@lM0P<:f8VvbCj,5>8(Xg^:k,!"NkaD@!B@ j8Z ,e﹈3 !٢೼TS3::". I Y=l&w@C1&~`E\1\90˝g@7(p,=^p@:|lç;ƀ{2ۚ LR`@ $! ؀5Eê0 <)3I~ t$By " xԋ"Ϥ9| =[>kl/v}a Л@K G$d #``行1xPA~(8_12 |u%/81 2(08gM7i})́:]RPTmTT'b'?OiiipUUAAǏg/]XaVK +@@}*#Fc%v'Q{d4{W+JK Íٟݚo`LI.ǣUXDfS/sn#.Ε 7/nb!p+ߌݞ]9pb8oPwFX ,4YenД<,/T-N s[]~ Wp*+ۻ'>$w"1@xad-~V䍸q]rg[D~98>P&Lnu]bcc0BJ+a<v0=ˑC=x?a)b?8/\V J LhT8 xD܌[Qp1]RPh_Fou4~۴M?UƍUqqڳgOϿʟUYՏb'QG7Y6w^|wI\RdBqƖ%o3-{=\ 1]NPY dm`kwX[?*65lذ:5~{`ÇУL̟1gBTm~~)g`mIp9G.{701`2W}QQW |fK{IUqTPL V2(u#{0*a,%qUUX@뻹xĉ, Rda x;l o:b€9ɹs=񃸍%gc? nB ,{lck^TU/Q*;5}]N2GD(sdK%¿ >S@ػw_smgi4`U[hH`j-H<.b97 y;bH{0 @{ܶϨ+vǨfih.e,]q=@P0u߿moT6%ƒgiWR{_Bkcyi!лkׄJ4)?A6yU&H'=0<RlJc"/34]# ^4&E:S%@e@.j>@ P5C~*̹s܍Djl l^^^s$(3S#؏zũv*NܹsQ  _:o֛L&Fd#؂,tI A0X`#d#  Npqd8)lk^0WVVN է;Z^A&?Ѽ%^ 6Txd5e NHP99PccS@: qFa㤩SSǍ;dTkIh0F/d8[3[TԸ1h '48`چW^UkenZO&L_h'@!VpyDDn, e^cτz{G0=Ϧ { zM{Qn…Gښ՘{Ix*𴯗׫$-XqG#GTĉQ2'aIIZ@h$}@k`<f3UO O曛?CYreQjGwdʔ(CT([\:bKr9paK_.p- 25ڭ1$—]8o'o\IZ9Nf EEڼ^Uj]0W,kqty nݺ'}yX 40`lA :Al11Q|kחV ,:N )@k;=1ډh]J}ݬH TZ8j %&6}?ޘzw7~^Q+;@s_0pom.ۯØ{p@ ޺MڙG\'^k-v8^ ?Kb FMiEQK}+y=WAl$2k_j87#?>v@ m8A0X럋)jPl:8VS ̈At &叮vN ӧ6?=Qa[AD_R'MR0 bb9p#n{_O=M`3]]7@n^N"``5=؉oHէ\3AȊH;1`S!Ny4y nj^}T?t2ߝeVFor{/8ͣ2XuJV㵮Ĺsv~3i0~<V%˖)NPTiiiOkK6?`Ld%쨪I 4ޟ0/z%1! Oz2:$vQ1\B Y p oo>Enl3ھG?ѵu>{`A7(sx'h/bݺA_"oU~, c;j`cǎ*6ApbsEaaQP{zE69ϘrsOÖ!0 RۑooӁx JsC@ h $\g/E\xX;BG`Le^C908]=(g`Y lDڐv}mxpEmz A-ҥk`()Llj „=Y_s xޔ^0!uQP9eJ8 -`$+IQQڷoM0PuŞ'HGy$aqfi4&Lf{p_g#e CϯH2Юʤ ݓ 1ኯtJ=q7gzh\qKZlF;L l^`|@4 ކ}a;3[^n?P7&T5aE??3k"j&؎eE`9׫k<}*sU8\ç%X 4Vxy^t/0{B܄K+*_Dcú`auKףCb1b"f>FJL09?u1cjۨ/r|2/`O=`3`: # hx| Ç%m^10W4v@ZD l|> m,kaCO.B800*FSK}6ȯ;hyxU앃#$a=*חZe3 0aB"o sxNc>CE8f `,'#sG@ Q1,kCyg  Vi>ێlW?̶\(lRP6.ֆ5ql{(1 *PQ|hjU̝[<9%K-5U޷CLtcK@eee=wC-8n&ʕMf`r pF <}@<ƳdL[J9^y܈!b!L5ujÏ_:p.p'>x ɐE;TcWEms{HTS8* DQFa!gImHh<|F go56lؠx>V||Ujj*<&mJ} ͌*QC%A37/]-"0F7im@lpI:ftcP&SRW^6`AnDf<7WXZ:YZ?1 ɓ٪d:ԵB j""@H87T+l`,Pslr1|7A_~9H{}iwk%%B[J\=)ݩm| 0,H|867űG{<{_me3˔Yv܅)TqqM(:zD76҇1ֽ: &'9Smyyulm"Dks z*UZZj, > \< е .}igC$[ͤrhU`x?r46!Kg@Jz1(H,`SuXc9gYy{U T&qO4U7>k&llA4c QO=R äC1ؒ!Ȑ馥i3 6lli9@ˡw^ŖP~[* h?4<v:Hʯ9jo||54ۼMe_EXfi.lrcI}\M\ E7?1(<DICgi><|/4& X֗m7o נ)t8}&mF,E?66L[n=C"|^'>{VlެլZr |eh#p1&wd[5UP|co&&FۺK]8>,PgΞURRZr*Z $F *qNb3fصvs5f!S`dz ]=65q\U@c]<\Ҽb_T}zU׮(d6h2&GʀMqc)6ѣ‡a6(Ztrƍj6_ԠI5Y6t?x jky嗩@]-Pm^m2ahnfP aK%FԦ^7|^}pmp3*w.6o3 $&v0`?[qb@Er6 ѝ ո8ñ#J+x-J0flUCp'-K $98P%28`䈑Ѭ0ʙnJ}pt:v*3ԆA1T ut<X 沚Q_z{6./?P\g3@[TZsNEZEkld~ja授;1)]Z맪jtg9K-|,to\N[l):u'<l .h^mMu ;9ebȄ B0 E7um埮nj222rn*]ktp;PCD3g7PуJ)6s)wC  f!ݻԩ עzHU작sݪ27n޷x42^)ta )3@6+P21v3U9pPU)0B82E8\߯qHd\ҭ&s`\bo*ܳ4lA6aaӔ/ 12WTaa4|'s >}:|/XlDYfQ`ݻgc铒L/.7{TT `|rC{8{W^ׯ@ !*zJ%'0fvjjjy睗6P$~Zx/޼?ߩ OJrX+pOqfyBͶ_~QG1t +K6 )5ykcƪQ#/Tlo*<1~o)3psI{3Uoۏ1^̨v=6H pihmwY a@\C=c`=?^_c`!65)-MMuʔ)'N99u(?`ubL9w"[֮];'99oСz6~cKt?=X)2p/~,mg@ ۹rԑ,Yq9gEN?1^e }i cb@_i_3}~e*5eA @VI?ؓ#GnU\\RTЫeo, "OXt{ң0 \Wø:ӧl0~8-毯B1IʌyWj=Ii"1` !_M4_8@uVc:0>ZWVW=f6PNjsM~'Ixz޽'tsJK-ް@SXH.% =Ue2(A!h6<&=x ߺӛ07SWps֚3zgsռߠ˭^X䢋.:}h񺒰1Q ֖snOztꖚZ3c쳨Al+D-_ (Zhдxg6G0@q#xВU]n@BN3~x@m [FμaxG_z6=?쓞R (Xha_ζUh s_Bz2++댊 ttE/fN"} *w?99mhGC_^yy hԮ+|}i bN3z誳:+mxü`4ZJiݧx2sZ3:Ao\Ap?9W_+ v@GPQRePV܆9Swk֨=8Y'1iCA1_z&[r8$Q5ds7k68<$W3}|NsذaoFo\o~0? m1[oGg0.sωh]Km z2;vJoi~ sjRO;ͩk'MQpٟE?RN^epZ/|Ԑ&kIU|(lAzE4DD'fW?.}i0`T 8O\b. S9٪c@6y0;=~I3|}++`]ULAוl|^A߭Y˦}nb|7w6~=jˆ@ 4saC*#GFh~rֽ6`<y(A=rEr$`^F.+,, }-"%%-\z 2 ,DSW|ZSFCV>%e;wB٪+^y`n̸uBRp)R9%EWRۈz&OLJ7L?ƉCA]nAMX@EzgEx ,;P̘ >wֲ|6~@{4TL1|n8Ay#|(tql>97ڹf/d< wgLH}ʟu`܌_36o޼q%@E˟Op_bsjY*P]05]qsl=q?xA}->쨡U4ڳ+`hq>ʲE׹nHYmaէAf*],Ѥb?rꇘ#UWLTw\B 3.חʸD4AiC7o&OɵDza]S)6&,G?⼇~8] 6v|o }`.`b4`7UDv+Nq9{UY9 d\ cxXQ{h.s]ؕEq&!Ļc51> fh9l(pp=/O9c 8_8?6e=2L(|j;Sa_TNN*MPOn]ƍSqVƎ[5~" p׳}1ҥK31J[w%ߛXkiV|0p ;߫P ޢ)fϪ{\f?k}6KDrr!)G{qga_v :Lnp_}ʠ(Ec{l'Oڸs eTi==>a 6(;ӂѿG_?4q$wv8lݦMUAqq*蒉6|`hꢧߴ[O#`2&cǎŒg -̧`DThf͚16@Ѝ}ɉ;߯]G &4 K,= )ɪh7:y LKKk1&ȻK#$[UM~==G j٫9-N`PO/y5tTL()VVR{_{]`ŮB""嗩.S(?(mRcG#ヌlj O^&i(|*&>a qEc5^S`sE>DDC+[knf~.w ֍A3{nXx'((>*_gݺuFRW͋|ق4믝Otʊ=rCΔM19S$/>zrMΜ9+ ?>Zu7۰/bƌ06v'|?7+f[~~5p޼j |z͜2yW>A`;ĥLV[z TF+8݉ԉ-[ohƭC\ - !ȯ]id-4(l`P\JмU!XM7hR**P_pyF˞Љ0~#9ʠA87hޱQIJJ? "^Cvc|}M S: ?2`$2;3q\!&>rJ:\6)`&'MT>e) ,+lE ܉U:\1!]?광_}]zm_I 0G~M6F g']6IK.V,?*ëVmmYG$w䅣IZ;!?OSeErˀ X-b*߮PyPT2f0[˵3ڲC{O` :o@j Fvr68;Z qtR=q|ˌ rs2~B=r!SnnFŜՁ* wz*70ؓ ^_DyV @ľz#QC5zQuo^ ۰~c QZW*##'ɽqC3Q^_ u}߿{eu$ ^}’Ū?ܾE= ר@i &ݬZPM;a0t,Œ0oii0زZa`B{deg]y**sd|@ƆEޅV\# C=.BќC丵Rx6h1;wx4^+*RiP cMfq u׌LaNJ]|('ǻCY:l@Bj 鲧E$9A%\yZcD16H_]$hC:̓iD)QTyʄ`BOQ;wOy d%KWUU@KxN,-9^` `UQxbj[рA|0VD{ ؖvBb#s\U)}kiVWY> /؉4n-S Tt`p_Y0*nΦl9k~QXk Sr6=J`~X"G4k-uB[~ь!/@j^WvҊƤ8h.B,CjD|ď-F X븣穠 %QѪruJFs08S n9h3~ Y8-_+ξqkFϦƍNƱe˖}AJxP\@嬥>?Ȋ {1!W~0ftk/gxԕ~vt^ĉo~P:BX^_`SC|ӍjHt{j i 5lr‹Ȳ [v=[ z^\F `ˋ1~W \HGvR1-SV8 @A6hʆ 0`42xǦh%#V<Л0&H;ؑT,i;>fZ6i1n$3/: 9|%_P-pËI/? 'x2!S󁧁dF%5UG'6kk'\/Y6RŌ>zvqA `XL>`*:Qo (~*m[hA4  [<~^'0"^?e lwAdp&_(2H9<= AHϳ樐TR 6J?xNMjSP@ 淦Mɠ:7V8:e;v\_Nё}S ؼcǎ >ޏ^6M]US6^]>m1xI<u^B2KH:k5/g͋Iy?mg爁lk^ܬ"(jwު8ꙕFit8cd35H;ڦ[Fu3{6emBFC~`BU/FH!e.F;M9%8.>+MgLWUσk6x.V9lqҲm >Lu5H)oTZ𡾝r9s4|IN+0q!G:λ;,y|?(i,ԩi.~ UmذaYg ƫ_׬W[*Y,o5-QA+_gA7FG?A8dpe)`ЃÇǀܚ\|-ͿCVu]X>4V) BJ%hL:KM\Dym%,^3M|]*Pt_U`tMϙ&hZ0^y#/ ha|Vf?`_(4aĜvƩ“?̠lz_x< B/p "J;0*Or4Ox%ճgm=[n_Vx+1b81qSWxs@cmZo3V?c0+A?+2//\Rtg \TTtan 4Xke.Ǐ'Z xh.1"ug*I_p ܳy4~g,MiMX,RZuJ}_fZ %m{x `a`tWVrƷ6v#B4">?!6 E/x_ص0u-O?| ԾMgO6_"? j0yYl*ֲ3``oiw  C1_} ״WxN5 lH[R@]i~3 ~vIݵ 1Dj< Lyh5pʉ~;IJLFoie iu>īR[P7@DcMQߌ_]mXq ö\e~ct ((8`@ZcڿEy#~=MX^\̏--iPϭ)8 3>q~>$ 5JR^p} 9]/cM^Dvr t/ HfX(JIc%(D;W V%^˿mGmXt֙55&) 9m1ͱMZ:g*]qXaz(N%ﭷM4cM#G& }spRRaaO .+eԞ_Vk4vZۑנd4O(m.|/}L`샸URR8VmP|g#/x9X5. ]`Ŀ*@B x@dncoj[aM})gzEnfK6.;8>gΜizK+V[ YTjj\6ҲRv,^+qlQQA+6lX-Kg۱"gH#@x``m5lĈqqA*]̘vNˠrD XrK<βmOϿEBk?3l@ Jzה֏.gq-D勫EPg`ӟNh ^}P:0,Ƽ g)}%j- U!Q͝y_xҾ[_Ug6hOK/ړ?@=W c UQP(nXbFcL3|/^zW5[= VDsY½ \ݝ G(U+0~Kd !M}-/g]#>4o9k~ǰPi%_~e nMp~P,o@$(DE 5bǾ;0+$ w߾B9ܧ[q__xᅆmP,$b 󥱋 r2ŢtT$'%%$&nI>mz Iu?ƒqàoVN#7_ZudXj]T%Hb5ϟIxd2{ Wj.y4jBY(PT Cs"xΝ  4'Nl+ >gxRȯqK ?B_'Mƌ5vT$ق}T4tqEm(-I14؛;Lxo44sђoa&A E9VڽkՊ1<~sH<_5G^={E9eve\jR0o 74M71ML]\/k*FQ||ZUةC$ Z?%=5M)P >ҢeO?D{VkؠQP|xg[b4+}眶l!Pk`-nC?LhsJiA 7#F O ($؆XEP8aN5G)Yet玦W۶!".7mvHƍ̂ 25ڶm[VxxX 1v4JXQcEd h@$}56=WDТflZu";0r !eS7uhiƽ{N*^NLDV>t;3~&4ijbY4JdGr'ɓ{wZM2PkKS!0m~Aa,AR/dXՑ>uM[PAᴧ1. 0]4NC6§.B:g͒?43e!p0qFM82*=Ctpܰeo,o@Zs޺Y65_,qK ( c`ȝ2SUCf\JIvP%8ت\vsD9iyF\ve9ySP$Ad֬YcVZmolF,><L{l4oc].y-֘֘+Vfka 2l늢K5i~IzT a-2lK~fEf_ԗX Ŵhn3 J ?uydc"Ъ/XDTM(:ğ~ zGE#5cߛ?brw ,ܵ{>"S-j$SUس`9Es{X"*?C.nk6kO k)٨d盈D7߷&Mʆ f|VdlhNrT7 =Ӡ- UW|Ι`M ];%Br2NATsAN:5KիW7es#l/oؿ[3"ݺt31pV6iji:vh gϞm9dAVXea#>"E@E$Y'SNuX׮]k'bWNǘLj[c@>*-°Zc=&>D2o8)qKpC%UՌlTB6J/ܣC(m4]oŕ>Ix*YǟB?ԺH?cp늪bY(}PTnVo1G2+ q:ZCbf5 "[XfL/ (>4 Lʚ5&WT5sL]>ij)(_ViZƷO/\@fuԀAb]yr-E0b}_qu=`=T؝t.}N%ةլe_#iDOxdt!X]dLmw髤R1puQ52[G!5 íxs$][Q]v%xÆ៛(+ ؋1 >JV%SIb,r $O9 ߾ ATCu栾ß~Vӯɦ*\Im"NwmuY# bSGV|1^E2D8qk"Rfac/x =/3 v{! /{$3 Az|dYb'm$InXp 2QBccctz.˙09_eoޜ+W6_Bp!("R!sxA隫M8Et=cQ'b=ŗ1Zħ믙C.R Գl+]ܬ`8mY:CX!-J|b7ŋqѲ"˖DR/*ع,+|lj%Q)1W+@nO5r%*j_UȤ-/rtJ#Ԁ֦mO6u  e c ja,] bfExep8q֗lu_Ը-8u\]'o655 pUAI𜹳 7q{Mh0م8$C9 .%B`*Pێ~\g;3q؏B#kYl% Ko!whi?NHEt)蜺QB4p/ Ry}*d8S(2& Z*8W\nz1L}IE-|Mnf."-jםMqע#ҷ@Zms+<;brʢ.sK/pddkJ= {;}@^eٲ&Fٴ"X%җ5 >.:4;rw1 t@]+^P:1r2;; ܹ3&;z B{eI`ُ(~5Vf0}Zkzz%mJkWϬȩKPdZޘXD`Yo ='`LEOab]("LEI+E~M.]ޣ{EE:."͍s(_1FBv]`w, I 9j_]_I{ :U[?tnbbk&ea9RPdR9[\3&y^$A`ڌ,E{#R.gg2)iʅuY'ruTD3itBC"^W@(\TVE&*U}S/ ׏wm#z=%_c y2Z<PcԇU0~zVWW41 4(MlR[W_m }lO$ɌRxꖛ.3r]fwMuIW!v7`Kހ|||L[;?^7$}) ߆73ps\m)rQANGfR$«U _븈L%ڍu9 P,6VC$d_"X؁M*la gAH5-"rE~ v .ۯOTcBwdKABrlD wmy%eohpIB|4ѯ܅Hg\T>Q&"HtasR<7JOSOyԢ*<ɧlXo-IL$Gd*Bo>涗^zIXNFU}ʚX=,jj|sN2e GX0NQxfעޅ岑$-^b]"xi ȎAnH2PAK-(b5h )a15M(of[DfUSLs4B2 @T@TirH5PJC(JuӪuːڱ0cZU2qJ,)Y&3T.QNܭ]i&5ulԾjuU ֝0.> ;{nݻECa/PQ!3O=ȆFTO3C-F d/P" [ J,>NJ& Ho c.$45=`9cښrې[l|B- N|1>YT}ޭ'sgφ: o6hGxY6s%Z+rOsL>צv<@IDAT׾{gK׭+ /ճ=έoƏ7۷<8Ehri>pD)ʼn(!@_of̙g,W:>tխVZa_.4 OT@_R T݂\0 Z/8ω1WQVj~~$q/&d'/J7 P5]%x2v%t]º-fNB-㘎rb YK/G8J"L:Lw1 ND5.JY59 Q` `D~;1*Q%QG9H!G*ѿ քIB$ eʝJw:b`R>tx]MnIj$ + v/PVՇ t.Ht^S}zq)OEul\].[q['&)NqFNh:xЩ&4 ?uH;_z4)~q*y柇5y- Rq)+oPPy3+w;+BjB[Ńgpᕇ)3)cj"[u8ZBb֭_gg:Gavmq}o{DXctZU+ɝD$L߂ e* `%B,T- ^D 8Q.b &3I)fuo@@hRY&*~)J?w~k1¶*^YGz3>jpPMϣ2TY w}P@HUWEwQ ->enVhv3Gi_~GGYa}(*aN+)SIMyMF(a_K"d#xe\nH=k5d"zғUφUYײ륵r!y"m\]~:Z.(ҟ4nsCK߼~6o:]ݼ@Y:JY[ Hc ;7x%DU@:f4qaJe،QyBEvOM4}*"dB`a+YCh˝wv0NbCaϞsfb\ Ҕ8y 6  -h!Ѧz›o&Z*żt?HKb#YҔ:!Llm!>4 qdrGZHeaE\>ҎH⬳ E8B3,20 M#:Iġc-.(iK"9+Lut)K9}Lm8,)U.ϮE1sX>op&,|g"0H׭HkGdc0[ﯨo1cjiSQ/-70wňf+*?A=!@ ٱc,$|-8v$-prñ;F)ʪ_ʮ]V|jG^E SJC\3&,<ԬZƥ)YW[~E!2ĕ+V7HO8uAZf'αb~Me)j_K"NX >3J,@@&Gǒ5!/S"(qj(ݔGK2ٵ< ,[^ /@ ifW* gK߲ۛr0Qh8%@8𖏮znIӑJ޷B۹ZQg6-+M= ^sOmEoV" IB u\זﱨ^_RPN$:O՗q0{ п km(9u.ݿiX1?~7z Vk͗N;b̜5\Ņ5p`qc""ӅktΕkr׷4թ'EWAxCB"ˀD 394lA\o'LVb$HPYT1M:YIyOr$.eoE"$8+"2"q]f쵮ڷ!Ŕ1'%I`KD&GE2HRLDt~0$t$ؕÀ͛ER#(Zz>Qa`&! Ro3q8rxz~8{|L=*\f?`C)v]v{UB}T=v@nߓk,r+,vyj(~=駾-  '/ rM]:6CfU+Oa\3czKÐukݦUT\8 jtL6&ɋdh\įb AV-4@ެf32yv]5"a~lOJ/;A/)rT7E0c?s=;6++;FNM:rv5[e!.KߣI+VȓTv(ejo4a)MU&J6׊ @*I lf8Xn&̜ͮ9;I%$~b!n};Z} &ҋM@jźnZQ"qfϿ eGPܫWbS &VQtߍÂ>6<׺(d$HY|QAٳdi:*flڒ lZv a[?ccMŸ=&))2uBAk5qNRm0.DZP"*`kSV$ FglZڵk|zí(czZ:\+.rB,qFBM`6 4$hL +18 wpqSM>#&7j#d[1]^l5&F'vE+Wx/A 1O^A|{ׇ꩎cOz!'yX{<bDΈxjNVpLa$J^v'=_(m5$N[Z W\1+>?D.]Lm SA~YgZcB!mfYf#H4sѢE2.9hzaהּm۵$`b( zz:[ .0a>VGk+Z2]Yg47d7|ȸvHxa*"">bʫry9 89 JeE 44k֮.E-J|}mtM4M:HlT$IE_ -io9 b'ROD) ;l"'#-"G (0ي 2f[(O}"vE+TQŏޣB]ȅ5MkSB seֿ@vJن$ }/ØL0W83(}{yޥ_cq')r{O?ݼDO tB%2j٪y(Vz&ٱ}3 [C[m8Ib lMRK"ΚWȿ?>{%%'F>bc<butPAzU]/?JQ&'>LE; UC8" dX(R/ATC(Mf-1Mܺ=+VT)M)-QL4E+"Y Ζ}ǂx-P`!lbI;M%teO"{Vzn9׫Edb`QęHXWl5V޻?BH[T"6 rH,wcWZg?㯒!S!x~Bh/ k)@[7k[ [DBrϖjv<"ֽ-!cmΝ˺iuN\!j$c]OEU KzQ, }GGcrЋYB9fMQQQڷҋ 0J-ي#1LMjM"tޑ( @_]p饗X遽?s3z_kd((E? ( "Udžb•& 8<r/c?=@gB0x9|/aH͔zFrX\;,[n63rYQCWVbv/2ڕBz!yזg07@| ՆH"*- Ns Ͽ/e]>w-u<=|+; :J#+`kn0kڮu^Y׭7kv1a53NdmĄ v'aC?ɇ)iӄp:kEkd'ulp6Iq侭uܑ#u1BWlBhw\Hh`'JJ-=kq4I؇Q`Xh} M~5y|O}698 ^1NwLm!믿n fj QQ3~ʇ]J+$X~C-Ti8Lܿ`ISM~eeuޝ5c'BFc2rEXҸKB`;1,6?,q_9lq}L25(rt8;T^b#-W/M !zM w"@T&e9/Y*M7s_~56dse[e*Z6o$;blJll#F@;o -Su g!2مV6n7!e'o} .IܚWjonߢ콙f f>\q{/K6:7)q=4\a楗Q#Gw !C._UiSt>1f a/` G5]*Z:C6ɦ\Ϫ q{_o8B3(7=[=qҦn1eQ%T$L,<]S] %R… ~WIX Sm\CYAqHDt׌=uaqUn5*num6^~cb^rټ v?^fu6?نW_'J`|uhb_aKfi{2UnO4Ow܄$&t¥oUW_YUVxuVgvbԺ}o85b,K;kEPvGq[0[m|]b)Z%eTt^ݸw'' IMM ٴqs&MG\㭱$/‹/I|<|2~:J~^&> N^ծcPZYHHΘj8'I rvhu),׎T(* Kc| p_UpZ_*h}lg CXr@םEÇ[/: D}㏽U.}ԠZcڕ!J6ؚxk)s=vEĢ1u:V;Ia𗜃w wgjj+bE25腎]f])ΝQ5Z*R Ԫ$IOT pKZzl Sn|HoO Ǔ|kD,\G={2K't~/.p9 қf D$k`ՏkAx:ƠdݣxKO?@??hXn|G]4`>+@s[\4Lj֭Q}ۑCvb lhbTcRƔ  p$:ue}gFA-bEƛ@T(뽜awPD wzlDzF-Za^uԺ.ծ@/I 0y Hy`RC%@Uxuo/_>#;9qۈ 5QgDyI$R4i:NH/$/}Q@5.vQKQ{թǥX1'Q}&cC\~&JS<୷L] wH;!nd?smĿ| sxcթ!ì` ,{M>,y 7D&Ӝ?2k _|E3h ku}q^oM?@w,ՙQZ^Z/1u]!d' _/! D;^:JOz>O)r|D5ZtT41T^QR˓9DYh$-^ W!W^Ga9($ifErmϱhտv>&Ξm&?Y{{V}mǵ}{\\rB@:RxDu%KLdƦQSoAa*E&G,J}}PI;$0n8;i@"_Xn/xXz~FRI&MTj-[Q H@]8vΜ9 #G6<*Ck~WB>凄QD?p|$(h_$ h(д/`p7TJ"zopE:aL][\Hut  Ejm?I-mX1'3H {YY_С6IQU/gP_D_(~ިK6UL?'|1X& _a| 7^& I-dߗ5=Xk"TnpUn`YHH.9rob9p V^ƃ[ҌHV/GcǗt(h4Q9R@΍b+Mɏ=JOE[#PC{S'`:x =_{tNp  Js;5T)w=#em_ 8&Mo3Oxb6J ^1N2N(_J9wpp@ݺuCHJ^GI{e}?@qegbX__~ ]q%WU;۽p< `'yS;+vG%$!\cT쪲}n"^83 M-CLs}au4f><VHw.\hh@"P+(5a6}&ټ8r("Y֢R{IQ-zraXdǹDױE6xET!F@^x_G/]TI%T( -Sj͚5ω΃DֽVeHx+lD;8G@\ :h_ d:^k~%mUoe_|!0v!ȣ&CJ8F9D;DRRGM=UA߾}Axʡ||\WjN>?+pHxqZ50_eV<"ɉ̳u}w9 %A ^U$ \WBOBH>N myƒ'Rg9? E M8Br ΰ~$-[fS#M~nm:piwFQ cPܼxp^FbPGį k_7nz!s0U־!xuՈNj3[t3II ;`PBBBRK lٲ{Gr"4P21p8~{괭^|݋Vo;ÿϺcǎ2A7sK[FR%D%t/7۵[Gq^pNb$Dѵ 8+L,Il}Q٦b:lzrqtۣ^\vR^B?*v]OiӦi~/N Z D'rFU._Zw 1o1Z.ƩTtu>0QyHEO楑V?>&uqcۃU=] $, 5 w9F"e]%pT 0 1}߸8%r9!k+'z"=4P0(J;JšAq(]5(|qԅh<1krr?Snf';v{w4P%sWfsϵYZEӍ76D7T m Oci3ĉ*мه>.?!j%sHÅHn0 So5`@~\V#i)Nyjq;!㞶b20C{e1zÁ'ܟ`!Yzcƌ/";iqWw;ٺ1]jժD\}6#r3P Id*b훺m%"# x2ՐlA3@q׍ivI'$"bTޥ/K Ac5ﻷzI >ǦBW&o5q\Ϙ1'N|qL*[㹟s~;YϞ=;Ö8׍2Cuk3{x;TXOքL7#N\kFoퟃOl ο/h{E&xŁ1^qFZPF@f6j1_oYzذaf**(7 FZG@eXD'ї3g̒/׃x:&WJaX+jI@kĈ_JB6ȂS/B/Ľ8/G[O/Queͪ +$ P`ʑv_N.OKD9/dF|Y߹"ɸ ͓ȺuLW8~40rkZJ4$Y7@TEbդPZv05OFAL8:뉟Ӑ·߱?7k=7<&!!KJίj@K|U(#D\FP._ꟃ;}gwG11} '\rɧ?S++P] %?[m`a pz9绗~JNZc@:g++/~(Pim#Ҋª_8B|nRd\0(;^xFUMEqTޏ>co}Qk?tsxƛaYp95kg+Olk߬gk>ټ놬vb5w} u<#OγAR irJI[Q 跊>PcyA:5={'vfGr[n% v"z_~yJ0JL[V +dS$Jzeҧ)"PP%& ђ5VJ=?Aco6?`{?WHUGi }^UH% HT%Lj~sJ>ẂuG?P-'2~ vE  ?kƺ_WN;l!pqB8SODCDC0"\Zׯ|a(Ե.ɊHz!5 qٸq &샚}M8ow)R䒸"8J $X7aELѤR Ћ++ u:v4MK6S̱[g`3\vsh1?4_i;'At9HAo:ͬGNRa(8%j$$guu+F@+FF+?o, ~;Xc<ch{tM9S"6C6Tz@[āK7"]j`r%` {/K^E3 t оtpfY$]C5PmSPV=K0IPHi%X Dd8;^X+QݾnT*֛N7lqzD*@K,# QGux,x=ĂUgNv.ɸ/F I2^DJ<;-6sY ~?%މ4kWbCLh<ė)))?Ud'S;[w\wÐl =Є6/$4 { Ew: ;'Yv|;vߖ-[k)r;@9?Sd}یҐ$@hF.c 1kWgN:\S YgY8\DuShCXڈxjsDǤ4 z%bJz+e,*HjF$ĴlejF򖔨m!q# WugYҊ8&hJ>!]xeb x" bk~i+ȏ\lD@!Fr$^)F +FRN (L"pt_׬5֯w8|71lV,휿N dKgr>#qS]#'~eїervJݪHM*w?^޸h!YDVOPsgs`" r7Tb~霟25!Nي Șn[qNTP|y%sV)akOiMYGYJO]gIOe62QsJu6= E᫯>P8 R3zc砤 =yT'/w4{ܤc\h )E$}RQYVPƞ gOǏe^ U1qZ&ˇ8\ڒ^Lpϙ3Ǭ3;?ē?У*q'#V<?ܝ DthΊEX&V~ 7o/?WKk[ -@\x' Ru`a5ہe:;vZ7`p&@#\ (}(-(bD5߉Ojެyφ M&z6 ;;R ̠̌V%Ϳ)r[@5,76q\6(P W ,d a6W_VWi3v,?L!7vT {t}x(aw,Tb =t?|Λ~C\L1PZ@3$jڂ>2Ϥwf0qB8{q$ B suS.2PvU='|8\n܃!R6z B`U>u ]7{-yDĉkӮŋW+ZKwiVXkڵvtA$ %*!*}R_! ܥ*fmkmRj c۵k7ҥڶPo4tq@ "18@,D4o!Yԩ0ňFÆ CAI/> nQ>3*~ڴ>)\W7nYڗE*HRؿMYU;xGon81+`l\6POV "'o#Sk7bF5އ޸L>쏇 rZ!Q[,o4#r"*f <;vIp颸O>rՑI4gwn9GY;l$x;#H^;$s Z `~g\NDT~]\fY`+Ȅ@*1Oݥ7 .駟BZ{cccTS:] Yy?~Ƃ ѷ`bMXT.鮕`Y)] uvތ*}=UK꾬};R-[jg>'ΡcjPy<~$g *"ET4o޼ږY3&8@> Og׼RGґW!p;T#ɔK)wQS /"𚑣^ʺU :tvz0ѕ\ 'L}1`tAdR=+$4\~ VtC=i?з#/4? ÕZ_@c!~2(; {gVn`ފ!@\j+M\kcWbW,o"< 3PAiVt.hV-zp"!iHXK١Ym]ϨMsrȁ7Ӕ[)~FJ DU:wzuTzZJ<'HNc\o D~G>867w^jܝڗE[ Trbǟs){=ه$7 _lP ZޟTG5 Jr߭kv#jwGb}D$]`@R{qb[qFDF͛'k{{ )룖"$qM_?@B<}N\- [0I;Je[ +o,=(4m>g!]jR(MmISE VA oG<L"_Kz41Y0(})N SJKζ9vz\*`!X87Ona n]aqLVØ_1㯨 U9E(WB~1\! Ћ9vzyx; Frbg`fOvx/_k@CyNp[(7w Z i7ںb FR,cG./ߪ߿?uK|H'_o}$)+;_5FֹRQMQwΥ ґR`~XA5uZH;W~ܐ>n};zDȭc$YqUE\ n9g#zBJXNo?pG7:X{5^*x>r~t tiӦyUi4ڕRp1`ь. Tb |t{-PC(QYԴ#Fp!_IWvcoVb'`ῷcÚ+N}.s-R䍅7]eZGCg;iP;$Qp.Yg1p1/(ȍ<׷oә@Eσ}wKovk%<,[ϙy;N:T)%rgna/?2F2rE: ,s }1^c5r)>t'UXX֠GәkrLx8_MuLܷgykU@$4V2֎|!{ hBBBbt^ssb58O :Ɯ5cA:+_>phQyiKORH @uJ1Y{#黃(9B`D$~DSOCksCPpo77>)d@PqU<֗L}:,B]WEqW,I9J#@!|%r.+.= abM2 :uӈ!B 5,dW~z ͍Q!/|\n  =ֹCmﱺG,w+9`,-u1^ eIEDcq B.^{բ嬥)(~^DӟxҌXϯ++idM{ůDg qM)>/iEC^XR.E?wiw\V8H|,+m! _]00}W6l .0O!hC%y0(90 7;kǐQ\{?{`E%#9 " #0tzgztfs8g:0(AAP"9~_WKyo]z=i{56t?_E“Pz_' h(Fj+ 4e{!O闁VJ{]+^')Ѧ2d]_qb4rY4R}?\Ŀ%=bD)x@a+2f~-k[5Ty7N&"A/L5 gOs+렙"m5RqTNFO#ۯx4I޽袜[4_]k,) N7R*$G24{?!20V#{ ~&6e>ݔ~I[o(ǪT5#,Q,|0ŐZlOe%npڝX[+Ajix aͳv$;.X/eyU='V~ʹ&=UvƾCϞ~ᑽ9uz{WҐd=D˯Iڶfcv+:U10J3~y/"OAuWh;mi|GaV+t(wkf68 !Lcȭ Ž:Ng̜xYǢ R1YE`&Gw۞?!֗oo>ʔ÷R%'>k ps:z4BH=JR Dz| -# Ӳҥ%fc ,`$3NGYیKٳ*9S_6l?+  Ro7 yZ~w1M@ڣ2˽fPӿ܁v;4E s>!а~ W1߿{E _a >!^0&12FWuОmLUu9aaF7Y'і83>nƧjUwaTqĻ&]zQ 1.aND6犁I {l0h9e?ȍC|Z̯,zsѰ5u~||͘Hw\ҷCjZ/qܪLu2^3:p,2 pwJUI;G#̍g$u 5ciHи# >D_۾7g 7D_PaU POs΀nDmgv>`~hVֺ_=Ly"1\i`k٤jG./Ǜ5d)U+Sot׵!*6'x.V`@]:-],7[D= jȱϕCb˦Z]b}t5nM |vaLѹމ2T7nN>#FpKJ3tP ӿ5md͍G,toTw (mp V,\1mg+&?P𖁷ZYUҒCh|ezF3rd2+N"@x$hT*J鯹B=gVo޳#Zc'n[u\p<1nG4Vni!{JYm\_;+ N׿HM0ZJDPB}*^?=rĸPlF!j57L#`6۽({J?(J+4};Џ:hKy޵.0QgngP56sL{q.pj?B\/BqM\:Y.@Ze ?P+@1e?i1|n}빅(CmNM{ۍQaoZ_^p_ ͔1B@O-ٴwC5 'iWI:{V¢ [|q ꑰ_[C aF`4Ԯ7lP#q+2uW?З0+1^ߟ:xW[x>=>C+()9‹A @XsAt rr _1x+I_mu۵mxd$7O`ET ޣ.0TLdջ%{尽1|+fK# W wנ(SD=ˬ Ea*-CEPCxK+3u֊ ߍtN:u_j׭Ӥg #ԾꞰwAo':˦zL(Dq@K7 ۰u+coѫio}}qM9&9L7?h }}`%9aό?Y`7ʅWYZtk:ʶt8fD<37;Fm|Aㅽ4T K/kܶ6vZJiv>HRy7nӺwd8C,ZJS6'wFP$S٧JXÕ^F@!ڞDem,a ,V)-#C':ۨ{%oZ|z+k|A9Ie7WGViѹRB xIfw;~r%]wO>z/?F`918Rgjzk=}B;4}O:-5(5~k&}~֏raƗICҬ?H!p%2܈8U&sLҺwZ0"5?}GI|<Ҁl̗aQEIIgx[fs!u$,GhfPu.=̘1$ɣ9F? VQ.-M aqw~{Hwoճ0BkGZ1Ճ,M$f2W:%윪v /ZRۉ6^VS2ӸT&Y3s1,cN[ >ӖF/zV9 N@d 6ܡށ}'K8 2~y&ॗ^P1bu C?~| S3ĉffi=h,3N.M!Lt0 6@ fKa}G f5jUŕ,(ӌfa썎{O@[ uLbceoY-5Vh/Jﶫk.ι  KҏX 8cntZq-];YkfJ>8\`5l\sC2ͳ.ߘG?6ҏq9BNI>_Y .B&JIߟǎ d,mOk @Uy>"ۍwSGF,ؿvb1NzαH uvWKq#|C0 :2[^HKv1d)Mʥuz+E&3qTTn WtWN?5\5Df!Xc~%if !_G+i9m8n&VoF >\3DJ6[hoz2 }vl}LʪwZCb@CY&RVݶQU0Cea"ic\0k8/M ӡߡ#PU`,Q 0mdw}RnV]YFt&alȻ|*6?+IѓiCk Kt]W‡Fzd0z^ 3!D[hBr$;I:= &/GV, `eԱ4N0ZQ,۱nb3@˗>I  *~#z^v2*!/HI?G(] K*gיJ?Q4](x`4 4L %(N0cU+gQR Z# ֦ҼC{(#0|ܨ dh\,A|/\t[4/Nfެcx1"XQ 8(EG+:/qbf*xAj{SbLm\@p5aF>:̙Bb)k/DaEx1 t`!@3 }zN]y] rlBY%.y1 m>>[uP1y Q}#eE({hfmqzŽ`V%K aY<<lDA꺤F+SM"2Wi V7Ia!w*C3[m7ڪ}8qqB2A AgOǻnt98O = jnNs =2홫HfXK??It }oϰև~D4~i;uV>/Rߑ*za6a>Y~]D3⑺^AApߠvD@f˂<2rHvs*q}4q 9!>TR3x4SуZN^b}>O5/ig BC`w,mq N=OѧAB$/VȅRaY_fĿL)pA+CGN0#QW?C1/Ї:C|g=2O59r2 1v *k22[[4@a@ i263~DW:/"޳?Lo|,eH:G C d^8(b sv p~mYjXGKt#d9nݓNt]$.F{ia3!>pb~{)I| Vq{i4b`YĜTx:(-o",,.* ĭ[:q1sw5~LwqQƇv󴢤')B"0#%Hz7Dmbu­bTegYAI!]y7>x >l_΄0e ,4RL@ǹ3ӷϧڿf e-7n*e xDz"HB>wi'i't{e?4H~̱nEul˒`q!ߵi~k+Izt׶1: `l},kvٺiWE#}_"y"X#$R ߛL%?Nޓqߗ}, hǖ"9WNxS.@'۽1g}>JO:'Xc=Q?37!5K:) I_|g$MjmkZNk6=Y|wU}hO!O^ N,#ژ4.I`H!:ݍ;a@E{Ӽ.fg.В:J I0yjw$OW ٗ[׀K! BޫD;*D #%JrW~ij\8:CsC`yx%zEz<ü5qMGðaK܆VQQKpŌak„/s\{06SE \sUg򈻯nxdTş6g-+l+LW4\|sn5[A5zQrWc1Y+c (~B@=¹8݈{+I42|;h~5XY.'< # cn f?"=d 1+Z\@CLK"i+߻ZZXN9%[K!kCۻ;!P; ;5ץn5l'Xõݛx5% ~Oh@ߴk)C%$)m^|:"kpoECJ6ώ0|`q EEIS'MXxI@NJ0/D|VB-{g;Yaֆ * `83GN\?[N.m5ӫτv^Uc9mƵ~/ Y2ꑁ8#R{:v?ýfN[M U|тV^$)o7H3oW&,EB&E8LbߡmF#LK.Pmo Vfȵ* `ϯ| ꧷F>` >/sNCKvFID4@~/kH3ia0rCwIl3_[ jDƩ?".?klc |p'a]]QeQ/w.3y'f"Q IƮsξЖõ77eE*SLX>jJ~Zn`x/U֬y3OZE{3]F?~=kXܥ "y Nsa" 1yW_f*w 3K):$ ,5$!c@7x`bWR<=ۣX]]vuM۶P9ҊO >Jq Ge (&> 2`XH(qG3zfqq/!9]lGmQ샠4˿G 4g *mm%d\׀!D};k/Ϻ2Əzlpi PLhm,{ۘl\‡tîC:^[!`^+OY 3 *oy3 'aYNf ?5ʇчk>3?\ < igQOJG CE 6 wqVw,?8kѣlFru-5+8SKG?`ór+jv: w +fKRx* AY% &? I{п).vȦRkz~ґ/n;H~pC9`ozv!̾BĈeLCaP{i )(g:Hy=iҏ:a8 UF| ?Ɖ:3B34 #y1db e.ahظ\d8?V2QZh˸CܺL!_v}wG}7fqp䁈`Zy0+=LLoVXZÎ?usW;I,w]Ўל0ì忓Gp#5$5LGƢ d} N^ZzFr&sg5:A1(נwp|R7ufٿwb{a=!5HzVϪ%~ V&?ε~eϔDi_gGNB dƹkW_aTٿN})k,P0`aCSW ^[]=3?s X: tgas2X%r褢C((bK JX5n6w \0`!㔮zIСCKgwakL GC]wIOR?? NB!wv ߑ>I ` FrJ[Fi۱C1E⮒F\ ]VZɭx:مM8KiW}{&,[N$\SѬk 2BiFm|,]oCekMJ+Jg5ڳcnȮ 5Ϯ͵0QU0e@^"۰E$QEh}\Dqo`BgX*Pn)ĝ@e "d hO3Raӓ:*|0-~@h- 58 _g9#| Υ3 İ|lZcZrI5.|㚎`)I\a)>0U^; %%%~'[&J( }?X8V~l >iB٘x\ˤ2W}z&˾ !*ZB"9*៥4F zW\pg{ JOh a @Uˊʭ+ 5qF3i0k|j.DH9яp( 5 qsvQO* 4[]@[ĺ~gY= ~{Żv"\RG}_F<^xэ鿮ֳ{콗krR?NIt贯  6B۠2 .R_|H3$*v !ZN3 `guk]\iY1ש.V|H z]2r o ͿpU!H@H"gLv CiӦIyŌ I?{ 312mvkk^TI«TsB]`|J]j;Q̟N`!-a5YK[G07/,KsK4>kAj'Uw:uX@1E f-,Q_Ia"~,ű4b#@K/ԋnI(r@+ɰL?sxϷ?VʴYgFnN]LRF#| Q$DhvۺiSy_/y;nژ}c ?_NB OXƜ| kjXȮjzcJh#O %4vj  e]#ԡŋ_IwuNP:$$~iJʎzu]sOkL]B  VIɡ`-:.m /РCzBRڡʷ8}:E%3Ls]Kv>un1Nآɠh {?J);Yoơ2z5׸t1RMwZ~h>37UC'5ЫG/We SK W-Hv?Y2뭇 yo0I֯_?7g7m47]R8Bd},tI›M<%h@IDAT`" 'ȽJyT[2qkTk$Êeha%h#Ca׸{f0ysOtNv0Ji8_B`u0'mp%%%*[V#a9%_47 `o, 8h>Q`8fࡇf,Zg~頃dVx/!t Yo_J$4{I@m}$|IvN°a"njۣdaKmr::E[QHCg!Q]Fw o"^OȴFzWC?N-x^rn=ps9L*}6qLcc7l]+?~\1 ciIT>2VWj+FbGjК aYa5a %(03%NXZqo G:\Z(ų6 jKek1ȯ`Ac7:+D4aȟr$7Tf_;H fI9o~LDw-rx>]RZVԚ{aOnRB4X@̑0rI,yc=0f0,z^$9Lqs?B׵q?i1"ƨ yp[a\Ϙ~#N F!@J5΁DŽ[:2ӏKftHk)ssy 8-3E0a H]_ 6htr*.UVe%fl 2gƤѓ\(0r g>Ai3/quluw’,pivØʄtRȷt VገYZUqU> %꟩xp+aP,d\fE%q! ~I0OiFH16Tk|\ } ,qhϐV +Bj30%ne\AL|^ZK,E0'نٵ1Ƀ{L/GӲEp7)ofrWQO<ͮz??|]+ݣ"ř~uhƬ:9kieoz8`󀿹2@vU.1]ocC>ԟ\ ̲ 0h$ <(0vX1@'mDnK$)|_`@w$ HQXPps!(MUg 7SU}t>$$&4)%P'7vExu>la>mp'8yev'e)4Vy.]eJQA.Eq6Vx6I H+l:+*Z`xdi.2&L&}EeAS'o'ns n!y\feQ9B yI,atְҋ pgvm ވCGvj*;ʬp(fVMisqSQa.)3ż =@x뒒o?I?~R 7PȮ?Bc2`+ <折)-Esou*_ k[xp.(!DhZw3& !P.2ky~AʖigKTR1KZd- !ݰk5. | (f6G~ hhE3KJHɮqM"&][>END߇[Re4\eWG۔y 4Ȗ;7[}|ryNp툚UXQ;kb2n$a?Y=#ϸ8V}f)P͙>"7A/p鮳l# @9sιwG%H[n4Ы@?B?vX|-,\"ˁ{Jӿ/LYEe Zo8UJEks ȖoK{ Wa `}-QMR'oRKN͘kቓ 'kts-<k|yv{XJW+²>41Dg@XDƇh@\p_u1kc{|֘@x'يԨq@iZ:y(cy~5pKyd*!yYQoԷ2rǺN8\[uO8}wܑnn;fJָZ7:n%yJʎmQ"f?~N~OǥHgLf4|~2+|Q?ܵOEP?*(dw)}yWQD{챇gW,7KظIK>j &%kR]Ŋ82]!` ua½|E+=X)4%*,,3q~x3{nq2۵ 㠅{ ]]'G/碐P$fݜ(Ӡ~ @(KŵJ0K aCFD4}zaD][#qm`pH!Xjޢ)˼a5_3!99` OmxE @}Yi=vv7\ϭ|5zdjv}z^y>xT7n]J{0l, 1_igqq Nž9[{B1ov+/r=٭z置o,ID^nǟvlSGq0UxKg?~`5u=5INL#in:mkzJ:MڵwE ,v,Q^7H{֘܋0PO_ G-cR;3&s 6}iKMć~v_Vd*. ^~ލFcpF o `ka.ۿ,<,0,Rjqq5h[Y,1V#R$/b8/ֵXg׈t!3藽juh}/j= `l3WtON)S_z-Fr+qk'h4^v<ا?~8!0JAG?ӽm%><J1P&iR*#8sBэh E]{YO-ɔ*<61mϭ΁`h!W+ >-Nrv>|G{<ҙ.\xp& sFG 񒱟??fʔE>LLXqmnԟ{}?A5gj`c)56e coH#0(3HCoC2D)gFPRR^\їXv8餓9!Cxf#.li&5|Q\\ˇv>mU(9X>k+?]v'űpTo6yY`WyaٯWem!̈́_.+ dBe)ZaXb\:*9 awU{khPk3Nr; 6?_Hk`K`2WAe4D?4!LE0\[YSغ?XtfE`m`I"XQd$_Qc=a&M 9::wV>gZ~qíR"~|c_on䦬3}vͤ_1 ʇ~@0b8D+p XVg85qx"9w:k.躯] )ʞu߫nTm0I7K*s ?}&Ji; W7Z[ӅLcX?UUA=!¶~ %[=??p9jx}xIZi0~v\0 MՋ@b41amX,aX '5ְoϘ!s ದK8 QT av%Z.K8Z'K7lw'd_\XM>,֗Rt~u+n@X:yM ka^v&ǻkr4Ġ`H~C]o%w|M裏zE0\u_8R 4 IR t[&+t-s\u'|-4rW7׶ESwx#XoSb˯]?y낳v,S56g "KtƎ}„H|W_и>Xn뭷T_xǹ1a\ج {;{*NpΛ /͙==1קGWQOK1tgNl.)7Qml2$bo1Ha*!rIk?_=B|7zE_~"DO:cP4%~gΚ&g]:ђ~ wzxjq m,>GߒaͅFâ亇nU/H.U$讁U1[P&`@JI34qĹJk`PXԓj-rXVIl= fp^U)udVNJ,P?`~6Ř׮ƫ\ os^al`0%$Zb_2#]b?<\)A!9`&4 C%Bu_X~@!a&C( v`J>Fq@Bd=N0t\p~ǹ-[MSewq s=f_?V}\K_Weac-'fr',*Jp!_!0},U@y; QT jAsPP@ & YiK6Fu3(ɔ-\ȍ3pgqе-L+u-tAmbvRqJb&ػ^\g\Ǻgq:t}=SO`C,g @$Bx^ >#:5h&6y\3@ۆL[3Nts:3_x9c!P񛍟Ys.3, e*|XG? ׇ{0a? q;uk}*.SJH``+kVlP;Qa7 Kx fꐶ]0LH# xcF}ҳx?P\un=69yyyԿ/;w&AK|nw`'wʏ)r W ¸(FX"dȌ:2xHA~c0륫P˦Xݜs2J;)N3nF?>`l#od]'.(}}g\YR <[>9[i<*Jlvd\D%)uХa?r1RfN/ChN$H)W]?8Z#.@@r-=Ki@r8"e'Wuw[вy5@vq|{7k.VxWZC UM_`_qqEìrV g(Z"0&"oA>e}H҅ ]+" _e[Bt se;]r׸$'ξQ7Omq_-˻:_"D3j XܟUVD#o_)kPG Ӆ (Ε+Dy]*?UoŻsfj}\w-þK $wI:)as1jC ƟUʵ_6|.C?m{VC3}\.8s15 m,fCbAʀL1cxB')M>r` , ,47ލy;7WO]3Ԫ*On{uy"݁@8Y10II`ē4U.q鐧 J礟,6z3g_`r(β,$ƌozС9[NK-)I:~7׮uswyzSz4X8@.(^ PL)HYK fqB  O)Mbi0g'K b%X sJUBš3€@xoK*2Ă@RD4A(PKa^60G;D3:,4H2s+сYP*\KGi`mw70[XC,ό<ۭ„a1nO ayM|ūU$TU|έ0!7؁n$ im FDIGb^\\ӲʅK?\7@G.vW]pk@;8leμۯJ鸬*%&Sẍ́g f`_<_ !*M0(D36BzJ17S[ BظӾ1s\7?~vVd[YDhpe;PK|*fXU/F|kp\Ckdŏ2pi[R<(5 ̨DObֱYgEeŋ'}i>oZJ2 v:ē7o >_b( Kt_ּ~gf?0ٯZ>XĻ@\}`&Y%T$ڟ{;l2.ec,@uyMWZ7kL-YDflpI3_C־ׅH,а8 Q]P+9xk¡l+I#p2PQFt Tl@2|?IhcsyxNX{C4%bpؖ 2fҹD_&Fְv3;u{Ƴkn(~ tf={aпQJԂr;9W㛸+~ܨ\0KМL\AyifX3=7MDHR'?õ|ꪋOm\ìuzm>kN$ )w h`\T,@@M MҬs ^$Wz?ݣ]6b(U˷rGۼ TT؈7`!3jjLޥaEΧX[x_Q RLI |6 ,0٥Ĉgcŷ{67 cסK>\\'r`>@sw'E*GEn+8LH e,XÚe["e5?\' @ P8Y=r0,@7pC?$OM_1&^kPTv(֓CNc`H"Ô\G<Mnq™D݈2)|S}unFgH {L2Ϲo~{wf!ȼJ/m̀ l4]4^Mܳ~B? z|2V &|kvk?ms"K{I`ʥR~U-~}bB4~(DuWep|Kx]ayB!W,2~,%z?}ksu(U 4’]GݤgтZ<rŹ;y,P¡\Tj Д0bP\pi)Ԁ:ldk|hl{f>Sތ\=GD%\i߿2ݾk3zh/7捰 @fwS7tTZ3%G3ʂ(Ē?'Pw]nr7}}1!/b(k.7~V{uzv-܈#ut^AZ@@ S"`[h:'5kr`p^h/`_}Uנbw]n+>^rr'=oQbj RI^-%\CvZBS.= ٻP9O /UNM ҭ1$ꗔ5`arH/~y@<&- z*›l%-X>֠.YB{f=!LjtX4η,aSc혙!DYEn&n-ߦ4rw=MC&}awM_Q6G f14V >ȏ5ktGZ6iiqs+=7f݀l{66uaaxL7_ׇگGKдq%si A-w0,kI?G7|WzX~閩xH] {J z{យU KfE»0J{;X).5j {?cgo󽁌pXy{!h#"RN|}k9H~;񒺗)K  Ng1t->n> oXˮn-]C]7vcvMQ^IMNφ23nҡ]+ibРm7~}0`c<9R#wXsxFJeP}oлkmMUbb|_-|DG5{O!S3+Hk!T %?  UFx)'|bKx&Ч>U0}q 17\,W~tRXאG>̚50g3(]Fү?f/HoY@JYHu|GO:[|kl[RyiEoof}#aVwqG1ao&i;j6c~ty/N= |ISW|]Xnq%VތA ¥ nv[.W4;-HBX/}\ /瞸;;Wϖ9d'&3]((dP'Mz@' MxPS /W6y%I ^0T2T?@Mcv4,EF,n<7Ima"n}nW2堲=TH\@x3l\ Yl@^-iO艻,: y؟~U~Oq^[J 6Z9ixr fB93Jw#epkǮ]=܌ӎwĀ.V sݞtn!:an^W2`ТG?⒱.c~wygsw {heFLZ|JS{产jګ) /b텼qZ]#1^8Lxi^gCv[j zKl?O#3׉ i`o\?0.m 3 g~ mWMZ>6x={eASğjPF 52e2-{Kg2ބN̬f$;]P ݸ .[o~ucf7251w~}ItSzQg=r.FKCIxlu-i1n~[SnOwSFmoG٤ɮ]w9Zw:ރ>nuj"^qxFz 9x-r\vk\C?(`⎮߆+ա H͍2X8W>F`4 ߄'5#Ŕp"c:s \'mZɄ5guYxoVWME(+ViX@%SU8JX~!PSP&MfhmlKf 81$?&hA =ViܡkۺȽiy<0ۣd:o4sk:=noNEzn"wKGA~z;KR{:Bvސk넧-gi᳣rouNϺ5&nQVYynNъqi=*[ta;ރcRRRRz\ ZQ$ :}2.ˎv(׼"^sS4\Н-bTr'O3t36$+9QKft,av?&Ch^y{kҸ;n; +Yam)hYv4 "D̺wm7O{=_և"=Gf`פn /¿u<YF\vk>fnF:&SΟ~:>[ز I } 6K(PdD5=g (YhHXnn5:vh2w}pR j7õo>c(9b'hž{ H]BEj am *FxxU?,Θ&b,_˻ٱ7)w$=17Ϯcǥ3ƒ5?\cpC:^J:HV4hKp4&hsV*)-o91۩,Lx3Qֳfޖs|mq3uڸWV"ewvu. '_oZ6_pY\>b.PU&qVCfhv6MͯwO쳎[R-.jm 4#GoZkUh$+,洓ZLQ@˘~V[m ; hxw#`im/W8kq4q_rJ#EϖȌhI-~֍in1z>|)TA ~(l# 5 gt~!B7$b-BqIΛ}2)#F= ~:f~t~2p$ՓVwNm[-p 8`_snw 3J$/ @͐hn㙳ݒܬջig\7gήiX7HN7cn kMGݒ˹JBU$rҧX~AI/&R^{`#_ޮJ4I>sM[͝|n WOol!Uv/'7A{sF\K37owS1zT~w‡7 -l)d.VERǫG 4i"FRd`2 %:32 t|cs.†:Rc;K 6mM&}n΀e5y.5sWhW8Ž1ͼ:me~ v䆰:ϣ2n a,x+ۊ]Bxb}-K&0^5PpD|+7 $-ڷm/@2^V JcrY)d$ /$M^1<`υ:iRT˧>{/ώ]޻ S)곋$ݽ7D;0ٽ;egvg9sڼ+ +e+7dF*T -b lMsʫ @{Ϲq?R&;}/{}􊋥j$)]s-lͫЧbJyhk2pUh׮ a]v. %ߟ@|͗wO.8 ׂ c\l# Qb{o({Ή {`MNH5 {4n6YAݱH[lq{>c(qm?XF҃,w[D |JI52պ*f<|hxF˝:oY_$'jw3F{~9i MPFQs5*/Ko_|7ލ?a/a6T?E6_ ]LU}fJ+?tR%hr=]Z-I~a*}/sDViD6\YrͽU83ug558_v.@\@mz/I^*u6H22dhޢϞ"ƭ,gy٠G_:OO u\g o&P{oHzz'Z?=QlX:ԍ;.{׭ggUH^5i\Lj!ma͔(zzv]t+yvӬUROٷv xD6crz.\`lz:u] @,МLvMZz< %vy75$ H60 {>{?쳎Q𿣎Omν^|U^rdgD-_b*A:2/.:jmTƀ_)os%) T$NWNI=s?!Jo*q)\y.!Q5|=eVKwVuL1L>/GZeqo'c]U)ZT+,+ (@IDAT:Y(нǶv%ʉ=22#UlIN>,)\VС} uZhדO=1 !<T7uGE טnbYNp5Q#]_߿˙grGW_}5mh絻ԳR}CBFݭi^;{]&٥dT.E< AM1:HDA.3q͕q`Qm^;ۗ^ks,ZbY)Vʐhv`šXI RQ?[ CAmgT7^>o3<\%~bx= (慭,v"+dsepD%-BynQJp.Wb(UWŚ*SȎc=pS ..ғg ǖ ܋$O[g=N.Cp9i(u츖mV;.]Z\i K\m6ذob~V 2*UE ӖP>}zêߋ.9ݫOJ H I駟vtAn-=˅F )VúֹSgFXl-ٻ#Z $a-Z>϶ח9 1bH Gb_O|3㶬ig`eK2  ϴ:EKl2Ө>~ikkd~6:)AWfяmBb}(.2ھͱ?C^4m6OcO0Qh[Vd|3^1J>R?;4mmjOuLm~+Q Vr\iM.k-Ye?{y'믿vzmqp<!͚"!B_}=Pu&O@]J?M>8y +kHDμVGɽNJI3C[[<}0^|߹IVff $gÝcnec' GƋcMCƧ(fU{JeeJ+-{Ϸk/?o#G+6Vw(XR^̀(Ŕcbfeya<5|_sI7[Zק:T(9K@-Nðv̀2rNyZ . $j{al*TBO^~'OԹG PLB$У:8Wooe`ėK$jL_-9ZkGam-AtTvm<;hr{֩m}{蹙6k^(π=}/eIp׭@{Go{VtD=/?A1g1;dL ෱㍗ٴ>VGU/pHZ H-`ZFTUęVDy3nb{nCxU)=*2%݅^hp@+<@"b61ejKVUjI370 [su%\9N#;Ku& KeϓS~R;wq߿3* *3њ(2]"0V7n\Rs^ײmi[oTbIOm gng#kam%_guw+¥zO>141 '\X=y| $lb p,Y?_AbmvN:FCـE+l^QEvWiCbMvTfUOw[NPzJi[I} C:ꨌ?>P3Q0Bʣ]*'9-(Q*Dh?z9 6 dܛ3\2{OF1PedH[oPf 7o%sa ~z-őNQp>xQ p&\k?QN 6!h>A0arb;6ld]~7Y}H^>X}Ht]Ի~/-a+ZE7Nv̷')jxu;[ڌ9l~2eb*fFWD"Åc{֪vQPDkX[ u{IH#.0~&),֫"ʴs.W>b]TgBX3g>`;S'TX:t=cqe0^I  /X-k+|.u|"s_Ɵs%LBq=XT̝]ʄ+dfǟB/z^_"·< eGvM{l _$\LIL6M81| UpD([g!ܟ1?,yuQ:v-siε~^jq h-Y;<.N}A\uUocٻ[97͵s/ie. |O{w)$"jdzw ͻâȨmrڹͰF*QϨьYw79zjg6@lrն4ѿη?.pQ*s7ףp;E_z7'ʨ9+=#{Qvƀ7Ƭ0V1׶AFPR7i@?0f?귻$TY7h5iWY??]lZԱ6DX`Q]pl[5M}g nqsy/wt][@IGvߧe_bWdw>цg !G/h"N UG^٧*aA\Q$.wHx-~v}mqҩq-};|:s߃Tqeĵu֊ĸfWRSoO&r7D7k0!F~ҹJ++>CW^{5gTݤTQSdU>gQLko+a|y<_&ї{_`*M6ؾCO':e7nT%eY>{i*϶8Jv:?uKau ?Ao Hf=s+sxeW1Bo*y*R=`6Tbb aJCp_ٳ_.Ǿ}:pv-.g&-vllxfmy#{BWغ (8+u#~wgLw:]rl\ZG[C#-[nCm{Cx=!H 9Be+ ~7iM4/B;&H_6Լ;EZP>89f@WAhðx7Ə'cOZNkUwGql-Urd y`聜'G~l?b pv}O?QΚUsVĩnPzvk[umv}N96ɵDNOKvSzvK"x ! [f+^@;Hnyx͞y[oO6!F=@ʔF>ovxw4VQC7odP;=ΕB~7u{Aonݕ3{/ /=Ҝ1cƸUD9I?3c:iHU*=pʱ{ AR W_[l:67$r̀HD $!C4^ +# I/ 1Fup~6a_F6b=X t)1,U/kIuRx [VCgz$ʷȹoo{&=^~.r 7@ḵOJ;vhj~NUOŷFlm!0EUDmڶmZ;剰㏇-|isT (h';!&Sy/+v  PzpQS Ν37j "F %mIMJ֍l,^ºZd)&}P >'Wkoi=D|Sϗww҈V]3?+n> <(h/F![hgo~c͛,c~~ip-@Vv9)UJay@_>~V/pF" *uU(at6m el uזoG|ag[W[ s B5 Ļ? 8\"YTWH{S! (LXhKV }}4 w&W?WF&BaD?E{sͧ}uqј1V x{~&݁:nO[~"cr\K|TsIV*  cVgPN[" 6yR334Cs{onyh"w6-syolNC8'/bt @I^u=I:u AMc~1}tG?aRcryu΃' AJDRKQ]3U.ȶf]:O[6=l7N9*f^cw%ŷ\d-[Եi ֯һCxXyл>E!ofq!Q}kݛ=OY^r\n>~ݨzCtOGa˱ OQxgU1/((pX37E0=l>@s&_|m?ptH!/b"Lv׳i,|NqSV4j`u׷MdE3Gp%8cLFmeJ#!aUc0NIs9FG'=S _T6y֩uIX^}102ŁNXbw27J ;R  8JųHiǻ@ 5HzƧGcP(aBܗ |}+fNrRK5q@PCWtpݶB\ UrY61n[ JA \|ɄSޅh"'A\ZWH8Gr$RIըm㣺P-!TN쳈+WYd< phkcTy 4Tvl hެSgEmsÀfZ6Kphas9Evc}[%\0bt+ a|D'G+ABF%9uᴙ276?2+q{Z[#'ﱼ_Z[ݢbVV[Tc?XAQ!-1~FѩmأmaKܶtmlr~T G_LUXաbA-qc޾uHpO!mk?n| VS`&2f%57ٲsNu| noim|eV6M wG=m͉YX]@m1x`4Y{=!zH:0+) {4M{6Ͼm?5HU~Ǵs3dN>_c= "'Mbxb<`ڴiglMOug3V7n.ZT=FITr-k+W/_:nBIL.x7I50 UƉd@HT w^+P3'= dڛƍ$ng83f#c6xѩ-c\׵u?|=R Jla4d }"(F}Gݮx bn\H).Pͳ9l!6V?khG=FT lww~KKjOV@ }&l( r3[LXa'I'~= ʦNRPTvӱVv;f*}:駟vvQw0:0qb zpl ;Թ ŸշjYg9brq=SUßjGi,1(2/vY ǀߏ a%[mS ? 6kZnk6>:&[׵Zv㝬@m:>=%YGM$h":ps[߳}0;&bd0_"}@Tݜt +B[ڭpEOa~*s/Wi,Ty, &rM5p+*ͺwKeJ 3t0f0xτqfHe\y n>Y͗ TѼ748a< m:FTeítƕ/W\Q=)??? )o~a"eMwh}[Ony}5~U*&~l^k Yb^_ƶذ;ob7ޯZVq2:`|ƸqPh"i;.bʶ9uc&[A%n?~k ,uq %y_D:s\pDnܚ`;w{fwgog~j 5ok|9fw?d%mJ=,quw%}JMl-vS) 8i 6l(`ujDbl<OM.acQ1_L?AֆOX.W;Qsp,# [ڠAC<-eIg~P$Q3H%Ƹ tblk<\d'6^4vAAnGI50oA}]צCu3 ! @ߏnC8FqGG*<zH+x˽rK\xIbw>?L C{,qVV8fu |*uY.~{7j}0F WLs殶+6;Vfytl5$WjW[[ @휚(uwdBH 8tpvK|s$@W ϩ bEq@ݯYv>P3r!,LjʹEЄ^zS11SEj[Nxj.Y#IƁ 1x.okQ+b{Jɳ\ 7f, '2P$*|̼Tu:g e @ •v -m-E!x ;]XalaM>x> 3}s+^G@в${bE#d J7"̠ZpRe^uegˑ]6Q8DNZⲋ,Λ>-l $KLYU I7l3e* W#vC:˜`&(M"U` tI Ʈ,lXhAU?W ~{&~uSj)T}Zj̖i;K4NSi^@aD9 lLj`@FZ5`滞?t"6tQ+UkQOZh#GA ,VϾnt 歴?/OM: uqR ܂!,Q{ [ڑ(s.;ow+FXd^V 63e}K{ퟭc_F`,c`!mkY9sqD . fTB p=H :S%:])4Rۯ~%${uK1ةBeB6SrD|cx SCCaxH6`h`~ NV' D{1DY0D; ިg©KhIڵkHP֯KH%j0@%6|tG=BW0y0d2@nN$P:@0/ˤTR{vniIqe(mqdÞ6n`^zk\6+^X͔W3 нF-ޔ1H.@8=b+z@ ݶodr;ڦ}vֵ_TCYZKam k(^ve|LEh2$`'b& vSׁbBF y$6^ j䑧JH xVR!ak}ٙ=#?^<_3<(i ͒}q@-Dw2* B,<"jr*)T٧Gԥk ~l*0qoTOaUfMut8명*Άv}͕?y#y\OFl1bb6 {SWuϛ)?Q3D-h&C@[fXlW< |b5goSi1DmZE x21}ѣG;<(OTݺ1F|I)O ظW4 =/WԙngKM)0(ECڄ5j  VĥWYIfiŕxks%Kgh+RWckH"Zvl%o $.j*lf3GE|;)[4PKjh/F9H|;sRXa` Lip,8Kq{'Zg-d&=]^m`-ɺ@zRI5?0Y6 +^*/Sjx[}x_iJLA!RV&mnucXfLPFB`pid`uj+f>c%O<( dDK~Qb$Z@>|DFAN~b PmyN%3&TgXUAe[wo\pD|9XYU+pm;\gT??.600wduyc)t ~2Ťc0~|]p2tCWV0Y%7 gz 8yvމ-lR)f}{Bgځr1l-1p2Hu=1g`IDՄE/q^}!m QArRqԵEֻh/P'*' G+o޽{謌Y22+ FB(3.-wOU۵yy\pϙ= UƃN=G $@{ɊZ;< e %d0/H5N~Ƙ81\iMU+[0:wSH69?T*9bN۴n}a%~￟@=nk7XU_JXܥjMd6l:O_X8 馅)СJl*+6 Ƹ {,J*u/q!j H#N{Ӿ l-)Ou`69hKo-w>F"BxAͬ w"Nqzޏ p'( #{\AZh+r^3].ilVv>nuGRQ$A'y/Po0R8w;ʣހ @Ϊ,ޤ"FR۶<#O rY*R⵷7$ynR,D'ѳc<9 Jgt$qڭL>sq*z(_`u0VjOr*XN u{' ٧tc`WK_ƕ\sy}\o9SAq<єpuU"B3"f_CyCn6H)!@IKhcy E[yuR !)(_kߤO};o(\?m ٖ'|C(wi `C3p 9сcm'̘1B|v:!4Ev3_ԶߪZƴ=VCAڷm.F<@ [:5\[,g>`}GaVf}ַD|*u:[⸣lMX '>F DtcMVJnx/p%tq, 3O'IHSOBN`W-x@1 0['}èSԳ_t=mVm`ڨX2*$8w3 6u@ȹ'>3<0_- >RR,|G<_u%;Tϊ ,AVKXmc+qi?Shvܦ@ȎU+, k!y(@@Q<ȑ2D܃00+SN WA 5Z&mWδo~u*/ڏ4$ ` P*?꙱ѫ/u-oBG5?ϼj%nh />6Jn Dȶޤu2&B't 2/@VlUx\TmPSq$젾b2m|lFӖ0 |&N8uhh|wRYtIk'^Įsv+2"([zu+q:png` ԏ[yspϿCϷ; 鱗 B]=cνzB9kyAU#D/L#c V W:#FT`Ja=eM;ptob%N}fHh0" ik^4u{Mv@[B.psӭ!LS0ܩ 33<ӑx xڟSX-:$#N?PL+ B uH-m͖!5螙0t8\e( OxXbp_3܆ ߮{~=RȺڝW~NXl7_ƚ6N8>#X@IDAT< n6B0@PQ@ ODe+Jo{ᒛfwoA?YjWͲ|][]1 6&ݩw$UcB ~3Va-J7,+/Yb"Zw\nR2f=ߎTX jYO3` pR$נLnbH gq ~Hq'7:PNZ[V'SxŮ8d[ǩ&W/A\M^JJ#iJRZWRZcde #X}M `BD5w62Xl3&Km!aQq4G>q8{d_H\ y(F d6Ij$Y'іA +sr{&=^cW7j? s#'`vvxRhx /s83XP`S$i?`3upNVu/#w! p).-t_Gҁ0)jt]J/+JM虉&x<1K{@w޻g} 6v t.yϊP~:j{SYpX7l i_01e|2C cl)?|}u3؁76#_gS{wS#I6Xc` {aGV0)Qs G&1֭,fGf%m17u`^b`n+fmAR$c@0VO? Pֵe T$(椖JQ?IٵXO=;mo@6#1S&; [%ȕ@9ϛ'Sin~}VJ~`9R F˺>J2"6c cnec`wGԫ  s|sGs c͏Kmf ` -nbyaSŏ< xH XEx&[ڇ6H;ɍ􁈂>uֶɋ$V䅋V yL0vrwiaPoc p8: F`ʳl_V!ɍ Uv|ty-Ai;W;k6kVJ g1P oNADiOXH"8KuQV )Wur6uq\7ȹbwv+I<869UD2/ox-7Uyܵp}FF1> x"On/[v!;'=q1S*+^کYS2N1u&;9MepҢy ee3L-eW<k mW V`)aB=C:=I.(!:ZUkb 2z_tREFZ"z#мYZe<sp<>xqIPo!׻zv>0${A0>;]qx5` :/zx~T36@|G[K6Wzm.y#dJ`Nؑx 1}' CKzlU|{){F`vv 8)@)y˼8ٗ}'N!ܳ31:*PFN^xJ QxJ e%1(qv"ts>s1 U㐊;A^\/W# %\\c1gϊgڵ6 @'/%:pp@E Tiqx:V \PΤ-]ɟT=I?a'[xL1uщ` y>QCw&ABF]l￿ӛgT]OZf_ o\G/꿋VS\{Uj5:B@p^{U:\?{G3 Cb8ara@<1+TqNl 7C9:ˁ >61թ}XxlT.;׏(swb5aK)⬖&<_mw\d&our]v^u_t=WOuK( SL? aOkǭ m*r<Up 0it [.m6SPG]X +"tޯVQ 2Hu#2U w[1F\+❈Bi;T8aX*fu%odZRG\[kp¼2&ԥʣb^PwL $!HjA[( 8T7V7,?WzN  c(LvX1I\E#~/_';@ ls=+cjѣ]E(9dHSW8\l\1{>j7Sa0t|ヅq;Hz{ #CtUVAAWnx\>h'Ai*ߒ_%U+t' 1T0DZldW!eKjc0iV'@1y F|;` }F E2P3 0TSwK4:#*6 >%2$eg)vxG@aw 6$9xQ @HY}#QkדB=ߋpzTsiۆ"7 OnavW*3W-dzbQ yaVfhe?ak~nyR1DT믾 (w3ܗi5_*l~CUW GmcЎVK6 A/=BR1,* XaTPUVPyJXbF)#rFdm`ʹC G?Εp˵ t:=:cps {tܓyc5KH^$!qH% @o_wNĒ^$Uq~LcVʼn[MO즚+C:Yuh U*jrmf+Er֠|&PKO[BT ߞU۴I-:;/pF'qb?no:tyJ  mҤCz={=]JS^[q ԨaJsƲ~/ڑ llNDvH0ؠ ;$o!jdqnF}\"/05#6F`#}yp[5il=3a d{6O uM3w)CASRBV_IΊ ߁X`IJi$|e-Z"_0/FEyRT%ADGVNS^vF)L[8XN&DTUQދ,Tk(uSrt58po_2c j'9@v9#plD@?M첋F  0_i=d< (m2,*z$߃~`S610My/:֠ERCwQSlpXy?]J==LCU8e6ZY9ݿl$@sFW:qv;冩lp WJ͙7S""a(Zn*5 xA-b>JFxĎ;rHYTXa 0G}S1:0 X'Mn7v >гCx"bcρӎSP&w @o=|d!\6~-O)e*%mW?H 묳.@gmtdB|E`@@b V6JJ5iǃhʼ xUU'Ƃ J(]tRFs11cwqKS5 eJ:%6{ {B}N| ҃+j\-nFaxk +IteN@BR Gb̂Ǫ>pUm _BȪ5EvBF+ڪ•jxl">r{h"cuvsJĶ6F]6 <VD`s`̘1mU" =A{4Q0{BGՍn.BxSsyP:N,rAyEWHl9Lp W*#~^DKD#i7&AȻoP|Q}r1=XB1;~YKkWnXNf֥P8V] m\ wUϠdA5u(rtFsٺkq8Wq?d)& c=z /۲{AB+-Px_]t)K/`BUdYZUpEkh+a?};PR!̙C·>vjvzξ!J@=&b ԢE^=3y"z3ߗA$殸W]Jda@ 1U?+ qB^^x[wf vJkGM sP^IaoQ\ 3hMޠۆxVR/rQ@xZ CZMGz36-s\_{zmQ;euwWsF g7'*^`Sss8) s1d\tPEzQZR"F8p^z61ցEF*8\>0zp! b0~yIlDa %uf7Xc8(n3z`A">v%K1dvXD8Q=?w]O'΅,uSkX+3Z[EXbjژZ/VdOU,#ΜfSgUF/]w5#Y['ݦ{CW%3-xGEronFl*@I%'yZWܫHkNf R'j/yV@@{@SI 8'?,W{Q'(_`~UBw=+6"70v{6]5rƁu;x0'Z_r|r!ll N۔qa$A$*B);> y 7x3|?5sn30;M黈].tss\/s)-pGQU{lWu Qk~_5u=aݲ2$38A!IA0e.'@S/aRk?+e#KapP\)V^@~绍zЛLj+ԫ $Q/w=Qƀ K ·?ZВHWN8;3XTpO_` ^dž;6Veϫ#e? ,^ 5a?aN8Cx)RҟKf8ꏬj|f=R<-4IG?)iP`Ɔo 0_3PuGw] `^Rf=3`}^{e 2k1H؆xky _gr 9UW~vBzX>nz` [69su<8#@~ةPd>\Olΰ1yʻL)Ŕ_V9^.-<ɸ|S%xezp5 5Ĭ䨾WBJP∍G CY@$)]1T֤v5GJQi-`NW< e`D!$(.!_{wEYm0xvEsP+gq7.sĬT/WSolԓ- t#FqXӿZvm9i=JU5WİtLn[*Y ϹmK]5=QyRpdCYp_-1+9*_%TT:ҙ[;&bys Wy#РP"<l_}\a~+@ea› mIC=/ˍp@AcΛ.5E3,n)v)S=bl<@ :?y#Fڻロz7u__ ~e/iӝYv`=mr,MZ跿NAAYչcJI/JcquPL;YqLd:Bl%$(7c{ X 2m Ȏh|L y#zJi‰A:m,A^/ړy6֦<'g\1 Qh"eF.#/̷>Zq*Ưlm).T#x6|3v΀,PzSl2WjIߪZ&VꩿT9L F`zvX91-LP.: Y5@G38p8D&Hb *j7&rq!FM[&׫I&*F%`bDO1F Q-~_UWOϜ9=[ϙswWuu-U$_ `E hhQYt9ꨣ̨Q~3Tͅ-,@j5koZeg }(qma@m^X]~xRw?-;2|+o&Ol+lzi~Uwk;˂Z߉->/Q3-?/Cu8#u.C[$f!>.bR>^{-2.X̎>ASXm:w7{Jijn yذav@>YsD@;;D| YNx'Y|[N.&SLt$W43O|vU@^jW^`l`%8FJ;MDj@θK&mUV{vJ-?ܞOUkU^8+Sˡ?r 7` ҫ:+m),h~u~?s^֛WGXpNȬ^썎K`-z#(}5G6sg}hkYn 9YU$svGIwD lMY \;8?җdWx\J_$-Vxi WLJ1sy)My6?p 4_!Q ept-4p zv;+2[8s G DOxHB יa MvH}m0e;s5y?kngYQ^X8Ќ7ήK 3g4s _<$׻:H.~[̇mT2p*< 8ez᧕vF-V[Bc;`W!M#]akZj4Z8k}VɤdlpL(γG>=]'։%$!+\s93l׶uO=y } 6c`?aX@:t<*qb'OKa?>y_Z{ Y͇~ʧ5&[9XةU(B vƺWAcw,%9?Ř@- Xr#F:,Xߌub2ُ=Ͳ6/ia/4c(!M5O?Ʌ MafرcB%+e9㷕~7q sg_񆅿G`+ ;Wȓy?j{)&zB -w/0@| vA)#g\ïǎU--|LTvqW틽۟ }%({(OiӦa&qWS =̨}ݤAMz<愣zu8{ono apM=gGȑ#^{Uth"s!|#Sر 9S("HT6"[mi+ǭ5mP@T8vT6oϏ-T=zsi8л[NRs?h3 El-1;_d9jsWw˩iXE\kUFr*}Ϗ#'8{0诠+d͚56t pX];pB!}Ylx ; kg+YYaec1{b&!;/~ޥf!UR}BCtoO8p~vIDe H]OSܶ4l9~1@c9*OA sJo4:?5iibr7 a$ǞƤ zch,Yp9cURs3sEͫK6`hu3z/â+vieY=z\w뭷fK_$IV+bFg zܢF u! wq>]oS@`4.χVgU/Y:ohYAa@xľ ۦ P>@; poA/rXo{5klwqǙ]v%D<ȳhaA>|f/mcZ`6k;?ѦZx#f,&svZ*ch#6O5(YfKi>f;:PASfxsګxcE^L?9V[~ޒN3*Q$qBaI܇|w~'6:+,Y&Լfûfzӻw|woW[0NۗS"(@>U&SZ? O{Elli +Vv:hh(y♺v5~[o<83<9ƮqwDLcqOXJh~|Nx̘1fԩv]_WөFi3ӧo4e-[fN=|sIy$}"5CK=#ޖq%*1d>"tR yTZ #A; )O qڏ3T5ƣUjUR7rz t4K_|N>BȞII{v2wÿN9#]RD?ڽЏr2 JW? ;-RN:sfmC|[?Ą?|ύnb1 1GhUߕ!G:[68͙giM+'Lc4>pI9l/ϗC(.Ʈ\Lq#|! ٚ{\rfKd~;Wz N [*-z Q\/be>6Tnu]'j3=,A P%oѮ6xW>Xizc^q{\t{˛B5AsJGXskz`*mz|!{s \sn7=:z2qy+.sOAaF)Y~ؤ#ɕj/9송YNM`-BY8.a)S7.MS c Wڕڞ͵Z;:ml{WC#Aav'P'ć6 i2)0J* /c 'B߀քt acr6mVq>.Ra)F3J}\R4V^0'x#Ⱥ-[ ٳgb(鋅sPDn< >fJue} x؇eY2!CAwο+W?[8%d薨/hwfqF[zv6R)8*?Q J\28>\y晬 |wY2S-.<]c㈛'^QH'^NURa}, ~:Bʇ @kVRtpZg!{ٱH}a ZtC`64IMf`F+LΆp3 ;N<|4\rYx1NT]ĉ[oSV#f")Q*}D'C GFz*6?|)cw&S6_w鈵2 J;BX=z4v".^r?r- 5%\#Cv(4s ||?xdUi~<\y*!P>Gi)c3bS{;A<4R{(?\(+h=9?Y5.fΜi=k%#ͳyl= {DΜDVqii+pEW@A Azwrιo/RuQ؁3o͉s Ip-D w#$Öhaq,~j߅Ӊy|nj( Zw4ԵTMVsmvon-eDw#ፍ av^K:LBG@95^7|Ӝhm\X׹<#wD_ 6'\~;)6m2{&V`e?v딢 @իW&R&|[Zy DhJs\haN8v]m_h}MA\}-d vLoF6~5\HcccM;&p ]2?C'CYX>uȑ#m<==y 1qܸq\ۑN:EWɶmMy#C]m}hOn>Owwm}gReNa,}=z4hPY\ @`0Po׌KTK,Nst6S w}Vio;vWj f P )?vq {_H>O\CRz[>4P~c |)ߋq\c-p.ְi'  C577O˞k֮-ʡ-ߟ[r)}7}?:+~] )l;C =?nNsM7 X[)[;J-[f_9r)fҤI6p+21;llݸS[sa0nRj+k6 1F8咘lA~o| I tz<je jk#\Hp&jLvZ&;CWubDA-HhlgEʊ+[jFa bnϞ=lZ9O?c ۹ t@ LIK&p=riɹyb ӿ10]!-|X ː0N @U,t~'>jmm@Dš+Nm#q$9rsТ9??)|e@mhpV9/0)pQP.$nmQԖWAwhCxlj^2r 2$g&J)nlLGh(pUFd޽>z}_Z-C/m3)OŸPЁKV~)(\MƺV9%oOG Kp~.!iq?D-1: +3q8sE5 vmmp9Crf:<<u(:;nV[x_cNPק(Y'6>/p_"mǡ9]1;uw|8 wl:Po! xtdzF>+h cӇaرѮ'Bd2Y+LN%x(_kX򑮜JPVH.򕅤cxn-S{6lK}VP'g+"l0Օ}PU?ODpKj!?Up ֛oy޽{YDYhKkhJBfa uUV_KR;ӡM~=B? -.g +K,08MO]Ix F3&j1 QVŸuh=̖JoM`feoywP钢 @i?;;,MhN8xϢC%ΰ2[O>BmhG9?\bUL[\đ8mvq.LO7#P|}J[ ͫCYtUAWίTߐhstCwj+u,WeNPػ]L_~ 19kSPL5L,en7O>VY VAgp+tc| @9C&oZGm(> -PIMA߆ vi[ _.|'.%#j2Nc+PVFP>xԄ@쯆_ˊydss5WQfͦRhSfE@D Bn #-A%ICC}맟n *)63ܽVe8W566B+_/Wv ([@%eEӮ# pg}m'j9h{R mfk(זN@V!tgmYc_̗seILhVy)%VX9{`/"l[bp߭[] y7veǫAv.YG7@D}TM= Cx,_zy/N|{s(۬ثW/3h<8?6%#/ P֡1$v cG464FFzCcƆ랅?C9'l*H`0&(ՀGe[D\ujxӧx"@' MPzIENDB`ic05ARGB2'x҄' #݂9 w4/t- X+b=PR ZP ;ׄ_ b ,X Ly|VZ'Vۏ  Ni ק cfrfpfftfȌAf݀:eeڇff txfSf f_U׀f/MfgS-V-SX<=Y(W. whYD4'!3<>4J^mK__[a@_ :Z_XM_YcL^ć$J\_BJN9T]]XNkܢ?\?IQ_R:PG?Y_^KZc'Q_X@GSN_^Ji~9_m1ۼ2l_U\- TS)ZUKQ1o*PKGF6ބ-EE=:4R)8="4+ic10PNG  IHDR+iCCPICC Profile(}KPƿjU*":8JmRPj&i6 I Ckpqֵ ( N)&Ҫs=MAU -~Z"R m@z0*Hc}l+-'%U3 :qFK0Z|XZI&7ļį^)iҹ)9bSod~薕VOgD18x(# (+H}ȐW .Z>3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4@IDATxWyZie5Kd2l[U\ ncPZHH $00`Jh˶.yFGWwݝ{hswf"  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @dY @ Tx iT'͒f11_&iXua)Xf:r 4퓼`n]{n~$O] @c%0Xg@JGi47';v-;v륺LMM544d2uuuruuu>#۴.:@o1Ӻmop%@___t'yO@A)9P&JK;-RA<SO BvWJsi$?niӦevԎ=#/> }=Mz:1ǽжi%0iJ+' @$q;;;ZV@[5[<*9P`= m0@@ PA@ PΖ'-Bf9ͫjiiJU3gΘ1#ܜۙfZaNInbtUqfG}:6o1ɴº0Uk#|@y] D*đM:oy[.D(LU^c \p ^>|p{{wWH;%~)Jv  P# bH:WrM"ɵnߴ`ǎ}ɏ{;w+`;ݮLfrvrˑxJ#жBۂ]!. G(8Xi_rРA2|^ "@[[ۀԯA@оJܽw}@H5Q^վkU;OoF._V'}ATxl_ZG|pp=>p  e p?H~.j@0@HM5HJIn¿@뛗.]Zs 'TYsΞ=;+?96^}+SɷssΧNuirimMy|@4akjzO_ʣZ8 88СC>-IIF0@ 09! *ϵgI_,Gpŋ-[VkԄ?wmk{4|ϻ~\{s~]ڒZ7mK B cدzN0S:Zu#eZ h] ' ~0Jߗ(A @`t{A@ 4({O.֪5ot'\pB'H}ΖloϸF_yI-9 ӱncq͹ԬuUqi/DoiuX/.j 9(iZdWOiQ @ (kH LHuIzjgЏ_#:no66n[Hw}v亨x(Y ,:jquIjx^?x#p5ͱ0ƺy<=+xp@_W]5HI'0@(S‘m@)'Ycy_|qyWkk12y|٩ʱцiiΟ\ixv;{p>7Z[gPx$ 80^˭H<(eIN|ojWhZhx7Х߮ia[h@ {iA@ PFBH1*ҕ9ӧOo֮Z*nۑШ/GFTF'yLr>?nᶅtgmc=ގXcB#k/v4B` 9u ,y[Z7ӉJs? tMupp tP @ =@)&?-1{f;sNGwNí?^1& <69 -ZDٱZ[[><>LB@  6I9o*Bp#M{;?KC  $@`2sn@II˥s,X|%ke˖~9q~;^N:Amw4ǎ{p=U7MrC ʃ@h)@r>,'.]r99?YۆHWc[GJ 0L,o@\ Nڠs6mprt9\u;0PLgsrhMc'сAM:;vC 9AhI 1/Z7y9F>xǎ&ݡҷ3o'?8~t C+p Z礽ahu={D߃a(&H[ 7;m.C8I tk%%{H|zB3 3 ʁ?&Y͛7ǃ͜9sTNwaQipN޽{8z EA Hl~օ}'6wЃ[$^  Pb$@ \ӦM.kP3ŋgCǣvcA B@.~l/]HC8 @`;B(k+IԬ擟?f֬Y(ß9t`[}C yp(6u`ŽݻGv$S@Zx0J7K?0@(EHRL+Ռs9I;S5ؑϓuuvf5]C#ǵ9mξ۷oݻvŵ ?\E bJwHnAq p8@J LS,]4_E]T;ߟt]R9cM۵۶mw7AKX $A #0v bMK.mv3uֹoΎ=7W::ܶ}G<\l0ڱcG]NktE LUjG |SA1UQn@!@`<8@\yKT_ŸokkVuܷ?Y>Z˾#zQ c" M‹ISc~< &@0BH;S]zrΝ׻3ڱ~.P|~TM?r Q{H2t%@`^z )͛7 OxByWS__//8So_7xG[]/"BByv;4: 4Gz!@%@(4_^f͚j܎#~8;oߎ? W) P %Z ZQ lc )K(*oWu45U3}?~.[pôкlnݻwӬ߄1@` '{OIr Li@ >QwHvK '@/!RJL=ukT:u^ǿ^/8^_hкu@!*޽Gc1@(L@- hzX-mc@Y PVBe@`Aiʕ+k=߂ b5sr4J;`~۶m  1pYGzd>1@eG@]22 @uy5]z'tRr@iГ* PJ$!)C#_s~k׮Ψ}vvmI>9my7w~i L ybIs$1>@ @* He!S@ Igyf>WOnmGwN}rrpώ]7D $ȍС`@~vtI 0*F fHϿvƍ'pBVM3,{]ryy7߹sg]8_&@n|q+F'aRG@. RHJy^Z5]tQU~93Sm;q@)"oz'wJESiL]\>f~֭e:ڪ_ݛsGtCwaz PZeԃ]12KԽ mvs-ZT{͜93ۛݷwoMG{{|L:N.joӠ~. )\{Ep %w 8X, I!@`RsR@ ޮ]]WWx֮\Ɵ;o_]qr={۷G @7IA4& ='RH\jҚ5kj_:;:j4jO{rr}}( P-SQ^-FwJWK XWBA C@tf5={Uߞkl$塶ߟK|<@K@|Ńj2hn p5@ &4RK51UUU5]vŊju[[I~y6;f LMzt+p(Kֳ@d - C)'0Kt%Kj8Ztuvؿ&YSt]rr>l 5/ @`P`@AJ5Pb@`2 loVPSS~/~hQ6wν4Ӟݻ=ɾĜ@: (0'_*&W@ P)Wr@!D;tҥKkN>ZW&iO:Nt^ f8f_Ar%'KޗX,  PT$[6444z W껺ξ<"osS7?x 5 Pk^=eZ~;o=KqDI`N8ᄪ+WMVvjR`Bt\A@ 16[_Ki?ʋ^hkpZ5niiR}U[kkk[CŎc bPkSe P C-YqٮKc 32RJAӧW-YZQcWg`_|G?5n!L!@F@A8  4@ְ)  0Z eW͝;׵U7\AڢcZ *@oS 9aH XRAz1.H@ *ɏKOY_]__jPmҹO;}y  0YS0iUMe*L! ;@)%JBM3f~v5y.rp?#@i$~%74|. (BC 04@%e59sfֵ}}ݪX^g?#B3@8 @v\#SXP E@ T)Snd7jzz3<cʁ H]UzDf! 8K@z }RАqOZ\ n\I:nAS/SSl(~F%ǿQ7ư `\boLMlBa)# J/T]t?*/ r!giFM<.gs5B 0@Fc:s0]N @J@tE@k|#*. (B 0@_atl*mB ?\A@öZa\ ^> S"SDjviUȗFizL!@(=gRZ |w&RJ^$ ͐  @.5˝Ϋ!$Pz L,5A?!9  @`k!UD aA PhPWrA ]Zq ~ {P )F@Uj О(;Y@B]!b@ \i )oj3 @) P ;-` G "0I 8,-trX+ǿA7 tPW$rOP+Y@ ( H!R˔H CtiV @H!ؗa:f!2& e|:RJ`!r=ҿ?1A Rz^gg~tt_JM 1 0X H2RsSGL!@H/\Q:KMg|TAeL@_<xQ>z @\{Kg\@0+1@K5Jz)3/V =aկ7KNü6/4N<}FZ=BNAN* Osy{x}_X( 2@ - Fv!B7(O |fZJT2747mlҲ v씧3ۍk't |?t$ 0z=#| e&@ 0^ҁ/½Fo3x8Tcɀ |f\fOwj] @j`\ΚrQ_yyX` :K_?']XVNK,3 '`^6kOԻl{+/ 9/v-os~>4/-'_7 33Gj lo:(y~Z$[cxqOݵyޟzDߕje5GK6 Som ^쫚yYX` _#r B&ܨ_1T~ٶ3]Lszvbݖ!MK-i :U̟ r%wMFο=.dL7j N8}NI!P%AI#Y12#T%ܟou %'`]јFaɎϥH@ ["KA4sFfu=o4ا( ~YQ'@hx0 % A{_Dc?`Zvw֯ͷkq4v=߽䦣9Vb( :ҹpk@88$OG 0>WJo_jRP%M7YFAiw?ץF.o$n{hkξ `SOKn:x;U7נ5e5AtN ?zMq *[Bt0&~dLCGܿS(y_0 e9 ɟ*?ypzɁ ptoKv}O %x r<*THALLܤKpV[_HIߕ $O>[$=NFp*G@ Jɭ0@` pcD)#IIćOLGM@/|q~M=`H9(פ;$ (T]F 8$1~@IE!;W^M\ 0ItO D1LSQ}Xf ~@W~,}IAGJ3Ґz.4w|rPPZ`+%}1@` ypJ@`rNpjWB ЗSp/&RO/|^A$'Jn!$ e !./C(=g foS(}B_n i0y9WS;~yڴn韥* 2rgs8cK' ?Hcn  0u!p0uKl P[ϢC"k6z䱉0@x/!\@*/vW<HOV%N|sK;_>* ?1n ɭ%MEE\r+49cuA! 4\Ii# e/]ŭ*^/~rBfGv҃@\ %-nTU8ynuHbS<LC`|\gHͱG"Ͽ:,3,^UM7\L;Y 0~g"R=ZA٦XsK<(`xf98n#1A ʹI%ePmKzK@FK_oN,p_ y0PӢY @*\QP*EIAL*n&rA=TWJ!(, p<bxX@ .S>#8EK7ceJ@&wEp퉻[Z`; ԯY%=\ أTɯ|Eezy"@ Uwr29b:]3)s)!!r!J}tT uxceU,7)*E es(FMA{)-՛,~ߐ$-a*[KIK *g1M8J6<^GzJ (|"@$ ~^ȓ^fo=)i]۟\CB~A&M7¾lW6;0?f葪ld'6{ۛc~=IsyfvH(ѕM0/nK!.Qv YRYW +Gq~h(ut1L뮻98e` ڤ)'䫥L&nG4uydnp p69 Ѳoz[4/ЭM0Cc!.W+;b_?nFOunӣ;~Jk ]A`B| -}}d'HvxS [ SZytC*i ~^sK~CYa (wx <@IDAT.pRn {7Ϳ6, 0 C B+OIΛ_x.4`7c)$`O_J~̥*wr(5O|U;w> d.ᜮs2 /(}>yL[nyI__Jӥ|'YL&xOOGw&<5Wp+UJ+5:t k/\ҘrMKN+T7yM?h?IԞCA͇- L$7SӞuXӰ^TڋRJs<ۢlK6w, I{pgR_?NGRK:V$8uVӀ_,ZIS7)u)lؠ򸆸ҏYouG@/. 5wKMvD5\#Ic|nƵa]ɶ]rmfGc>8\׮^+8LI14N-1s5 # 8G|OtrA` B E*/?8!YRF@/+v]t8/k~y[Yv6+#7LZ%y$v=v[$져&SVn\[K/H>Ac~_]wwYJya.o:::o[h;W@G'iL 2I*)׃C7u )ـ@Y͠"d$OqѤgF/*>g:䖜˥&idGR.v5)hj)Cn@-8WKHҭ5J$lfͮ$.s_he©+>uҵR2У{^=W󁂐&uQ 2$$A$^0F;A) ^q!z?"zy쓗oG~MW+('4{|Ot0'IN37px-"}/Ҩ"}6p@˧i Fgi0fC ?Ci|`$ZK p& ݘ _"2lҿHqN?zK>LR&GI9j- BMWJOTM.AvL[ss_W,iiir/߸_WMVzw=\ݐU,l6hp6%>뮿g"Xt߯Ӥz^H8 (9 =Eq$ɡ2MKMA+#I\YԆUE75C4PJ+boq5ieajbmڴ9Lߟro/-C7Rux;OdL>Gr-^??Ҏl@ +gIGܢG|n%=Ixn9Vcp GmHߔ˒<ըvMGfw0/#X*fĺ<)4[VSS|y{^T]]&f_׿-?`C|u;`rd#'t?ᆿo DؠKZw⬞n8<6Y|ׁpͿby!P.jK' CÝhLT/]){v)( B?_AshΜ9х{qXS~o?@/^`;n׿/K;`${ο|Czyi_~jed";"03= 0 >v6AO`YяIw&~_Aޤ}-NYZ&JzT'gXw޹Ĩw4>F w[w;Q[n餾*å'{_q4 0ު >pT;?% gr%~elVCt=8m LђC؊MpuL G=4˅~o?AӧJ8PAsk%wy`@>;]?cƌٿs=yr_]Z*ީ{DkA ޭL8hIi mz(EXO29KnƀB`,e,ǰ/ 0qnԩ2qL^ =p=ҥүJE8YZ^ %֬Y͝;oA(޽;;]vÙҟHln\weαE!> : A4xYS 5\1--#ߟT3:ʗ~/ R+_~َMaE@opz۫94/J+V7}NҸ]*o:ag؁CE?O[E}<ȖB?W Pj~Lïu >'p/7Oώ}ŴفMy`Z?[;A4(+r)Fc*oxxZ3?iK[h@pU;'Hv^egqz4}zsj Mz(Qh"]ɁIK1Nߗ?7)jS#Ķ&me\F)dgrίhdWF> pG`!prrRȍ~<)YN-_%=Az@*kҟIT566FK.kݼ(s`~Z iGrP`̖FeӴH^Fh~׻J 0 >s>N='_j p@ӡtagEԒHYߜXf@ }M'N gs'3[Y\.iC2rȫjkmY5ѷeU2CS~Cу>=c]t^M)y\'JuҐe;PmoKF84:+\:,u9j<b@}LO ˘Gp[0Z龰ipm%ҍINywM|ܹQMSSԴhaTUWշDӧGgEuӣΎJ}{;:"zڥ>GZn}H壃rګjO1h-Y$n okk~KKJIIwJ{5jwFMt܊`8k>>z+^ CDR=Xڤv.00gzJ&m8iB p)ǫF+ *[ĦHcîLA@/zs `5sŰipuQzU]]4cŊhGF-+W˪Ur2^A~9 )V~j4룮t/wz}ϯuk}y$:UQTm۶-ڳgp 5m8p} AkkROe+m0h@lI-.K"+m-N ;a%`Rnr)DSW<[f)M>e)?];6=h`y]W< C5YrsDrH`|$XgώNܵkY j5ŷmWc{uklg^O>,v'2Qq+7FmrݜޯF,;vD56%F?====3b]ѬUvpH$픢Kz~ۧ5>l@ S^ =WY% =] 0 HO(/Z^~paE&.Z;,}-`Zq)G$wxTAj~ΙgD 9'Z~}4QVawOζMMrlb}8v wT\uښh橫т_BCXyUWW)N#:xP DqlK-/oڴuu K`x_7]exLl-nUg0I_jNuo.IHB )%eytx䚲 LCn^dh{`5#l^']-(y]IAgzjIONr'Sǣ/Ł]Tc~Eѣ>Z-U 駟6g õH}_Rd4!0 %яJ%>әk &xn;M5 $(KP N "~ ~SȏV L^OmSnǜ}RNZ.W7cFxwezsm l9QՀ>7&6%gu;vƃ&qގJu>3xў={uuuZ20"I]w-qh5jj8 H9USH2ZV:4)})|J|D2:)^f/QrO{v4y3%7Yʢy ӮzIُp TWQ"0u׾~~0?^f͚~=iӚ !n΋{ x^Rߖm1,wD_.+unT謩aƌ{N2h$JU>- K2t @kA"{@_R:[79M@y_?r_֨ߖ_*:%pkStde sw& rRps58)nfiͣxg?;Za~56s$j޺HBT3kVۿm +… ΝzI'eO;mMSCCC8V+?Xp_NQod`~DslK[zPP{Yݷwrʚ_yswѕIoEwk}S/.R$#@.0SyN˕NoVI)hO5_^/%HlX2U$(ey͋NzSuQ֣y/yEͺ겣YwVp[G~{-j^JL77O;|%מq755}o꘱_nSx.F]_@DIڡMZZ^w p.'ɨV` H@~z/؛;ǚC􀫄2Rkw>[?H~8~0Si욳gKJY8oyFѼΊUcמǕwMӗ(hڧO-w^v)Qѣj=oGv<+3ghllnm9d[ZNR:Tw50w1ڪ@72쇮(iLi5z>6r=!ٟ=lb:JzGhˁ[[0L9C L9MN=:7Y?f=&:t>=Իp?(ߐ^!QSAvJ OyJO~zԧQSorٿM4c˖@]] N5+ |0z?qGߏz;»sTҿ__wKIc}CU,_-Ū?yL mgEH29>7cK!hf>*D32ټVxx@oV)H;І^K븤/@?4zxϤ%1[9뚰I𬑊U* X7{͚h͋_-ULVèGf&` |xP˗G͋E3Wyf;ߍOIht[^'>K)4v#ϖc^3ǽUc PtCW0 qHS_vN?)k{m43]?t4qsgoVA7Tda)! L,e:ݏWlyl@nLWi Vyz汮)Yk΍_5Ι鏮j%n7G~x`%D=a5:U= QݴiQ_F+/G΁_X…QW(t9=aL_,g,_)PжcDv pYAiہۇ>jL)`Ҭ @nwd 'SIonTwAPM kFs,@R+I9ʅ4|crzHOݮec 󥿔_Kg3O>9ZgFk_h?_GPpuҨ1m@5veI ,f,[UȉKe$_X,sq7oKAjy˟@)R_jؖ, +ͪĭ=WMJBR EPdXpNZOF=7r=IlZ7vȝGVA?. (yDGщ_7E&ɱoRMCqSY3ι0嶣?Ѳre4CU谿40qf'REoꪫM/R('v=f}c>L%DTjnI[%35&9@5*mhpvjRB, Bx?{t)* ziB@ 2'0G#f|4&w޺uѺ?St_Z}wNdviʕHPk4ҧġ>lU76?+w p`EQ -^uuߟ8{IgDx)G靰y @<>'/Cĭr Fn`^i iX/(@ |^y_|}F "ilF'Jwp8ˏK%wVHvJbu--IxFtK_-(&Sw%)QA{k 0j}`C[QQNAow*q nuuriD{nٳ>F/Eb7(fn_7֭;7T+7^`@Տ5CBzJɻ`Er-JR{ؠ]}ut}sjVɡztWc:x Zuj?\v'oˢLoWد6;M`e 35bCQN-y.hl+`*b[-}vۨЯs}1]F8$wd0sC 13R]Qu`Cp t+O!P1GA%J%e.cS"L\za(tKZRztr™& /*9l-^9QxDݍe+2U۾?p9[;0<9j[oDrާvj43kӣlui8GwFKѡ* KDgqz߭:z{{gԘט @@<>LSu}iQ]ˌ }]m)+e]>.ÇsO7CTq7Я:1u`˨y_&G}mmeiϿdd?6Պv3ڹsW}9=د[-$kOj~qS(Ѓ]{]F]>EZpM]N?I;\wrOI$G ݪHڼyJfýO7p÷4 0$|;az]p륜ߛ¤ZlsܢJ%@J+-ܟ96=mgyC]ܩ+KXpKO)um5/*Z~}4cٲxtojwɩwS5}q.}"Ё5qڷnzԜ_x]AS sD-'o$_+,GgNmll>n/~h߾u&;Iߐ/AHݺ|я]ͫ_>A`"I.MŭvU35?\J9"8 bsy @E PBtQV`?Ռ[ML˗_<KWIfK%3/޸Q{>wq<}juɩz;;w>򗿎Z(Ы&vlFvezdW9qPq^zs\uJ8XmᏢ{ŨU̵ϋ4_e Fַ@G~Ӵ zIߑvI6~`DBdpGKI)5:#4\e,&`6R; T*ʻ(=ܼ96 rvRS9?% *KΕJ=7ZD$kO5 *w9=77iOh4-5AO{[T&s<3j^$#߿uq^ϟUC|mȔj?vvE萶H[^.]75u 8tvc}_?u -O~,ԧenytMG4 N! @}`չZ%Kr7,=N.z^˻}  cJ){/eV#wWmۿfv9g93] #7 S8LD57K,}_w8w?fhzJkiiNFrIeIlAPsMM;&6H5W@)<#w(D>uk= vBX|NA@6b6Lݯ&W<9 2ǀ j xRټy"Ύ AF | H[@0t(Hpd,j4<(p`<! kXs@(M b޿ ox&CFsbex& qiM.4-a̽B[@kchLνx?iBX06ID^)֌ OHd ,-_>3>@xx5J0pu7gÆ 3ZLZe-U6SO_jw?A QsKÞ|)R 냚ohv^sp h@v&?3警@ '#(PpJ.o9bQO}[(!)9e`1EFuM5Mk)[$(ʊMtVI%,9YtD@ 3@IGeGdY1J9[ \;8x1RŬɧzZNW}MZm> xNfϒzhTA>Yuukf]W;Kʄ'3X½ ~ ٸfY3pETTttyy9] _O/P@@Q\fz-zMvUᇅ RZ+BԠ)0`(Q  pM1>?Ϲ-\L88](nv8w/} 06Oe.fIK9$`Lr>L; 3KORke<㼢!2RHa:I9 r@|UqO`N ={t:dl۶ݒhGZ?uqׇ,0ܪ{ ]25!Oͭ5-- AO=LST :G< ،x囎6pV|\h"3P(I ܆aR(}i?xo/:p)ԧэy48FT`8jr 3p2.o_K|kAx_OmG{ =~dI7WBSkSbR_Y)&n\8>|Vxh5!`bǂ<>bN8fl6/ onn*0Z@?@B4f0cp|%K'|e4h wxMxⱨQ;'7 f-ɁMs؏R]P`5AgxlRY`'M,䂂Co0aWC?[@8+R|0 F76HHɓbDE"D1<3CBa)rW焙y}:()?ٴi\B=0 d*˕#F"-a=@D3+@gywz }=al~:XO;ZhJ]|R¥_P8,f(8gZ/y}Z0ASvԾO<^00U$a>2\>5L Q&I…2hE$͵OԜCd)dQF;ٿ-~m#Yvcǎl]LXMNNV?h%Oi%_{a'JѶ3B";WW3p(0 Pgx[XDq5"1~VtР)0(p'{\ dk{Q9s Kh}MrRZm qL׀QS.Wފ $m; (-oE_?iShL`7ɦޓ2m ::Jrrr$==uĈII6u0i\;=  YIZm@oASO=ݳ5DQw!KEgP:{b=~ܵ[$H!q %ud ~MIG455***KۇKe׀.%Z?O <4]BCC>Y|4h d~dc=k' 8Ё7xF4=?B}DkF5t Ǩlq([?zM&ӧ;@k$,>^MkAu gQ  |gvj!6VB'&H12~VBKή1_:88Hf8 ŋlo㸍4l]$xQM3l;ti i߈*;28 7oV۹CϠ;RiPR; {T]+M7 SC?t߀3ޙ#!|UW#T*:_k4 "Z+Ɖ@ *DA(|VDHĉ[X N)]iҁ@ iV| ?4.`< r7^~kp*5߸v!?,u0訴[ h Y M/̄49!#c eǰQ }{8 <3;w<=yz ~ Fx##dc\\[(_t+ AzhK2YŘ=^*Ͱ(@}y   1c4܋ۀ`csA,Pa5ku.tΞwHK?jvC+P ˃CNT]]<Ԡ)Я)^~}C/PD,M8A`qi14fΟگJ8!@(`q5nPIĀ ,sse 7Hƌȁwߕ:X.܆0pA`k=bFuldd"C?mw7Q/ݽ@;(@xt+0wA9c,$= WGΗ[y43τ}54ʅ~qI}ځ. n553~0+iPИI:U?KPhiIAS{hE} p# `29 @*F@K]ԕʰ{K)S^^nٳGLJP-Sr; OyiK ,^[ _OtHE2~x:tS@݃ҵK.huqub*F-PiZ.ҒƭU8Z { 4M4rqG5o*Q=u7t @seji ,y8ɿt^&ؐ!AS70K}> ;uZ8)I](&!vBe׫Ɂ+$X/ى8=|IAft v5 ~w\TK7o)VExmW\?ȋ4RKpQ0 (k4⛭_q=7V4G-e]@RzxVbw X6ޏ{sИz1V]7#YEsdԝw5=MP1fI^7P;ϾVJưB _('`F 0;vJ`NJyܬU0/@̊%Hvor|f&xLFl"-JJJd]K م[?:t;VrQN=&}b-tyvH{@^ GoN(@p,Tr_u &3u@ @ OW/kw2 뮕X5ۛ;Ztf0U[c.jʓ0p ˡ}$,u;v[&I(Iڴ ȗzX0sҢe1HA?a%Myylܸɴv\X C >%W& [ny 30@G4(m)0n7 w{)p&Lz_}T`B0wޠ쐑tZ5Jm P359@A`w-%-n̚]񀣀b9n#i>5-UߕUԹ@IDATK_U]-eph>].נ'L;RLH@:"@] iAʞZ 8 2ح?$>J Ll g$#XjUCqqt\D&;T]n k֬G :ւ@C[H)MءRNwEh [ @(AS@S`^\B&~~aS} ɿU)dI?V.4h x&i8Q&UwJ 4f** L oF@nm`m++ ̫K.!HLa7$2Ś+; P1޽[D]pQMB`7qn~K dD{3:УtsqKkqv b!4{ 0 |t>drud8*` ^OP ?]P(a )2[${\CAּ!]逦U}~uL*0 WjkkرR AAyyIEKxꔄ$ +ހC`E]\&<=rO! J,ϰT\:XlذAt>;ӀˁkK]SK,NB(j=PpNa )V+t +)g20M~O-P@QX2_j~;=q Zcj| G?"k-%-2'[lЈCL壏7񯁦A1d@PLq=2q`̺2w,ޝ}{(z"fIdoI5,d M"衻N8 \52~O?Ud9׬ܶO$ Е~ T oHx{akASR@ =< PMm,$,ϵ@['?OX=սqB8m%N{쐅 92$ OSgwCl0Al+KhKK:~,߁jHX8N` iFzkrx;~\t FZLw cΝ0? ɐv05w[g/͆Фk0[θXh-K`%@ NRI -PM Ǩo"(@m53fL@ wi O6{}@". 嶤NM*F2MHCk՝Uh tP vhrGEl`h1 ʘ%Q1]/ĠIPr.+W9Q8 (2'_ǎC>݋F_G kb+3[J6Mg(\|H˒ 1^ -0 D00(9/{0uĤO9z|qccBS.:`.~n+ 1$㍋5+Sd7HVx7Z<3d$!` P, pP_UU|]4 HAt?o-&&hASS،8d$Gq^=\+[-vU@ x4h h cq폁C33"bcO-aÄ'?Ujuإ}5:RhQ2dߕhNoiliOHT4[" (YM( }0*"9^*nABwĀpQwzsë,B`ۺa=944ktN`ϻ Q1?W<ޅO kډ&*_<4K ?Rui|=[࢒s|ɝ?~(fhѰQ pcyJK#gzk=ץfASƥ,+ߗӧ eP?{SCC$2/WR^$ּ<o PD-gMQ$`ʽ`"p֭[[f+@pDICXtœ>`6M?d >sc*ڬa(PD--xUf2k/^ 6B}sA>tU}&XAR̙So5 ~N 5*$_=>m]0^{Wi$qC6}*N -n3警@(19-p~&"<[R3+3ߌrͫd{pW֕GS^3 2?9K;N<@  9rd25P !=AP( bT{VXR13@Xz*$AOᕵ@Λ"_*Y7\+4s?vC fە tEؽ[*`mh͎ 5"VVV+貆n.}'6//-7ca@m)ͽ1 ZC MkԲD ,3Ս_IIIW^l9&D2ݳ* 8~);rL4=,Հ߁رc3"㑮 4€DL0JJw\i˄a(?x;íQ#ewɈ[nxQZ0cVCC k0al hbe833+ȏL(ѷ$YYcFK"|cǏHs$~di>wvgPYю M_8gav|4ҪRa5r*1%PRrLJK|{'z /QSSw'}Hk3O3A  fn9sv^W}KG@j{Y>mEeS(}jғ>sx Hl+FM~CO} j d 4Ȉ8yB| |#""XqA ym4YSe<?љ?vt]}P@DIy2舘60^kSWFZ\#9wa+%aoBLS[!enpBZmmOD.Z@gefOȵG!0=\p3%EoAbflF|(J)+;ٺm+V.u[tevYhu4:3NaiPR\\|n}vY@CWB:|~ˎ42 Ϻngg4aW@`Ss;MS2H--\!qjn0,c;.c!XS\O\1)NEi{9C鞑Eq}HpXiž OOꏟ#`K׭Wic߂S}.0W! `#ߡҊ@{AM3{P23SCKvQD@ }`lL1"(M<ܒ0c%M*[:2(9E`ZmfQ9 vc ֍2%}4ojOzE]Sg ܿd*9;BmR;jPj9WbkG`U:>#ќx&oA@κl\) d5s&Js 9hB @~#@?kÏ.Z(Zp .(r*-`Jԩ̥0~{={[0qq bo6EGDnd3c0;|76VS )tt#w;E.ʊ $'Ś19ƾ@ 1ZK"= z0GaǕ A./hh;y,f͖Qw)#nY,jGHۣJWݫLOm$A2u*^4[]ߊ  ɻcW@y| xNY:;Gp͡%e8(ƾRA |4OS >ނ@ ҝ|啿nO~~v=C R@+J=pWȒc.q1ql( ڳgye@@@S@ &4ixWf̚J?mW`rh˒!Fl/?p98Hf }BL^^}Ly I1Bc>d;4uf`t,缒:qd"> )jU@2dpf``Ȭٳ%iimish5 ^d4hkAB\GrssoS/_4ZbE3/>b2Y-q"kWl04]]6JнO9r1gGbwX9"@SK):6&͟U;7 {]Ṃ E_^Qys2Ѻ1t1Xufɇ6v}L|})}^䄣?Fۀ@=%Ζ##nIT*4_,=~3Bk8~ɱ+/ңZ̥f1DG- @VA<7W@b ;%IT e9^lA@@̝?^ kj* n#F Z ][R9ad!Pee~_uRZEU+[?ȷSo.Ne! qְWZ쮔>ׯ(px ^ :c]zzobb$4A-yH zB}4L-3 uȀG ;z(kjJ!Kw`̾s@.2tO2.;kgE@jW4tp7@s/H헅`! Gp,`i/||uiT#R],"6" >AiIW[7$#=-a14϶(,.]?Æ oZRӐ!\r@fW@P4))?M6J#j_z&&u-MipXǬ_faO@W G;Tx3_L*rĵ !RӓC?iCUU!RvKխB_ ;e ShE.821n\|Œmܹs vLhH u&347gq@o}Jx6ˀ$(#8ɘ5 P?j]j {T. '=c %A8޽[vlokQc>|G]7Km lP(asGGk -BS?H8 "Abo~3)G zpU-w?ׯr)|w/[u'0gNF. 7[[z.{eZ0!hDȭ&Vs+_ $ ~c;e:ͱzu%˶|5警@ P@ )> EGka7Q ?24i|*ʜ9slÆp:̿1bc|`' /Z$M"d|/?'Fڏ['^}M f"É1&Ak"nwX9]{ )'_%A`8 6'@2>yJ_̄ˆ9d)đ#I.Bџ) nik$[fUVVC'm ֮][Y\\4OͰrt6t@Pa" _"S!^+w|Bbc suuMо("pQ8 j;@w (@ 7j ߿c7~FW_~驧$-sIR 'cC{ۀ|GzpC`}BdZ ff _CR25e6^F;P kۥBY'X0!0Y0lQo\+ %;q_ANʁeϞRgՌ,'hV#& €˄PhlL 12HGLcI2\ܥV!+b0 sNI 'O(**F38cF_w+Ga@h9+ȳ˯:<V1= 32~Y%95!tW[+**I c__)~%n<@({ _rsE#9Q܍@n{ï ?i8?5'75N2\B^a`.>cLdĭ vj-(2÷4K3 ޷kwu Vܭta@'P_)-(oꝻ$}+;wwt}) 86adٲw.;=sy( c@P\\4',vM7~oQaSmx v[F)eeeL! Jw3sߝ|ne7765޵_iw_8Р)m to{~MSc `ȑc'MdHϔ028{墍v`gXPP ]wr-V"sO$yrVu \`R8t#05H0^nq^HWLF<(Ȋ";jLw!h c 1j:9G]VmPkꓲR74.F}mc䘜޸Xc@wP{髯V/+ < [y% .Z{ɓ'GBG"@SSXWZ[ţUwߺ>) hwk l { \uYdX;|ϸŜ> 9#[o~M7m|V4{5@ c81{0. 'JbXGwNn2d 1A{]?㓛?Ɠ'ajv||xI{LK BƂilv|fzGY ?nuuNMȾTXL1 5\kkkA#駟Sa| ֠)S hOɭ P`aIÆ Γ`n1F=3\M(> 5iv1󽆈d|cɝ7O"[s iw-=f60W+>L2[% djI[k}1%"5U1Xd _^?Q K]m 6[JA anROfd`hD?zэ˕ι7c>@ `|?S$,3Sce RQjnnիWI^5ot!fb+=`,z駟~5h 8P\P{롐q3CϺu0c%X1%@T/HH >ԺЏA.laB "SJLq5Y1E]TzAj \?6 #=L<~zkܛ?@\s4<ԁ ǵ}Ϻ@l< `XR8$M'K n%BwBI]0_B  )3&Mp_I;-n;#_=.\`Z#[ծ`^Xz}h{OХ. 7oA|q\sqqQʬYS?Nܹs`0'jժu.+'MЁNرn:2 Ża omll2$H@ >Ժͼ;oߚdJO8j`y5񸁌|3Vk hB)0&2^޷_΅3m WJzb%i:D!B૸,@ dlڃ4 w(G_gm4Õl|h"b@}.tC` 8X1r^ dr!`3M!3mePB Hx}}u͚<՗K;ٳfYWBf~t7,. ~9pLQQ9sD euƌi ׯ7꒮oXĺsFdDv&g ?v<ޝQhClLGn5퐃m)1 4h NOZ֍h 4csf(_nsD0~-h|?#}W~>`D:>K If{=gb \"N_injZ5>Xוȶ_ҐԜzDA[JK6v ‚ ̴`uEkCYY[AL/ `,( JSI`IgނkA*hJ DrlMW@-x4+kvhN<7ȁA N>eb'JMMMM͍0A#V [[s߮YƘs{Յ_\^\\4<ǙE GQ\v6HwZ*':lY4wp1 @#J`;S}fff5w #S5 ۜ\4Dՠ)= 5нהYSok5̟F]}U9YL#qqyP$ZÇo$U#DjW?8oA*!ߗ P W{'o ௾*AZBfה?*;wl_K?`o^/)E h /WW0x=i mwܜ*I)a[]l?kw49(O¤L>|EO{uz 䠙ǁN:_D_)ҧM)O<  {$k3L8נ]ۻ Ի zSRU-'$x6I`X0m nNG $111* h R{@Pz ` C\[8wxH;XIWY!V.YʭB%s1p 0[e9,0&V--=}{TDFF <{SXox⡰rYk9_rkBaLk>X(I ~h}0%v^}p蔡Гή"Xfdd[׭]SvPZZKjAIhݎͷޔao3+tF9w,r^l?GmY 0" r{"k ʰnZ1sѯg RS#)!=ۅqmZ4 ]`KSl3UbiE)M;c Ě+Fьp*PcP}>P[(}lQUqF43å& ): }ѷshYc***jChh^Fi0pn8No$""hg|Q3YBhr`4Xa 1ywQG9cvvM4U!fB/ta@YMoQ@ EY]o PW)`ıqSNFAŌB[w8t <4A+dƍ{Bڱ. pU ,p,k:2qwA B# SnhĴT!PLsS?]Gڿ0m}42Z5`ZO|4Hf  h`@+%&VW B]+9 '"f h@!G(;vH0謊!S@H1 k1&08ǂF-]J${ni>Yr6 D>Rk֬>kW-[x1|g =v,߄njG ,,'NJJJ1ʵ KAS+ڢ+Օj L7޸oTKLH2'㝷{ 1f*aH7$mTI@*:0k54,YB`ʩ,+? HVi޺U Jvͳv>Q`sPo:].`x_ʝ-J9qi,0`p;vX 1}( (̈́D ǜ1jH]JC(ʱ/q 0NccF\a9~nG < K-e= zYvbQ=y%?5$>-a۶m" Qo7kk%33=M:0s՗FY$ 4P߀ƹ'N41lРB7|mOγ,1 LE׿uK/Iֶ]KHE,mv}r5b62@IDATVkCÅQ=ߥAǼжlTJ#H՘n ӊ2->@DkvPY^S(KǠh``oB"b">,{ L>?x'%U AO=d@e,؂-$\jsNAv>H}{O|xxػ= pux2$ZriGӗc +++r„ qwo)-&sEyȑQéHxZIj?CGtI`>cˏcv7~/X@z5id}0eo"fzI͕th jg(k?lˑxuu W@ p7JK8"2 ]Y P VJxf(-s c@Ch{rwL,:Bh 8w)dzmnE(f@ C@B ,@'-,,nС߽ekq-k֒Qc- Sfߺzv |kՈm`qN'!HzS>I-RP* 4UTc)$* (p!z]`ܕiw`08fƔJN QFo=JJr״!l2iL~Q)Dp,t[om } 2U;wgc Kݺ-2va;RabÒ0M tN"E&*<- UAV dM0חrh0ha HZX"2zwȁ`ITY h0fV+|ΑjJTFr G|l)..f7[72'?nokn~k2?ͯA9ʤ`#2XA||NkWz1 `uAS`Pw4wIS&FU f1I;{cq؏ǢgܹcU\PuuTwck0EQ U|8 eԷ+,lƕ5;&|c=k׮9M`͚s̩UT tQ5M5]`P@;S{`Lǩ31㖜 J26|aVS/"/j d /(e! Ms8}w[/>Ȕ)SB_|Q^}_oN iz'O3'OJ`e bjhȸN0N'Nݛ( ynWc5qz9g VE)A-d`,1 "2#Ͼ*Eob ǂJ HHiUT}~wy_mCݾC G6:g7?x } |hF E3ܩ"ǂ lSeqz^.b] "oeo0{dze~ FĜ9E%ƅx5-g\s>aB{(Cx;52ZM)tqZ>Q@ D>}qP̙@^uqxpE ɲeZ}b{Еt (3<*`4k8zfA|Z*guhEpZL;Oi**N1dj`*> 3yɴR@@ASf?U}c o/l >@"Cn8 TY!-|K>#+.YK<\ɓS_ۡœxX0N"&7GSV.A7IjJ`eLG֮]k>z$0cQkeDj1̜9 p!cxpUH9֠ˁ۶mk6lXԘ1c "i|{޹:2zxKwQ]kJZiWb7 WzM@- $BKx)Zb`۸WIޥk[+˖VG3;sgΙ;wN?1Q!׬(0CNxBH$ MKnZ'3A ,{YY段o\Γ6L]޷m/RgOHQ >>Ok4G{)2%{dE/zs\gi:yX^4e鑡 hDkc^%t!{uq!I +vD> `^_~y~Qﺢ#R[R 1QBxs9. Pm߱S**7bѐ#[^3xޑx ߷/l (0Z>[ %Xk`2CYޕH~枙COSNM8 `Uaݺ孁g)]I@ΰ PDYfΜ0f%yOf.[ƉL23#PhkEKpZd  PX3.䑣FWBY}S2׽-y\gၰ ͛)OX Q HP0p~)y7%tC?!qUG\?]j܆"yKaVmAݻ$5f@`PWVucUJ6n`CZ(m9Dz,"~ Jrp"܊ "O۩rkN?4d ޷X(pƫ_ M58Ƴں5_mW<"@I!s*ύ㔞++AxTʹH爩?;u8T I;#!spE%g@5/d>Qh}5 f#łjI`0*֬Ypu1i 3RJVUWPQ±m1#q?b^Zvm X 9n1 t֛/.&|̇xa-`Xx,_[3ng"@ TP%hic;< [ʈ| ]d;vԦ/P4hIm[#q1!+@iE|mBK*YmSЩ*?OFnn-/*(#kXsΥ $5`LR@Uoˀ:h'Nҫ'@ bڹJn>3Cio,dXlxU)X@-YIK`LQ`X~DˠYÓFnJ)ch_B+KE.ZBk('IE1V߉0$ t!?@,R(Ǫ Oo ~TPRR (.u%0e98= k`?3} })'nH x9`-W㿓lhIQ )s" q9Ę-7@FZ3\Cq Z$YR @@"/zɓ.G G?тVY;EŸ`*ꫣ^b3R}q9#VS.Y9WC;[:fQd'?)@!U`iƏֻg?iY4>ގ%[$0 k0\gv[@\V:(E.[n!/ɰ$;1Z,Pn/zRukΧ* .ׁ&c9:g5hI}ZNE bRh%2_I k!27W. U"̷Pw v#VI8BXi^ :YRoGa}ԥa4**cĻ^e B8KR*ex4$# ky3gS ưsW[h 0d > /8aqüy`HM78Qz mooC%@UM D9m=&`4.H^  E)`oyբ@@Sbj"}ss4(`^^%iբ+뾥KpBh% bc< Z>?*t_O> ف""ŏ*(2?aS@a=;BB> hYw`2Bl8FqukH}خHz3?ޛ ,7cUPȓvťJlqJ)Kú.Ucq|0e*/{;P(K/psS ,#Dl ϡXZ#k_) WL)((CkԨQv*ʨh2lg.'8(ZUY]Um204A&km(eJ?lfu˳GFZbZvm=;JFWr$@둸o2I?v>KskM(뵬?;h@ V*VrX6 ̗CkJ\^۳}3Z !Ѕ5I# qm*)ZRJow@*(U` |(X 9Rn`K+(.j(ۺM"*.Q{gL+1T!qc$y$t /JF@ЪU !d5g )Æ.d"ysu*56!?@$+=,(P%PYRgMf]gx@@ʰx$1{ >i,JkA6{C@w0,3#]=,]kXҒ+dzN9CYوҀϔ9u=!P6}$)b\_iMH9a:6#?,<:ռU CEKXoLJO}}{ My b@#=<5Yјohb)5URcб-(4[?h$97ߨ-IwU9BJYdY-eƻ;#H8qPҐ<`i{t5+F,<#GO4)\\v\:D X5Is#=Gg] ("a m]}^ ~T,"\RV^ ϖKy9> 4 Sg߭YwtQ௸&Q:tH߸ճ{q깓u666s;c{Úp]wAWS{#ֲE 0bOdD20y}oQvDg̕sǵ;pm&S;K_@YSQjyr5h|cw;^ShrI[2Mu˸ͱ[_Qԅ݆LTPf@ US P'H!|{HN>K(}ES[TyJ6m%!K鏾u:1:(u P$cIg %تU00?+$,2»j+{+VHLNHHѣ{7&4wx檫(٧4|p"9oΏ@pt 0 atlptt~%T;<GuGp|Vr iƌ h)/=Qu?Y05K˂0v]'#LUNQHW}KŃZHVz[ ZnimmxIðD7AP9⁐!\ZL*!L3~BVA(H&`MOBpclk᫇;a[:=er@]'ux\ M`t0؅i exC2&4&J%z2$O*aPŀSvF̿7I8M[Zim˗i% qoC}oDR8|@ O3a}Oѩ'8+Q8^l7PF`l[*ȶkʔiΝp ,b20iӦM5D*(3D'=~Ƀ={3%TBRBYPA~X`Q5 ھX, tOdy-})}zLJ3ErrH=Sak>&IIA!Ľ1?ׅ|'R  Yʘ8Az͘Vq xHtߍK}VgvQO<.]̀Pru=!t]߷3هgTi3# *DDJ򸱒2a<zKXxV*㍷pG>ڡP/lPB@TqtV`> Fh>'`./rE'>*A LFH/0?O/aga/T'HLXG*|^ '/ ]x@~ue#C*qF^ gsmܴN֬]0 cjQ PgE@oѹ^fw2s NM&%(8A%v3~sX7ָnc'U/,6Zf DGd>" :7Wz~[$.TyA! ?I;BȻR{ +kGϳ]m B4-1*ɂ==;?qɆ\5G`1dX@9. Ysf(_ CHܠsLPSggJzY*\ /܅M]u ѳS5ϱo( C = XÕ- 42Jv~zW+oN"2ܧ,8 P` $yݛS @g-s@IK10~!4.TP$[=+KM)^N'VoO/ w% =C]/Gqt`<jP3Ba9*Xu׬YPmWCo\w??ǝYV3&-~@̆sߌ xcHիƎmc(ɣSO^BZS[#~Yяt,8~PQ-SRLk)@W0{p͌nj'ApoP-djOE変ʅL1E; tgkmZ`P,>auMYe P{aϖc؉_K;mug~ l ʨ;o!Ax#]b /)$ $z p ]c>̏SR.qb_._mI7m޼mGYYyQxuhw0h…]w]$ck&eMMlh4r5+ۛ|9N< wIeUD9׭]_aXhzxV- xTaQ (43Sbbb.CWL{IR<Q `8(P4?S06Zywk?&Sy쇵gMG'@!"+HW';d(\o=ki{V43|w=gm:0D"9Qڜy%B &@1˶oײ',Ʊӕwc9%c-~S{k+վHJ7oD.EknڹSs@xK{ _+ ,Y'J\K1 3k(p"/V޽=hժUb'@z с׬!z4 @ѣCj11q_#R3\I25Rgnf{n3׍+;Ƽo޴PKi"8X`Qx 9'oG)0O\c?ѽ{[pDxt66>c5OF@c.3g,@QNK7tu S2 @fooɠ-ѹ9jkCŅ 0]r_X݋F߽k(<}F'hUA}QBcՂ F_P(a~cL` $2c˾@WXIGK<UfцtGZ0?o0xPBxQ1?j. ųv#T q-c,a~"G=`Ic.= k2*z]~7bێuZ)4R- іy<b0>+KbYjc 9&?jm W9.vm9'$PPZ Hw}WGt']OEGia^EW7&+/w\sBɒZQH߆c&P~e9:BC$11I}ْ+W"pP%]^ &yx/me.󈤣X lݴ&r\nxu1{6j̛l{~*uC7[N*( 2w9(g wV]`B5Rs,Jx?s$לgГiSۢ6Tt2TPV٣^PR ?Lr/3rVsB\Gu0XxϽE~|8P@qQ#l>UMd)R'ˍ 6%< Lx駟zw8YήsGڰaCݕW^"Z%)¼ۚ gO(&k=W "$dPhʰ& ,۾C^4@~Xu2%5A@(:k2 P4{ɱߧ*cYX# w#y`7tbq+(-($88O<y͝;z޼ᄏiy%V)S&#AҀp/^j!Ye۳ w|0{ѫg/;yG-nVy\|%鑏>Ŕ8wMeVnտ_yL5]ژ"gJ; Zd {vktЁ1fH<sB&+"3zΰ2wʑ!ʲ|7*G8?KExwJ7Vߡ;T! ]?@DpN`|$Nqd])A!xlgRx4f ϕӴѣ$k*Jg`nxOO4ηF˟?xO?&״9s6@mڴ0!!A,-##Kd7^53Z`hZ~W8QVW_ c’Fz_f&Ok,ECl03+3r钥H Fo֮6Z9JKp֚)Gt¦A#nH ̢RL?:IrDv8POvro# {w13Q6zR[L c ⊐~}e(Jj OH8CQ5be22'LvƴAZt{Pw L?VX˶n2B0FU >Aq O _=$Pz|844,ׯC*G֬p s {>_>ԍ#ftw^mA6B*1(xt ,(+ЪĘӖA8S4c5.0?>͜9s*L);N *12g}n{E=yUv(J{#x̘1<)[^psGm`&6]v&pƬP4tY9̶Ң@PZf{٢" /bTpo1g?7jS3J07/V|;٘J}Hˀf[ci[&rweK/۩al1ޚLC|Nz q {uδ0]h;;+K?yN%Dn$iO{h7vN w~ӟqQ[QKxk@b{破_lh?ֿC6_r@{!Ѱ_/ LKE 0} QЄvGrmvh~ /#XS bfhK=V^H>LFJ? 5KnA8y}e`#1Y4,)4(`N8})Kտ?( J@V-8NI;\?N+kTnK/n_XۘGU/Ds+)@h2T5ӂ[@2; {0k߾}uyyy.\ > 'Tp%V)6y[ag䁩x ڽСCqotm X }q⤗g~x Ļw{%azVflV+1~?  'Dnn<B|z<tqlvM>p8>29ӦɰS$,&x|&g ^dGqQ99(}xdN*2l/&cxϪCI/;<{VeQ0=R1*8KR@5C8b{& F.1 t**R Oo-VP ^o0eg׳b՗WhV عS9"gh㠭a<#ŁOȾٟH0TD%!e[BXi)ںMKJ% ,`繃c! ʿI+ʪCKD^T !ekO=#):Z^縏xt:/m}sKkOҮ+VKo(ȧ~W)c0S@=cfIXÓ HCMf{k5)`)sȻ |$jh`o`*R <?ި&6 3uMҴSёa6Ojdh&F1ZO qrOΐ\7ayY'0_6˗gn|^g.,Dk[LI'JS9a)Nȧx$Ҋ|@֭$iDǃ91ƀKIY4b\I$ymU\JenB>V 'OԔVF| eO4 Ϣ"N/.--c8æfw5dؼZ0T )xذa jZM+>9W]W:|.oXr27,lPܰ~O8ѧ 73ˋ/O1ݡ$8F^՝@3((HR?my$DGjNyNn|B? 46!u"Du@9h՛}ѽ555gq<[ ǀ|v,O ./S2ƌcn~>OJAY׽w)?B jIpP`u oq 1i1bC?p 5H +~QO.ZT`k@>8!d1RV )IF~)SBt9|H@ Bwa(zSRā%{TUV8ESQ% l0 @r{J(L۶ -647hiLUˡ"fj4ih0k#cG-C$/p `)(ymPsF Ny( u birw6[YLPJ y EDsC* .H^<mLKp?nzOIMu 7'?ɵ;\'3NH-7VT!@ tr=t:oF%KL3 i߯yZшY<;A9$@`+fj%!ANld}K矗/$Q(XUV!˗Fm cUЇwe#Nb G2*C(zYP_UxHr w (anXM"ҶJ^^cxYl".V<~|ޝM\/R%p8`Ԕd*lS8;vȊd歂iA_*l7IqȕA94RG"ޭcQ۶Y0090@pK6d>VVm,A S @Wx\PńZ`Tf0v;%7/7Ͽj҇};b| ~/R hygqQkہYtO=f예\;?촘  h[}.ߞ| ܉Sć6Mw)unt rAP+ٸx#}  dYگ Kj%319u;d;dKȖAd~qe/@<Lv_uy찡CCsQ5?Zn/8%5ٍx~ͤ}1\qs F?GOCWCN?qAxγrpO2? L{CLm֤ZƎ[Z vJ-mm9aJ=Z 8j"sf}˖A$*ۏLv*@! uo}+s JC%lAP4’q `@;Ke5b/P/Ubn9vfO1Bbb1FX\~D ރ*p wSFU'{>TAS6̘>MA0t0&naG i 0?}zK)S p0Ѫ?p>LXGfG"3Gx]]iPxMկ~u7MQ|ji+1xg #SGvɅ^2ejk"2X @~:zz|g|ݍ3ƎHIF͈3@>3m(XVj/$AA(Ɍ/Q~ Cnܺ1<K~B y{R`%^sj>ut{6OMϽ;xzLpҊO"ssta_~%'h̸u֩29j8rDvfk>ɾ I:\;w͹@ n g&[ +Uyх!}֏rFxXBRiw(c (h8(y0T2ykߦ9dzϼV2'M?P*P_}ԃ`ôTn9rD6獖ڴq)<u#y#X4$TV@8{ lڵf5p* 1t`LRpuceCAf ڞ rSb BR2`h4#EM7YբN 5@ *@;gu/W+bb{xs FсR@b%.6N\pi6P$z"|(oO7b`-A>E9D`0v,eBm9!_Dgv:$Rg?|8vA|~8(h9OF?\/ԬYʤ\ˮO?1ܢq1yyJرnY%y$Pbq0{…M6u/} =P<VYugkl^j5˫{ˤTD[8ABP6T)DA_qL#<4c@28b9z.Ɓ'scQW#&1t6ϒ^Q5A7@-Ӂ09Vݷz멤\TPT=+]|1;qʰ/z% pJ^+ؗ.p ='ϵm6UTYOFOl |THoU_%OD}霺5+L`<9*N kR)@Y]8@v2laO <\L:^S4ՍӔ4N'11IbP*<yjeg{޹7:699UڝL[|しw-0 xaVw|N_)<s=yzCHpBK Xb?xJd53Z =st;!_]7#YT(=o5C1'̨s3D}»hѢ?+lur$N` *V:aeav݆ (`߰ʭ]sml٩8ɜ8V'='WNѥ$ 7 Y"1R~/L,K\ȧR E0dh–/Cύ QPE*03z<ڡW?tA-[! Up0!c=iON^$$`Βڒ#*"4WM PsEt޿Os7kZשx?z{XcV`9 _͌+/W!Ӑҹ1wók<:y/0קO߫əf\^W[z'~k!QxMqp>}(+@yZejmz.OaLϐ$f8zzW.\G@p_OS '^] {Μ%'B `Ԇ ƍt0MTx [ }JTv$aɧ'.y~47~c]ּ^wsBA/9)Y3G@A UA*Hu>}{E)܋b7 &? G,@<?w60ӳg3ǍbG84YZZG3 9K' N <8?M'1Zx剹YI'&L _^QBq,&ŋ4׀uC\ d |K$`? >+䊁sPX:?HnP^eO&= B34).E]H6Yo%{R cy*0=_|!!s@FKB H.oz_Q]"NjaLV!tϹʱy'*Pb ՂI@We l:Yx:Ŧ4<~<ۑp# !,h@fO'Z- ;٫<0:NЕi_^eqXrcQ 5())CdԄN5L?l>5&xUK%3V?Fn8u:%[7 ,m#h6lsʃ4/qSw%-5Hiy)(mG ~ zjѨTȄDϗ \4= 51!W2%>tR!$qt/^s87w/mフK9(zD2LdJ(@&/^a ~1oG!Ź|1b27$COrNU.zc'$7HݤM$B-& Lwn;?D" WRAA,- PUydʠCCD[*4?n Ǚ._ +WvO@SPr$+{mI0݁/  㒮 [`RCc6 qwy;~C6 p1$ v7lcA(:^T"tE]xCO0Y+$a#vSa?n/[}Aqarʣm9Xp)rsOq-< { BA*+#, ds9@ߘ 8 {Ƙߌ1,۸q\7=wa-=lm f7l* P!ywGєQGDwi˱{eɃ/v?^ۺ)0 1_p=wp .;26B^s8|:'=H`nsz6lfǴwCۘҸ'?v`,OKUTiB+p*_Sud\IU^2)1C! Ipַ$ bY<;_{]PcsیvŒstG<fuU6O/{( Ӈ:ֆdAA)rGOU\tV`nc`0ttag3= B-~ח7TBC:g D8 ONDt%=L` OeASʈJxW^BjBCz[d’ŕQx*4j hIJuV9] `e $;\`v{f57{Yf/vfd"1cOHퟭ6ƾ ԍ=.X]6ܖ-}~:-G-UmS׹t6N[3B AR@T }{;jes2 ;X2.;wgbY˗d_hR??'SapOK%KкZD`BuEU$نY>˱)q&ޠpXn"E_} >˗k8({RP"n9ݞ{6{Ȳ|.Ta(o AƢO&'!"AH2> ղnM˖k V %G*P09F耿 ܎~e̝'m6_cCZ#Wsޮ>[dk}m+hENy衇2ې|+2Eį[s-Aj B1 &IE&7K={H$^:hKbLWzvs;wH-̔oᆭ7xtܹEF u6?u| xp/;K&~.If9 d|f]Iiݤ5n /VjoAKw…r,Wu`{NcWFĉZ2GZ ZT\k3X> af9R xX0S@>}$Hq=OUz4av`(C9ŗRAX4<LzrbB&Zd .@ 3V*|cϐ!fJQR7` B*iR /.&/s']@2JV6@[(Bn pu@ Np;<455O؂1J&$ގS\ynW3tlO`17We y7wmcY%t'nܭòs(7ɛoSd7/6+?eQ8;֕J72]o(7֭`ஜ.FƱb<Kd#3졶e~B1a1C@~,ɯF)# ٌ1_3{rDXÜt+]uۚݳi֬Y9 cy[g@_EJ$G,$%P^fw:ЈH-GKJWfwqn@LIޗˑt'R {xrŲFB0M L3A8FE+ÆJjnļc xz4_* ί"?N~Q$=ay%d E".M+7a|F3 oF vKZ.}ZP$WhͱTv!401m\{> 6C JҢm (s+l(գs`8x*dѐϘω#" IP7NTgt:Vre>-K?UdS͟Nj'0n ֺ)˺B=6O5x {ue-67fhV +t{0'|,/X/d ccb-0NOO*`i9x=odC.P3ƄfLvxzcb@ ZqLfpe ɂBԙ^q=4ܜĐUBj$x6n6deswd)ve W%\n/LՙHVk&+CLLȄȖ풋{!DH=mqj\R9'Jk/aÆXhӃp߼.@ g* ``sG/ZYǒy߹<{BJuBn6 ]uw~玈rd?;wfūyt^D!OLX _ן${u' 䋍`` ؠ0a`b ҀL׀'ufKܓ VU]% #7)SN<`N@Vx-Tm /a'o7;g&㪫ŗHa`Q.Z l^L:GY7RgKWZUGF>_/,=aheFetՒk_x$&JEvs tQȼ `(ZL ! n"ZSOJaʞ^$a(LqT8zg?6UʜΖ(kYcA~` sLg\Nϖ2/X0j[pQc.ʼŋEk4I[8-AҵmfxfO-s' ؾc|tN)̥S3ݲrJ)2jʓGE2!2zy-|T,]Dvcd?֯9P{>p?ao)]{53///kk+~JKnV\/N!ߖ7|l2nXL2N0&pY '2/grvOZA(3`r@G3fPGCl >lm ctM']E8p\U2 w $grpҡvbU=ɱDJGn VUbgՕ>kF D;7$]t"0]lf||ˡ#ӺBk)Fb;VHHDs$hn(=|VLxTPsf 1#5)RܳW-ٌ! y].7@EA)ߖyFiJ1)TAWc<9 ej3%Q3Twtߢ+ FX- &ݩ.vz3(([Sȣ=*^S&8eTN]:=}?(Jgz F)X 3f 804))wxxIKK7Au7yrp'lPGͷHG"B;G)xO~=sD0JѸ!!,-XạqgW<11QB>1!Q{zC՗_2 ko yp,krpR 0d9ΥKVT ic2 |L|,8)pVe|ӑmVUA >w#cIW}c^)&׿q +|2tp6@~qr W>T N9Jٻk$SJ8u4 J.@r6+@NğYs>y'ۆ?ˍa`,0 p+[r&q9%Y~&t=:`X#~a\B C_'^D0Q9y2g3{Ѱ*0VȧʔX{Jp2B@-PDS(|ʠ`_">"4&0V{a]yUt2a.q.!jQBP0}c-8(gB' PdKnVF*lɻQ @X yaSZ`&K$mơ!i1&LHKO4igdg` Qٽ~׬Y-d{vBnӦˀ~$ 7Pˊzf%|H` QA޽uP*UWU3I3ۊ*a77t=6^7 ߿O| ;;rGxI-}"liOa0+zM#G )/3%1q< 30WWVqb wj9fFWhfuBq:ArnlO>de?R:е&9LP L&{s:]R|s~WmPx#I J/JkHEA(t$$ GWSb`4ڎƙ|.I6]vϛL}?hq%]/Cx@_~|R1@l`x* p'PQuC9… %+zgX!jFhXe"1XVks?LJ)5EP[=s0ʼnP-~Zz% w4j Ca ] b@Sם קշtf9r*Ղ!$2'Ƃ5x7CD2 ϲ`W@gMMP~<a\ޒ*UHE  0780Čp(:f'*>o$,~c'Mk)|Bր9mfoS=@lmMR"\_r4~_X~Kc¸n<*8E4MDžN,X7*s`h]5]eg߭`rQGkx)XÅr֍؞4L Z]yNV*w(%% vSVuÄ@c *`ha'_6Zp^3+'Ohx[IǺ‹GJdc~+)L2ѷY s '5S=*]qMzu뭷56N7~k0)@e0EJ.*j7_k/pWNs; ߑ]8fZ[/;A1Zpٲe} _26-15Mo[ʫh-2]wCf baRIS9\,) S]Trk%j5rկ6Dq56JRlrH}FP ӹ5 ͥ`{ p'?Ԓ`%'BdpXf^aA%Җ xGڡL0+<1d~dGTc7!7K'(:꟬:kB{eb=Dӓ\lqJU|E NXs_R21[zYb1E8!`/uqatgwG0{?@ i2A>}hlQ2\mS|SSV0&Tkq4ݷe=L56y?nM#̒5?Qp27`Q~R5^q7$<Bid]ҜIh+Ɯf)Wk}C59.4 @@ۥޕOq8"7+㉵̊cbAtv,CE#:e~͵ȎPd8\;z%BoMT]"2 $U'{ǂnHk<NO@B}2WIP'*}C>sM7\G8=[r-y{7Y+Z[!o*&'[|b3EE\~KֆƟS?rv[c ^S t5_.0 M &:1Լ '89?In5^gjc3iLSh %蛤߇_KDK+lHikRL>q7󆷘=B2. eûo}|@~u@q|J',Қ}3umB^7zԓnO";S]?XQ: @\みrL!gvmS`>Apffu. Zd#L3?5[Jb7 X,H6|;i{Tf=(Ľu+1,_*4Lh#enw.zZSKzXK} SΝ҈{|T|,83 /͕ʪ& xUy=]|)½zR7ĹF*@ 4r*vk֬q{[$8fn)<?5~Ƿf=m(f0#U'x'4Fwk@qB {횵j(t{h<ڽ *0>poZ k!"#@ʧ4+Qbn @?OTwwmN#aVB&!\?OlUSx?!yJI`  fh"3h<@a#eDqDZ !vk#OtI|6i)Yq hnڴ ;lr*2]ʉo<zRlTn3>D\wu_|}0zן{ CҀ[1w3z]~ÒCk|yanS 9~nues!HM.5k׸9s@kmkzUvWo.5"ӖQJ D gg)~0y߻'`~~kKx:SgAI|[ej_v숰_(b1h!O LѸuTGm+'"8)m6w dSڷ>sy354[ Oþ`lHBguݻv<6#Їq@OzƜK8NtJdfvJ򪤿ٜ9.&؊ʄ/=,"1T<(+caf@#my2Wws'MQ[`Aٳ4MkSĆ# ܫ] vnq\,xEB@̒*y\:#\é}7B4rԩO?jI]!imp'H跱%8^">h̓qC}}}of.NmJCR3 5mTGZٓtIj~B-X>ix-D5n={Ew6Υ%KL<9F!x $Y+ ?"xwA܇g/ _\U1k/vL@f=c@yS@ss7 n:m۶{ mʫ@H\fKK4̘1wUNȪʫ\gp`Ȝ|{5,kIba/"ӤH,! `x*n+xLxMKHaPX)_=RD W똃0.6k>qr7l؀T*ZMoQ:'lPMzy}+Mx$?,rλ;=9FzRY6\|[/Y7da엳%*\㛮b բB*M%%in)OS骫Lrd}#DtaU&s'Hd- NX?vEܲżC\C|v`IQ.͝*9^,Z$vnKk!ct*Ôhyy;%MA @|6~vo(x&"k =ት w6(~!(eP3+ 7mYP9T^M}ʯN8V =)S'XdkuEnC~=/Gg}To¼12! Nw_!h4>ַd8bQ@8r 9RoeG `SPęr6;_2Xd425M `HtGL{ yJ~FS5H*7?W^^+2&oZ<땤3N?@rm8c>`?T`0ÀC$2jk(GB2"ڣmԌmR=pAa8&[{ cՕ9TרV@Ssk.vFӟ ]5* sK?dJY!5j."͌1bIsRdI߼Y' D{',^Ze-j/vbno1oxtyBoэigo15΁6.kT{+k_nO)_* !y8~&0kفg߮<1vk%{6587yUo}em;n-{m{19})%[] Ġ~p!4 ϯȑӬ2CeYehßf{=Z7uT[/U{l L, ubǕ7Ļ*?iC~A~3j6plpgV{׽OY-Vt29%YfT+WAQ l4 J YRSNf,W'I!d,by~/]/"'~Ca7\A$PY9<O ֞?4v?,Yr![-':utLk3@#͑R8SbjZ(Q.Q]1 Drer4C2gtcRG=vlBBV)0ffd j#<px/5ԲvKdB@,Ov9."T1"!2l96LAe%$ݎr;xTs}eI*ɛ A?"\w+V%ʅ55\8}YWV'CLBM?5\}rr/Gp} 9HfLCROL+UKeB9 ۺ_aX3&S哝J`Hxo '~Cӈ ujwŬJL}yb :LW(AU LFثi1\1G .SX^ kE \D?V4EMu$j weK߃a/Qm;:`h&fR#{">TMv;qeH~`VI~#'Wɓ,Sc@ J5GĎ!WP -(\Wg\@]ֆb\p"-r`S*nbcc ~;2VCLx͛ )޽{Q=+RF\ӯu pǕcKi{f|9F WJ8}l5?k7:|ew:y ϕ(_! u ouaDŽL%L{A&{*Mo~O;HH'43g*yG%!!k1L'caaϮݮ]f&mbTasĸ˶dZ)S\h A`}Fyb17o9QtulzHW;quҲڳ۵J.C MODTH/^\5y\!x:4eyv"n噷}1 ӏ?ֱ] _Cfq$i̒5+ڎ>aa9_}z|#*1 x x}W3"/}x3s|R3@j1[ZA} c"K-A:޶O8AI !Fj@m|ٲ?ֈTYR5?,N;Fp(ߌy‐ @C8b'֞n53G)(s" N`C%4Ajכ6ordb^Ө';WxOe^s `#[Е9C?qe]), :nџ;wMf})IR$l>]*9Ln!I0 +e&鑳 eE-_4!q_$Wx[̦M(efP f@:sVhY @>3C^FvSvбiS]WZC ٞ( v0K\[p~ϸf1˺w{W4nʵ׺q,c)E{RoP^'^&! \M5”\p> 1aL14Z m]niN(Ĺ*P 5c %⢉ ~nBi6) HYA!^F, (r=vGXhE }&hNbps7} KO=G:1d_ i^mP#E035 PG YR3gL] f̞;R,&RaA@𲠍sg@V׮quJr}BE ZvߜjP= 3!P01y? #%} ZgY +sk9b.e9Z{ybpa ccs y36?TS.YLnP9}ݔti;z*iąxل_Dx}0n!s@ȃxO~W0QHb5a+cdD.ل)~l&0bPF)3w !@H;Bj\# u#3oT2;8FߨQCT풟Wxiտ W"ƘF 8K XE%/`2sС;Ӊ9:쒦~R{930iN3=M>Ph㯸\ ,\$"rob5tc A`9Xa6koKGS _) :9 Ə/YBk+Jkڵ32Ȫl9,U_jk~ыr D6V+UI|yDmݣ ٷz?Qv3`1PJIX.`"(ߘ=eb1ƍ+VElfNy%jEHNv~a9f㤛|\}Mok9 --ĪJuʢK1TXSNY b %I,EJuDߜJ%&Πڦ/vIAYL@(4Pa@ 0Q+6EpI9*O;909P!q(=[{>PGQ$t܂}͔(B |6v?Y ƭ* st'~H/;cԓۥ7Mh03(I,+IW}{n1dƉϗ]Ь}dd VH&˩N캶m7LZ0! QV@CPʷ̏X%sjItqh#={8j$]30`T10k2- 4 UPQnzWȉ(0\dw9Ww5D0n3qY|1`4@Xy'{OYU+ 05jǎ3\T/ۖ L hyANAʜAKv0`͡!ִg2YV60ck}X &Rp'( x#x=qS\  K捛nڴٿom v'[jf FF>1C,qlj!J$5mNQ"^*^k^)PW@xڐ}2w :ixEaJzUU@8<#1 r9axmDSO6LRg(58VU 67KalBLcKlL{EpF0' !fx`gb$^= u9WБ5rg+D.e5M1(h \wSOi>xbXxsz9 b̢>!ldYhVP~e3ֵ#//b1T{n⛯V13x7@Ε_9\Zd LկJYvf%--.-4m/\$dni˔ܱb /HYLL @^&7؝""ߟñ !kLݣ\a!\ W![0 t>RP%!de/]&@d A;1Li8q{\h-i嘿uF̛os]o\djS OBO!GVlRM~qꦊ6D=>Fr"?AlWXdaziZLV,ZhI IҌID"ΣǞ[cI`" . /uBI.8HZLwnze>Ӿakj95D8ĸNRWc $,q}Q9{+ϸ-gZH2+,ć pDN^-yHcp?mj} bRw]30e| *]meӧ! gAOm|ad+8p ?uZWcʗKqYyS|Z 0W9h܁ 1cXW ~rBa'0A92 n]5{5h.֟1q%(3//)^?g^-En۾ILYmnR4\51FD. Dڈd ơ5)i64yTYCP3Ν6(`97f@:u֦_װ`h݋iIPK-roe @*nRTI聍Z*(( ƝCx7.q>%vw˹YK7xEKA"TQCn?PxD#w G]sUn$ +/u}2I6՞@5Hl>$kb_ J}ףpI k.33Pl$Am[u"T.8ܵ½"c?hD`zjK3ח0Q잁a/ѯek# _TH?#@M 1:sk04F|$ W =~앚m~DvaSm[+NKIue63F&@ I&O,jPIFnuߕk߶-驨5M^ rēĀ|T & **m5'R h!\n2.JښLA6^vS/bD## e^V9{+o[A?0h0RBdچ2ْXSW es?B}'x.0NTʗOmg̀kq.P3$Je=J6F9Êyܼw[VLُ&Svp&Lvi.B&p 3w põVסuu&B6(9C雚K?V@Pe]Bh:)^ob~A׋ZmmLnj)nV2%|4"uH4sÎ@f &Rs!1`a`qk?<tn~{D@Cʾ?(2߈c+,o;7Q= nܐ:+=NRU,N 0{oŋqx2gܧR]kq*}H#ʤ%OPȚ1bҗCH:FwB󊕮H݊n-ܱӭ1dU=k|饮LvlY/0xP{"W.&~p Fie2?1GkmֺOm3NO, ͖R>5H'^r=Ә,{VO$%0uZ”st'&rg˼FH|4d64qtci' _>Ъ>*P^k$7vOZ=ih*k(iXb$ o.b^ ~މ@p`P=}`ح{]%WjzRX&|C>HvA "9-`#hx?cP.*VS8|>1|ȍ abd@f>֋p6']< <线qPq<3Dy !@7mWY1 <@́! 8;"yb ' P۷ czsyʿGyVofǢJsh0{vT5gMCv[R5Ev3~q7| .{350/fl?L A1)t#ND uC[1rO J?@-9Բj(b+ܘňNֳdKbd1 P-{>9;xi&җ\YgIW]j2l31x +[^I<pZ}|37sVFF8t\yrlő!~1yaz gpa`LdΌKBwPjD XO~D_DOffwߏէIk#8Q) E8gaY,!0 CBzn@;2 ?*ҌK4,zߑg&H&ӟ\JŽܛ廔Qʜfv)x)OGXjW$G"! /[+ŏ-\9m!> c=`8\SX2s]~@&]RK P>4nXÒ Ld"@"uVmmUpZ;w2BOA `@xȏNB9Eej鈁sq 8"ksU땗(^Q+ n?mdR8l{%/?qlω=z*=üDBSt=9mywneĊTz?]"Ոߥ=^]o TATo*sؗk[TU+8 ?>13RDw$L^eSW͘a`FtV$77v="wIecdxeZs-/p5zn-V$m@AֳdKB3a46,v/}{ys҆s NKcHW;Bݙ'd\Q)OQ[\ nPiLyi<3l߃$,CJ2((_5@!e$ϓ?A+IuPa6 1>9tN6 _mn Ыd.r<"Cer@[=at2YOL;@eGAa۹kwKJ7MpׯgKұfk|[ұ^YC|e hNuh>%%vԤ[7nt5yNP.] "b~h /_dFj5jS4CRUg?oٍ;l [}f-n r6\}pZ + `M%C?[9l,yfcrtޙ/;EbƠhFeN`#5]rLy`+JC4CHh9R(3c2W,FOτxmvG]?hi_3-`})jLa"! U! H3:7Z׍ @;1Ÿ2D]FgE2 '4xy|oް1P98T0!Y"31쮳GÛw۷Ovc*N̞&nM'Lt4m>Cjrv ;`7dC Q/dBWq#ubf\Sy 1Sx< 5izh"ƔZZZ7:(O;j׸";qYn )n_ft;# _̛ov74phW+UxO]j}R+N4!#&8D9g:}V;\޽Iw_-Ue.ޱYҍF T3`%.>G\%K,B!!ȁN?@_4:_v[=KuS\Z7XGOc, GHuYg)tBٞ-[ 3`ϸVy?Qu3.,R'Ou\=` i .8R"ia X9V9' ~P=53 Tp?C@7@! C%=`14Bx4sƐCF́U;:ք?!9M ZJ?1lfR'?5cZ9 Xt: @#%-p<`ɲo??P1= u5@v{du!ǐY:5ka HH@=WGMz09+A] H8MdcfR^#"f­F:~~u_ w^TJ_*7\oZظ} DO4!}kGe<\9Ŷeݺ%;8.K(06"_03N o+X޼#M4|1Ȟ=N V|((/3O3gY@[^15%qL;<9q1$;̚yJ싍j0^-.ߕs2?P~B9@j$E T|T߷oߠE拰ĘMqE 6¬ J@GnM،y_?&1$:3&Ly_ߨ{|6 77뱤z*g4`!!E@n$OA*W8ҫgNkXOb31lw/,>e!iGfH ! -NGBffq-x-h? ;rX,cLyԗhľ%:Qe=a&R͙3gĸ#ۺmOЙ_x4M\mAt`C /Ģv^k$H-\/R4[E2%gܯߥBmm@#@_뫞Z 9~qn}]gZzL}v*`L˗kW(_ h>9$:[AK&ՙ])ey{|פ3>IgQۙm+WnʕI3G9U4GFY>S6ﮯ/߯#&N0h BXO:mذZ˵fr\@/1:ޏ?/dk6_:COnk㦙k `x`YvHY  n BàŠW* 4ԸLƸ6Qx,E')P#%mEd l0ڻݾ}G[vC6xwG0㏛ͼZ˨ jJSW ϹnZvseo}0k`f HQqcFnxSݗvqGݎ;%\, sI зX۽{:=wNE*`67UcdFFDžЮ+e5 2#8ӟvIۻchh&l~c p8KLŷev=r(,T5]}u%s |^5 `镶^J2FHhq=3\ZVgNє`% s Ӓ 4͕NnC`Yk)/̇7&]yz ΦxQsL ߶=[I[m+ պ]Iyijq࡚c'MD;ޕ)_?+{Lr2] e*ĸ=/ć?_':On"@r󗍵r8EupS+r!A;`ݮE1B$ ߀u<;>g P׈t_^=0:aPXugf=ܴi9NZ^b-TH-[VXտyVE Lx@IDATGkddc9]rUfXD290ZyB`;Tw`ͫgh9ݚ4Q;b"c&w2gZ!\zi~G!ozA~^vޑGH3~j=מyC'!!0 ȵBZ/[Ƞ|si^bRT=VZ 2ie-4erXبdW,m$y?S0qRG uzv,VsKtw*8p eO*<)3_ܩp^,t'9s[o: ?<[SBNY֮] %ew-BjJᓵky|\/s|@>Γqcch% _[[<30i/[漢B T께~ n̸Z#qxKs$Dd2(}H3{dsHo}1]I5>BeܿPdw4Pk6YM]z=΀E)xE #'c={Iz%-iLz: ;kw G 6C"-Yr1wKﵶV= }{ޣ_:B#IOaV6BP6ok&HW&)=h4K@!@5"x&JxްFA[͸H[o|mҮO:<ۇ{8P}LОaKqɗ]_w+9f}-D=l O? IZ#[|l}oiK"^Pl^mm<x95\tQ0^'M?${d:a5Ȅa;)b?Ccޕ!YKb$?/+5Ӄ=s`e 3` *]vƄ=N<b1[\$ F1(UhUwiZ>OYfRqfNfNimsKDt}n@ J,xǻ%:(wqyyEA}$4ܣ x劕&ܪ()~C~\6B? s." iznw^{ML1?wx!,:KB9l W?_~A{cDsϋ/.WGecjf bfV )(?9>㩧r5Dcq .ݒ"G~msJu6(G%Rs"܉Ov9b<\ǮЌ7uQNAOnذA{Zѫpq;,4BfYgY-JY:$1 @5yנ-bJ 9L3x?Lx{XNh YV4YxW3^dzm^"=AT_ T~5FaбqI *M *e)SԲƩLK~i ?~%nL EhߎI:ʘu B#lշvHm@{Z*8HY 8qLWAUDQ$9-\D`Т--+E:ϕǟU0\ƌV8~rr4 @H佳ejy ӡdC=l\T ]sg1iND@H\f[Kʓ`{مrȁ] @9˖/7uzkp"#c"?~Ifp|!$6h!e5}B(D0hFW :Z`!To9W3zQ:(uBT's[nu`̀6ORBLQ[4m~pAtsNWuV[ZOuzIS gz+pH 7\^࣊PZmCB~UcOj1>kvޘ ;66#[_?Y`SNt7( èg!/` |8F7zgUhN|٭/]`2]->%ضTܯ#IiZX܎O.3D ER 2|=u1~<͑o<@3]"CH.D;x3w0\=lv-[ӵCpw㮽`q"ܔ+Mgw*Ah1-U+WwP%~ _*cnFXFͧ^'|MDU9v.ĉ x?H]O?g<0 YOa:^I{T8߼߀R>E3y&n$6MһWKZ'Fg|lJ0PŮ3[~c;Ғ>'}qNx&&x&a>KÀQ-f6-0bL;q>131R;P)^S%E*lHQO5{YEG }T d8kO94O[/vkB&zB5vi85kŮE„5/|Kr{_Nûlҷя~ԽCaHػqijOc4 B,C"sG矶|4mdf6pT&j1^~e&0 (!{%]55VZ%-͆{-koa=ގiz2,-vTw 8v~cT :): ^* )iFT6] T.9hhpǧzSZ)1[N{O/ Os4=Dx&G=(j!?jTD0S8]“$ 09?_|~gyk޽r&{˔і|\ oMO爠9{(rDXwɇFBI\ W 9L,4pj-$4Q {n (>]Z]?{@H8./g]T}a:ojbsd;X̴Df< ]iӠ[_`o~$ ? ߸+nwkr;? & ?6]iM9 -b|_PTX0eʔ\q|s K'M2a1e~C)>44Z8 ;+V^/W{0?g/So$v)a] M)hƹ|=\Cjp'-312YhFC^G3ϵS& uG?x-x_cSSy,DN,x,=O-qؕbLGQT*ρfctlۺ?o6s2j(ʈhѤ2!?@4 Q7 @_tμ&'0# =OvtIlW~{n@dR/͹y$dT7/+Ĺ M"9ٷ_ezֶS!m>BmJr>AZ YbXK:Y"AO&±-3JoW[֭skܿkOW6u8*qz|`6cI )<; !N< Ԁr5BH@Tz )`V%. hbe;s׮lV/%)>عsݤspvT88ScB)91͐m]/!0@l5kݲ}ݵ%.59nB#g#J pEY=(TKUeSgzxʌկ=o(&1 }Zc̖^M+WLÒ@@MRǟ̑ ʂuQQGc˵x=?Cc+Mzg*N]ǿحjB? pG{ۿC1\eB٬ͬ B,}'~͒K64?=Hީ):4_*]2-=gv^_r?~0ϋeFG[|Bepdgp \gvqurqv40Ɖ_̔p80WtD.W+aXq|"@+*.3Gˋ/,W/Yveqbj3iܠl}}6n8x嗚QlZ\$8~;6D[oJ<[D3 @FvVT`B% ^y/=Bn*\1@1?}ŰlcH`#K.Ot>&s#.&8 ;JG/x;05FqWu=V}+;G-R18l|D u'd@ axхi FH3:Zd^h98K Z9KT镐Fw&K߼@I-> y8[ ܭypf&`08CЇƅ'sFy{|v!ů/W8zƍn俺eZ?Zi5BVda>o~ß;A?*?4@HgY)/ھmG8C^v,j$peez洯X\rq=G384.3.0)44%ļ] "v:]1{g9TU\èSQUuێ yԭE3 $yʵxҷwӦ*"ƒy |饤 V(npS.YMOՌf 30$M1BO&Ju^11(WM !b#Wc~6__3GVo_kٰ!xɒ%sE` X :_xD@0#ˣN_"fzrGKq{pA F20^}eo*.-/g.n ?GCw*hn۶M橿PBe]߽g;:Ggǧ/=`]Ģ!^881i8вڭW^ZgK>|ont|,jqi&@^782ri%k1[y\|DHeu0P/;&![ر߸a~K6=3pbG~Hxs]\VU]9@WO⌆D#jEO<pیDN]2!'Ns| X1g tp1[Ĭx[vʕ+[rOq՘{n q< NX:ur$ezPS9*ƜM>7=$;(Hyb^{< )J!BrSn9p{wgfgs;A0(5ªo)ͥ-"^`,7]-yaנ&CJ믇ZCEZt1=`?x05vP`yIix85۶5R[jtajpPϛ/k&MCX7KM dӧ )m~U;O<5XӀ \V-+AXO3֯ې 0;ͷ(.j"0u RZ[" 3:ݝLtZt#I$ܤw &?s>PQpmHW0`#F▃E; sg9QzxK: w QHpx_ZLx zB @O"Z)!z?uJcroo>F[h=f9vs)]^׮fp)5PlRIi1=r sw$:\{ ?M^>) E>oҟ_Ǝ+o\0 >-p97sj L&m^\܃*n*!dغe[vttQw`4.}f"dUkT+6u5uިQ#t#xJiX"xw0j!oLH@1AZkv=xFXzn݀J1u90R=9_ 2%o==pp7X'NN ׷o_]-Y>9!5=~X9h@뱂m4hYcGh7F̣;sJ}pq٦Duf>0xYck5>k1m6r450>\SQ |w=^C25@ h0Fj`JBJAOD˰Ӧ˖wߓ~HZ-ݠBg>sr뭷*3\'.X@bcciT.:5ჁA\„>c-dҼe\( 9༃ դiٵs'ԋus˵^sg5jPN! 3J6& @ޓ~Y? Lǵ9J?RdsI?@DrkϬu™7\WrH=sx8CGOzD}=V>wߥ@ޖ<' 0H&"/_%|?2AUr/|=T+ % L"pSz]ɴl .p"}~.׭*k@4]̨#Z22}uƄɂP*nR3ke$zjG@8ES2,t&S\;w.}G[Ѱa#:/Q s z\sM tyseT?<?r(W HS!pNps30.ٔ^F/ES}$.A @||~ߜ(88YX' u2r^Ym0+A:bwY4!oN.Yc&`L1^Tؖ-~3&gQAH0+"^U2RhM9Q8}Fb?BҐ*WF@J0k@YQJ<>$-Z,|+̀{qfpׯD"/7_`M,tڃ[/YpQ!kW_-7x՗T{,(.HP1q->sgϾxAkjdXNnI*Ք4V}Nں^׺^g"1UͣpM O4ܣߋ'u9/\aR"ЧQo^^$IT7?.!L/P"H d XNK +W- AP6nښwN'aq*r@D=rPsWy\NЯˤ^U撦N9@8\ӲqT[L; mYq ܊oCoULKP } C Kv&aC1`_&͔s~TTπ,l(LZ=ZLa}!f16hߊyG7l5WA?}݊9,ǫ#,{}s^*65ϻ>/XȚ5xӍ PXTQّ\{k܅kpgJ@>qa'a!8ysLXrA kf(`G|ItSHbz0#֫S"־@r2ѓ ɇ ' +L۟-C˱+vgU˯'!%: 9i[QJui$u,|MLrCVIJ!Ka?{7ҕUGtrw› D3q@|/_^] "ML9b)K-h[U~&"g% n5x(m^ /" wԔ*$ߺE"|*+N\Q 7,۷/_΁UE5e1hYPm@**;'NLvZOk=2O^Apd,0CCZi@jTrRzM [61.gIoakҲ@Qq}p_f!!!HR/y&܌>;zN zr@y5ɠwpfoniOqrmM_ji8P^{ydl_~raQ@%-q3q/Hf͜Y{Ԑ)\y(& tG̘!Ε*g9Hs&.N+dJb?\N>>=zH{\fJˋ9̨@V`8ˆ֎#V^T^<);l*{>L 瓏-gHVsD8\ۀ@DXOK:,qv}oBvkkк([̓eB>@i|鹙 }v nԸ2C`tuZюsil=V?BЀ[GA_ϵ'UhT@E|ExٗB{<Ȟ;}˖- ~LKgyA$:Yݶu͛r-[_[Ci@1 H+N)ȣ>Mj##0(w5HAd0+SAxxG2G֮.G _vNJX5 Hᣚ T+3IEڪȈ-*]}nP`|S=0 98@'Aa7rnbOPh-Pp' 5;u4VeE@DvӛS$abސ( 2pVR>{y=j+yq i`+ (K/+ ***jj*aXF6Dfcy `\} \s&$]~ Hwb@ N%) !׺wi8BvTʧtsBѓ M`]VV@z v4g -=s0M@C,Ȝ˛|GłI1cdɈcwDկ/,r|XR_s sc刔j5(k%y9?N=?π75dVKD=Dɓ kp;X8wOHEG^x Λ/p"Hx]9\3 f Akr^̿uqͭ}:ȦMCw@NPof[6)Pl( A4\nݺL染NHT4N&Tj Zu5~Pֱ2 Y9S66"哻{YŰ ?P84TDj6}"^:M3kK%J`h@%ӹdAԗ˘M|(6£'%+}_|)'}a@R=RtO!AZ,Y6 &w!_])vt`j9/Zr1[쫗?D*h0* !nAksWWIw( Rr [px_ a .*Ý4]+9 `$￿0r+?'X]0j2Vlll&ڧƿ+W`"'n@Myؓif]MkqU Wwȴ pROD9|ZYS_5X]r(2P(>޿Owr382ӽ+>b\4 y ,/ꖧ*T\=+}[kr׳\Z[N疊?hp=2\E X׃U\gubbbkeX0D-Z$ JtɄpd+~t,i0ڱ[#Cb0%!({t7»#KwQ {>L2.*wZJGΊrgPW݈ն7 f{б.-T#pq*3b@ȣra$w^9~Zvڑp89ZZHTZ1- ŧyPKh|xhҤI`a&V7NzB u}N$d1WرcG6ڡpR} uWp>ڙi<*RSULFC57V׎Uap8#;sq2ܾʖd:HǶ^ ܼ@8hwK(83iHXݺ*ӵMȂ_!%ת7q^GAzjt9✞vAߗ'`N_~ /ȵ^{Q7;I|lzI]IoʮA`>7\}љ]A],1n6Ϭg}v×!xiJm,*KI  ܄>822ҁ| 7/lz")\98}++cs{$B~!-TaCU$q> f$2^8?N}?GRҤ>5͞L)r%Ŝ\@%?,Ƿb]0eA h5n.t0dcT!3)p·7< *>!"sо9s'7$&&F{9 .DF0S^t\0zZBhq@sݺ:K.{ի_uJRm@Ҿ$^\7vz'/hg8:(`~/Up`pIxBW_&^.  Bq`K&0AǶ1~ga=zJUbr%@:`$.[.y2er 1]A@IDATsW^)AФĕ:IN-ͷ={dŽm,΃q>ƿkײcRy qJ#-jϺ/wt `A8p  \o,J s^]+Yh JHɁ es2drpRI@_c >mwoE q9}U*O`z.;v 1VQ;w\! .|}0.|lI\ /61mڴ7oZZc J+omae.ԧ@Z z Ԗ|)s9Գ;w~lSC~a*ݯpؑjp\C5X@g~H=s8l~ek͛>V"C ^9d+pF9CC@H* =q%c #G/Y״n^# 1@MS@Vºϖ͡E8n{!(I @IRZNKKlɏ*L?^@GU?AzZFa2KuA7B+}k8 _|(511Km׍ML!WM9qAs j/XL ݥ M1Hb4va"4csd(`Z/BH,S^gkAUHePtLC O˄N-mtoClR!`'<}͛K׿GeN\4`ZǭǸt `q[ ](}#o8:}Ҡ^4>(`/>F&?QjBZ}}Nk ڲ>:u~.p#]i =f)0N9i=T\,  gd:aSEK` 5ު֏S!u;} &Tr5zuTA>UI>fVKWHrh:|JK/GN}8uZ.Lh|k(? (m/\ Hnݺ?/wy7T-͞=[>S9 [<^-e e 2=V{ cƍ{|I>\%Gɘ FLḥs̹gڵ=7\(WG}}}޺BoȺHBQAon2D˥]Z²LHӷp b,nR/]I^=L0Dm` deP sz;>D5[½pth?@>~"3߹G}Jn]:::=  J*wf?o[[]tYuyQFIӦ\J_[o7IB`B_{NKmnܸ2 ho׭> Wbxwu>@<1;5pCffӧ/T;?h Pk,9]G+ETwŊYqqqAv u`^6~2dn*ĆJYS?y e.ZH ~vCjb"WO?, 9]#n{E}o0? #AߧfGJfTP>S k3={BP_=g$#%iE \"7MMC)9&Ԅ*PJ0W}Vu„ KnFF].J:÷ ,o; *~ `Hs+\0L!TcG:>iwn !XYfPf flZ0({g͖ah?Y)lɒk\eU) rE#^OX x44VwPJK\aٲeq%ӧTFP<:R`i8tAZQLyWk],_\`Y[. 7pOq(CÔ_0_ESX8 HA0i,Ag~|㈘i>f4\ݼVsUR,35MnڌXEB`5$7Q-_!; \Wo?K׋+pa gTE&V;R 7<ЪW%@=6  \(8+O-+[vؖ-cJˑnuԩHtH罢~D?h;-,BP0]u\xuoֺϠpoav2mBUYe9@THM<$arxSPRPkpu,!;tl2Ev~VT?KsXŜ,>$oty`7 T:0ɹQQQH+Kf5ï  X]YY. @{C5zѢE3_{5 2/ (Y&`s3ñ~QzF鰕F[}^3z_e}L2y])-`p+FV`f6c$oܨ{g: b8|e6GNţbÇ5L!z=40)^ȺjL?PwÀdgF̴rpb_f'M(*_/VSGw s7 Q1o  Nw8-l2"'v-7tk G0ȦRa ,ВF:52 .׬A,PeoҰ(2n *km,2FG}t1c6oZ(y#(vQ !h pHhdɿfйXx]ǵq}Z;b]FDŽMWl`\Auq1@'`S/}bI?uJ#O(%g_M[`D.D1`^پ;z֛xgzcϧ,䅁!f< qg׾0G:vtp o-;2Ѐe"c@7f!F+0)  D̍JEoe/I2e jyy> g1w͝;Wy{Q ` TzOv;n+Kf[+ǯfq9}̺t /'N#-犸?s @!)Kh/ ~ȓ 5Sk\o;Lo]\}ӧ~b\Up?T563@ 34Q3H9̐qV p ={w s4e`-c>)|JB;|DCCZÆà6|׼zo|Y72ۥfN̿!x ]<VDi?"]50dCanqIZJV=z/9 \szH4h`LPl)1h^d @ŧF Պr 2wj]o-h_ףK-(Bɓ'{]`OrUM2C֯_y—1$^Zx2ݝVoZ*FyjpTp$d'm̀~2>i;q\a2ta0&_4H ##~MjpY?9/78ߤǷo3 */.05T|^t ,T-H!v[ "8wJWzM S.=t{fk(P(9DZٝ)+'N};>m۶rw˫*LLNN<)AJո8I?xQWur `|{֭Oх,ͬ2Yǭu]>KD쇃{7mڴ m TYxO .70KWhO\  =z˺k1] |aCΟ F+T*@'c >Z/=q@I,JNyS/2h*_2C[(U nǶnWݓ1>xXePZ1Z䇯pEJXD-*\XPDgZVeG!9x(#yGL3 Ljn=&7T+:`i_Ꚓr|HZZZTڵU?k ^j&]ou9o_ؖ!=MLL4 `p+++P͕H -8l2˦44զ @6A~#W!}_ZafDm ,N"XŋsL"۶A{̉9 f>hb~fqݣS_r̭4=NV,n|IcKbeAy P,~vKf͚wjuW6^1۠ZӋ֩~ h^RgQ.`u1͈2ŕ bq׭z<#% A3裏.@1(` RISB6lg̙bÒ|K3m1c}݆fz^3|ٽ{w.Rs ΥMwMÇ0oJI9Y!O N~qД[B1\a70C'$$~ +\0h2>('K}أ-kؿFOcC?})HWTDaa.ng Tr PxN1oO>ꝷ6蔱MBZK|+#̇Io%@=e}SB Otz] +mu{nbP/dl5w|x%nQ n<"jp9s9};&Ͱ\2d4_vmvbb"48ȧ?JÁmZ#̆K+z]/UfL)h,l#}mXd.1?TG/muA`'+%0}1@ש]$ISdا{eqoM)y%ɐTuK`BGY #3(|BwX0SpNiFTېV XC*-[%ן\m[ pm?pV|aسg@jɤhmAzrֺ>F|htG<#GsDT]l/&v.Lw}_i i xfzs뺯Y|euY}L&Ï )q??8ԈWv/̨{Znm2C1=kUN%vpjmiXSWQ"}%s ^RBL_ Z[Z\ !()C[ɡ+aDL4GA\@oa T4 =cT0{fRG7"(uឯBZb^>͕wR \]h㽯Dst rɗ+ޒ9|n]1}U_q^K%}} Z67޸A4ê XLA #s率Mpzzn_󺌮Syײ<}SO!` ̼ׄiO?wY |~}a@[]B<׀ÇKt*(',zS2OB{MK6ml}}[0_ _XӇ _~Q Zb)sZο;W&^ŢO8LdxiC(w9LcP7%iJPfo5JHaw2ּ#JKg74`I][ UEet1}KfJw-[֭y+ͭf.SֺukgZԩSzDQąFBqM} ۶m)( rz-ɵ>Vq2d$"2vݺuِE"~l@)@hZl  '} X2c hޤ5N&)@f0-c׿k5~1W9"2dϟ:,`e^~^Nԟ]/-,yuB!7i@hdb30?E$ܐ58Y CzQZ4MưL}W,-Ӣy܅>oi]i^ px9Qr @F/KW(p_XOs׆nlM4U7oѣޣx5Etש2|J`@2_K0ڃaXjjj4lgPAo}U?ZFk?5)'ig]bir UA3[(2`,P6܇-S51B'.D0;h m#}mX9`]E dI\ T:?_ {L2TB 9Zu-f01GEE1Ai`Ú5kfOL9@)<$ ` +/hԬ6 aow7˺;ƶ񇟏bibO_@cOBP}6Vk@ QvϘ!GV?nNNjj0liS:C50@zt_}-xC2RRJTnN `o*G\nN2K]92+I=-cAtX -,=%0 uBvX@Xԃ4&sq^Y_/V o31+Nj0_{ n==xSҔRi…\}jZiR@D/8.?SF׮]۴iqx]e.dyW_uYV"d;s=s= UC$=H[1,Q`ibzP[[/YW}i B 9qMfЀ)x pV8;FopedPD:G|1agc͚ * ]&[{OΜY`Ke "&o>xv޶]`ש}T3ȼT !C$ 5Qhխ(w*-$/Z4d@@`P$)@ ϛx$$%!7`7| _!)Bٳg8S-(h&b̯iR9)#H%@+'.hF!VCzo}^GH*(YժUs {i'FJje>$5} S1%%Uz0[2s[}\oy`o#rbgg CU mj$Q &B; *+F=ж0 ; (|`f1oKc,NT8'vOj*] XN ,jC\uȴdOtm2Ij X@"~c8 '!8 ?OTLfuPS)b(؁ap;A܁L'5$VmH6>Dj[.rP dKmBQsw}ݧғy^J%o#-x"o SOx~P YrLw^i~[uk=eTaVp-ߴB`#ѻwHc>{+>Jp`GO%'' 4Jʁ%`Ϲ>Zyc?jt2'k}K@&.rrj 蜈!ǷmLPV b~Ơm0 W> `Lq:>dVðx> WEv,?+'żV9Vc:B#(:~9P.n<9?~o=8 t$&tCPsx =Π8_`ky[-0:{NY P㟴H7mCVZ`qm YC}ׂ7h 8P;g<-npdaKʜ"Jރ,*I*-$&Gξ}(i - 2cwEM(w| -5:"d XlٲڪnjOBEvnݺ4Kg 喃[u_ey^uW?'?U&z-Wku%CM#3=y:A"f ղҢt4n4\f(@&H:;J,#۶CpTZ}cy kRn ?L!^69KD[[Q0`8}73қiT9sGT:q%Q&mnA"4 X֌nP' `s<1)D_̳r_ P}p)lW_}Jw22I ̯ɇ;9 B G駡 իW y"ݥ $B|G<޺oCg\ $9.]7ܱ_E{#d֑} >2uOMF?Ooݲ+mXz:RdQKiFKu)@+@] /-*6@,֩@"OAliR@3Ua u7y}O;ĵxbApZ@g@ 2% l%BS{oZ*6xM[+2:5ĝbi=ziyUR)P_3܀ksOVhڻf<*OEN=FB>tB@ UK(XbQl'Aj3r A)WA@a>sm譶u6mꀅ1 Bv1 B8'UiF?J@"ms`z*؟6uDց}^"A-i'4}6@٠Wh &6 dL0hɛ I\fͤNj3L8n)C&t®Om`hHׅ+\Hiy5b lăl`*p КN%0_=r%S#ɑ5kUaARcAo`~ccp-FgyF@dT(?C(e!)u'_͜-e 0p'DƳlV:ܹ*?d1 ׼je%JNHyo%\TrfƲAaqS׃>8&`0ws0ujVvJޘڏ~P+gӦM0!7p0hQD qrj!mެbPSKm oqqeTr `$Jw$fNNraB;y.YOzcse7OB`X ]D<9MԞ7DM'=x'w<(0WB7eVBQ~sC`V4M0A~i?~ @8ע?Pp  q MF/ILL yh Vߺy#}M~[w$LA@utYfӮ]eBboGƺ.ƍ;or׃ݖݲn,>溥 ԟ?@YIIIPH>@٧=0~6 5*I&.͆hZV1m A.yF Z{F0xŤzb}LuOOQ0hFbON']gּoP> Lnv<ڤ‚GEJԪU˓WepDtE>HTLd zr:sy¿VNB KjQ_]RǿnK`Nw)ɔ"P!dQ@[Qn@ˇ.Da\c6UmiPeB*{4o-*G1(0G2`tϞ.uB#U9s=239v~iqZ7*ͨ!ZI\\69=4**}`lw["5ȹ`~MJ>3[HKO?Ios VsS‵6]zy@eef`Fg("Ϝ93O>pqB3ihhƺuoLףGR"M4(n[!Dkib@E 0N`{c0Ў:8#ZLӦ` R h"`}{>%Rp+Z-/5&tؼys|q3p sXTl0f̘VUpR3gڼ 8+π`!@ -8?]FX 14ش2y]4dzBЊe4-[A͋ub/K |4ĉ;e|e۪OI믗Ԥ$ca SɷtI?qR#. ET Mo\8.Tpmd6l`G_beloo_+"?<#rs@@Zr` Z@wr<= [Hh&PqjvKa9n-YD㫁`HA )0?oj* (LK S|5?T71?ȋEc %>3-:/pI[˒lr=x/~ʼT*dnܸq_a5`ԄW:R+QӾ>l2l($>tm/ dY*6 ~}4BLȆR?66\zI:+S ~Νjz=۸>`((!fP\Wp5Uhġ.a]U_gtk @窫G ܓ`\scݞ)W*u9ۺeXSqrT7#%z L \Pq ?"_BkėalW3.5_ʌgdo߾=נPt'gZnotlxw 3.>lXX\,rr'* 1TC(ukוSOI|!uP? f_1H!K,ɀ o'$f?G;tl?a<;o(//>C۷t)%]@D4p p$08H@[ }13ozI.c `+MŠ@84 (~Q"<{"">iׅEq~,ŨUp0s bhg AN  =P=Cƃ춎3wb+"MO>,fiL"|U%hi1=5c / PAY9ERO,eAQ x7N@ #v4\~Ű m1K`lr|fcP H:t(FרQĉk!~5>!B*f da}{u]3\ߚ?6] @"/oe˲Ż  Zl߱ Ԟp> B fãK1u˗/&baC^ƚW?x@ρXf-9v2g}@׃>M'ѣiOm۶]6U>FCv?BdPLt>#9,x'SǶGm]W 9\7`$WlZ-HP,ءpJxRq*,fаI6)1/1 {kԷ$懾-p:yT9?;`6w,g4_/VXC{;\+;>D@󟊔v.]ȥpیVLBA̿dTXnƍhIA!̙#A%\v o H 4m;^רa|]真ף\0(>8kr0cwDA%j5ߠ `"f2sObw$3zt@+xx.`Jū:c,oeɃrstZS76߰>Ӈo?D]||TaxԀ/X908WCmUA߄UJd5p:4Wa?WQ}Z/Yqqq٨ |0L: +pØu8 .G#Gw6\CV/8pu-Si]Hn ZTb'sԁ2W0#)xaPD(@' Z5oT}JDd*8Zb lLϷSb-H0,ͯQr8|0Ar~ޟ!. ) DY {v7`jrj)S)!Ue'aOvv)|idZ+Ep@SF'^?ɔful~v=2?{jA9BW^ɸjt* 55M֯_۽fZg !@2Ь@+ C0Kb*㚛ko 8ϫտ34|@|><@JoG u)Y+`㦍@WLJ F_|LX2MȒ c\pp8QQÌ. D֑ǏzpsI&LG_kibŊL`I@hU8l R`qss8ÑrL⒓8}HoƆV4An~'jke[ w]%"&ZhOXR:aP$(`ᵒw=zz_o&Nò sn~{o0/O? UZCOZLqWK ڳo?y]ZEY.ZHgݙ&3/r7( o2fh2[7uvd*E#SR@CrJ|ēv^T)!@S_iڍ@FSW^fVΝ+ ,(F% `[jƊ;,,y`Uѫ?cc 7#T(p)G3 626BhI| jZ{HaA' D,yZBtNby`y`RRR}0n}gϞ}?#`r!PO #= pce :e8w,nUqr)?4 5rz.76#<|zLiR}6( W>/!b*ЌN׀Mi@IDAT} wMi]qԁ\-  3^+F4{ 'joivNN>5dJ'SߺU:}d K7)͛AsʬT/Bv[{0o>jҠo~$4% L~{T={圇(8z"ITR._3r)#6P(]2a.2TX? , O-Zlb^a*,P+);(QL!Cs6&<7 $]vyC o2F+5~5]]:^"ʶ^iEZǓF< 2,|ۧu^XhqAV̎(`1yxD,H8HŠ;1\0}9q@,!O)3?0&ŭ ,GCߢvUa99Y_8M4f:,U=-S(ddd؝u -T:'\L2Ȏ}QHj2BAJsȴN 0  I5bjJ3/ 1xf?{#rj>yNCƛs}dǧɺ^Bs]kbA$j.t4P#hkA$.ki:|Tomy@[3ݑ%Xr߮ fS(.l[ 8`WY#ۦMSsɁI'J6z6Z|\S\X1ߦ)SCδnZ)? GsaS{XJt¿(c1/^E=4_@HCöm[K6m5ؑAYFcDP.pwB*!g/&t˖-4tDǖrc aE `}8͎{9*cC~u;SYy0>ShBuuPbRbAkcà \pamTGUF#칳jRJc?F]re} wBae8HBSB[$;O|GnЭZV 'dhUqc-p/1@_mR)Ak$~5b@8`6`(`̏~A-Hǰ5ϫ$ω>re"}>d0iyUJ4i\,04D$l(CoR*,'Ryt{!.t3I$Cu;u}+Zf:Xԁ >+M3K*>1?T=!UAF|߾}GAZ\%`30mVZ22#+WY-{?S}`ϼ'$ R 7H_Zsɒwuq  >V0MI{׷@Q|?vmu E@dpI*n9P"]`y@.ˇa px>cȐ!!tա[\~U ](q+⇳c]#/\i#}Df@p7%gy/;?"ֿ6$(D x3nw@bccs~&u9WN׭[J<>ri_~J[ILV:o;?:M]?uԕ0sɆV?&]PO֮lON }$x%p[S{*}zK1c..G &}0`(w iޤ{i©t uzFD"adP+ЕOHՇLPx8A2@ !\Fx_~%ǟKXXT$,Zv[K"ýwDZ?ZRnyX(P rvr]@aO4IF̈]^ӧ4m7įYtbf2* Af qd:F?V7u\2nG'1"auʩ0+۷mwYFE1?M1p cu=!vq/2 w~J㮿_~KL+<`x"XCĩ@ :A߁Pd!;bP5jk֬ `o̬-3ѓt7o^C:"@C$N)P,uP(MFI1@4?,Y$դjg4/HEQ_Z@תU+tٜ)A8 %3pF3?FU_hq7=fK!rNd)cQW] ~;cPPr)ػwaWEU(p_{#Ӓ0w ȌܹSfP?]B5vSP 8׆xC9%~xJnaiI(C<߽4_+>^@o9Z( BѰ*o >Γd$$B[ dy~Nw,BjLiO̕ nL%"]yr)U2h> ퟳۜ&UApx y5f\, GSPZ=f֕0 Fs5KH8KmwjLю[ P ,p t'eW툲4PI01p@,4>N l۶waС[`d5heh6T23iҤoKaV/-UP>o =C{/.=/0. Bj:2\h˺G٣Oڟ(IdӟUTTX|  ㏭K#5P8ZHUig裏n/ &61p!dM,jk)O-QBЯoݿwB~@#DOIo*/%Qtx!œҗ^r+d˻ߩd{ u>r﫴9bY}B}ax?6d/S}.Ç>vc0`x 2d;)hߌZZZW0Dk;aJ߹d Ab޽F!5vbD79>fޜ lwde2``B ]Σ)".skA_.u]` ɦM% +`ap"KW$v/yUG "B#CpZR!J:ďuޭ ;e~y>BS^˥2_2~UioneZ?/,~= ׹mNX(dx2_Efu1]K4a$joh0Zs$O#0 CK}G>|Y1Meĉ=e^}mc0m{t^}̎"z3Ϻ-&]`e|߃t}O<16ysB+~ܦV İ,zY7[ e:E&U<~.6$Ǽ~i7e[vpwy__Vai>eጳB'EDa _](fRo!Ӆ29¬Pd"{Ҿ!`vKu(jY=Kjǀe@SYYY&Z-H]_9DjXI1a1C 8e˪cTk*a'Fݿl:h?_j"a< t<C?R qHa9' ( U6xWmo]]i U$Zë%B}0:kW o` 8]xp0>uo&MUeM Z߽ȴ`FFt&9{lab ~e0mQqrujK³A r_&debVWy3YP;W\q}_ E^ >q>Trg{[3)j9A'AcvkNvvc"k5L߻f&q[G}7m'W4 CnB qp L Œ[o__?b4,l0Q>&OزJ]Eo?K/ 9A"~ph6x>AvnG~p; |7 B.Jb (۩ab-JHIV1ē5 <Ёx۟$ttNjѩԼFaD;kē1Tޠ>' E"S70 MmZc!")$p;SNq8ujOkݱbUX1!'{<i y*BAN4QcpClmrŀ 3 z=8\_#؍x灃d@=:-{sP]bn<ҕX0`Ict42\%MG^-OcXfFa*yQ&v.[ZW~Y?Z8vc?7Je@]4rѽѼמ%,|NC@`yѢn <(MB· t uyh},ާU7HȭmP( "3MDtHp $RmۙBTZBg OG0w>',`s1hAr++U1&TG _<4wiVכ',3kUL~UV8/Y`Vk 2fL^ޯVJez k1{(Bvjfs̴Κޖ̧v <[/0TQ^;0;oX̥`9+YRq%@981QҗMiG_rIh٫x]eekZ'|4}oc'/+TN9.|?˻MEBt0ƃyA6Q' NBϛ{]YC3 Ѩ_"ƱC;@ؽ* ъo&L:}0lk?wpxU㄁yI0SϹyٵuㅏmkAkn'u^' _/)/v/%`a Xf?d;|᱀Z~M@!ZˢK$8k;r=YpYY5p^v(wA0o R}?'Ǫbf;ėWPd暅oS9[olb1cLyǻoj<.‘p5lϟq_GuTw1c@8G~xL׾FӘF)I`Z'pTW>նmR +lj?^cL8E B97~9nwHi]:+fB h0A#ny>u=`V B5lUa3"v0ՄKIwh/5 qnɖx0JiIm*H 7n;rGQO.l\]]C^| 4̿C+Qjж?vp2]q嗻EpFb`.R;V?{4Z17!%Z(5Gd3`pqI=$pmL>!>#VةcB63%4~#97eL4JwK$=& [4 ['YmάނCAYx0G!L(Ю آ,4n/ݲYAáҸ\a5R]ot]+k:G.:th'I˘?L?ۦ3_'?')+km(1:+U(Bq-V-eK xۄjyźP 3G s ˧MsmiI]Ty oE9#󠿛m2rlM6~OOvhhvٶs3S+6C\Kٌ%3F͟tm$m hOgEd:x6}nt^+gm뿢 :U-x)hԭ'j' 9-sbR֜mO02!42*&J $y[xRb<@K }V'|d)e:f]rz8+YG*8 7 7lfdfڵx=6|NDY<㿿[y>34ps5nߤ1.9إ0J& kb`Ziָ/>m{ ` G}D?*S[q6mϴ$ɧd=voiaA}@Qy/?|}sʆrGACQۥC g[6Wc:ihĘ@ p[ ?y(t'tVRS=vRkMa٪$[IƮ1u2 ~,]!. \5awM 08=N^ <^8R\`$n/. TqVY7`; F@@&وrܩp[KO Nͬ7ZuלmyC0,J=jf ZîƕKWmN4DP\39Cn'!=7bu9w=W;p-U'Xu^n, 8Ss1|gO 6^~bT|V%j/ RDw p7m8 .&rIP4Lr&8BU++**:=6H> ^0ltv2!oo3wgJXd˹-IIaBDlP8Expp0&I.YܴԴ16=U=ƋyZ R犨g`g{y 3iyEgo\4R׼駻nbjSWV҄W zʽ?o0[ĩ֎C;ds "UuR+#݉O10u>0HOX&f TP?_x0@ 5'KKo>j˝jd#X ۺmg)DBh:ׯ#k֬v gL B}doksoa^(`״Z?^umpp9|aSdnQYKX|42dp$اױHe)PzrmjES8p@.2[@4 7}oR "(m/ʜMxE%VE].8DVp1\W*O,Z^ ABzy*ۄ #H$9837dN J Y .9ʈfv) if *x/E9`u4^~0bz( 2r4Im 1/ XNkXAqk7:S s0Յ.{?K&>rVΈn w Q̸X9ƸRgl6.|'n<"6Z?xYTo1P-A"a vXu}n4\ee9cs-B|ũkxkLP6sV})o% */4.9jyTj7kJ?{"" 꼥y]9( yphɍγ8mme4HBW Zk:vȻXXX<zZ >B1#ι~.HoׂK#8aCC=B>7Gze/X<(Bnkup1~W:u["{0@UJTʄs$G\VM1?,ߣ=N aVZ }ox@8oϜA1zO&:0 y 4 9lr-kSfOv1fZpy ^Wj&v//9 ?QpHT`Pdჩ!}jbD48X $D%O>) Їq? .ߑ\Eha9g?<[G >OT<3 |S$XLP>*z>K΅W:_^"D`?aMI+y׭V? fFf4F  l_vE Z3yޒ < 3a1\Τys/:08\ʫƴ1r]FuYg-#(0"nF3D3jW_}';SFp@94j׸#OԆ6&|S?y!EMRxbXa}b ,[̭Z+JKc.YCEsKt6-عvUwXN8QOMVmfXBqԅ]{_l{n폱/b,) 2voDRߐJJh O-)e5MkPn_K|@)m5WN)5VLW}doS{l ?qsGuA}v]i\*q^^$d>D]3"~8<]J bg 3.@4>iŴA6={M.&uU>.7 Iet"'c{5:({XSc/25'bα]Iev̙ݛo-r};aKµv2by; 2]B.Ϝ?0"gD3BA`Ŋ?W:gZ]}8c 7zމ 1 f5\ƒ/HlE@5UG:5 tbب(ma W Q0+Faa MqIyJVjt1g<7F{Z6 ϐa($dBՖ[$U"x_OJ 0z Hpnl&XOCQ/κUڶwwx'qPW8O#įcvM>TDҧ|fa;F ?=J.wwp^지>yl;1 ԵymǨ#X8`RgNbppa0|tD/梣7j)V}1,c ?N0u;_6Xv\_ֈAX/Am-d:_j+w.}tIm ?3:̙R[ԏ3!5@Nל;O-B vVE;SL?D8ي~G-j/HyaG ' /͓`9._RgK ׵۾([ĪM@|:j!KduڴiԎnTjÛǝ%^-= ?v^<^ i$+`8[NԆh01FSE 1[XâEZZ&JVwdצ1b?`Du 7+.3 ?3Hz>}7[4Q;T:D!zq3`ɹ?▽xǻv"ZȔՆqΪq5 =njI[@>Tq9۵MH3+&z9ܬ#÷\z:$q`䴵B^3B|Ѯ5_Zz;ض;cM"?)q m<ж kz`n>*?:{< nYGG !Q¤4v[~ @^ST,LÂ3脇M6vIgY aB9-Zzwwty@lf]j/fA #K/qϳcf7{η~':Jڽɮ{5R9~;qϚUݺV+'w%bpyY=6]mV~wWsiUdAr}-^ɜ/k7b!=r(tQ8XbS_<ӧ%?%& bIRi]z$G &Vj7U+W=}pcwU&CV9;v˶#G>yJc1Ѵyp]ֺeW5>Gc27"W6-orx1D)'pX0GvRQT> tQ Qy+)f^j@DԨ}͟4ѿ{[ͷ\G.#.CGcY.=̀21p_h ͫW寽!YlBGǶ3zU% ܸ|{iR%7F&&L0}<ߋ-اyu7n,d}:7{g^{5Sǫ… ÔP󵚋(`(0oԖ-?Ľ%͐ C~['XH0VecT%ØWhD&dhpy2}Z-`wN ,X+>p~xޗg#8>}5Oc|'ƄYy>-,@N)E@/˵hpGi\|c+I'F`$i|҅_.=?xe @D0V8 &Q6(nFB$FJRw MxH[Ё'ϳ7`2 D8A8JSs?VWg^=\1YmD`jɪGE(@NkN;-2-Nw_ԓ&% :K1۴JYۅm^\[κ^f[=\ +pTޥI\iu=Gyĭw.aN4ɱJ?e+,YbY!]2Fme`.G03f$Bpo_wwu{饗jC `n42.F r 0",F-ҷ~J+wK;Ѓ_-גWŅ4E?TR`rOdRf_+L}|mGZTy4=DjS@iID﫱,4agGDMM|TftSu\d LWVo㕄2ѼS8{c2څ7ǻ5ژ1lYy?qFS}Upx/E;ൢ0ϟWfcxG7C9('T#ڡIp*jjH4x2Oo7NkALM1Xw5q=R^B[KOZzN3A, u4P-0@ @-W<%4}yFL3L7! !Ɨ/x)W mXyrϵSfSq5T hD{ <1㈯EsWYeâjW:1W;m`زխݶWO7K_R\`竱&hu~㖼BREɧD+.7sLmZOZWY, ~}!3`dž\+/2ȏảm>?߫:] a]b K^=i@mCpT;؎:Bo2?СnN08U䘮1NcS%X.~K82!/6lT^+i}?G%a@֗oג5+v4߭w̪(\'|*1fvSU rE}Ҍ x"h }A*i,RG*@Ԃ1`@u{R|0P;: 0\+ou_w2}{/'rq-?aW.`˭n쭇\vuXZD0Ee ٌQ0s/|I׼mI2a:DC훕}Po{3h7km$)4.b#ޡt~nf;̶#EϞMf[As Ǐo3>-7kjo,p6ں; D?U{7V19xMHFbxޛБ78б}S&(L9ZB@> ~6>?!+X_3UDf_w 7nZ<֮]`|CjWG{ѰjE..5ݥHI#t^{/[<0Fa ohxS#4!ʺi8oʜh8M*#d̀ #՗1DZKo!o_$1}6CWaՇ)iZ <%~v{g-U$Ԓz@bFdu㟈Tx{-2&[ɻ)@Vh8+;m(P9`ШZ,PSB4N lwuיsV~6lXxl2 =L0~yr/ģ7y-7XUG91zll&ש9+!I"ؠ63K[7>(w Ɣ6*$Q;ķ)vC^]s5IUs>qڇs4q8,sL~1R-[6P |.sm&ΰR0aNop^AMds8B>/ $`Lo4>k*L"s: g  n*^*_އ~M6Av<+geI-|YsfCޫ[uꚩPsy^ 0N@TKUPiN:hUB71,&X)m5~&=n(dmi2QtY*oN}r%so„ Z&8 A/ܮ"8ӦMsegg?HF* ^>;x*Y L9nf  !@i+ !&q)~Bǩ f$qeAj40XN4.ѵs-dML0S/t n#_844 ub0 Pdn@J3bX?84{ߎ!>XlU@h=. i*@l%H & 8 &-F*Sw^-~>k&1 Ztۃò^t"ݜQ =U!Bz!SkctW-:@_m_rGc-E(C3 `٘b[~l? w?`\mc&M EKSF\>V[ejʺfڊpgz+>3ḦvM>n\sd9v̳g\P~'-;ӌ@."k(lw[2"o'_յpQWyӍ{ꩧܯk0τTkS$T2ZeW h(ڌ{,ǔs=-z:?[8I8BF-]!V@S_A,V}v{1觿i40DG>M[k2wSd%!y _ t`\xL^nUd^?HEd϶JZ`' GNiGGqyaG ;I T폡i]qDqm&"&U?ȅ>)N>( F(ePK\[!zGk0y'?A`5,{|t7snJuY7| `R17GA`9uv;E'&4{;@rK/ڃpw(ӵwD< ] &?05H0Qz啮Ԡm{& b1ݘn#hL?R}gyo^xL5pzh`WTTI:&ϼgcNh%G$[u9馛ܔ)Sj$DZHi_|UB-~wwUK kn E;F!hB=/…B4.wDc"k%Y`ԀlDN=zu=ny:imswI)hfTLj`V9ۡ%Y{s\{ <__E\n`{OIek&ZR&aYQ̔\{.{~17i_O i"m\-}e~&' Dq{L*]*;s3f*#ƬSŅSN2E0N>_TANqyg +_EMLn|$nߘSǢ*!IPp oRﯼ9D{Ńeu:GOsoc][7Slԟ_B_,7Z'= `KC -zΛ4k / a5] "L.!1=ACq$J4Q7wP&I_7&Ί HV ~“c a @sϫ&-=vNn婉kh#p{bgB C;Zi_9R *f=͟Dݰ亏⧢mvh'ϘfB ,z9RkD sb͵ӏ[(i`pJL[~.eK@%ĉf"|#V QpF:+zG}42  0DYOjZd Q/skJ}FO.YG:;o9!G^N57xƓ`tY<Vye?c1"$R tM)4$ 5wi F T[W?Ҹ'!rZ\pnmˇ5i d ȵ 1(Jٛ3iL:03R]JX@T!2R-^_$%فB忭o CR}fK]6*S5Wq)n嗹NPhަY@6k0w})M-v˿;bUc2 T{>*|؎ ء.|I'˻TvN$i0s}n{qK)O7pa< ߛd}횂!(wJVVV,< bSűd9o?1(Ghᇻ>0phxHN]|y*ɻFǓ) gSsF!m DKk.ogH|<5a<'ӧhL9Y4@@ߤ}[  V@DC^yACtAu N) F=hL:84@ߠkyAt`ud'ciEir|TʻDFs`R0ysh\hb|k2"Gu;$t%lFee 8Ӓ-svgJ$z&YVzF/8-NTpsofs"J4XnO4~V{$ 'bgȾI 4ca KԤE/j_oPC0BhОOE-?4\L!}(UJ \ \Direޭ+J0ΟýݿCH.cQ/)tHke=)vfN<M^>>JkX=_HZˬ]QQjX1AU1(+H[WkpM&RiXAsЍ(!K` fIRG>7Kg˵/50pYB}:;d̤6r hbt.'oW RMրZ2O;s K[ܠUٙcVxk'o~ TO.sv^Ȥk30alX^F+j \>[! ,`FLdni/}l+sVϕZa pF]|GxM圩yni=&?8`}jBTR(ԔERV4so;d>X۵OtLՔ&QF짭-l(@7=Uy+giYBd_y4mJ.E@PCP~bְl0ra@2GJ!tjAɮl d}>cVk îp`j:p}ƷvxLwqD[@#o*0|~vntl!.tk511lq;Je[ yXqur.xR:0>*I7ƭC)3|-o*.}b_ܪw5L몮ck=&&D}5YAv]F1b?:@Z3GhBa@>M3u𢜵x&xgIStB}pu||lѷ|jBf R?yӄQ1tj:bcƌ2F.':Gsf`,+ >Lhq{裉Di0hMqZMr >=ҞxGQ,粔m?oa.c#!_lH^PXu@FMGـ^d=Bu?!  r!%mcQV3-6mK V+=*CEMUpnu..Ze鯋~/S:0dqbp×s>.Hd~RYY˦ (ܷȆ.r7=tt,#iODTVXaa~+_1v9Z{Mνfrbk쑮RXk gT-Њ fX);Ll&1D_e |+<36El>1En(ӨJۂ pD];k~ ,@G6LCWM*N~<+zezN 8\8Q8NO'cdş焘7#+_0m oi>{m:As2$H_(FaЅgy_X!]4g 5AB({7( -wAmA 3_GCdQFGÌ3#\"[q6l]cájEG5k'O_N]xi\[yΈx7\=_@ "Ĥ|.8hxqRE7>a4@Wi`4@4vK^V@6= Ã޽{$UjmpP"GO%.ށչ&&@ ܵ39r ko9Ћb1-@uC9$̿/@qyȑ:Bi$?}U\+/8 2NΨJ%MfGY^srfZpC s?/7C }mϗIۿ)7.*lk hV`ܚj3;@j?‘̂Bf8bܽF~€y$&. \Rek .J 2*8TB wQ T[ļ/BsLj$TSi76me`&\~#߶ؒ;s16[R%:w} җ\S,D[*mEA@.!-5scFv}n{qlbdp.ZkڥK;-`Dnoʪ\ }V`hW ^w2دT 4dž`C iA-.o` l h$[Pb[4їu@ O\۳cdB4iQ3ôt~G’d#d.4؆L/z9nNDq6Rpz9)ΦJ53,mi>[*`  ~gS, ̿4|vb҆]5:MNh] Z !gRWyvP5LJU~슱0 G{F3@ƜdD|J2_hGI~<>m\]ylw[j3h bTOܦZZh p<߇RͦA3q;EU7ߐ) [M,Ku\Z >x|OPU+:D"K89^w"4l }WÄ0}b$m+B!UPN|8M93gXqj+H}꺶-JwRnL0!GD6"Kr|m2cZA].ӸO=O~Irgt̜J;KxVy3x^@4`P轉71-`w`g_qmØh:vh$1P)-T{\4J ;Bp5"JhS|TxMAo^!$KInsBMk Ot<>7O^D7eg?L7+\JW&FV; D6UҤ˞6bKrTgwݗkB®㛮lmYF?@O{jK0d C+|p$w@|M8h}a:̱S͖޸sN{WUz{ɓ'ܨ\<"XnW>˘3VlL8-vZj,m\:aD4[] {e| @/1cjaրpEYdGhg;J6b&KDiԺ+3/?.`6$StbNu踖` )LV|ܱjILKݖ{ x9y4h`\#Fp}qۨWwxTJ)[tvw욎꯻5_ T/=CGq^GuplϛrP唉Fk 0 @7d?Jk B8JS7$D/ ̌?f=vs$ vv7>4@8DB>} vrdϷ(ZX&3aIS]5ֽݏI_`/gml香WOniZ4aqk#y?: -,L@:֍ÂԀG1>ƥE2]JW_ǒt\ 8O J-Yz+d~cE^pa!s?Yx3s,+^ZV|MCSL: y L%Dl`$d֧$(0|š icm`ٕW 27ux-~[[ ﶨ}Ge|xgx%x;x4VJ-vPהVjzPE_ИSU-&Asד~bV0դX9s<󯵌X G]G+T9Fk!?k;Znbh0 kXTe}]՛s Nr @C]+(*͞B]<]|85_G8=\]9+JN?a C1(W33 cax&猭{؟ fa@C/hY;M{wQm 7FۜtXLѮa[{.dZ43F —;a`O;mOg^ C>뜲M755t3;k7hvj 3( w&j‡:;_q;}˼7 m`{5N7;o:v l7E6WC1@*P>]^$=]/~=%f|9r;#2Pz}v'9> $(&ȱvQLUVM@%_ڿW_}u<41Ar.b\h0P0Z7&IF"d\_Bvwxۀ %| !D#|yﴃp({?&Yҏ+W;s|(Y7= q(Ou,o34;f.pfϘm~xxb0X b_1HY61wS} j)Q l&䮋, nT `FH欄io`$,6lō,lha*LJapd1ds iLpå]ϡ T_+8lfyuwѢլ v;<\7),(jHj f7Bh:ֈEeC?0?wD"PM@tnHg>a*`nGG:B|h|4t!GOЙtT8v;bzꩧ<>[%.y2B)sf%51K̥.1j E 'OaҀ6wMnz4O -e-`KlxZh o5 Dk|-;6hoL 4{bt9z4{YQtvmӃJʁ?BƊ`[N_{iX^Q"lcFi=K'YbY\>=IDO-qX cq\n1so;šuh1T.0 |Ï\l̺ )P)ƵY,QW *Rӧ٭C<_;Zx=APK~y{;ĖWVr޹~j$;O>޸v7]bs9^' g!+E[3g1~y"}ܹQFct&R7 so5.i1lsw=S"4ެ[JBB@\L!²Ͼ)nʯ7!$aw"#D>;YJwxQnc[!#]jܴB$taFhf oivsd  qu,um|ڶOb 4D0 &MKiTV7:`W؞)3ŋvf/T qza|~a4;qc&Ӎ-CѹE BiaK!_>NlaTz]v DޜE pq/m!2@D?=*HpH> .>KMM~w _5R:!%`tc|d{-nv5r97b>YM` B6̋ V`2 e!Wt&470ڱ|Wɤw@pV^C#%YC΂zw ~IQ;sEPxp7dP`U(ៅS1B(X"ۭ[ GO :4eOM,`esF@{"]]|_PU[DGf I^I:ܬ*11sngsg&( O' :_5g6kKgUNZ~pW.^$"uGm$}κ^8W>vM7/ SLIB4:(n=n[D[k#=.rYniWۚ`I5iw޼67wBj:J؁ju"CȗFir%~@њcFs i2p,WL?@8`F%O) qBƢ[8Gӄ1@s$X!;ƺ/˳@L V0ܶv_񃵨'hYF%)K;4"ffZФNb ~,,? W\hXTϩsԮx?: L_/." @X#Ma_l#<^14B cs*ELJW , >`]7[پ!(ICeZ ۱+oe}[H믿/v}5K3K&{}r#]Y͏E{5(XjW%Fn"msJHIY_lE%GEW1lDBL6"E7( $m.cdc=& lV]:"qnl9N)-JЭN^ lq]z$au-SW !(w"Ѐ(BD!4^V92,F w"Oh]zP@pV&ʘ2g!~tJ1+F1axôrIr@PNm`q~'=ʪF/Nj'M40 aX'nш͋pMr-ݷ-ĉH/Մ3g'ot{_U>{f b5PX:oͭ/&jy&TuןrW9w)x1TFWK1B'I,4iso192~]a0(kz;v{q3[*DY-25T )Vw]3(I%>@  =3d\lY=*dp1B5,nX9"-`Z }UA}3'SbM_c 6iqxw{憙= cv84pg1+1xg1z(:Hl OurhT^Oqk?W54NNb;,9-OLְ= [۽$, 88L5(`{.5O10 ?w1RץH !ZLU Z ͆yE-ʨm+y3'8Qk;r ڱYL&re].N^E,~򓟸ѣGo_#BϹwUцJL7b͔~g05ԶQ8Jzs?k>>=oz"bK/T=!\nlmYŧL8.ÔAOJ"`oǘH-$.?J޶ F~?VVbֻߋq: ! 4ܪZf %/as9-όai:$h`TRӴM"hgfo毡Ȏ.jF7YuOxNIinڭ,q|iaC7xp30{.pqLch rr -JR+ZYS֤)v ? e:8ngl)njjb,iRdf '(r{dB5Cx[yen3Nf'w_#Y4\mzM7/[5>K.]^oX5/5mŘ&vt<3a0&QQ,gQ n?3yOI\NT= zk fd]ʼPWIui_=2 /M ΌhT|]դh?\8Bx:߯,j9aP Bmo;`Gs_ʹl&f4 Û[00~&Lmf[1 X$|?}) ;o)G<ŒׁQv.+ CbPMK ?>@˗]敕ҏs՟0K)XȢt ¸$.&KlX0n=w9ý. pN| ˵6G?roH9>_C3WրF #=򾎲k\w2yɹТ箼UO:dA# DG*cIH002Nw*"){)r}VcJ]' ĺWGH$js Qր#¿$&;1 aB3NF.r-2Yۡ:r{qV\ar./5|f?Y̶b0> sa_/gGC %@ߘɌ}tdN)g q-~fɅn73W?o~fffvb{ '?eY 1TOi%<#)WlH2 e ^5rb u&2FW6#Eaw=1hm}/} KLtn?ɧf=݈ڕn/H&\?J?xùj˸BSSG2"AsQ˝~&16$x5Qg]tk4:Q_ƍs/K2bvF~rPa7a_1[} ¿ _Nr@̟!+B@ґ́2xX8)ȽOm^Mm,M-vlq fo#Zۻ/fP/iF;<:4%'7Ç u3}:I77|+kyK08~+]"SG6KLB` A%8Ay!D,"|-yfmmm}S 0kV};m K$c=L,vg3qLcI- N]sazu<78!P4$%JakJ@oJ3- jv Y3 OfiXii Ù{e$T6Xe070(P/~e1ӽdNW QL( Q¶hu!MIXJ"Ӟѣ&M1!Z[/5O1_xR7~x!-5BJv~M6?}9uMX!ԀwCv?kof=25WY* #Fzc{@ŏ`}qXå կ~M _iNsO7mKvQGg+k8= ?{E$SƖ#UL\j=6 4a<l%=' J_&`}BtػK\ƝU:GfZJlfTڤgiŘZY:ݺU NkeX__kWK3hi L`v!3(WhaqbXȦtu: 0ش0/I ,L9&f CLv@-2SՠgG?XNZmI}׋ӣ< f̻iX ӧ$ H aPSO=n&Ġ[ϗ8 .tu[Kځs6V " X68׿v<>hz5y$ Pc.'.}]wYb.;+G* c,EWk|Az"%A5W/t)Ve? U8RX}B4``1Nx&a(&G# vיU ߞ?+[*c.a6hְ2 ")M^9tK[aOC+41&Y9 7K6$BZ|>AP%ŏTZ,`3k;!Nh&B>aBv ϱ_ZC薖Ff1m07+aqݞcAgU0!]mfJ6!s:,"K9ΑO2/(?o> s,gmb}!o_yB0 ,{Vs3u a /:JqYC?@+j?pM5Z 9v$o3碪3.r?q 10b],¹bnLi-b$]/)?8{VǓ^!+L#;- i7 -l= w}\9uҌ8=VF놸[=~pYx=~Ib0 4f":K+( ^ @?uZR]Ӂ+Ytndona'\KGlotv$-n3rLap33W?dzg3} .c & F2i;CX?އ3(b[Ksu$; A=An"yH0~xs=ॗ^4( roz|mמٱw*&F;0YBU$AE0Px {d}/?\&KOS/$R k͂Uҷ2Bmg1thC?vߕǥ,rIbmT$ܽM jCY~ |B0>. R`6*;/ oN}twv[|henYLX7C̱y{f,u|*5Ϭr[kl^m'HVW#29!4l_x' QOc6>l؞O:* h4N7 BŦ=[f cf2@ ɠ0?g`ժD7#ܖVu)&,[q\o]z& ؘ9sC?"6gbK\?\>/zX[N?=1DzR^ɋ绁|bCJZ Y͞?Lz5S,/ 1@-YRӦL!0P\,\!:&-kҘpvӭC5iʄKH(p믻4piDCOxB!fmR W0VvB Ū1R*_:HRsf"C鰖Ck43̴°fqp<14Lk; <,0{Xr_VxnLƳ Z?- 5~۟LK ^tm|Du5CVI2h۬TN?r&>M:̙ B@ǒrj7a98ZXPw{ K-mg#͚a5-i&c7K76-ϱ3ό0Aú|*i&$yp }۵0l0`^ u37lޞ>l]$L1j|F">=2 m C?Ja}@a@U % }~"Ĉ;܇cGsfmqTpg oXoɺ"L3tǞ - jjaa P]5i4 :,0XlxR#GAW4;+Ӆi䳓- ofZ\L77 ,[hbOC#d̴tc%[za^ؕǪf֊\bUB#6G aPs-WU 0ؕd$;WrY;nM=D:W^yŧ&+`&qYַƏnDaՄ^{͍QG[֨LEjv8L?F&eaC#<ŴE s8 ?2wT; , &8_K瀰1W{ow8TKOZ}z3?ѦU8“<7mk? !d?!> !Z7sxX >̝}~N]l?oL!&0̱ ;ia7$-3\nq<+gҨIԇI3T1*}ݕΧ=k0*SjЁs4|':A ;Tǔ[Aa: {ݲ̝' vc88lgKҴ4,=2K1)LuY\uZ;",apjk`}$j֖6 Bt@ӵskb!~sȋ|Tȕ0CGw(GƸ9cqu|~rkrEDW~Í鯺L!Zhgx.+ya>\V@^(ӿ~Ĭ8 w}/hqk4ٻ XU1W+3bx_-ж5{D]aK 6td,=d`g)Q 1#`ȸIxCJ̟̕g! u~O[zi:aߊF3jfJѲaJʅiv+b7Wx-$l#C߄纵6t4YfwB/;_ PnǍ$Xp5HV?n g6vs8L0tl4qXݷLʃôIoZ:OJ=0 ߖ骂VI[?wY SE>î/}7N$UG)MZnMO@|ᄣNEcXr){vm!GA:\ϖʀ,YoXJ}aj3g13MU>dO[Pv,1>.q }0`R^Ϙ!R \s=zgLkUC%E~.Fܖj*\/% Ͼ[R3~1X-;|'9wv@{uw7GoEo ^,UhlecFdaX!bipt\yŕZK٭X[֮u&im˴4sٜok0͹٭ =癱,ı)e " BJS=]54|c=|.aN/qd`1 A!N#vOQ _HEy[a6aӳgK3]Tax+h-S c>Om0 Tn-.3:fcNvUSCLn1i`*l~`@h@O:ѕi&7t]Φ&.# K(B`KG7mM Dwoy+\_)d21߿mO]vP"|=Y) v;餓 v/|Кי9Fy{$iF_vߚ<6G!J6Ҙ9D q?1TQ8p>;IDɋ߬1I?ݬoWoߑ~.] ,TVo !#[nZ8GȮb@,=Ў@A!0P܇~$ ! ̵H+AذٿF?A=\%^uU^AM7^ו]0a0/}ėC\{_r[7SꮜwJˣԀ굳vŗɔ1~馛zYH}[ ىG"D9+զiIҕ{aL rtT@ejƮvvI;!%iQ8΍_$V؀Do^+|R@L)D* k (';Oy7ݬf~8Pdڃ;p $qCnVf?N-Bq>{5͡ejvzgfHd-Ot$*08q\v\@iO3(DGq<^W8:0ւb3^yNB ?Fk!$|4\?n'K0@CУ^E0m$Ku|vg˾gC`z] =~%C^ _[kgMTm\ @X#&/k gahB1 ? fG|(& CivB00= 18yY a 8 <\C0}L[*Xc)|D8UX.,pk)Em,[]vB[6j?VycB^x;=m};`d:a~i&Oaz e!vBaqs60 uZg)q4ljCB>-+`igga[(SCŮf(|m6MS\Y]G-ʻIǛo>{[e 1%:Y;22sv7!lr$}#cT@L0ʉ$ {׋jI~VYڍ7Y:绁g6ֽ F@Fÿ&BKn9^|a@R6ؽ-ri9h>,̟0Q1TJziyf9455y97n߱Bi;~|n8PGozE**rY +zIIJ) 7 hU>P '%'jc BiY5SNA,2_7d]ނbZ^[ʦZ}MW>V6SϽnΗVF3'-?B,>5w;* F= `s["3i@d,&7,)`႘E b;E8g onsƷ-@-6Ҳl`tL NÞu'1n$jU KGe;C(Y'Py)E"wj~|e/V(ÏOձݦg VjNDaص0m*֍A3$ l8t`<gvb>ϺÇ{i~ڟv[<=Խ%PtmaG^?oņ?[8sVU]r% ڊ1(cyFwr  B*>kRto-}fU] ݾl$xֺap)—t#b$kKx ![ڮho\v_~PZm!Pn9HF;LP0D*AZ9`Դ )m#!kwU :~(n-YcZu78vB[f!VOZHP2H]~ttWb3%Q8HvOGRͿM[=ܳu I1SAx:BpkaڶUExT%7GQ7b}j!!Vo A8 &w˚,{4p6k|toB ,I7ku`) D[ 9O+uZ#N[ eZ謐T !,A/Ǹ_ٴ4[Y^ݢc?5iͳϡ{Ϡ`WY:@j<}J=^l\6z|nQn~K;q*7bbVv/Nkwv;׭b3Opώw^|unq=ޘ\U D ӧOMh>}s>}SD"#30@=A|_Vw}VomH˹Z:>7 7Ndei608-P7SN '<@`ўP Pϊv3z "?.GJ)_NjDܽ?Fw{btA~3M+N@8µ޴5S3~1d ^J^?﹧>9;XmqTe~Kxt(.K[]$wU%*L'XӁ²vcmb\QOF1| g?*."b$ o\GCi(Dm*5}\.?tMnG @W]CɌL2v^, Ou/:?msq#Gڣ}g#A y\RҏKZyp\C?fLp_Ite}3^DU?0=-) PկڙZQG1/'?C&\kqza:f0=inazaΜO\ſ`fL X7`~ˢD4>[\XpfEَ`YAd?[R? +WȴA$GBL8mQMXL+k-l.77I/ C6fNY,=[zi0tg߀WB dPok4w&+&76?Ϝ`}svjrKn6}kE~:20<Ɲ O O,LL4mBA  ֗ߔ/qa@sj`TB?@;m7N"0PVY{isnGC/3k}6QsяR}v>hvȷlOc&;JWB?pQ\ 3 }'1>%wE:DU;$v~,%hOr(a]N{:q"Ja\ݷ!maegĿ ȶT!4^8GX T&ϜfX"399> &5n*Bnc3 cBϖZЯ`aT GȂUW`HdkvY4а1uЏ( UgŽ#@Yl- a+q:3yXy˾dB `s: agL2hZ[DZ4oVDؚRb&Ja ̬a[#N+JVDM#4fFNV.7,,vΕǀV /Ƥ܅1@ s M[X{2Y`Y:~%)GϦJs+4u zg;^r"USGkRnAmm"=p`=W71s cu 7GGco[=g\'1qGҮ6XH!4ו"Ǹ@FL_K+?rذa^I#:Xk-4vtz6k6] ,TH)MzNxmw|6Շs^ x}8_>xCؑK%琉*i T0Om*5y+?1b f}2,髮r(U$H08ĠGJMó.SW&)wӦ/Kκjhmi?Oy?9gLbpI65s9mU|3N݂|ʱ;  <^؀׀l8 cI' ٵRRKeMWiH")p!TE(z~mm~ =kY>_֙6'fhÄq0Og iüV^ 3a)Kwc !}<{`ht$Xf,pheԟ=#Ej)n$X q)Jni& ȋ0X}ڳ-0,\nl@xO-&IbVGcQ$PT}o;cME`?{ѱʬ`t9|G;Wݲmo`'D|2hjsJ' &s;?A>Q:v+6̇M6wb'EW[0҇xh ha.Rl|{7|ߩ)復\\x~ݘ/w}~cv55m$+-^MۧM{־NT:skqO}-˱ۛNn0h#tC x-1-!V:FsJ$i%桺"m@=Tmkg FYiBvv5BvluȒ;ؙm̪6Y) vԨPݞIϑ*7Ͽ ڢy?`;fO ,?/ oaL fZzqmmfaJQ ؿ =k ^ օX4nn qtnLIEfQmE>tұ۳y(YlQY00aO{baą%]vRV;Y~+n7H/s%D`rnNu,M.er<`ݴ6qJvJ}1tzJ^bH8ɠ0^_r[?1V w5]^F 07 @h}QgRG! U8^Ÿٚ1⎐$ s{XW ýǎ;>ph{B'ڐPDvj"h5Q7OsPqy['N>di]̷_{?&PG;H "3(:&:ư8Ok~bW;1i)Q:@n>acW [rl@Ek"p04B# kD5џ§'DHi.EhgWb:{b2@pA3i/6 YX8N臽$=,ft0ۊPEa@M'DM>[3n pI!! ְK+c@TYG2ƌ\]S*1G?۠ia^0;#=a̐FG44TI:)5|6 n!6_=HfwSw j1OڽÏ^yn3>}lϫ-Rv?{㚎]%!p]R$c ic'0qCb{[RatT#'t>>w n-uMc%kc̷Դi/菠O߂p~_ɕ:,Er,PS>w~wϻQY{-cw73+7{ ǍX)"{@` U3v95C>^x/9fv,rGڝm/Ŏvm=Nuҋ^R Ub,;kzlW: `襣=n̘m!"|$/4j)x4XL^/Ha7RPxYgs=3hFIikHOh8Qz#5߱ƣg%/:1]&4xdyn@MN}BE%BpZL+JX,f+vh6[{(DYl5."tW:.[$ 󀿊0G:P Hgɳ`u@cwsJC=YS&LH<#(oV~ŒB!>z3~j5HYU`u;fOn@`7K%MB)bgH(7 QtC؀ʊ]9 -q E2e$5Wu'DkO%cb [ %6vX3Kspiina4;C[:_)v46TU"@Z<NFgfh[ (.r:d,}qN"A|#Ƃub&.An>cҳ8`i3Aecʻ3Hy/m>,P⑁L/D?Dw}[7L̙3=R:]DRCvDzmun_OvYumwhч[Kb`# $"1^o쓎u=ޘ[lo0;\A>:}ln &0U0+@9sb>]+7H6q G`(WO%&R3V8=ݡn3H]+#7Of PmQ f|Όѭmxv*;H:Cݣ[IL ,ځŦw̓UjCoyv/GvP\ܧ Oկz »cSCc݄ !!o)vX >,\YM!e{gWW6~92[ ns>Maax [JU[<C)`ö4::"&=l0cPNKgj S˸KH||VLa" ifn05?L8-xm` ¾}= V{G*4 ]H f kNqz;رw`cS ޑPH! V+^-{OҞf;9sLlcL0ԽHiX`BC N8/c" ?s=uۧ>z]xTW~b,^\;ecj#$Zo%;w/Y`]-;eM uc[›ۄ1@g)2^P: alW 5.ڠVGXc?ǐ@%w <_7~3}3γvaWu0Rv Q  v)#5xy(%MK@4' lt8ƻu|4U UO ¤M"!PbvHxgz5ׄ{X#Eyh#~^YY>6~~&Zהws_b# 6`ے8H@%oJAlU@9d!夙ce]DA)Sauh:0?G|-@xHh'5⹠yxs͍>u]iNjZk. RU+NEJڝ+?tg.|` SW|V[Vu'b,bt>dH8〾/iM)|Lv&1h& ?.dGڶ #|75; rAaA vv _ 8&Z֓ͣ.{VXc:߿ Ğ8os7Glii7fzlc|rֽ5< ot1A=d1aKwh{V ~Ә `P/3?;^=#nt0J_̄9Kҭ-i!c'HRǸYI7+ac(9kR?~uL X?*eIQ!@E1?[vM Y0ɧV1=S@׭{?淿}|%0{(iӦ`D9 J|8h񺦍0+W .tk9Hap6yK( &w uDOS{C&8|3K7Wuh?w}7-V~}פgm璯&_[ T\7Cgm;(cgW a/A% E֒ tyMD;, 0Q0i3=w^oy!Hq-\NjJ?'1f ͭa#is.5D6ww>M,0K˿ōh~;1Cd8@|0(HI I!ʖVkއiK }H7gy qkr$ڪKDSMuGbܦ'&O?-=:uj8@[uFX I~_DD|_;fb520Peib2 v]bnx-HTmtt0+4WA"A#e~q€yCm PQQ.ykoH3|+_^x!0}4G]$}Pȸg&,Х H|`4lzY?lѢEu͜q}>hzd:((f[֚D/X`10)8ƇXzeq󚫾)Il!aM r,CBq~,%®BgB6 SM¯/G= DX'af`= aq8+bPqH)+ȼ@ ~3B}i8֑+xآ|wzc}8k=e11p<6U>.!vϡ>=D<#?vf'׫9 wkMfNPdnNH&8 ]%b+;Y\=?} Iѣ_XmjCxr,+P>]!xc}Ge~+Ag_~Kް?R]W:)m'$jUC e6`S`!)ɡSb–@IDATtё"qp`@AC[uEM<9`/6 pSn48eN$u]L f`\BQgLߟ_WTT 6_rCviZ0dgǍ?նBJ Ydas p"0 oJu@Lƹpq? _'#!;/ɱR B$g#Glᬌ<ʹ]!v\g-yTU xnn=FviLp|L޿ػ@ >&Hxs3t8mų9y~Ee*cʿ^ ;6m>3>p= : }0Dvٱ˺od=NMÍ[On;`U@]يlal<[{>@&r0+I%uđ 3/JAA: `;1+إ#> /=d_= N''Z6ɧ%s.]i`BBxpu@qk`pZ|U(3\QM?@ɽ焯-~UHlN-Y1n Ӻ̷Ϳ--BÿTo3fe -6=Mw즻[ķP yP+`CVgQE){6 Z8mVbnt8.I5 q:AxZ$mrv҉֔q 6toH>DC芸n 3vL k=g!g-\v!ʪt@zXvk;K`w=l(Mj7.n]qVQQ&(C?>[wFLfz >aZ6 W2QN 3g$z{l }"#-1 viA':kIF;~ۃc0e2p'xةk$26;'|rOZ:6g?Lkk6BcR7> X|xۯ=zݪ>ٯqC7=H'4qũe»w _2diBͬVa _(snf Ə[J+hhENGɦi40ѳϿ~ [uJJ[slk 5ؾ6u{`&]"z$qPL.4V!u?V*Q` /"0!@o˒r)L T2?Fz(33^!P*mDaAKJa ?_ tuFI$TLBI|0Asx$$83 er3v{Ϟ?7ezX7}9I{i3a~ (PSB~ {]A@GIGĞVMAClM1 ߗg1O:Jklab7꘰ @HG~3NaBƹl. 'vPxb|7(?Qd1dwB5$}oʕ,u =vg0o޼pLbF}y~Ŀ)'M>~w~2QvwƌPG#X`H~|r<7tS .i|If2ڎ5ר گ}.A%qH}ᣒ +]=jru A=𲴧Zf y5Dp.|8!;N H$$+=_-? aCzGIi?>Č >^|u N55?ݭ)3ßcO7mni3a`b (8Px˜k 56wl @tكoAKxX,L }tmHȖ<{=a);ـb7*8\iGc={&أfXDo&_"{!I n{ >bĈ@t@s! qWQQQ'ysF:]ǏC1 rlPWv:9`\+m w %0gh~1 Kh={vh @\߅ȴ=mB&~}|mfag~L$ț# 0 !Q<1y0.Kz03xn0y?w L $, |I8韌$ȋ Hˆ0m bRЭk=}}L 5&kiM;~q~F g?{~[ꔁ%W2Ep潇4& Sp ʔ_TVl"``$Xxp|ۆ2Q>xp0If&ghЅd-$ $UTe$X[2:R`Ϭ=3a2Fqxwfϭ׺qXj0ٛKO9˞|1Em <3nUXrw;;wlpn{g l[܎?{}y}x8L'Ma!$y$!*pv@ -i$)XE]AkY %w]O4a bH-C !Ur&ar"(+ -LD]ZeݡO4fjfC>]V]^*P:0ld-1#LDk1.\3YQQ@zy!w:g™]hU8~ XPwwD>N夾 O9@s,8>L=H80a1a^PQ?ayM=XH EIS:yٿr٥v/DD>sN^/ZKZR,:~T "\"Lop"f FJ [/|L{a7/O z+7#.Z2ye'GOF'Ujtd\Ϟ8p{:NL NppZj-]YrI1ǝ""w}Shpi7+ÍtYRW{O=I^Yϔ&0qyȇ/&UJ&wr|1ɲȘiO("|` Qqrwa(댦xĞa]k cX@Ђ8 ; . ;Ō=͟$͈ØA"~Dvy&}nuwI0@{(Cyj~xnƎC0 nV;꒜6/Ӹs|]BZ馄.'mm67\1%! Q Aaa Eq.ǎՉ)l› ,zpppyOG֒>Dӻpb!!L1"ٴowAeмsq,7 Xym }lab{6{68Nlq9l v|W_+%mEE`^3"KgäbpqNOxLq1r"?nwK~(!i7}4w(#,y&Lizx;fN,@f 9._{}DD: bυ B ^YY$$8 ENG*)[?gE x|v ~6{o;V+^Ia[Ɓ$)8s(H[p%z0S L},Cc.kG[xcQ}ן=2[ o+0?bH?ׯ~.yrǭM!0zt9``f0Z8]x¿m1!_%0YiB~ Le{ _)|[_p·JA(j[8߃/3GlGwK|r黙-ʓ%,Aubw$yd5 4 m4^ӽP=^4[\胍Ζm!Dq$,ܤbJ)HpӅI¤ϱuh@hj0Ige2=P^:;Vd [8 D݌! ; # B" \5N`<U{2>oI *$^Nj##*oʤ믵+:e[Nɶ60:>'c{o3E>ex>R_0跮dqpΧ 0g!н[/\c9}HZH?}|n큗CLTF5@CT8W%鲟'86ڣr֖+"N<@P'Do'恻t(´B:u-6h;g`m8}u+,7ӧOc>d^sk_Kc&1 lhښ:Ggy/EKϧ79Wwݏ.mҸGF !h<}6a *.d[Yr0o K._ 'TB,!NYz[" v_`f֗T|4K1=tZ&qnlayq8n݌Xm:B<l!pxK:C( 磉ٔ=̄ux1ḱX'>1aAD3XOȹ /ϗ2@̙3g`d9ov t{[ʬG܈bf S4ʵ҄#"I!tluUJ{$s1cst?;U`y~>)l(,NTiu !at)cL#!N]E973Bۊde)ڋ4Er RN-y,챾 $e⵴h+q>-%=[';iIȞ;P$ J : ΋Bw3vG >xy.~Y\Iap\I#=?Ӄ1 dK#5,( B[[@ސI [ Q עI#bݔ~DGmТ^!?v?u߾EQێ&+#H ?\qJ|>ysx.I18h0g@Dp4ONBs&mCTVV"H ̿([bE@stu LbF˔?S)D#k𿄫—JTKh+W-t}:7&Q~M_/}^u9.KlO#8M[qx6fp3n[>Hg]TL("@xs1˞K 5G:= 焿#a< P)9x @3Ζx}r]JM޲}LmuWcw>8Ϫ* "2c53IdӔ/BBv{ %bhxZ0 rH}7iu Nɼ]`cihqfsדű$8a@^M>nKFҋWo]:m7j-]>} @P4SQ W7vܯB p%"Ÿm^3!+CR{[?T!ٍ$Ȅ5Z3Q|qkNǿ |ru3=?NYpn>0 Ed T2h_ ͟NGGgV1 gBj A{u?Mwp.<d?ETbq.3Xd >K-,w}H NLw8[9Twm2Mܫ(@UUٳګo$;?c'W -ܜ=}AYܫv=!~o,3c7`w 3ЏG #B(;Ek}٩3'ldP}vBѿ}zo8{WY3pi6'ߛ[ZW+ϥ3mӹZ(O 7;/`i ww.cf k|;RѪocП򶠝w?v|ȦTn&FoWSe>|ε(o~] VڙS>''\v:6L9jX~'?"d+a`GWY;JgNyM_xʫ ןg Gezzi;-6IB@t-γ2qE<SV!it0?3̒A@gs"4unz-ʁ"2IŸ}e"ŲדMy;t>q| \׼8Hbf~M86^A:Xا~zД.;61̊t/ Te 텅'91{, NV0@Ο??# z.as ~D PLqAܚn]>oSkfe.6{F OCz_k q)KmqV `A/η?a=6Om4 ӜrA%j.1.kD9EQ>䓡=H y#n|8A =1G)>M{W9MۦiA>/i{m>9=&J2%<|Bk/X} YB~y r(`w"BNpH,w$N'G9!&K'Yj72vm!PDJ% @ ~ n",_ۂ{8~xG7ݽ)4?vOMH/Wuu;Ϥ˟.\xv$썵6%%~zH0WZ~',!vucYi71P}NùZ]]u6mbk9П8.1x4 vwǖTA۾0<~&\&LdeD/~0F<RA _O /n|P6 Ys!ϼޑG;4|'j0\|KpOMa#NYaO<c6=,^#--mF͜Fbv-˵.X*{r^?}VPG7,]]n8uJX=R/`._*:e^n@3Pwy"bqH @џ[H0 8a T+ dg__[PwLj;l"mܲoD++"\{m=ϪE 2:@cVR ph-yCJWmߨ!L.Gr;!]?z7vEZI6E`ӦM s,`Ȑ!!ֶy\|nf[>QG9??HH")ƻ8vٓmwYu$1W;!qz>N^.%t!P%lqDž)|&bhe@SzS1|V:¹S7]]L#s$^ 4㤟zҋsGUt7t0[`lNJNj |QO1zǯzwKaǽv?N3}ď"bu_6Y ߏ5ļWVڂ7{v=>^kO簫v}Cg wd`ǏMx+qb 8DOar&9~,lQnbe5{tTfo#ii!q>~z+2Pk}z Rnzjmv쌩ymuq>H\%ms  A‡sfd?R _Ͻ$\qmy%й+vWCEk-_a5ÆjW?"2s; 6HQaIt $(6`ٶR @ B>_=OX@? BBgoGb<[Voo\_jm;G0՗Ͱ[x~2?G3i# 8 !?rqZ֒g+%Շ׀GB^x @%^BP|Us8r7,.Y*:%F ל-^˒6i9C>-N:Nb"XLN݋vNIwHWWW|;f;aI -CEcݔnlt{c}ߥA٠+"6 I gc?_0aYfM8#ȥH?y)2W,8֠`mϏ2Gcd0ӫc{` is:3[Vf5jŖ_d^[|ZTHf=mHG.v#L?gju3ϞMTA2R1;P-zscb_cVK@ ϦGNvٖopj6o1Nb^wk@}]t!h>k9G@?'#A3}<:iw_GU F[oQwoV AIb1kWἿ'la6WEﲚmVVnuF$`tZ -0~_=78p_<8:aW|x饗Bo|K~_OLS&s& 3'm-1ӒtK1LKۢκ` {K ]fh'xW6/e6Apv;_:6nb(߳ޏ2 @IDATkq\}A_ P{r13Ap:#`С<xmPr{3q_[׺6꾽:6>޽rU h]m=cFQ#±d6HxBYI,{_[{!|vW.wKWvҌufƌAF,+5@̑0`=:H]s\kr+HqRM?uDv!JB 'ؘxU~2J&1 _A2vJ!j 9py…m,VVq%QԐb뮘c=o hnA%PXre6pnx*iu$,eևfȨ6kA10B' ?"T<'0>ԇlޖ8j>}$§>8}[[WKf%KrwN#+~9oyn;pww6¶(G(a8Pc K[RU? )plv4?3:^8|sCX 鸎&Ach0>2&FXڻDJvZw)JuLJnpK} 'hEfkzVyҕv[gj&ot}`'1J ~rD7՟#֌_`, GrmM7$(K1٫tL]go!I$_)7u)^Kgr= )b! iMXK(73;? '0Z@P_GI|Z33g;N@5fs&l}Jظjt`6@l7F9[q#y:qqZb9 TSMO gz'o@/@[A\mu\㴰$L[$~)⦝2L:c٪\XbrB~b7#mw|HIkZ{e v=k3wI\nwG`w)}?~|m{aa[8a$+X'[#?i~Y} Pg: mf}_;;p4B\++m?}Mozgv>3췊[֪: oplV۹n :22m䇛:1ى@]&j@; 7 ގ_k 818~dKRw,Vzy…13G)s#NXf1ڠn[Wؿݲ4E.NOf!Z҄1oX)Mf 4y,蝷 RyWo80C8|bUa񬟈B k1OI/:`.Aա~vi}l|:[^xoпO]6y|5ږawt !GvQ$^)\/9cҟ|ׇkQsκkD+XvF0|Ȫ@ UG'6sm;ۻlnP|eNCⳣ=*pIP{*8lء=IcpxF;ɽݶ{x;aL>~.o-MQ:$5***l„ ᨆݚv4mrJKϰO}BSG̊sw:-_Y[l}w8QM >+fbzIY'4˄Bdu*PQv™~e!VI2x7D:a gmGI<1'79!~U4~23X}1s"lTzNTqZ' 0O=|c&a8f|^! Pܳ B6\+Ҋ!wڸsFyE;b&ӟ ?e^8qyZ9p,<+{cf&cvɴ_!'8-LSr˳@ ߄glv!zڇ?VU˺h7ݳe!Rzph>y7b?vm~]gN]-g+iSvg<[axgx≁dwxaZ?wUTTco\G(V_SdžM߯W2Pa_VfJ UV/wm%u ʴu 6qJBYq[ |i|3v3l:NeI N; XgAAFQ s"@:|G6%r#|x㍺:'.~l,uk>]yDZNel9$j=^"cEĈ>ԁV9-Z;\pX 3P0HS;7-9Lh91Bf|E [N|퀆5 '/ag@d\z׺?ԗV7^38qM=8_/G/[8dz= mo#v UNb;/f1$?H|x/߳#cil?.~&-ƞÝ:\C"'JrpNYMԲ(GllmpľLr]_;a\fnisKBOg+u]Ž%lRx*)z\^_ v AR?/3\pAg gav횔-%X?a%xYd҇D:vO/vguB쿫8Ֆr[ٖ3٨{$b-=@n -:myIORӽm^) 7mK*mIcůKJz>3Rګ}N0bǍgÇmV㐹 !XH!#ݭU:q)>0P6G4F}bwՈ4[=Un8·'Ŀ-Bnf) hTixI%4 31;06h`^-/ |8% %ya)"=41\: R5MMf=L)c@6L %Xyym y pGespi nIOʬ.(~4'2 )d5#!GBYs)㹧~ö8dLW?Ws:v]z֕~zuه%V]pv9=}UW]Ni|84WVVk 1&A*SXKa;6LZ?76\p2:/A B{v?:i l=4{nɒmI`"7)-eUۃ$4rpFk͘ pm$ߞЎ?7|͛7h^tCN ?I'1 W.>c0Ξ p\+l=.|!XeVBl[ړ~r!'Iޏas 5_pνz Zhg9s;&%7c -v3da@پqqؽ,ޘI`t}s Ũ|Ⱦ+8qv6JD8 *nzix>mO av#t x52<DࡅP,D5CN6-H"]Я~7p m l̙V 9.vIRrD>~T+߻ߪ;wyJR.FWhAm˪{W_axܺ th a`H?c6w.Wݻ)qJN*UAu gvE>Y-j@7 U56i\oy …Bb% 2 YM^"~UoI `䃏l;'-3 gفAnyT[(Xf!Icyf 2@?@EEE8 7|y6ڥK}GYO3O?F"Y[t1Vù}}+ 9Ƃ"ŸsqO^ Qvcmރ / d)h_F,;=%lg vFȽ-x$`R&f]L[o գ +_20(|+e){xy:&*AziǴ_a܌Zj'n {pr77ݯ.6_u{ Zd^$Oɂ9v|va̍v _w[ֲbd MɢAtU{ =~?N&<_0gNIv̢r{@<;ӎ"̮"={vT_rٮmش^_v6~lڪu]Y^kGk$j>rh}I deo_M dZ-^`&gSS姾AX^xA駟'"Nķ&Oa ,׹}ي :JG¸l0F֊*ߵ2_+m;'o{A^sA~Q#`O$I@@DKNaX c<\%VP5tH`^»~ fʕ+ aU6iKKczg+}0s Ƿ瞳[nh$cg۽η)FىجON_AI:A~@,wsY{$Ʀm3&^^k# έ!;oB/a #MPv~2[fZ#Y7x[M5jJIB2(@C]a}aj,vvn헪8c? K#>xY«A!GO: àc`:#ARս9D$:}LM&@Ԙe8?UaG`aK} k"Y 5Zr8:q8I R6NOˎ}q`lH~deeeIff+zZ@ ;|'N0jdPq[bo^KD1$ yW" Acǯh]BR qap~\v(ox6tϾd=FF#~20j  )BG̠ACD*wɱzTgϞ!/:RY6rs2 pƀ_6/;Iww]_ʉ\2D7 .]WQYHہspc|^$`c E>a8;pEw!cƌ?Oh)T@\2gy s+m`qo #^w=rQr^}{i^4껊k.WI=H3<J6O+uUBރҬV53]‰'?|+4ovq˭7Ͽ?{,)\Z̧ Lpb,A0N\*lD&?|;hg&GuL$EI<@ţT;>%)\~Tɫp) /\^"+7V?~" .rْ 6@F "*$Ȋr*7 I2zk|MO 2P*3F8tma,b4th> #:V]{?Q}8K HT<Ⱦr*WUcN Ȗku\c. SF|<!P"˩Qäo/.TzmIޠH3Y8u**dplQZ)B}wE承 Ji@in aa6`@e >:̓'D21O0:!ϝ~I)I$9CU5ҽ[L!S [RüoM{ ½2( p48%Ķl)pdR,L'ַ䮻2L'|H>!kh{4,M.e%הa޷GF+|a>p:6cOZ/wU׿!.+77cc-iʺ _pCvA EZWA3XP/cƎ6 N_\ IDhk<*3g|p6 wOygyh(}Qgk8BиK7ސ۷.Wkvo}SAł<+u)û1?;C}CSyՕ5rפNʜ`"1Ea?AI69v!% õJ#GW#ֲSR8;&GS☏>ȥ {^/٭3BhYQ4$G.#Wׯ`Բg45ܑQ ײ^kݯ[;ص[~蔧PO6з_ر}'7.2yexqrMӰac sDYgٸSi@3KN3㼹g~]zLtF6pi9^k+ut W}yzK,1^SHFE͹vZc8ݔ(zaՆ2sm,@dGȒUTaڬHiZ݀1ǣ8 au(Y /Y+m``Ā`7۔2%'py׮]F"bT `(KRT #LxIw?p^Q49`X .CCH&2`s)Syw,]>2)"'?_A='73: N ŻD>J]?R `C\/}59dPZcO>߬R|< TG{sT>P?0o?%O 0v(ԡoN p~L%8~As_ {Iҫsl;`1 @?E3{pos*ŐwG(nvqW,:;EoF\4<6La<>Gyp}s' lZI?\{:ZnLl%FJ0knifS6pU:!\p 1GfƱ㧥<8 g.lcU;%}:JޙV&̓K[tMv>1bn.A*ƲQ;Ϲ}S`/660'KކZf 8\Jt YG߉JQ3dY+Nc[nKDϝjx%,1\4n8Cpݘv{d~Q,QIHSpIw5˃=eA;(G֡2Qlp9|"#4zHh^_Ld +88dw^K hflG3y41U&מVK=SWr䷗av.j-kw.=sN4s]ұSGWYd#Bmd8$J~_\>D78|_.+]~IbPp熋r 8Efhl:`5/﹘$3hz33娴qLoVU)hJ# c⠦qV^n|m'?;NB"E۷mfg CS'K5uK;~&I{cTca¨_y z (n~o9z/I-fjda) VK]G @Հ1$y2h,Lo{V#`t*!3i}][h/.,m{C:kbhߖ!:cJC~xd ]k5%&OV 1!ep\1AwՅ IHmSa7+/YꎮґI#cX7'2׬u<=)f I2߱4kIܘ?G㘀~c`"`_3L)$I9)ׄ~}d\c$0>BgT&ֽr ?@t2?xOb$:c`ݺuF_w&8_!@ JGP-C&߀+}0\h'Qx,슝#U@MgU.-=$w`)CJ@/v]%Z ?tTBW)ǯc Hal5Xd>X*оJr2(=Aڻ (ӶٳǨ(!fo5I̓)/"YT`1|SO=e-ܹSfΜicqMZG&@+NΖf- $YWxC^[~r-0; BsYzS׌: s[z~mpWyUy;wqP`| g5E8[S V5ZN^)jqm WOrJC$* C,^+wG1]0"K\H\/ߝQg0u YheXRe_, T8t(H64._:]yW_ۑ^,k\VQj=U+qӿ Xq=8Ebb >\8H2DN_|PP\~0@f {!N`;ܹseҥF= KMQ]j7Ri0B l&h]஁ G ‘yD ϷSQ&&8g0`:]Nqǜ _o"V%shԍHQWkrMr@tK5@: бcGa'0T?;|{)dKt^,jӷ%bOJE=~D z0y#KP 6HYI-γ%i>tn]&C~ܥ…2^9V̢A4Ut26lpFɔq!X-ijx}Tf.f p=(wb.\`(Rҋ̴#33S~_˭rl^U,ZU׉(:zM! @8RBc.uc]_D:_ Ty9糗9ޫo/Ϟ͵U9d8,[~)YfTszsUin zj*IPPysdʴ qP.@IDAT g8pu{K'D$4Lbey3yPL2(jbP5`צ>ZT ]FN2x|)N}Fr)NK}-vcH$y<wV%3ȋb]FOY"tq,yRT!7'A.äK2 Fn{(Nr "eD8`P'g~ `1k]]@iP 8U'^6%A\vb 1O0b&J[DIݴM 3?r@$)hX@ݩl~}^!nM#r *'njApR|+m^"%%ŜL2io߷N)Ag *a?#6ѡ_ъP}g_ L1h G1iTD`[{3 馛{1DvܘJmRˑ hzX^;R{HB6P5$9t,V*dxINHX(*Q G Oܩ'3F{el)P :W ߏ>Q ++ U`mj;bNRD Drn>/jʱQ*2%0U n^&ɐP)_`¶mݲi(>'v2-'ߗ/b c_F|]ruvO[jr$AZJl@E@ФmM+_:wp Oޚ&gC쪝yt9h^L{-$%X8p1uI~|o*\>з0 ,k F^!Cdĉ@F)' ] _ U8ή 0ڵ LRUQ@TU;ۯ= ?Tn|{F+䪱9r<|dvOړ e| ߅8zQ`T ;q4x~d 8gJ}2uTcI_}{9Pc쁖Xs^3AWs$ǬWw^p:AP\<=}:{: o9t?#}^{\VVSZR f27-Y "SSrȵkӷO09 Ih+ Y .r y\w 'yhn p\! sΣVdȅҁL FkJTl:#exuyOE&Mo{Kj7dN< j^E233 AHi-]VQr %GocVK}wcVחݒ,ߺ:Q~U")IR\Z+]#]!O WJҴVG^EaĨ8¨_6raOWB^7cB.騢AsyB~Qz,M$Q,%(A&dwnߓwޅQFޱZ𯉎e(J !%Ubl~O(Q${@-`5-7H aK~tdиW 2ڲvC_"  2q%WolQp- >K[n!~8;pA[$|AcPwf5տxKt!XXO:LR\JnqYq[ڑZg~ކ"Zg +h*U->PzϼdibgAbM;/&ҥ8?"8}G;dS)KtXs󌋝ϼ E8 4Ut{Zn -0=ܒ`z{9Z'_9ҜKqpD_ZzQa2X{233 C$I(M’1EsFԝj@5 d.K]QҾM|Rfםm$B Uru7 aѢ $C' $KbaQj P2C2$ه@)e]1CbUhӦyp*!{cv &wR$C8EXtx. ́@GIi.rՂz@KB#qF47 }.x&m`$zHKjUmۆZ֒diqP? G."4GѰմBd*.[L>@,u=|ܺ*$טլu9fIo0 m)ξɵlz  wV.{YkOHXtl1Q#{9s?3u>i۶M0k<o@0{ϲt^3-[(R?$\l5PdS m[ mrܮR@u=!)Lm1 3ȕȒׁMa~m `*sXǹ M˼eةAFZ\?>A˥s;tEbG yU N-E9}W *usZ#T)G/ѩ}0; Fv(W>]jC]n e.U*$.@Q-LD'<ƱGF-" Q wA);@w1#ݻ޻a߱2# *.R"K $o~2s #C;H75<66N\U8'sQsBGV_Z'U;x݊ϷlYqH\R'#$kO9oA泧c^:xO!2ͬ+zܣ*  pJYޗρtvM0{&opt^'j2)Qt7@qgΓ@qBS컝ޔeOoW_TM"$@~;2d$ĝ\2}mJ{u+Ҟ5& HpR 9 tV#[` IF q $8`k|m@i2{2D-G-`]$AG!)H>?ų+ĥWʑk@ mgv|/$gdpg殮ANA%+{TL #dY9j>4Ln{5TEXpPA2czڴir]wIZ]=p/X@@#_cҚQOQcB9GK&9؎s/ `]Ι27 {u\#ͣ=0{9-14--{>cy)h2]*0ko keB5ة# 4,~خK.H UO%OS&Sc 2(CUmXxl2H`ܩ$'#ژP"D:ApK|AKs-m58w._a~ܚ/-fR 6 ~NM~=11/}n6A8 w`@jܸqrʔ)S@?~/x%VKhu݂f W6lQ/iZJ`G䭏 e%2twY 0;> poNo>KӯzC|Rv=Q-YB||'FC"tɛcKJ0*ONE)Sѧ˯Icw5qg S"d3_\H@ՉL.pdgI|\}NB7LYn?!$ D?l|qq0 3T _4kKm#EI!Dޒ]pue- l5Ǘ$k.8RÑ2v&$w7:Q?l*iS`1YEj1Hyӧ?gxicI;8,uZ]V,ڞNӫo(Ǟ~m GW߹MZ㳏{i5;*o`WlֺnKf7nKݧяBC2g`w>m#/X<[6o&N㹣Gxo!csZh UAS(8r G1";2IofH9p ZrLјЋ/4c/  СC AHⓢdp >WɦM^1c䪫2;^4ϫ$}{DϺcOJzj8|9O<^f.$߈EFѪCst%Wȷ:)[m`@F˗뒥GRwαK"Ĕ [n5:%8.I |tNd2@4; r5ѐ+k['Àg~&zHR djb:4h[4!Q[o-f)R]5:„ y,ZsJv mp1O |kL S u o_21{{^rc|S4T/6nj6Mk7 C{2Ymѣ`$hۨ"NF9͕ ,v"B.Wbc;q6L\c 5 K>2ЫW/ɧsezm$H?!M00bql<]xRy$Hp-;)ފA4n&3ɂ\'?wBHv8 ̮ /=iNt:R"H>r 7P7>t=IO؅xo6LR$9@Iŋ[?йt>%cJxd-d D3auΑޯ(n ]94MMuʧi&r\C rlfpݤ*sõm[ek.q~D8ު9xAjq /fn[xF /C?!N>G7YRW_;If%n(X"W4L(ZklMQ59D@V=S#_+3}>Xy|h>_QCbqrõF_dw>. 8XCmx"ϖ)ƍ3ܩ88ޖI(h իW-tF"2Sv쭐ӮK [K}2%>uJ+@̍fv0˩\u#3sqD@~1nE}GdE(Ғ8\ZՎ&=uF Zg\Hڑ yAg, *'oJOIRt˧/l"Z_KO*P=#%m88#'eapAVU&zdqIE-f}A363~m:`  B>kM}4 aJ~\GrqYgЬ01ϹjҊ\ZKUiy4<z\z^*FM:c#/=9۶npb%R[n4AJj?0mƌ0 &t$n. j {9؟Nd+C23܁ 1o ,(1bIfS_V*8wV7mdN5 #+LڤEHrblQ.G[^/vt@Hx?++>2H3<#O?1dh|n P*zEq@ĝ"I^l qz`|_?wP+30xk$9u\qITM?㞌2Iy#'̻`qdg||dR€%#i*b2(@vڙ1bHB[& DP wcH .+wLK$5Rb\ԫ;E!NzJ>%E£h{J6lXğ6=7Q/HMur08)FBB9N.3}:(G'O | uVU-e8壥S{ /7 ہQ*]O;{X˖w<OHʎp$?(%];IU{urqyDU ;u/7M(/HY5O}ȫ0Fhg\0X12$Cý6N8 !ʟ'wC$&B)qe@PFk֦{$t?O۷m`>9R5ŪP]MGqVE|y-1v3G + l+5ӱ|^s0q^\B<\8rwU5إ)˰Y*{>+,qK!H- ry>O՝7.w>f1} ٶ4 Hצ{uIDIIpwx[>,[ :h~m9CA{-c4=MQ:Z Ac+#hhX ׫F"d@nc-Gɔm&R~z_ tcLUKVr j}1|Ce`HUN ٬),<&GO[ 9;(ֿn:ߞ+۝IAqƙ1%sxr r92Z@`l`auiP!J=i^q4Z/U8|-\a[lH~bb\{2sG%}9nӳ?xuLÕr+ܦőP++?bNX |ܥn 0Jcm|E j8z4rK^uٴ(UI /rg tQdVf|]@⛌W7 4/*is-l(=0 L\3x\(dހMs!Ν;4p0`ρJCZeJ򇟥~5ߔ-a0l`|dO8[%NP]A-X q$333B j2%VMsJp/DZs<_y3Lx۟MZki{<\duF?'W(̖(?Ȁ^0.#~֭v<Ƒ$)O<&#L28`%I"OHdv:)w2WYG7"⌕k!_D8$2]6M*S4]HS}rP[jdixWjpREA }Z/P e2Rx(n(w_C9Ԣ<\#b//ϵESGk3Td.A+rC[-%%7hWʬ9&ox;FʲXhw~x{;_׸e{{mPU>mކjۯՅQ P^}Uλ }T{WgwkϦ5[V@$#F\ybd|4c:X`֘ȸʣ8hIБP^LldI7aXP0^.tW)zw~j&ϼ*wFWa]qG8 HoaH$­$Useo|3H"GW>Mwu}}1Wm,XaЕ]ZuPIK G~!=rKyE aLZX pj~&w)>8Fn;^%rHs96J~Up޿7]wPq7-_M2L>4#DJɃ" C{?=Ip~a:[:2^8GR›vGx^СzSw%EɜϏ%,| Βw6}\ólh}g$F|j}}G µKZ!=Az~#q!͊a揗3 俣\N碴|a͎619ޞכk-C}ΣպERer(6\zX]*dԨ.< ͷ@Zy;;ONpeG l 'x^x_L$#.| g$k` 1s!"?ѧ}qv'ž&D PV 2bP\>QVV^+5wT*пo15Qzv w-v) y,hS')m^a_D^~@{#7@i͒ӧPl;$ I8 ZO زe Q.W?6%I&]/ऀG(&!q2jN{q8~󹼭*L> @0&GJO+=!.&w6)Oqu] h_z.uJ2Hrлwos\$ >y @DItPbeAj$ގꬆAK+=Nկ eӦM_dQbL2|'-g]3H 8 r̃m۩Eߘ}XJʭw5b⣒J/+仺{?`d-X@@M~#dB􀷟s&pj֟Xq-}M^dx-~ךޫoO뵶SYq3'zɵWNvp,YfL#l"x 99e鲥rJ| f@N݁%p@ kU>zU͙ODGDž%=6@]:M6ޚsʪnȣyi=xly]p紛7o9Εk9}~}?}P>P{Y4pTM:gkF?;v۷m3wmջ&ql|JU&2B^ FW:[t`PyDJ+Qa52a":.C@b(y8$°5=Atktk)gWz[=\~Aҧ z}!xԂOK%RH\V'_X\"%.6L(бmX'?-֖C䲼Ke X/ 0pdP'}֭X'LSif槞.O xW u 7v?Nk9Tm;6l#E`1.Ѱ ekR19Ĉ$YUk#0/>1:u2l}E iAd /.n3gK4TW\ lDI@W >Js$&7GKa<,yHm$*nmV.~^)!C`7h1̠ӧڵkZ\|w˦ ++Q`* H(0#e@V햀`4+1)-FIHw?8 ,hK_8i JqP&Ѕp_q9FOC=$_}I $?뀋sʎmX_~gz5YαִV/ ҸX;`v(˫u-˕aKwWs?8Aգ*8u 2'_ҒQRS0Df3H) {tֵ(OylMz];:ĵ.3p^x߮#a0\0jY9L牠2e붊E`MS>(Z?jG >^L.h})DSUeܨº~(-@oDT7:D~xvxaQ-fS^Q 'ے% wꅓPL#M>t B5 M<0艂^Pȑme`< 0fqչL._1kSe$) 0 .Y,tV'!rW;7 dp>ACz@I֑eb'!8Q} 8D\6nv_~Q[r~r\"du; ݒ~H_]W7LC~d( S:~46c 2Ct2rBF)\q``(|E6@njIed7oLNFIxtJm-{~4H4`-6t>H(:.-6Y] [o>umS>wB !U4EO? ^Gyf݉2W/qj&(H;p5wem\aWi5< =p__&^uRf6$e6qR DzU[$l䫐=m8but?" ʑaݞsr,?YQ .htwG3]ZFd[Vlɓ<(mS$R -Hl o&FbR]b"|/d 6haSlm}$uSLʉj mpv~ܚq>avuU~.72Z֟%#0E(oxU1x+OuVˡowV59|wyǽm&I.0|zgSWgӞrҘĆgqNy¦="/v.W0\gߚ0 \]`|qI+a ,!,Y.hҊ}s'EMyT% PlNA>*.z1&ϼ'40zHths kERRjߟ K|~dp' ђ5uq (:l2bh{w"ʼiO' 1rԉ}B1Ž5e""iҒd\YՀؘ#}_ȉW? wň•hUZ&߿!?>{ 3LÇ]{ꢫd?e3$gwAUC _w/}%) 7>V|T%&8ބU*%jݧ1Mr[!'YܽĝwIߑD.Krj@7mK ڻ r<1r;JP :u1O{h JtQF`:<'*utT= zuIa}%ے10,C.헂g0` '!ܜ4{>yG gg R/Yc!&#8ug6Rrrr-Tc $;g ^Auњݿu5_-- qDh±dP]ιKp5󚗩5Qߴéz9ּ%9u]<1G L- ?kfffjO>ٱ0{Mcy u}kTYY!))X܇C"A""-]lTu#"53$bdEVXPYÇi;JJ9yp@IDAT;ss4 q]J6D7ۭcʐ[lU)NmhOӌ.q C_.ղFsM2]} prmn?)oxT-7㑘S$̃jHa$%55y8?{gKA? IQp/ppΪ?駟˜Fwr%B^|E#-E( J @6Y) lpÉk;-rp S9x8877b2J4̫Y5yK57>dSb+P\& .kR&DZb#YPFr.m2it\2x)6VWثm/ jIoӅlmҶ6۸m(ʰmAeܺw.wvHm`,[2SP{6v@r:;0RD:1f a"j̵dܤ1D.P26u g^g}yrX"Fgb۲#iҮU ղLZJzu Ė@e[?r=.$Yl ֥̄r(z6PݔIuv 2|p;v=cnM`pm;خyo HdLC}%ᳵX*'Zl t+</1Q`X0&U"bgP9zy<a{)V'ʹq$9悚-:MC =ȔC@E>+Źsx&XeR׸cA|)_  9&ݐ6ڌ3kl4BII#tL3qI_ltŎ}c 2eXΚ5?֥^eyy!V-W+Nl.kwZjlq96tP]l0m.&e?vo{v d^{>( BVSmcw֊(@G} 曀;Lv! JCQ0Ř>}S=@->@ 6[!זsnnìiϰy mCDgX`]YkzAe]o[%ŅaVZqSW,j4f`8 ;cGux7xo(̯i0|}CB ICdrNYyԅ)Q"ImKv,mF io[Y yik;[m1A6#WK~Rzh>y.I'07{z@IT 3 dn@Z)Doƣc"(W'^#B6]"u9u|#'kiIj@=ᎏSǜPfJ{ko?ݬc:ٍ"rcONѐ} Y,=?-@.r8y=0w4!l+|y%BR'jA 1ۦ,j*>Dzk y7qM5? n$q#æ,#pz^sO/oo-O'ٿ61Rg\ $A\!NA#g-cwkcƌq;ވ'Cغꧯ-ˮ62S,sH^15c^Gn:@JҕٶiKk{|Y;"Vb2VIzE8H@3W0fZd @ 61'DnMmgh:TFc,KK=/|zv>|TQVһuyxCXUD~/'5z|4=_^R+7]ড|6M{512!z;Sp -[ MS1虓߿2tװA0^uI{F=.qG>sVg9HbdK GLlR3a39_HA\yv7o%n<,l͢9y Դ[;tCaMoWkQbÏ6?v}~K>œdž;gus%;5kJ5XX:)CŕO3Zؒ 2m.9 假?wu9ml2y (?Vd/]#2|qn$Dg_ߩ};Q}o 2b4&oo=eطʖ.Z[{-mZ${bU瞰SY`l;gZLwF;^M3;VɬsM?`@݀t{6̇ӲWۿNN?`w?tk`?[0[;Ƴ_dy/],Sjgmp !FB[P`ZϱoZ"h&Ёl[kJ?c"`l}ӚF8yELXR6g;*{wasqR0X+EOYl|-"F3CTF@v h"ŵ\r'׾5spo g|?I>Nt@j? BU+xQ_U^uW"K<Юkc|7'lus(Rx8\wǁ]T$ʎr6<:ZBQ п3G':.ʦC8~[r%Wѵm9ԡ]xz]=f4!JC"SmWE>)& 19HXbw@s>߁N}?c G`Np^25֬Ӝ+=dPG ؽl-[ornDYa2;M}q|-[% [Oh!rva * דg >JB/;PY1DτD&v >jz6 j+O8ʦ~m|` ӽN(>X Txb[=('1gr[\꧷m6N,1?3GMAURvyg0jwDv Zu}hHn^ĉ':t0  y'>2˓;"C{7t}; ;l?Ii+7VkDcI@ Id%x*ퟆk Gyۡk;Dr%;qJ|tQ _D%SkgNJ*l?=ўzy;' 8YW~BB5ETA/4BXL!GBNc* 0U> IQLe0WJ⣙!aZTk 0yMXD]w|+Mӎ?GpcT\\}"1a`]'<?sF(fu~`A$ZcmmzT"&\[ o-̘/V1-m%rkeY>av5H ʽCF̈?^"Fί>"۹l-z}i>v i+ϑ5*;ڳɍt31Y`+y vMfw1t!:x;px`@.j;FqCVš3o!^ޚNeyu̾| ^f/$C9b҄^r26p ^V`9bN`&0K 50 I'3_Ѻ00H_ ; 567X uE]BFSӤi6G,\54^v-A `dGjeCzH@f_}l" ['u;^Eoo UV9b=YF'Mvy yG`4J \>@Z_~W_ }pcNvXUpD@fw$IjfJ+~ZT/nxº¥x?gfkKoaѷ\m'5~yi/יּ?oPUJ3~LsOтf ;^_#y}^m}!2pvoN"GEX/WE?i?AaK5Dy/ a"&wrڞ[dg:ʮPiy6nN.:#׉鼭Ip¨kr-sD c FDghhDgSLqv:ɲ)3 T@,ҷͼ X.-O\ՍzeYN W-TX3 –)8jd&mmJ EnEtzvmm߾RR8[?t˳DvEv)kC^'nH$镙6nr[9KF/#I z^-B "Lt-C4*M$Rke_lZʋlkn-?u-\0g8Py,P`>`zt\ vhoֽ%ۯ` ky׮u@3Ƶj/oX׿-e~#1EA|g$9: x@3xGy6T;'|L",Rݟ)uFW1#P #U <'Fqh:ߞ?׋oF.y|;x8r_{/mʆJ[ZjoK7B4'׌F=T0GNy>:$ U``@YoGTWM)%aDpl5L+"c0~Vj L~?Emw :afڀ~^˟}]\<0!lڵ/~Nu̅޾yvJ6@< !XXX~v%cC.DkyЁJŮ% lb3^[nh>ΞyLAW,|WcD38# J$8<: ]Qb>y ג] \`- WrqnA[yh[vh[|yV֥~2]= q)*XP TG=lv?-LxWĿ濵<4|y'%"#ɘ-ؼƂZk%%ق^=Δ^g:@/\0%,f?LegQ҉hFssp&Fjg>oL+)$`66;_ĩt[qat5>!Gi9 `X4Gf[¦3؉L&x叴MGۮ 0ͯ #Z .p0U?.O=薗˺{@mcK3L~@ŷ3k.l*Dk~Wnc_8? ڷ+Y"/uQDI\tF ٧vl޲͞mrmJ_٦osXIu|$  >xBC0Nh>f!4OMoxvx \s }dwu?c-Jy'm!u?YbG(Cܤ]mbd 赌z,B5S{dA؍1 21kIGK`@-5vw7+!^]VBMmm-ּImnXMܢKbz1fc}lԑf_=[&эn-vf(a:IFtTr^SVSOu 1j  |C-3p kc<4.]k qvEC k46Fcpҳ׷tM*5 . /ġ F32X.]Iv\[Nw' ;*&@P4OQ;- 3jS 9 drpqLLה8oB@zK 0n[Fß 2=Usv1!Їmi. N>&ǎ=\̅@Y6gAUȸOѲ2Su?*.rbGI&4Lϡ?_ɞ>灾=XɃ\O>X"gNC}OQC;WxnAtPsDEШF.q*=(yQK*/ۢy3y^hm۽^G.] /]f,˜OP"Ɂu1oGRDgC3n2FiM= tGk22ux Y%-F {WeI| ZZoA] a-=Igi^nWbAӡeN5`H`Ǎz n#tZ/850Q!vHoObz 7<I|~YZ)!8@ E ;W/U-vgϞ (%7Tc;t{C̑9rkt{ɫmޡ?k~S;v^׳/quukI}`G }N)-"NjBB WcRrsgj k%&04wi ˂Y `6W?nvE?jwfsJWj_pu{Hԯx%$8t{Ќ9>|3szBx?p w$YFY3NYv裏C=ęaս_q]m6 |IMk[NN o NɑXOPc7@yq|*F]QoǏI>]۸^@i#urJiٍfݮT2yOpYe2<<c\\C-:]CRF?GMui75MKyC/ 0jԨeAC-1 $BR r{"a뿮wb:v1أ[+HϗER 8'_[fH@'m%3i500 qELw<4\~N$[YIi̾smjeňa /N;Œ~靎h`p.qt3y<4 ݭ\x}feABv`ΰ6Qݛܡ$LOH Κ#Y*)Fn4^,@+x6)`6uOǎ!>deϬI.p c,Tj c=0tK*Y?X(5f„ ܍UM*͙L麩5?0oUfwmu7u02d8؅~Oڬ;?'lHK{7o]+ 6|vJMy@6 Oc2(&vmI 7`D!*\hKU/Ƕq6l Z &<@GjKjjd͚Wn3?-wX?)׀9@hz_m>1ͷmk `,p ^Eо9}$=`t=zؠAQZ Hd6UsȁJX50b,;Wޗmb 2ة#KEڝVء¹ ,ȯ?kgOI,-Xc3絳}n<hs~[i];Jw#ŰgS;wvUXK"0J@`|`u/]3Y/uܗ.Yo]~a3zOޟlҹ`-ؖ kwO1XSI37Q7[; Wrw3pӧ9߆v79)͎70yxf?Eք]#ĵdwmAxȮ3}D.rw9}0.6&g@Zlp쯴 ]?/mٳ,+fa | 5CO;_QGUC+O:H$^R+OtզMy{ctG#?'9 C?TRȦSFP6aZ>]gkTkNȖIr"#l,K$osblUJ"Mg˱[kI.a|@VG: I` ɁnCѓ.`"߫W/ڏy9NWHhc3fy晎9Pvcbt ˵l3-vqh>jl1 >f?T249aǮ\/Ըa<܂UÁ(1l|{9h9˻Ś| eL˦`;v3DpnWDd6Z 4cmb}|diksa NXSJۄ]{$D~ 5‘<'6fwKLЖ2<U8P>O4 $S<8va,$3%~JF~?SHq2! 6@Mcc ˊB`Lzl)X|.5 B>n8G{܊6YV?v hKWƝmm?NG%f~V&Á|bpʱZ61VsFy%y^-.MaaDde<;{݀w#C:R9@ l;sf7.p6-jwzsp\0.U2f L۸llAE2X>k|$Яg#OmCoA"Nư.{/`x}BEqߝ(1׳V_.4W0;`?3PbG=xcwf" bk$b?ETo⿺s1$;餓 jJޖB l{$q!3 RC=$JWm^l$z%տ@m)إG+N‡8V9T7D>OcܧkL 4V}wVH3HyJ tmUf>2&MEVg,яҮQLa: !߯WKOv$ RBvdbwtwɲ/ʳ.2w9b'\c>6;jQR?%˷:jggN1{?hJJ;AN)93 !$>6YWqΚoۇVV }MJ++/J¢/JM8.P}Ow+ܯ؎9x,RcϏ>Gv2=zpFYdւqH d{]6 Āg3c]|0aPB KͲ{}DȪkU?/7>_΂e !do,n NȠf7H̄RauV_Jk3ekb[o#'|{n;$x Y>!{v?OiD?U\DM?07}M#}P9Oq;O$G9uY! l]#G# Β[ U*$yBhri@'.Bf`' #O>5]m:l `LةL=G(6.?/߻T'a.?PVVUrI7|bkw Ώ9gOwo>m1/nbfCeُn(0zp7־-}{,ʜB;]rj=` vxg0`#F 'aghdUcsRiC^+,1f)3YeАc^: l>%s3C^1l;`G޴G!#$FHh`$;FW>ɓ;[$Ɯ&Ffe# "ΣRK$[p-ː+HESmǷ% PLČ]p Zl /Ydeeri;^JGy;fc]dw_;cd 2s3&/.Bgڜu]+TBrbHZ 1i#M>t}z `wxe`;4~H<}"?xF|4!/Jjls!}^)9#-PYJ;>uڂi@8s 9[J ? C5!N|}]8fI/Mv =P8X/v:UBȜ]~֯۰1ViZT 78 gI&/ȯ"/ޱP,_ 7&\f| tV{R+hojb.jb~y:T 0lVᙇdysatkOLCua}32N ג fu"Հ?o}߂Ǟo/Ypw-Ns93i+a[Y|dW>`3g)| ra} |F3Pm kJveH]r vv${bIm6 e TIyaȹC*Y]3GF`Z 6a/Yݾk͵ _&1 '$s޼!WJm޵l޽T`uE,yATyffvʄw9 m@)S؜26P (Vw=Bu 0a#L@SAԵTRF2\ \RgLRw~$2rl⭶xY=?IyE}Н+mk6^$E0rXtN D Pxxj{/vl%g a, ^: (1UU}%!qY֯W;SOб:%;_%;KZ{_XP笳~s .9{C~S{]6~2kke@fL`$%KK,ַljSy0`H㏷nݺ9ɖπvUW9ɦ&ju'=JItZ(.Qhh0]Ig@&:C2}`HxJᑞ* /_D>lҜ; q#:vr0 ]}*->tH~BZ3zHq\R`f4 lcHqx*KwqM>>lg>7E[ڝl ~,C"xF*⸦6ZWi!J㠃C9ĩ!lN)̐VGɥ5W W177 tsaaiKUC 'K|Ӗe> Q` HbD |r7b'bu@xXI ܋gnO?BeXeʫ}OGV]V6{J鱗H?6~R~u*:nMuYbs fcv\=#{^{5{χGQgݻm<059S+Le_MlWX+gn@kCScx> >gϞm0}98hۄ3_u mܸى"D.-׮t<oƎ q֮p-?{%||/-Z*Ւ;a\`09ݍZ!""xĉMJ2Ӧ~RfGPi_e{dh1o{F;ً7ڢϊm̱ٺI!8֏9@}`>M>D!*K3^ߟ{'9% 6өƼ N /w}ԥ=yg(w Q^|E=-v(xЂl[ł2 'p%1CD+ZLq?X ~[ f/2u, M U&d<9}'xUuc}:,x I",T]T$" Ԍ7SaH{ѧ]!}#BB]*5pT:&p=ޮ?lNxsBIyB*J՘Zp; g1fJ=YGtURe[1YePp~dTF>T3^߷C@VXΗqㆍ +{OX[snmgR^) z0c k V'q唍 5 uh8ļVfZ1;;\5w(пVf\[oPRT"e7tcEh,B 3"^"t|A]TZ}O[ M~0UeQgv"\wi{ێ2Xd}Vk=lā]D8Qnn$ ٵ'@Cs 1˶Y8s_vŧ#m#:`ׁEn@ a,i e@2|7?ߜ\ѭև*{-x[}Lj%FZWgAMܩqpYy W}LxC]8u-XbO=f4  oCmR+Gm1cܵ&Nuo/649U~b(z ]<Zt+A>}{[nA{.:Z[?y} 0^8(׆ds7G1u_&SugS mN3 GWu*وB5_b -|Bjg4 (b<5!ƔX|D @B@ hh_ ӎGMmr*SS1e5]S-PqYHJ"@xb|Μ9ΘO~R"շlJ=ܦhy[᧋_`=}]f$}~,N &F@qbOŎ) xQ4v(BNv+;|x[z9[EW؊U2lMvLK"ߑdM)1;\yh-[{v9ۇY}3v\ o>}y@AJx_j ~@t  jQ.%|6lfd3wȗ;!<: p{;"pB{ Njx=pغu`:v&(3!Yv5KUsT/`?UfV[_ ar筠<$X$>)î,#slSNua!s ;gPҋ?ŗ5IUf@.Ûb}˂y9JePh+/X?D@_ 8bD2&h Jj@ /+z'0,L'|1S/:G1D ӧ |KM9%\{N>&>Gvxju+C5Iu7bh#]^$a\? G+?xvx! J @ ւ|RJѧq\P֫F#9V&y+Bbd;梈cp5kb0 PZ kѴ"PԉJ *i0>66m%*zMӟd5SU}J1_pHe9k9|sDj3{^/ȥ`^vˍKeܩ\pZ 2D܎o[ A JpSQ{y %qstqeŊnǘkɬ+ヨ`/M14zɣCmcA&ΩrIxmAbpC8vN#Z74s91ܣHf-Ab( LbwCbR4܅LP>yxl<5CD7]rQ |:Gn/я}@z~b @cJ, Ր0lرΫE*}ٟ Vv~|〯98-^$Z$upCOS4i6*xO&}:@fizN%Pݷyq-i)#îf Yѷ?}5Q;Y<>k%gqQ=F`5d4^KTXrū(6J@_y6}t7n]z饵3k4MkoWےeyFenB]A?Bv+jFLRzvf :y+b"d` +Z\5v.^(@Zu*mgYn$# #\,Bc {mҤIn96Bm!R|  Ju>YрR:lMzb~f@\i p xnUW}AoTO'#J(DӾYWN2y֒ ,F@LW lb-fi;SpL7HU8H1WQbxXDCuXgggtO >ޘPbhqAYvu?4;lkζb+o ]puyZ adN{*w y8/,,tF֯gC}SnOv>!J[Z-/kxcVx7Mc; pU8mVyX8.lh`حAG`8yG T5Xtiֵ*@p?b8=/;oҋY߄2Q6hǿg_ȂMR%/W'6p oc~v^:}U3Qn T&@:93mJ=vj^ԓ'yȎ ?h@ҝ!9p/2Ms|S;HQJp# MKyFU:nnh6AM&@*4FYm7]] 1Y@a*]Z>{YH # p"7mbOv 6 \@Oaqm~^k* -Ζu#the]:eЁm4sd [J@y Ȱk.̷>[lZ#oʹ}FŁzY$&Fҝ4 BQ]Cdo]upȻchQaC濏J `LfrR&P]:fTJj;1OyH}=DtՖ;ds0: wU|3 Ԅ%;zT"Xr'8(j7Th^CblI:nĂi@^dt*q<$?]^SKJKl {ic28@+6> VG4f]aLI?olYs  WͲM7nYmﮝ !aA.ۋŀduDOly 0䓛!)ƍ1,#N靫kԅ)9>mu aߩK̳k/noή87  N~qz0.8TFcG=c~I!7Hn" D%0˜3d \O&FÔ)SaN#<Ԃ-Xbx`)wOMK'`fIW6ˬYew(d ?$lTBfׁMUk립·! 0m&5&(!!1QEl;[݆dt4 @ݫk>nǍDq=hxY&%OWxBma[l\8>d@F_a2u{\1q5$kb5}y7oHOx8>iH  N>d:pWn c4e p/<)[G? K r{1^(y9C"XfsC 0Lx'͑]~_g^oG"SEj\F}_!LВr'~h|9M|?{ WU}ͦQ{%%z*M@ADE"E@E.R$!! ow޻3ofgfgNy7sw9o;}  2Hd]2xyp> LYnN:뚼QZTL(jzVb8ߙ_g5ի8R=ONzHG\8 N&uyRSJK,P˔ drީ%jEϱr]\Nq~ZQ%/^->^n[ڇ_¥ xE#$# {aFbӐ`4Q2R=[e“6%HtR" 8-?Ȱ5))ʀeVJWFTbuu{ NFAƬur=;!m=7"Ȑ@ ?^Xދ6p?tIJfm$CavƎǀa>t+qʵA>x_, ӗ4KM1O¿]:)XO?5Q<h(ڻMO.u!T׾RpEuz)A CUU{u+S5-fX F~\ |!q2K7dPd3l,k37.&Ȥ!pHڀդzD .ZE _1ʄt"~_\8"O(i(6q߻jVfKg@ȟxDtkʛ tq M7u 4ʧe-5ɗbU '@J[*T`E(NѣG[?bG8aڼy o1S声0^f+aO=dRvh9VfVHd^^1uBYmgÛٰF .Vˋoը7Ⱦc_.a:?ܽ]Ļ)vZ帩E^(Q pO'M$T {|0 L=%IDX$lI^,NBuGpW+ϵ_hyO 蝁r7/S |6>NE;@:P}7{﵀AТRRNJ >UƍH'׍kƵf/8' a9dhc/8tj@B"])cFzsH3gTYDg}sϿ,^yUr&|m49VjL(9, R~ yO9*_弩  *+`nt`lDZ^efB?i )Y7xeSri ]IrO-OT<`feR-؟&ͼV }} F2]o‡Mxqqa$I$.r2y %*q=zX=Pj)-:? GwXx/90N{Iݳk?PF)kc$x^ׂ= NSɓ')=VyQG“jdNGӷf1yr>/U TYYa\]_ ҙ[ rmOnQjU H{Q0XRd Xn394ףaIuZO)_WW cpΝ{Az>B칇d /J蟍yVMګIJ .Z4TIDDW?EL0!щT%Ƀ6 600"w|61r%cZ$f')nX+BN`Q SUH?4ӿ^vm.s>ZD_Vm1JF g=giʝ+KB#PSgCjacV}Fmxl%<@ UZ$OJIs?E81%;g} 1yNa|EE_'[(+̀b@g)c<0hw)j;wj;Zd;VCWı9rm<>&7"W0d{kMqtDb'l?}Md$hц18ˌjz1K hلM64;cZ^Y-9*J2e_H=XIޝU\*PƃX\饔m5/oEb&CL>@s2-!7p}繯JdD 6Q<۴+ :0)ڸ)=`IJ+rj|MdMօzzv_g:gL;cLM޿n,;cXη J( (W/`7\[^x$Bnzřa'!P^29%GDU~ !5ՋWZ?|9&PO *#)v~ Ҹ>pikٲesN= qC}UdFO ˒EOǩ1PC ge92~dA̟V @. .; E`4LG3pm (np߽z Mx13 |fyr5î1}ݬr;a;.p Ip%p[U(PtHrR-M68h=%`U0O>c<ꜴYhgY|17cK 7 gw ^ h6Mm˥Lgk*0ץWKD;\[z)VX6  ft a?TrCX;7b<n%sU)acTx!c9u@Kc"-҂kD2 Z!^,9 dNC$CD56xC(xƌp0ȓ0 ~%ҿO6"菷BF4E]C|BFDkzZ(蝏/{eX6Xk ԡ{nCU=qZ~0&D' X#lUXֻw[|nz\A=Y,|Q [ 5UVjEW@#Cb J~\0H65V7`l.C4Eۿ5k2e>A AGJ hp.7P, &T*>tCɓO>^Qh{Mݦɷd/fM#3V/ߞ!urrz?'`FIh&qN .%W"DOG$hF(QӘ)a:3 xK6HIj&P7QضAA Ⱦf͖s,odXix lDq6bOAq GO?>H80cƫsZS+EuY'gf@;d;1wd=kQ`z]^٪bеIɂc+RB.85K$^-a=O;nk%e6 :ƪuMj|ReY} Ua-F3%w=?7b@=H#D׋2l0U1a51@OV\4LH&@6a-Ď[M=@mMic<{F0SڹMw~G'$ψ=ۚ`F .xD>Z)k@ $Xc:S+SUusX5;: #&Vag2 zF ~Qq/!OP;(3oVϼcM3 չ 'uZH#tP^q {$mPg#Fx&cHE{~مQ#Cxo!n n$oNzRDa~>RP}d~$.NO}d0>:e@IDAT˼϶$lIl~[ |4 دOŒL%c詅qm116 Tn8Ct]g{ȺTɨkX1QAH׋'={T}JPzLhs2AiZ'WXXo/`Te>7pNmzS,yW #GaUPԢ +?nmB#ДLVH@9V oMyS֊4ZTe]hnPp̶m)!"G`Eb,je@rȶƢB"ulL2 q.Y,J<$C>sf"BWE}~I|.]T~m#Zd txJAxNzr{<1&92eB@_!(f~U!O #q  %+?Ei<3]-8Jj*z`,z{dzaqQyfkheDD,\/ĠƸqx׍bS"*8dʐw-?0Xn?@e6 ;CV&5@i!F܃0YW 9D5z%IGnE+OBX j=ֳyDzu/a+74c;3 vW8ڭՉZ:q4gt'T `eRB;JX *CHU"&o_+peZaZ<&N&.lA."ui(г<44Z0w􄒆Ғ5PL}^YZiE-oP%P#5va{26~(. u+oժ; F@t8!m h u3𽍆8$INFP`{` w H;jyQ"fE^0[Aa;/2wAӜ[op]d,׋bTC쓌`2|PSSQ 0qP~:;4Wo+|Q]Em+p='31o':Mڤ61kA& ҒRyT`MhweivkubvPtnb$ HkO uo=5 j^1uDw^It͓͈ibĸPe֬Y*=Cd c%^h/P K2.z9"9")X |zwϔ@oF>zEe wNxU-5v_A6 ɉyM&%aH}tz >!CF0`{@1wx xjbe䣰G-w9-R(+͐3W"߇h? /7C*@_?>׋T4F2+V dP"i(+`+[ϴc}mcRs#qg}V|A}Wr!/UEnӤZ2-%c71cG{`ckX),ںk=8k%T ڳciMtq |5}J]@{_vkubvWhzb0vVp-gތOgTj@'NE%YhcHLjX^hF:dܜڂӒwt8q  $C*G.W}u'[iq02ga}p]WR!WM~>)q;"Jr$ti~*Xc6F(UԫUE޺͍;#H5 $V#{:ے%Id0$@xRf|P"!O>V.B҂* KoC +e#lfȉG2Sy4 #dp?cb\ cc!%B!@kZ9m_ruש$(ڻM{~lW*J{~Akj]zq֪J0PĖpU̪'Mz'fç . V\`ma'wmؔ8`?ralP\|E(yvu,Ϻg] juҌ@9fفHo!h O0V4h"yP4i)+/9_ӯT}L;@N9 M%ϽQ-2U ^ ΁MKͮA&ˡp%*U1bp[FV5}~O{ougìUAb .T 4hG@ʛ' M@{^[h(ڻMH ڂ* >i(eXd! [3pQ*)%̨B [GK] i{y*{&LH4 $\ڑ&8L 3P@#*ֆ TmdMDyǔO_P 4H&!$[?G|#(e #T xTl|;P|&k-Enst֫;S䟧<vi$vc${ێgP,tuiC9Ds?0„;&IȓTqd]2b(:1r`(nU}PW %?=$ÀrzYfU}ofdHJgEV|/n܏X0?߇Z9 JD$* K蔪tGQўnH28Te$h260,{B2i 32ЙFq 3N?H/i+~$?FjbF Tx UXHwļ5gfR/v#\i1ϟ"y~S퇈_ 1 ķzKfϞ݊Ճr1^YxbMN3e'axM;Plu,X\/_C̟o$Ћ)S#x >_zfF3&_{:$G)JeP5or`N>2'!"F AM }rն‰GZ^OVPjV%2^KNh?x #@U8B=8:@) A/ mAІS:sh;1delݺU;1`{dDLI22P]n{KOK$" m45VNupmg!`W)<sW3VyTC;}a:59u! Y nwdhȵ 4JW3-a e,[>HE"5EOD-꘺>M?O0ǍՈo#C$k?@D t+,Ew!9<[O+VQ~]vc(˒__X&-p1ȥ+를^P9fj1-By Pr <{2i%ɓ 'Gu…a[CF#>@,}sTJ`?Њ >([~tz)Gyq"uжB)O7†oCTBr/z@j`@S[Pu܏XH PmedPB|vy[P3g]wݥ(& m)J.{Ҋ0rm~3<Ŀ@I'aᇉ赕6KPR\ M[vz2B.H]p3:.p' 즓&Y%R8BQ|kfshX'X 醔[ //@ E"@B_^xK+T"2ųOW3Je&uGVs 캭ꢎ?:+,o =q>lO?Cy70Âd0RcΜ9ꮎb'NqyXG]]Yn,/}9<-4477gC9U#S,(NA6LhhD`VT5^HR└ QF CGw Xnx3w "$v}]y饗Ԉ d *nιH'<9,X %KJl;AP﷩; n~IҿO[]w@P=aCpFF۠Ͳ2d $+_@3$2F xpw>2 [ d0T״-g^;YZ̝zFZp6T =zJRP"a97z Xl$s apY|*=#G.a^E{ij@Hdˈbc$ oDHϣؐV7?b%UU0{Dwڬ(ql ]QW+fycup?DcP D?? Q+K_yώ~ ܥW(sp+J>3MoBZ"5YH:@""C|D烘9{VzC/{%hlnz!1ة9_SsǏ$ڍh'FJxL-u` 5^a!mP&Q&B -.[ !'+઱Q;RS`Hil,Ϊk]6oier!$: z;hmhCaתEHʬ 6p@رVt/L{-jS"`ڵF-H >)8Th~t\s%dg!$5WF[RD23d Dφ]uoTW`} %yiyJƬL"5P J mm ׋hjdx} b pO_ nUn_]"  DvfnD&anNaÇ9[> ~DA{#?K/zaah.@7+r#Ѝ.sw`1nM~;kIxU@I7a 5ek޷*Ym_ٌ UVKC}<']e+rdpM! 5P_|!O?Jpq/+W -XWf2O_Yi+aI2fxp(?$Ncq$i:͉Ti5'' 4nj6 1S egyP"/7Ck[Ub1yrzH`.nOUި k{(c$Fr{J\z~\~Q7%|m<@@`Uoz Y؞= Cd`7n|צLj |pHϗ?xb^IS-˙Qt6MCJ=Vۇ/ȗC Mh_&=8Z 7iu$0/< >+p)I z#.ؙ=VMT J+*J*f'fV/# XzSNpS @L2(PVByp h0Z~prrtyB솵}U߿mc[ep, .֗__Aլjd.ʞj!//<(=pWez>ap#2F<#C>8SN*U-.q עh6M`3m!= aa@{Pox gwtŬ2$9'$2Bۖ|Oziq0&R@b"E8)-EOV??t=uphFyBwh*l E>yL$i_ݶm2<6tu΅a0 E (U wJxl) Fcn,A:OT \KJ u;DV3Y2 DZuz ^P*k` 6P C5;/&hD(]{W" 9RQnpW7.Ԡm&} a~ڟe XE%*6p'.<֮@$6 R i}ݮcD4(ubP7Shu<}k'3yW#msg?F<D =̘1C&L \r|RZwqy&$鎎b)6dE zਖ਼Ã0p@9;2lսQ/ޝ1^6^{pKS`U}MdNY<`m+SC$.n, ۓKL[}Nt1Oc/E& OxjF  (v̛{V~͊ 7ϣFdO{ 81/0Pz p!7vD'}Q+A9z5pf2S:|̓knۮFb30f~\++֎zTUSzR?Z}t3 [žr=z2HF#AKz:_zSr0/P^- fh/Cf5NwUc+'[~|x hؔ0xj*ޣHU#_ >\D!S嬳ΒV\[Nj͜u&y;ѵ2111A;yy 3ےH<) zMVyi'j*F87fW_ w`$/ @1h4G50 /9yPEڌ-(okaZu"ʏRg:moz?}Cv{uܾ}DB> *Pߝn͚5?xhk^=iNU&BZ\If?[\yq72EC k1gQ ;X:hV1q\\RUohG $1Z` [=tYѣk۷260poc= ׿d~'ׄ>>ć;έ^+0=][Y7W_Z\k9M 񏔈>~F >7X4qmYJҦ4 \@1U~~ԯ #@/^76T*˰W6Cif(O+H7_yLr-FZ Zr3,]TxeRэT$;Dd r@b1218Vpgw*yH!L:E O Ϯ O3%3dP" >wؖ{Sm2\zK"7 3%G( tah7i8vE؛d?*XЖGw`7R }xo<ؤEW_DD@Y~ b0,ф&2*4v3Y,fk;u0ܼ[)EinJ'RO@$U419 O"=4ynӆ@{'d(e7nu|"p"{΅WԾ-# P=@Slbd0ÓpkoS $AK&/{k>e(_U"5B:Aau;V4E0T6*V5}OXRTNR(}= T'X0rHA Eh=܈(hT$79^E{ityԞ={Ȟ}{(w0XfK(00ZQ˸bloVEZmniE%"U WpU|V* o99 !] kAGY@lG^.4";^lSfZ"ȓqr!r9߮zq4{Ͱr ":pgiZA$0sL7oZ~4]t ޑkڕeMsN*f Id\ˁ,8ۿvɬyu utQ -Ep J 'h ͖fa [=Kzu:x(; x[l=~ W'sʟPZ!_#w^Mr#|?2'O5?%x6wa9<־v"ΩwѸed;PnڗS OfWm;U co Q0fmGsKx *!Y C{裏E]={9" JmgL9:^(}w+@ޓwz|:V~2TGR8DVn\ዖ50 ~ tkrZS2h`Æ *j*e8L2c,#JNT#,z:9_@O0Z00~:j>7ߔ_ uGm+Raeďu4ydyySk`:9tY6RuM8~*~]Ƕg;n <؁)W(-s~>a-ؔ{x2JHwc#D2;%S ^ @h;jJ돻Z9$Jwi{Es$ӻ}vpnD v`ѱޒq4=n-(WY"+i(,<\yeo]`YCS1i4>+<wM1~[h,pРAj&e տOP|%mNfpT XI6÷=O{.+ %+·ʁpJ 2I$V?se ^C~udX/. {'|ׯ kjkk)/©Ea2-z#(++XH{46@&˗7wAhfKahisݜ!TP}K74P(:Dm+@ ٫eG'wp`7az-,h|?i\*`#%',<'Ó|0!dHm4̜BB `P2XBq fSvV.=z-[inx bwBIwiKJJĽ4$5~Kke p xהTAI%@82WKy8*yS;,yj;uT2Ԥ`/xtkG=mlffOGs@BH$ ^ܹsӖFEX_5HɺM`4JXuK6yns' gOQΜ T BDKxZ%?.7|?L($瞌&{ܯՊ=d9Dz o+ҿ`q̞W/aTn / #l#3/C.erQUki`Ȑ!?of  gұi jW^w-i ::̦۝ɛ hW WHzXUX/bW[LFNqNcȜ먳 7D'M[maF0 +[+& \OD< z ο|\>@IDAT$裏*@ pe=SKw*kZԅ0=03c$ !mhvjE:>#JPn0:ymf|M?][,;Vg±c|jQ_ą>@pQKV^)PNg?>veZea:U+Pi85)nۖFD!Vu=# E=_lCWpT6wq=rW_щq'ʖ.(PkԀ ٯ e{e8'gC`1`԰\ vVmPO9^߿0Rw%K= x)OH+۷o_ǘ:uL2S?˟7婞~j/lBewEч] <4}`?"ޤ@x18v.Yd QyJtnAgmR%2\yh/7H+N{mP>D_EoVZ#`/ja<*w9l&ӫ%E }Ö!#-¯Ø1cNN:IHS}:$ T9` | ,MW u^vxѼ hWauXNȣF7L:#,3A:ذX\xtш 0k,e{ruѣT#UDi33 #'K}?$d{\}Zvjz%.7lnp)X[KWP;8V *ᡠ ݻ˴iP m4,^XV\{A2=O+㾑@r3g^ZuQU_ 1lu 2A8}]h :c"%юOH++<F)r2G5)(Lޤ,38+:V8i;sdf_$ٟC8y#'"ކ #3v+;k_ٽ^wmduZ}SxY7bO?3T e ͖&vkMZTGJO r+ n'Ti=x /P 3>@SSlٲE~mC=4*:9j8zS*' # TDw-ٯYv!a{V pma/.?aR6q-ts-k[kg|qnixi\BMʻGJ]L2֮ rD=n_g yBfsyxQZ9 դu' M|Z8 z2P? cB(rE!X"8z@L 9efx|Tce#TmjvP&Ve~'apY=yE/?Gc{Vi+))QWr{07 zU艀FKKKc NxCa_ 6VgӨ%\no#)~@an3wioTN89jH|2ISfzM3eL +K#i,?d3M@G3 "(CavSQO2)0@{@9_gJlyD>@`}ܚ_tpNhI xCS;jD(/^|ג5 !*!rOf;07&_X)=ʲ䠉^֬7]S l Ro(=pr=AaMW~sNTXXɑ(>`ӦM{(3;f k3j2s/ҟpaTC Bsa9 ״E̵!&)W\վ0 "e 0 F?EK\_³&H] uA.}z'PyfSyijkrā5scqX;BD7yMK4a&_| N!!&t/͔A{Yv 3L"~@f0  `ݶfy "߿ShP7v,22E`>`ٱYV?[=@jDDVvFL}}rw("X{`GgypY|%jD4 7+H.bMϤZ4'ԟ!`9>>,O@)ʣ@ORѺ9ҥ ]2z9(@T LD= ?Xr45 gD{w.q_0¿):<S<͟?_{1E "HO@?PMiYQE+[U;1CY|ucޝr'g'HQ!'+`Jޟ]+!rwnݺ %0㙧jնmm O" %@"o߾1= ͺxd3όVvIqO8H\(-5d!ܙH0bp^>~kn}]/rD*b )X7)c)h]_`Klq8UjAP`',2g`cBd^:}LMk0'e;S+bWSz5 X"j֭[jpN 8&Z^+믗c9FEԣ1TywY Q 8 o)8vkCFɑ?_Kx)/PPb(QVu$ &+"߿C^Q-UUVmA!%C!)0Rgȑ2{l Gd$vmcc|*m0m4aL g-jjjk(XUX º :e$VM"TiM^%-\Զ{g` YӴ=7uxqw\Geui0%D )Bkz^qH9gg^Yƌdߏy|epSu;/ⵈg WGB^xA 93TT-P%[5K_ <"%փ=LJ e; JQAsRIw5@Ш&΅5 ! IY2:uSx9w?O{쩌1cƨʕ+Ր_~~*6ieez^ ' HUmݦFף;Qw&;hVuW $9geSAzQE\kj쏯r4y}7dh;t[J9K<%V"l8CkX]f 9owm;qG,qE nji@׿#SO=%W_}#*CuseY2y|W}ʲ1iܜLill#)nh6nVK%I/d饲Yj`p<7[~B=ШUr׍_4hX,|W~P#EX}ayG`ԩSM'i[ov}vwW+@tD|F_ O2gw^kg |> #xA)/9rQ:Kp}IPw@k߻+ڑ8nf6m>}]T 1Y'!^7b!b[u*P/sΑSN9EPgxSS?8߳wh"tQZ &@nwNkɊyef18W(oЁ9r-Mn֘44xٍ[9u|u8qZjϧ-KUf͚%vR?3vAxiƍ iRգ?Zӎ"lDPuf4A<Ap  d׷]]Ew |Qׄ\w} (AT E@4&ySݧv~_:Uuz_: +C` k] F<sꩧ y8E(l`zI\~_?k_M zf_٨/ۓWeSQY[xygv?TcZ 3mm^Vqggxg;9 M|tæ5ddZӨgC)^Ls:ŲV\ч=ě"uwzzċě[UoP( {ӧizv;O_vsE6 W׬.>̌ wǪ0uJs~1g\rj,F@x3SQ]+=#`޼yϟVZ h{G8䓻nN=ب؎{GO4IC*|ӄY;9shQb#^lTf?˯Qcx?k;Qd<|V8lZ{uk3uEyV7K~"²+O 4r_ꅭt6:.ިqseO8-',f:#H8b%f 7^YtT xXeW璟HiRx?P<5ಫքo?|z5¬}ao-{ڜoj)G2ksYfE>nE/zQe#ױuە|:!;Aglg1ىW'#YʬLk Osr.&{gɩ]M@|zJlB Y1OҠ[) Ӹ5X쩕6 X> $-钦9o.pꩧ>:WYַ̝5>'t{աtLpφЮ!lɍsG4z;XaZ/{@9A;p@ Xa*ƀ>v1Cy7f¸qX\ $u)q=3_н޶18 wWf D%*Zl3Sd1NZJk6EPFc%?$I%9Qdinƍs ]vY?p 'qzڂ_8eSl6w;q 7o|G~#az(zFHdPrDɎg 5˘ٯ? M<[)@OLթ| CLzi{V؄3bl){VԹP =U/JS$離X"|K_ z׻Ygnm҆v4mzݡKU !x=a#/PiCeWP.v8A!w Y1+&PI6J&!:*pu#n [`Ӯ*6KR&TOtU2H&O \ GҦ{'| {wmwS;kgFnGӹG q I5Zy\RGd@4Vq4u;|_+$ESq?WZzY)dQwnw~S'$019ߕk,;H.tWE *٤>ӽabJ jJ*˓PBw?^=C]~)rIӝx;>я .gXP/~Z㿺ʭxH%6aTT%se_)F -8GvEq1GodNg;GND=κQ,luշހnuzDEkJ\Ce]*68)[gpT45 8@]x;IBrd9py煟mo{[8þmc>-x, j]g$=rF[vI$,/=Jvy'^$0|(؈dfMڟ"dskʐINMc:J2]c|.' ѳj6/aLU)NJRQMj'/!cFxWf%#>+ߒoInx_{,|3 zj8쳃7~QhoT9GCƭGqhW=a#m>ۉV,)y.EVas2gdi+ F;j=̞]7)?#6Lcga۸}:V`JLl'ݨSj_Y͒µ.Htս+ϩxA|N#y`ɞn- pG- {wלOQ,8/$ZyS/My)o]7l>xE8~wؿE/@#x@ >LE;LQ)oLQsb{R  Hձ=|Do?YO;`{1$M>44,tQQJmQ?>R"b\tw[UFi=ˆڋz䓒K%%Mw/»O~2? m_c95ɪSGoTŴ}'K{s]<$ unTlUVg}6NuGɓOPmDpr_a+.^tU\_W5Wڔ,Y~ʛ3hO%/?%%}#&izkkºu.3gN6m k1+6V%+e_6r)aٲNN$>v&pz;WQu=gveh%5ݐd+}䗬YoX9u8n5u.MN=iʦɽIЅukM؀Q |PYJb<^Dcd(.zj)XzXRY0!@%'9K=T>φs 7tShC[Txzf܎\pF.fo;1ngk璟2B %P6p֬FN;@Y@0wz˥A6vnG_np=]-?W 9[rddV>^vr/;MJOz H{ӕ3˗*#+R a! xjᡒIJEƺ׼&ixK^.\g&5I--⢝jxϵKᔦ5nk zrR%]{WW &08)o:FL_9|K\ʛBeeH=gmKm z3$o`U @@F{IVGm=w<EM4W)}Ř;{7)Xt"w`Y|BE$'H^"lⲀ׿㎋Ο?lE1o)\N&餫G//=7*8@M htFUP9& 8eWŧ[g/oNT^Ӛʁ3P3f;:=;ǜ c"^øc: E"6vV(:{;n+)LUES@A{Q4K8P̗" bv )? 0*nx佒HՊSgy&{@83ÕW^YoqlU-5}oK[UF>gɒ% .\rIBB=Œg(\^*9Kc[‰ibf͎L6t5 uɒJh B3Mh{e/LTkuC"+Ƭ:3uƚլk^%r!ٹ@O!§$WJNBrdin|/7WUS4M{NEAwnT~H"AVUϱWj>:M=xfRV8mKe?Ѯ6C]+$$t\ bm~JI^(>{ G$~@TgYv k)ˈt 1vWJ4yc@W: o/M}UO~o;<կ2%ڌ@qm\ dJmk(a1y8wg8gUYS@W1n"M[˓ci/KM :&~hW֕:mϭDb'@+޷S*Mfz@XV^m\EMzU k$_\-:hxjS^?@4ӓqTir%E|v隅*#+%j 5lo  @腧,ڠyH!ْ'x"uYꫯ'tR pa9s4홭, NV>Zzu'>gm"m0{ߛQ il#`quګ\lЧ`Sf͔%fWcq@yN@;: ~wwژmYiDk׮.ϭnuiJTfHӦrHQ\]kTQLXZ}G^'j8\rd\ǫ*ߨܢE§?ӟ4Ā#8"8iRS;՛SGO?tN:.#:@Xꏮ%o;7Sޘ?kg޼@HΝr)&xMYZuuߧ[7:C@z,-zߗ|[w#}7̧O@*rIj6i۔t==_=&p^fɫ%^'%Mu7xc1s^c?>4>27cfʕ#'/1.9 v<[OUD6 'KNMX_ZN* x)jv7/M p#gn1vY!f5oKa&Y.Z!GҤk9y׃Ue`x#wFT)Hpx. _}8fx+.GZE5᷿ms$ C` hծh6ܒ}hlR[ׁׂ͚U0=FDmmm\6G'j05IQklTV/+ռ봠8}oB2?r6\Qzi<@ϗXO$9Jr69: iGyd8CìYL Z*s9/nT>݈(DS^ gMJP!G%ml*&,^}}q4EPDzmz\6yI=}S]']b@R֏ -okUMork e+CY\78χx14*LGr)9Xiw__*W2tAa`koοK.$x:"vpdKT;FSe/)ڪ1>c9Y?H~jdLbGO-yHeAu.|=zӷԩSQlXZk}O2)netBEŜbҵ-3W@`?MHPT7|s 𨣎 G}tw}^+#^>+_JXtio[%$DS8t+XexMbj}k!mʕd=^ J[@|g/au`x.|=#4mtՀw;wCx''|"O<9*+x?a~Nk!_S\*/owa96ThsxtJ<%rċ%w̔4y{7x}>|Dݎ;Ȳz}CᮻDrw2@2^׀rں}' qy(ڞLÎ(oEnIm?]7H:exirBݲe zV2 VFpf)3#AM~ZyO()My%VҢQʑ,"I1PJ>a`_p(Eun}1 M$>Geox?x8s 7;<#Kf̘GC#߀M9OKO]6$pi֩U*/,U^:ʕ}%(74U5_KL_. vU NUmdzPR y}(=ڿRޅUSO=~:kBVkK%ZQI:\eZʸ, {t?ٵoNjA#,I<+GLTw=O ^p!4X;To&l-Rߐx?B3 [Y0 a ̀;b*;9[PdNoOwm\J'K/IDAT6Uk+ۮi=QrNQ%l)İv)URΥ%b{By2Q<_Tn8z}1Ď޻}?pm5╼keQe@x'Qtի! LF\fctkQd6m: 0\*r^zۊgq,{whLz3>v*p=7M;f2jL-eIr[N1}'վ=uϫ&pPB{M%̓4K/4w85M{V|^ۨP}S 5Tʁ@{XjUi|-' Jv=֞ 4,e@<+ x:"kƿ'j x;9Ť]6pw?ٳ'MiR2[UN,mֿeY_iF~_/nF KCK-]Gp@x I[%M휷>yaq4iaR VuIcn}in8ש3%n@Yv$bUvX#4k0 4x~A`JC!)m6Ttԁ [kOWٶ='MwN{,gŊ=L>-6\hAXY ﹚Xрc+Ҵ 7me[p@JȚ MB '`)Txw7xk_^җV͠gJxÿ;3$ JЈQLT) .m6kǦ< GRɳ8~NY12;AζBW-5yMim=f83ƒ>بbIh7*3ժ\W7 ʖak^LZQN9Fo=dXq/PhVښGMOKКF`F<1O nt}6l}3k^ 0^.#/+{&TW:Z]ЕoKA} ؈J^c4w^>hnIN'oďo9|c 炏k%_)W$%8W%r#yvIAGy'T-w + Ek]j㷽vN۬AGUK- te~Ve1p'j/Q4h13gj>Uq"gE[.#=Gt`v'p*x7{ISs=pdž:(a6-*ܛ^}OhE3%)AW|H/zt7l1" â}n gTYcibҵ) njm{-;?ԇRxS tu( ]!H%JXw^Xpa\uSN9%<'l6MK .ַOe v?PyR:ChS;('D ~JVɚJ8Uyw, -;s7t:Y|Rӂ$>`ƌ-O=*3iXK~S.᱃a/ut<)Q_7Id-uxwzh<=E/zQ8Ѱ:*m x+26y% ]OЄR$Ik*wl*Y%OmDѥ$ѓۚ~u2+ ۴iS2UVyF:Nt <<j >eʔ,JSC[;9007YxFϯ~Um65 0:wxUlWoW/:/txӿF1ONUN~̎M1ڱPvvNgq?/RUGB[:!?a.OD96O޲N֜.LHb.gq.+W#thZvpq@{Xy9mx&Cr}/^%^7;o޼pqE Ο??;CSGy$\qnH zdz+ٍUN$ٔg3fX٬NO#L>ϝГmiۄM eB](B]iLu9Ծ-Y FK2;G͙ϤE}U7y1;:d^%GF$$z.+6};|ĠO,..0{XWvtݒ/I1޳ d;#nНD[%_(@G8E ѮqU&_0_u/O3FZpr4ߩW7jӳp]@.>$Co@{x읣 1SV/ zOӵ\rOk9n^hO:n/xYgxc%m֮]i~q798kNA,s=;9p~n:>8o!tVKftDmGQ&TDvMb(Ӧt/ƫ.!nn'4zԝI%D?&.!@@|mUwKSkdg{jMGV, O.B\ɻśT5=:fζ8@s x&7L/MrwvnѢEq֘/ҦiA_mBn|[rĜqp(vaW8HJ1+BS8/C6? c|<;_u{SI+zoHJLn}WI¬EeN 1SzRTyc.rx^%`ߑ&d]G;>^ ,ۥ1c'Z<m YYhմȚ|(1>⽔?lՃv>˝ZlUzꅒ6<h%y'w`[*qZ{ [flzdcrZSiT;kO!j7JJu nP7U e_θNm蛵j2e=嫭,omјL1iˏjsǫf":O@ύ|e:{ZZGz7{&5EiRgcҾSC\LUNGu?')8@QtsSr7z^JuK>)!>Y[?Xik:U.dyF~lIL ,5~NmtӲl2lzBVI˞gK|]}t>5.]m]R͵TV!}I2^ 5=)W͛[-5^CzE$xmwǍLgߕ/ 8kl/`v[0mÖ]џ**#JIqYtim\.|>OOK;QI!f}fh+]>-?K˳gXXo]˲F*)]T;c7[ζIޏMm L%^O{%<#ef-.;Jl 3&8:zQx5l NyC~݈)Mjݭ-7']x 6{T+F1/s'NF5uXof5O~#%+ᘵКytE`䅒H<:=+$}LOT;*?%=^ \BRqUKyJ=9]H ݂ǣd?,rE_fU5q=#nglaƌِV`E?I]=Jɓ&WGuJUQN'ZOX|, %GKH̓ I:ɸwgՒ%/A!E![GɓlB(Et>J|Щճovg,^x:yħ5z=Ek<)s6{H {ٳܹs+FGSobN6MzT3lw&L&-)yli&O4 =B- !x^O% 1w!i玀b# |JNj-YYOJ`)\c<t4lW'VEkCCzS=CE=tχvS~ʓO>֬YnؠM~iʔ)q*5h_.-.ŔXUBykLrJ7#4e < 6b;2a)E^JaO?vۑ3xESN+VXJiwz@G+O7)$Ok_]fΜ93,fm⪆L^p.?ПVLTLm;qDɓB^@[ <ݺL⎀}$DpM$/8-[@β;zuM.8g",ϯaLrIuL07B+y@20uLR9~$P[*F]"M7ͻk ꊯ[.xp6g V?af޺[$)1\G6zmwM"! {ォFsi%iKfVRbVa} wq3YrƌeʴikIc:>\vy>W)unS*{KQܧQ: Jzj X1Bn qoB͔N$t~35wL}֤%a Rlk)d+vö?bV#2Yan`zte@`jvVqG%n\"wxGiZX~_+=qS}ěruo*&ORJiO..eR*%6mSO>uM74[cwhd֛i{58.֑֟%QAuȺ!^5SC[ou^};,-W^/_jZs}=~HqfMJ]bKN.:yҔnC>_`;T:@wVxs΍O,sB@K4H6LQy6g8čg="E͖믿oNViXw?FҋF9ɽJT;GVѣ}-RI&E;Vee=o…׿g aYS^B{ ^~{@@ Dek;p/S\)Oџɮ{?O Wg(@ *+$jB\.;q  wij.NdڭP=%~^t~ C 3f٤YU' j᥇|^ԋ.q;mz8!eGh@UG7q|K6lZ 7ron8+6i=\pm{t9[H[^V?H @B޿΁q(%/?5>}>rz͚5aڵaoa 8w;͛袋~[!DB*Q4ZG`v63~6qW7@?{5?2VHx}WvF3 9$QE|g~7Yih6p74>M^]&%'.O{t.#wh}4͗a*qh#j~= w@r ]{H\ãG>~ywPv4"IDATX V{PcvYYE@F:M4&Xm?:Ӊ6QtN'dlvb0V# $bW+ >XE]~ ilgsfwwy9{w_+ %zmtcG.y89yblZ3 ##Bc||mml5n pIt?YY><L!2q} P"<^7>0Ms;:ki-sQߴ@ F)n'm$KCzyGM"[dD8O!6J'wydPPP8A^;R7k>Gߡ%;.G=u iQ+*A4 ݸK?<.N)8m6xi4>;A !}BzrHysϧEݻZjX6$Yo2?o`l*8fU&""c=2Cku~47=@هey}Ϟ=}Vn+8(\(0[Ɇ\)nk]oX>BKwwwuCC_ica) Ȼ4@{My'J>߹3oNi՘q80 EJ lajҥ*=kEϟNV|Xr}9JjdzbanB bc1>0 TZZ1@ '(K<.^욞6&{Rrm}Ƥ̐cb,_+EhF:VѮ#"`FVAAIrcK~~xIIQ7n4M9yxTUU Î˟_.l./^z_pk4c܊i>-ƨ\%sgNxW"#tn.jjjZGɸ \ w$wh:^V,}tSgo%۷C9b4^$gA!RqkA|0gsr@Iҙ}dS5)| x~@YлݠKW]NCF7e?sւ%d()]ط4 I;^~FGxKۺr\TF&l4}Mb1JJYlƒho@DQf+" ID^E%^lW$Tttӷ-.r*ZNsw'U4|ِ% iw|6gnѝ_vʨ.~;K`xu3HEHS\==oi*Wɷ?w!wu)1/\?MKKU}cag kTѩwO`swo3۬Z햗h=ߏe`K*+,v4Ld4aRu#B< &33 lMJp2]VZ};OcV).[is B?o?\ш hɈG!h4ժpt * 'SތH ԉk 50*JʤSPyt ̒b{ȰӍ&ܼy[;DzN@ L~[^^^@Bw+Vx i 3Bw;0яLI],[QVVY)7qT&3.]v8 SmSrH屰 a P1Yb6(s l0@ ` c.?dEEssso~/Vs'WAJUǣK*ՆK.uQE0H}>?:sxU*.@. * * * *****************************************************************************/ #include #include #include class ShowErrorDialog: public QDialog { Q_OBJECT public: ShowErrorDialog(); ~ShowErrorDialog(); void setText(const QString txt); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QLabel *txtLabel; }; #endif // SHOWERRORDIALOG_H klog-1.8.6/awardswidget.h0000644000175000017500000000720014166020407014277 0ustar develdevel#ifndef AWARDSWIDGET_H #define AWARDSWIDGET_H /*************************************************************************** awardswidget.h - description ------------------- begin : nov 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the search widget // #include #include #include "dataproxy_sqlite.h" #include "awards.h" //#include "world.h" //#include "utilities.h" //#include "filemanager.h" class AwardsWidget : public QWidget { Q_OBJECT public: explicit AwardsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~AwardsWidget(); void setManageDXMarathon(const bool _dx); void setLog(const int _log); void setYear(const int _year); void fillOperatingYears(); void showAwards(); void clear(); private slots: void slotRecalculateAwardsButtonClicked(); void slotOperatingYearComboBoxChanged(); signals: //void actionQSODoubleClicked(const int _qsoid); void debugLog (QString _func, QString _msg, DebugLogLevel _level); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution //void recalculateAwardsSignal(); void requireCurrentLogSignal(); void requireCurrentYearSignal(); private: void createUI(); void setToolTips(); void showDXMarathon(const int _year); void checkIfValidLog(); void reconfigureDXMarathonUI(const bool _dxM); QLCDNumber *dxccConfirmedQLCDNumber, *dxccWorkedQLCDNumber, *wazConfirmedQLCDNumber, *wazWorkedQLCDNumber, *localConfirmedQLCDNumber, *localWorkedQLCDNumber, *qsoConfirmedQLCDNumber, *qsoWorkedQLCDNumber, *yearlyQSOLCDNumber, *yearlyDXCCQLCDNumber, *yearlyCQQLCDNumber, *yearlyScoreQLCDNumber; QLabel *yearlyLabelN, *yearlyScoreLabelN; QPushButton *recalculateAwardsButton; QComboBox *operatingYearsComboBox; DataProxy_SQLite *dataProxy; bool manageDXMarathon; int selectedYear; int currentLog; DebugLogLevel logSeverity; Awards *awards; }; #endif // AWARDSWIDGET_H klog-1.8.6/klog.10000644000175000017500000000271314166020407012463 0ustar develdevel.TH KLog 1 "version 1.4" "Jaime Robles, EA4K" "Hamradio" .SH "NAME" klog \- The Ham Radio Logging program .SH SYNOPSIS \fBklog\fR \fI[option]\fR .SH OPTIONS A summary of options is included below. .TP \fB\-\-help\fR Show summary of options. .TP \fB\-\-version\fR Output version information and exit. .SH DESCRIPTION \fBklog\fR is a ham radio logging program for GNU/Linux, macOS and Windows. With KLog you can log your QSOs and save it in ADIF format. KLog helps you to manage DXCC, WAZ and IOTA award. .SH USAGE Enter you QSO data in the top left box while entity data, direction and other usefull information will be shown in the top right box. .P Previous QSOs are shown in the botton box where you can click to edit them. .P Here is a list of keys that can be used to navigate through klog: .TP \fIControl a\fR: Add a QSO. .TP \fIControl d\fR: Delete a selected QSO. .SH PRINTING KLog has a very basic printing feature implemented. .SH PREFERENCES You can edit the ~/.klog/klogrc file to setup you call and locator. .P All the data files are saved in the KLog home directory (~/.klog) by default. .SH FILES \fI/usr/share/klog/cty.csv\fR contains the DXCC entries read by KLog. \fI~/.klog/logbook.dat.\fR contains all the logbook and information of KLog. .SH AUTHORS KLog was written by Jaime Robles, EA4K Download the last version from: https://www.klog.xyz Calculation of heading and distance was taken from Loccalc code by Marco Bersani, IK2PIH.