klog-2.4.1/0000755000175000017500000000000015003153303011423 5ustar develdevelklog-2.4.1/logwindow.h0000644000175000017500000001477015003153303013616 0ustar develdevel#ifndef KLOG_LOGWINDOW_H #define KLOG_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 "dataproxy_sqlite.h" #include "logmodel.h" #include "awards.h" #include "utilities.h" class LogWindow : public QWidget { Q_OBJECT friend class tst_LogWindow; public: LogWindow(Awards *awards, 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(); void slotOnSectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); private: void createUI(); void createActionsCommon(); void createActions(); void retoreColumsOrder(); 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); QStringList getOrderedVisibleHeaders() const; 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-2.4.1/elogclublog.cpp0000644000175000017500000006217515003153303014440 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" ; //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(Q_FUNC_INFO); //qDebug()<< "eLogClubLog::eLogClubLog - END" ; } eLogClubLog::~eLogClubLog() { delete(util); delete(manager); //qDebug()<< "eLogClubLog::~eLogClubLog" ; } void eLogClubLog::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished" ; result = data->error(); //qDebug()<< Q_FUNC_INFO << " - Result = " << QString::number(result); 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()<< Q_FUNC_INFO << " - NO ERROR"; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(result, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< Q_FUNC_INFO << " - Result = Host Not found! = " << QString::number(result) ; text = "ClubLog: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< Q_FUNC_INFO << " - Result = Time out error! = " << QString::number(result) ; 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."); 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()<< Q_FUNC_INFO << " - Result = Password Error! = " << QString::number(result) ; 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()<< Q_FUNC_INFO << " - Result = UNDEFINED = " << QString::number(result) ; 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()<< Q_FUNC_INFO << " - Result = " << QString::number(result); //qDebug()<< Q_FUNC_INFO << " - Result Text = " << text; //emit done(); //emit signalFileUploaded(result, qsos); emit showMessage(text); } void eLogClubLog::slotFileUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotFileUploadFinished" ; result = data->error(); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); QString text; if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = NoError = " << QString::number(result) ; //qDebug()<< sdata; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Host Not found! = " << QString::number(result) ; text = "ClubLog: " + tr("Host not found!"); } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Time out error! = " << QString::number(result) ; text = "ClubLog: " + tr("Timeout error!"); } else { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = UNDEFINED = " << QString::number(result) ; text = "ClubLog: " + tr("Undefined error..."); } //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result); //emit done(); emit showMessage(text); } void eLogClubLog::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eLogClubLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total); //qDebug()<< received << total; emit actionShowProgres(received, total); } void eLogClubLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eLogClubLog::slotErrorManagement: " << QString::number(networkError); result = networkError; } int eLogClubLog::sendQSO(QStringList _qso) { //qDebug() << "eLogClubLog::sendQSO: " << email << "/" << pass << "/" << api ; //qDebug()<< "eLogClubLog::sendQSO:: length = " << QString::number(_qso.length()); // 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); } if (_qso.length()!=18) { //qDebug() << "eLogClubLog::sendQSO:: length - END"; return -1; } currentQSO = (_qso.at(0)).toInt(); _qso.removeFirst(); //_qso.removeFirst(); //qDebug()<< "eLogClubLog::sendQSO CALL TO USE (before checking): " << _qso.at(16); //qDebug()<< "eLogClubLog::sendQSO default StationCallsign): " << stationCallsign; QString tempCall = _qso.at(16); if (tempCall.length()<1) { tempCall = stationCallsign; } //qDebug()<< "eLogClubLog::sendQSO CALL TO USE: " << tempCall; _qso.removeLast(); QString qso = getClubLogAdif(_qso); //qDebug()<< "eLogClubLog::sendQSO: " << qso; QUrlQuery params; params.addQueryItem("adif",qso); //qDebug() << "eLogClubLog::sendQSO: QSO: " << qso; //qDebug() << "eLogClubLog::sendQSO: END"; uploadingFile = false; return sendDataParams(tempCall, params, true); //return sendData(tempCall, qso); } /* int eLogClubLog::deleteQSOid(const int _qsoId) { //qDebug()<< "eLogClubLog::deleteQSOid: " << QString::number(_qsoId); // 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()<< Q_FUNC_INFO << ": Call: " << _clublogCall; //qDebug()<< Q_FUNC_INFO << ": : Params: " << _params.query(QUrl::FullyEncoded).toUtf8(); //qDebug()<< Q_FUNC_INFO << ": email = " << email; //qDebug()<< Q_FUNC_INFO << ": Pass = " << pass; QUrl serviceUrl; if (_adding) { //serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); serviceUrl = QUrl("https://clublog.org/realtime.php"); } else { //serviceUrl = QUrl("https://secure.clublog.org/delete.php"); serviceUrl = QUrl("https://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()<< Q_FUNC_INFO << ": - callsign 1: " << _clublogCall; } else { params.addQueryItem("callsign",stationCallsign); } //qDebug()<< Q_FUNC_INFO << ": - query before send/delete: " << params.query(QUrl::FullyEncoded).toUtf8(); 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"); //qDebug() << Q_FUNC_INFO << ": " << postData; manager->post(request, postData); //qDebug()<< Q_FUNC_INFO << ": - END"; return -1; } /* int eLogClubLog::sendData(const QString &_clublogCall, const QString &_q) { //qDebug()<< "eLogClubLog::sendData: " << _q; 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; } 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; //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()); // _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)); } QString qso, aux1; qso.clear(); aux1 = _q.at(0); //qDebug()<< "eLogClubLog::getClubLogAdif: Date: " << _q.at(0) ; if (QDate::fromString(aux1, "yyyyMMdd").isValid()) { qso = "" + aux1 + " "; } else { //qDebug() << "eLogClubLog::getClubLogAdif: END error "; return QString(); } //qso = "" + _q.at(0) + " "; qso = qso + "" + _q.at(1) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 10" ; if ((_q.at(2)).length()>0) { qso = qso + "" + _q.at(2) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 20" ; if ((_q.at(3)).length()>0) { qso = qso + "" + _q.at(3) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 30" ; qso = qso + "" + _q.at(4) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 40" ; if ((_q.at(5)).length()>0) { qso = qso + "" + _q.at(5) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 50" ; qso = qso + "" + _q.at(6) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 60" ; qso = qso + "" + _q.at(7) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 70" ; 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" ; qso = qso + "" + _q.at(10) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" ; qso = qso + "" + _q.at(11) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 110" ; //qso = qso + "" + _q.at(12) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 120" ; if ((_q.at(13)).toInt()> 0) { qso = qso + "" + _q.at(13) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 130'" ; if ((_q.at(14)).toInt()> 0) { qso = qso + "" + _q.at(14) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 140" ; if ((_q.at(15)).length()>0) { qso = qso + "" + _q.at(15) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 150" ; qso = qso + ""; //qDebug()<< "eLogClubLog:: - QSO: " << qso; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" ; return qso; } void eLogClubLog::setDefaultCallsign(const QString &_defaultStationCallsign) { stationCallsign = _defaultStationCallsign; } int eLogClubLog::deleteQSO(QStringList _qso) { //qDebug()<< "eLogClubLog::deleteQSO: length = " << QString::number(_qso.length()); //qDebug()<< "eLogClubLog::deleteQSO: " << email << "/" << pass << "/" << api ; //qDebug()<< "eLogClubLog::deleteQSO: email = " << email; //qDebug()<< "eLogClubLog::deleteQSO: Pass = " << pass; // 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)); } 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); //qDebug()<< QString("eLogClubLog::deleteQSO: band-1: ") << _qso.at(8); bandid = (_qso.at(8)).chopped(1); //qDebug()<< QString("eLogClubLog::deleteQSO: band-2: ") << bandid; 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; } //qDebug()<< QString("eLogClubLog::deleteQSO: bandid = %1").arg(bandid); 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; 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"); int x = -1; x = deleteQSO(_oldQSO); x = sendQSO(_newQSO); return x; } void eLogClubLog::sendLogFile(const QString &_file, QList _qso, bool _overwrite) { //qDebug()<< Q_FUNC_INFO << ": " << _file; 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()<< Q_FUNC_INFO << ": ERROR File not opened"; return; } file->close(); // The rest of the form goes as usual //qDebug()<< Q_FUNC_INFO << ": email: " << email; //qDebug()<< Q_FUNC_INFO << ": apPass: " << appPass; //qDebug()<< Q_FUNC_INFO << ": stationcall: " << stationCallsign; //qDebug()<< Q_FUNC_INFO << ": api: " << api; 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(appPass.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); //qDebug() << Q_FUNC_INFO << ": " << multiPart; //qDebug()<< "eLogClubLog::sendLogFile - END"; } void eLogClubLog::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); email = settings.value ("ClubLogEmail").toString (); pass = settings.value ("ClubLogPass").toString (); appPass = settings.value ("ClubLogAppPass").toString (); settings.endGroup (); } klog-2.4.1/adif.h0000644000175000017500000001175715003153303012512 0ustar develdevel#ifndef KLOG_ADIF_H #define KLOG_ADIF_H /*************************************************************************** adif.h - description ------------------- begin : ago 2023 copyright : (C) 2023 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 controls on ADIF standard Refer to https://www.adif.org/ This classs hould not need to query the DB neither the DataProxy Class */ #include #include #include #include #include //#include "locator.h" #include "klogdefinitions.h" class Adif : public QObject { Q_OBJECT //friend class tst_Adif; public: Adif(const QString &_parentName); ~Adif(); void init(); bool isValidFreq(const QString &_b); //>0 bool isValidPower(const QString &_b); //>0 bool isValidK_Index(const QString &_b); //0-9 bool isValidCQz(const QString &_b); //1-40 bool isValidITUz(const QString &_b); // 1-90 bool isValidDXCC(const QString &_b); // 0-522 bool isValidAge(const QString &_b); // 0-120 bool isValidDistance(const QString &_b); //>0.0 bool isValidAnt_EL(const QString &_b); //>=0-360 bool isValidAnt_AZ(const QString &_b); //>=-90-90 bool isValidA_Index(const QString &_b); //0-400 bool isValidIOTA_islandID(const QString &_b); //1-99999999 bool isValidNRBursts(const QString &_b); //>0 bool isValidPings(const QString &_b); //>0 bool isValidSFI(const QString &_b); //0-300 bool isValidSTX(const QString &_b); //>=0 bool isValidSRX(const QString &_b); //>=0 bool isValidFISTS(const QString &_b); //>0 bool isValidUKSMG(const QString &_b); //>0 bool isValidTenTen(const QString &_b); //>0 bool isValidLogId(const QString &_b); //>0 bool isValidAltitude (const QString &_s); // > 10000 (10000 is a default value in KLog) bool isValidAntPath(const QString &_s); bool isValidMode (const QString &_s); bool isValidQSO_COMPLETE(const QString &_s); // "Y", "N", "NIL", "?" QString getQSO_COMPLETEFromDB(const QString &_s); // Translates the DB value into an ADIF value bool isValidPOTA(const QString &_s); // TODO bool isValidWWFF_Ref(const QString &_s); // TODO bool isValidQSLRCVD(const QString &_s, bool _importing=true); // Y, I, or V) (V on import only) bool isValidQSLSENT(const QString &_s); // Y, Q, or I void setLogLevel(DebugLogLevel _l); QString getADIFField(const QString &_fieldName, const QString &_data); QString getADIFBoolFromBool(const bool _b); // Will produce the ADIF format if a bool is received void setModes(const QStringList &_modes); //TODO: Do not depend on external source to fill signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); void InitializeHash(); void setARRLSect(); void setContinents(); void setSponsorsList(); bool isValidCall(const QString &_c); QString parentName; DebugLogLevel logLevel; QHash ADIFHash; // Name, type QStringList notZeroFields; // Numeral ADIF fields where having a Zero makes no sense QStringList ARRL_sects, continents, sponsorsList, modes; }; #endif // ADIF_H klog-2.4.1/showerrordialog.h0000644000175000017500000000426015003153303015010 0ustar develdevel#ifndef KLOG_SHOWERRORDIALOG_H #define KLOG_SHOWERRORDIALOG_H /*************************************************************************** showerrordialog.h - 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 #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-2.4.1/softwareupdate.cpp0000644000175000017500000002762315003153303015176 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" SoftwareUpdate::SoftwareUpdate(const QString &_klogVersion) : QObject(nullptr) { //qDebug() << "SoftwareUpdate::SoftwareUpdate(): " << _klogVersion; util = new Utilities(Q_FUNC_INFO); updateDialog = new SoftwareUpdateDialog(); latestVersion = "0.0"; repositoryFound = false; url = new QUrl; setVersion(_klogVersion); callsign = QString(); OSString = QString(); messageShown = false; OSVersion = QOperatingSystemVersion::currentType(); //qDebug() << "SoftwareUpdate::SoftwareUpdate OSVersion:: " << QString::number(OSVersion) ; findOS(QOperatingSystemVersion::currentType()); setHeader(); //qDebug() << "SoftwareUpdate::SoftwareUpdate(): - END" ; } void SoftwareUpdate::findOS(const int _os) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_os) ; switch (_os) { case QOperatingSystemVersion::MacOS: OSString = QString("osx"); break; case QOperatingSystemVersion::Windows: OSString = QString("win"); break; case QOperatingSystemVersion::Unknown: OSString = QString(); break; default: // should never be reached break; } //qDebug() << Q_FUNC_INFO << " - END"; } SoftwareUpdate::~SoftwareUpdate() { delete(updateDialog); delete(util); delete(url); } void SoftwareUpdate::setVersion(const QString &_klogVersion) { //qDebug() << Q_FUNC_INFO << ": " << _klogVersion; klogVersion = _klogVersion; latestVersion = klogVersion; setHeader(); //qDebug() << "SoftwareUpdate::setVersion: END " ; } void SoftwareUpdate::slotReadyRead() { //qDebug() << "SoftwareUpdate::slotReadyRead: "; } void SoftwareUpdate::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << Q_FUNC_INFO << " - Start "; QUrl url = reply->url(); if (url.toString().length()< QString("https://api.github.com/repos/ea4k/klog/releases/latest").length()) { //qDebug() << Q_FUNC_INFO << ": URL too short" ; return; } QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (reply->error()) { //qDebug() << Q_FUNC_INFO << ": reply error: " << QString::number(reply->error()) ; } else if (!redirectionTarget.isNull()) { repositoryFound = false; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); //qDebug() << "SoftwareUpdate::slotDownloadFinished: Redirect: " << newUrl.toString(); url = newUrl; reply->deleteLater(); connectToURL(url.toString()); //qDebug() << "SoftwareUpdate::slotDownloadFinished - end After connect"; return; } else { //qDebug() << "SoftwareUpdate::slotDownloadFinished: no redirection" ; if (checkUpdates(reply)) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates true" ; if (repositoryFound) { //qDebug() << "SoftwareUpdate::slotDownloadFinished repository found" ; if(latestVersion>klogVersion) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates should update!" ; updateDialog->setVersion(latestVersion, true); } updateDialog->show(); latestVersion = klogVersion; repositoryFound = false; } } else { if (repositoryFound && messageShown) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates false!" ; updateDialog->setVersion(latestVersion, false); updateDialog->show(); } //qDebug() << "SoftwareUpdate::slotDownloadFinished: checkupdates false" ; } } reply->deleteLater(); //qDebug() << "SoftwareUpdate::slotDownloadFinished end" ; } bool SoftwareUpdate::checkUpdates(QIODevice *data) { // Checks if there is a new version in the repository //qDebug() << "SoftwareUpdate::checkUpdates: " << QString::number(data->size()); QString line, release; QStringList stringList, klogStringList; QRegularExpression rx; QString filterString; QString fileExtension; switch (OSVersion) { case QOperatingSystemVersion::Unknown: //qDebug() << "MainWindow::checkUpdates - Unknown" ; 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" ; 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+)?(-RC\\d+)?.dmg"); filterString = QString("KLog"); fileExtension = QString(".dmg"); //qDebug() << "MainWindow::checkUpdates - macOS" ; 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; if ((line.contains("browser_download_url")) || (line.contains("tarball_url"))) { //qDebug() << "SoftwareUpdate::checkUpdates: line contains browser_download_url or tarball_url "; repositoryFound = true; stringList << line.split(",", QT_SKIP); klogStringList << stringList.filter(filterString); release = findMatch (rx, fileExtension, klogStringList); if (release.length ()>0) { updateNeeded(release); } //qDebug() << "SoftwareUpdate::checkUpdates: " << line; } } //qDebug() << "SoftwareUpdate::checkUpdates:Latest/Actual: " << latestVersion << "/" << klogVersion; if (latestVersion > klogVersion) { emit updateNeededSignal (true); //qDebug() << "SoftwareUpdate::checkUpdates: signal true"; return true; } else { //qDebug() << "SoftwareUpdate::checkUpdates: signal alse 1"; 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; //qDebug() << "SoftwareUpdate::findMatch klog - chopped: " << str; if (rx.match(str).hasMatch()) { //qDebug() << "SoftwareUpdate::findMatch: MATCH: " << str; release = str.section("-",1); //qDebug() << "SoftwareUpdate::findMatch: MATCH-1: " << str; release = release.section(fileExtension, 0, 0); //qDebug() << "SoftwareUpdate::findMatch: MATCH-2: " << str; return release; } else { //qDebug() << "SoftwareUpdate::findMatch: DOES NOT MATCH: " << str; } } return release; } void SoftwareUpdate::updateNeeded(const QString &_newVer) { //qDebug() << "SoftwareUpdate::updateNeeded: new: " << _newVer ; //qDebug() << "SoftwareUpdate::updateNeeded: cur: " << latestVersion ; if (latestVersion< _newVer) { latestVersion = _newVer; } //qDebug() << "SoftwareUpdate::updateNeeded - KLogVersion/latestVersion/newver: "<< klogVersion <<"/"<< latestVersion << "/"<<_newVer ; } 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 << ")" ; messageShown = _showWithoutVersion; setVersion(klogVersion); //setTheURL("http://download.klog.xyz"); connectToURL("https://api.github.com/repos/ea4k/klog/releases/latest"); //qDebug() << "SoftwareUpdate::neededToUpdate - END"; } 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; QNetworkAccessManager *manager = new QNetworkAccessManager(this); 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"; } void SoftwareUpdate::setHeader() { //qDebug() << Q_FUNC_INFO; QString ver = util->getAgent(klogVersion); //qDebug() << "SoftwareUpdate::setHeader - ver: " << ver; if (callsign.length()>2) { ver = ver + "-" + callsign; } QByteArray str; str.clear(); str.append(ver.toUtf8 ()); //qDebug() << "SoftwareUpdate::setHeader: " << str; request.setRawHeader("User-Agent", str); //qDebug() << "SoftwareUpdate::setHeader - END" ; } void SoftwareUpdate::addCall(const QString &_call) { //qDebug() << "SoftwareUpdate::addCall: " << _call; if (_call.length()>2) { //callsign = _call; setHeader(); } //qDebug() << "SoftwareUpdate::addCall - END"; } klog-2.4.1/adif.cpp0000644000175000017500000005213715003153303013042 0ustar develdevel/*************************************************************************** adif.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 "adif.h" #include "callsign.h" Adif::Adif(const QString &_parentName) { parentName = _parentName; //qDebug() << Q_FUNC_INFO << " (" << _parentName << ")"; //init(); } Adif::~Adif() { } void Adif::init() { setARRLSect(); setContinents(); setSponsorsList (); } void Adif::InitializeHash() { ADIFHash = { {"ADDRESS", "MultiLineString"}, {"AGE", "Number"}, {"ALTITUDE", "Number"}, {"ANT_AZ", "Number"}, {"ANT_EL", "Number"}, {"ANT_PATH", "Enumeration"}, {"ARRL_SECT", "Enumeration"}, {"AWARD_SUBMITTED", "SponsoredAwardList"}, {"AWARD_GRANTED", "SponsoredAwardList"}, {"A_INDEX", "Number"}, {"BAND", "Enumeration"}, {"BAND_RX", "Enumeration"}, {"CALL", "String"}, {"CHECK", "String"}, {"CLASS", "String"}, {"CLUBLOG_QSO_UPLOAD_DATE", "Date"}, {"CLUBLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"CNTY", "Enumeration"}, {"COMMENT", "String"}, {"CONT", "Enumeration"}, {"CONTACTED_OP", "String"}, {"CONTEST_ID", "String"}, {"COUNTRY", "String"}, {"CQZ", "PositiveInteger"}, {"CREDIT_SUBMITTED", "CreditList"}, {"CREDIT_GRANTED", "CreditList"}, {"DARC_DOK", "Enumeration"}, {"DISTANCE", "Number"}, {"DXCC", "Enumeration"}, {"EMAIL", "String"}, {"EQ_CALL", "String"}, {"EQSL_QSLRDATE", "Date"}, {"EQSL_QSLSDATE", "Date"}, {"EQSL_QSL_RCVD", "Enumeration"}, {"EQSL_QSL_SENT", "Enumeration"}, {"FISTS", "PositiveInteger"}, {"FISTS_CC", "PositiveInteger"}, {"FORCE_INIT", "Boolean"}, {"FREQ", "Number"}, {"FREQ_RX", "Number"}, {"GRIDSQUARE", "GridSquare"}, {"GRIDSQUARE_EXT", "GridSquareExt"}, {"GUEST_OP", "String"}, {"HAMLOGEU_QSO_UPLOAD_DATE", "Date"}, {"HAMLOGEU_UPLOAD_STATUS", "Enumeration"}, {"HAMQTH_QSO_UPLOAD_DATE", "Date"}, {"HAMQTH_UPLOAD_STATUS", "Enumeration"}, {"HRDLOG_QSO_UPLOAD_DATE", "Date"}, {"HRDLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"IOTA", "IOTARefNo"}, {"IOTA_ISLAND_ID", "PositiveInteger"}, {"ITUZ", "PositiveInteger"}, {"K_INDEX", "Integer"}, {"LAT", "Location"}, {"LON", "Location"}, {"LOTW_QSLRDATE", "Date"}, {"LOTW_QSLSDATE", "Date"}, {"LOTW_QSL_RCVD", "Enumeration"}, {"LOTW_QSL_SENT", "Enumeration"}, {"MAX_BURSTS", "Number"}, {"MODE", "Enumeration"}, {"MS_SHOWER", "String"}, {"MY_ALTITUDE", "Number"}, {"MY_ANTENNA", "String"}, {"MY_ARRL_SECT", "Enumeration"}, {"MY_CITY", "String"}, {"MY_CNTY", "Enumeration"}, {"MY_COUNTRY", "String"}, {"MY_CQ_ZONE", "PositiveInteger"}, {"MY_DXCC", "Enumeration"}, {"MY_FISTS", "PositiveInteger"}, {"MY_GRIDSQUARE", "GridSquare"}, {"MY_GRIDSQUARE_EXT", "GridSquareExt"}, {"MY_IOTA", "IOTARefNo"}, {"MY_IOTA_ISLAND_ID", "PositiveInteger"}, {"MY_ITU_ZONE", "PositiveInteger"}, {"MY_LAT", "Location"}, {"MY_LON", "Location"}, {"MY_NAME", "String"}, {"MY_POSTAL_CODE", "String"}, {"MY_POTA_REF", "POTARef"}, {"MY_RIG", "String"}, {"MY_SIG", "String"}, {"MY_SIG_INFO", "String"}, {"MY_SOTA_REF", "SOTARef"}, {"MY_STATE", "Enumeration"}, {"MY_STREET", "String"}, {"MY_USACA_COUNTIES", "SecondarySubdivisionList"}, {"MY_VUCC_GRIDS", "GridSquareList"}, {"MY_WWFF_REF", "WWFFRef"}, {"NAME", "String"}, {"NOTES", "MultilineString"}, {"NR_BURSTS", "Integer"}, {"NR_PINGS", "Integer"}, {"OPERATOR", "String"}, {"OWNER_CALLSIGN", "String"}, {"PFX", "String"}, {"POTA_REF", "POTARef"}, {"PRECEDENCE", "String"}, {"PROP_MODE", "Enumeration"}, {"PUBLIC_KEY", "String"}, {"QRZCOM_QSO_UPLOAD_DATE", "Date"}, {"QRZCOM_QSO_UPLOAD_STATUS", "Enumeration"}, {"QSLMSG", "MultilineString"}, {"QSLRDATE", "Date"}, {"QSLSDATE", "Date"}, {"QSL_RCVD", "Enumeration"}, {"QSL_RCVD_VIA", "Enumeration"}, {"QSL_SENT", "Enumeration"}, {"QSL_SENT_VIA", "Enumeration"}, {"QSL_VIA", "String"}, {"QSO_COMPLETE", "Enumeration"}, {"QSO_DATE", "Date"}, {"QSO_DATE_OFF", "Date"}, {"QSO_RANDOM", "Boolean"}, {"QTH", "String"}, {"REGION", "Enumeration"}, {"RIG", "MultilineString"}, {"RST_RCVD", "String"}, {"RST_SENT", "String"}, {"RX_PWR", "Number"}, {"SAT_MODE", "String"}, {"SAT_NAME", "String"}, {"SFI", "Integer"}, {"SIG", "String"}, {"SIG_INFO", "String"}, {"SILENT_KEY", "Boolean"}, {"SKCC", "String"}, {"SOTA_REF", "SOTARef"}, {"SRX", "Integer"}, {"SRX_STRING", "String"}, {"STATE", "Enumeration"}, {"STATION_CALLSIGN", "String"}, {"STX", "Integer"}, {"STX_STRING", "String"}, {"SUBMODE", "String"}, {"SWL", "Boolean"}, {"TEN_TEN", "PositiveInteger"}, {"TIME_OFF", "Time"}, {"TIME_ON", "Time"}, {"TX_PWR", "Number"}, {"UKSMG", "PositiveInteger"}, {"USACA_COUNTIES", "SecondarySubdivisionList"}, {"VE_PROV", "String"}, {"VUCC_GRIDS", "GridSquareList"}, {"WEB", "String"}, {"WWFF_REF", "WWFFRef"}, {"APP_LOTW_RXQSL", "Date"}, {"APP_LOTW_RXQSO", "Date"}, {"APP_LOTW_QSO_TIMESTAMP", "Date"} }; return; } void Adif::setLogLevel(DebugLogLevel _l) { logLevel = _l; } void Adif::setARRLSect() { QStringList pARRL_sects = {"AL", "AK", "AB", "AR", "AZ", "BC", "CO", "CT", "DE", "EB", "EMA", "ENY", "EPA", "EWA" "GA", "GTA", "ID", "IL", "IN", "IA", "KS", "KY", "LAX", "LA", "ME", "MB", "MAR", "MDC", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NM", "NLI", "NL", "NC", "ND", "NTX", "NFL", "NNJ", "NNY", "NT", "NWT", "OH", "OK", "ON", "ONE", "ONN", "ONS", "ORG", "OR", "PAC", "PE", "PR", "QC", "RI", "SV", "SDG", "SF", "SJV", "SB", "SCV", "SK", "SC", "SD", "STX", "SFL", "SNJ", "TN", "VI", "UT", "VT", "VA", "WCF", "WTX", "WV", "WMA", "WNY", "WPA", "WWA", "WI", "WY"}; ARRL_sects = pARRL_sects; } void Adif::setContinents() { QStringList pcontinents = {"NA", "SA", "EU", "AF", "OC", "AS", "AN"}; continents = pcontinents; } void Adif::setSponsorsList() { QStringList psponsorsList = {"ADIF_", "ARI_", "ARRL_", "CQ_", "DARC_", "EQSL_", "IARU_", "JARL_", "RSGB_", "TAG_", "WABAG_"}; sponsorsList = psponsorsList; } bool Adif::isValidMode (const QString &_s) { return modes.contains(_s); } void Adif::setModes(const QStringList &_modes) { // TODO: Add here the list/table of modes to feed DB creation and/or to prevent depending on external sources // from this class modes.clear(); modes << _modes; } bool Adif::isValidFreq(const QString &_b) { //qDebug() << Q_FUNC_INFO << ": freq: " << _b; bool _ok; double f = _b.toDouble(&_ok); if ((_ok) && f>0) { //qDebug() << Q_FUNC_INFO << ": Freq OK" ; return true; } /* if (!_ok) //qDebug() << Q_FUNC_INFO << ": Freq NOK: NOK" ; if (f<=0) //qDebug() << Q_FUNC_INFO << ": Freq NOK: f=0" ; else //qDebug() << Q_FUNC_INFO << ": Freq NOK: NOT-KNOWN" ;*/ return false; } bool Adif::isValidPower(const QString &_b) { return (_b.toDouble()>0.0); } QString Adif::getADIFBoolFromBool(const bool _b) {// Will produce the ADIF format if a bool is received if (_b) return "Y"; return "N"; } bool Adif::isValidK_Index(const QString &_b) { return ((_b.toInt()>=0) && (_b.toInt()<=9)); } bool Adif::isValidCQz(const QString &_b) { return ((_b.toInt()>=1) && (_b.toInt()<=40)); } bool Adif::isValidITUz(const QString &_b) { return ((_b.toInt()>=1) && (_b.toInt()<=90)); } bool Adif::isValidDXCC(const QString &_b) { return ((_b.toInt()>=0) && (_b.toInt()<=522)); } bool Adif::isValidAge(const QString &_b) { return ((_b.toInt()>0) && (_b.toInt()<=120)); } bool Adif::isValidAnt_EL(const QString &_b) { return ((_b.toInt()>=-90) && (_b.toInt()<=900)); } bool Adif::isValidAnt_AZ(const QString &_b) { return ((_b.toInt()>=0) && (_b.toInt()<=360)); } bool Adif::isValidA_Index(const QString &_b) { return ((_b.toInt()>=0) && (_b.toInt()<=400)); } bool Adif::isValidDistance(const QString &_b) { return (_b.toDouble()>0); } bool Adif::isValidAltitude(const QString &_b) { return (_b.toDouble()>10000); } bool Adif::isValidIOTA_islandID(const QString &_b) { return ((_b.toInt()>=1) && (_b.toInt()<=90)); } bool Adif::isValidNRBursts(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidPings(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidSFI(const QString &_b) { return ((_b.toInt()>=0) && (_b.toInt()<=300)); } bool Adif::isValidSTX(const QString &_b) { return (_b.toInt()>=0); } bool Adif::isValidSRX(const QString &_b) { return (_b.toInt()>=0); } bool Adif::isValidFISTS(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidUKSMG(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidTenTen(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidLogId(const QString &_b) { return (_b.toInt()>0); } bool Adif::isValidAntPath(const QString &_s) { return ((_s == "G") || (_s == "O") || (_s == "S") || (_s == "L")); } bool Adif::isValidQSO_COMPLETE(const QString &_s) { // "Y", "N", "NIL", "?" return ((_s == "Y") || (_s == "N") || (_s == "NIL") || (_s == "?")); } QString Adif::getQSO_COMPLETEFromDB(const QString &_s) {// Returns the ADIF QSO_COMPLETE //1=Y, 2=N, 3=NIL, 4=? //qDebug() << Q_FUNC_INFO << ": " << _s; int i = _s.toInt(); switch (i) { case 2: { return "N"; } case 3: { return "NIL"; } case 4: { return "?"; } default: { return "Y"; } } } bool Adif::isValidPOTA(const QString &_s) { if (_s.length()<1) return false; return true; } bool Adif::isValidWWFF_Ref(const QString &_s) { if (_s.length()<1) return false; return true; } /* bool Utilities::isValidComment(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidName(const QString &_b) { return (_b.length()>0); } 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) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "I") || (c == "V")); } bool Utilities::isValidQSL_Sent(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "Q") || (c == "I")); } bool Utilities::isValidUpload_Status(const QString &c) { return ((c == "Y") || (c == "N") || (c == "M")); } bool Utilities::isValidFISTS(const QString &c) { return (c.toInt ()>0); } 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;ield = 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::getADIFField(const QString &_fieldName, const QString &_data) {// Receives the ADIF field and the data and returns the ADIF field with a blank space at the end. // Check if _fieldName is a valid ADIF // if (ADIFHash.empty()) { InitializeHash(); } if (!ADIFHash.contains(_fieldName)) { //qDebug() << Q_FUNC_INFO << " - No valid ADIF: " << _fieldName; return QString(); } return QString ("<%1:%2>%3 ").arg(_fieldName).arg(_data.length ()).arg(_data); } bool Utilities::isValidARRLSect(const QString &_s) { return (ARRL_sects.contains (_s.toUpper ())); } bool Utilities::isValidContinent(const QString &_s) { return (continent.contains (_s.toUpper ())); } bool Utilities::isValidPropMode(const QString &_s) { QStringList propModes; propModes.clear (); propModes << "AS" << "AUE" << "AUR" << "BS" << "ECH" << "EME" << "ES" << "F2" << "FAI" << "GWAVE" << "INTERNET" << "ION" << "IRL" << "LOS" << "MS" << "RPT" << "RS" << "SAT" << "TEP" << "TR"; return propModes.contains (_s.toUpper ()); } bool Utilities::isValidDistance(const double _d) { return (_d>=0); } bool Utilities::isValidSponsor(const QString &_s) { return (sponsorsList.contains (_s.toUpper ())); } */ QString Adif::getADIFField(const QString &_fieldName, const QString &_data) {// Receives the ADIF field and the data and returns the ADIF field with a blank space at the end. // Check if _fieldName is a valid ADIF //qDebug() << Q_FUNC_INFO << " - " << _fieldName << "/" << _data; if ((_data.length()<=0) || (_data.isNull())) { //qDebug() << Q_FUNC_INFO << " - Not Valid"; return QString(); } if (ADIFHash.empty()) { InitializeHash(); } QString fieldN = _fieldName.toUpper(); if (!ADIFHash.contains(fieldN)) { //qDebug() << Q_FUNC_INFO << " - No valid ADIF: " << _fieldName; return QString(); } if (fieldN == "DISTANCE" ) if (_data.toDouble() <= 0.0) return QString(); return QString ("<%1:%2>%3 ").arg(fieldN).arg(_data.length ()).arg(_data); } bool Adif::isValidCall(const QString &_c) { Callsign _callsign(_c); return _callsign.isValid(); //if (_c.length ()>=3) // return true; //return false; } bool Adif::isValidQSLRCVD(const QString &_s, bool _importing) { // Y, I, or V) (V on import only) return ((_s == "Y") || (_s == "I") || ((_s == "V") && _importing)); } bool Adif::isValidQSLSENT(const QString &_s) {// Y, Q, or I return ((_s == "Y") || (_s == "Q") || (_s == "I")); } void Adif::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { emit debugLog (_func, _msg, _level); } klog-2.4.1/fileawardmanager.h0000644000175000017500000000450615003153303015072 0ustar develdevel#ifndef KLOG_FILEAWARDMANAGER_H #define KLOG_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); ~FileAwardManager(); 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-2.4.1/searchwindow.cpp0000644000175000017500000010003215003153303014620 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(Awards *awards, QWidget *parent) : QWidget(parent), awards(awards) // Initialize Awards reference { //qDebug() << "SearchWindow::SearchWindow: " ; dataProxy = awards->dataProxy; showStationCallsignInHeader = true; //sortingThroughProxyModel = false; searchModel = std::make_unique(awards, this); //searchModel = new SearchModel(dataProxy, this); util = new Utilities(Q_FUNC_INFO); connect(searchModel.get(), 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" ; } SearchWindow::~SearchWindow() { // emit clearError(); //delete(dataProxy); delete(util); //delete(awards); } void SearchWindow::sortColumn(const int _c) { //proxyModel->sort(_c); searchModel->sort(_c, Qt::AscendingOrder); } void SearchWindow::clear() { //qDebug() << "SearchWindow::clear " ; qslingNeeded = false; } void SearchWindow::createUI() { //qDebug() << "SearchWindow::createUI" ; //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" ; } void SearchWindow::setStationCallsignInHeader(const bool _h) { showStationCallsignInHeader = _h; setColumnsToDX(); } void SearchWindow::createlogPanel(const int _currentLog) { //qDebug() << "SearchWindow::createlogPanel: " << QString::number(_currentLog); currentLog = _currentLog; searchModel->createSearchModel(currentLog); treeView->setModel(searchModel.get()); 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(); //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" ; 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().text(), query.lastQuery()); } //qDebug() << "SearchWindow::setColumnsToDX - Query: " << query.lastQuery(); 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" ; 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()) ; //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); int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID); 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) { 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) { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); if (!qslSent) { menuRecQsl->addAction(qslRecViaBureauMarkReqFromSearchAct); } menuRecQsl->addAction(qslRecViaDirectFromLogAct); if (!qslSent) { 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()); 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()); //qDebug() << "SearchWindow::slotDoubleClickLog: emitted: " << QString::number (((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt()); 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); 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); return dataProxy->isQSLSent(_qsoId); } void SearchWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "SearchWindow::showMenuRightButtonFromLogCreateActions"; 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()) ); 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()) ); 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: "; 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()) ); 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(); 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); //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()); int QSOid = ((searchModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int QSOid = (delQSOFromLogAct->data()).toInt(); //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number(QSOid); //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID2: " << QString::number((delQSOFromLogAct->data()).toInt()); 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"); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(); //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(); 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; 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; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void SearchWindow::setFilterString(const QString &_st) { //qDebug() << "SearchWindow::setFilterString: " << _st; searchModel->setFilterString(_st); //qDebug() << "SearchWindow::setFilterString: - END " ; } void SearchWindow::selectAll() { //qDebug() << "SearchWindow::selectAll: " << QString::number(searchModel->rowCount()); int rowCount = searchModel->rowCount(); //logView->selectAll(); treeView->selectAll(); for (int i=0;iselectRow(i); } } void SearchWindow::clearSelection() { //qDebug() << "SearchWindow::clearSelection"; //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()) << ")"; 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); // 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"; 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); message = tr("Needed QSO to send the QSL"); setNeedingQSL(true); //qslingNeeded = true; emit requestFocus(); break; case 1: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 1"; 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"; 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"; 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"; // should never be reached return; // break; } clear(); setFilterString(filter); } void SearchWindow::searchToolNeededQSLToSend() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END"; } void SearchWindow::slotQSLSentMarkAsRequested() { //qDebug() << "SearchWindow::slotQSLSentMarkAsRequested: " << QString::number( (qslSentRequestedAct->data()).toInt() ); // 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: "; 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() ); //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 "; // Mark Sent, Bureau, date, update log. } void SearchWindow::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start"; //int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslRecViaBureauMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01"; //qslRecViaBureauMarkReq(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId); if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04"; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05"; emit updateSearchText(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06"; } searchModel->select(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07"; } void SearchWindow::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: "; //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(); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END"; } */ /* void SearchWindow::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWindow::colorTheList() { //qDebug() << "SearchWidget::colorTheList: " << QString::number(treeView->model()->rowCount()); 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; } } */ void SearchWindow::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class searchModel->setColors(_newOne, _needed, _worked, _confirmed, _default); } klog-2.4.1/awards.cpp0000644000175000017500000012776615003153303013433 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) { Q_UNUSED(_parentFunction); //qDebug() << "Awards::Awards- from: " << _parentFunction; dataProxy = dp; //QSqlDatabase db = QSqlDatabase::database("QSQLITE"); world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << "Awards::Awards - Before DXMarathon" ; dxMarathon = new DXMarathon(dataProxy); //qDebug() << "Awards::Awards - After DXMarathon" ; //world->create(); /* newOneColor.setNamedColor("#ff0000"); neededColor.setNamedColor("#ff8c00"); workedColor.setNamedColor("#ffd700"); confirmedColor.setNamedColor("#32cd32"); defaultColor.setNamedColor("#00bfff"); */ //"Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; //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" ; } Awards::~Awards() { delete(world); delete(dxMarathon); } 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); 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; if (sqlOK) { query.next(); if (query.isValid()) { QString answer = query.value(0).toString() + " / " + query.value(1).toString() ; query.finish(); //qDebug() << "Awards::getQSOofAward: answer: " << answer; return answer; } else { query.finish(); //qDebug() << "Awards::getQSOofAward: 0"; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOofAward: Query error"; 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); QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; int answer = -1; 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; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toInt(); //qDebug() << "Awards::getQSOIdofAward: answer: " << QString::number(answer); query.finish(); if (answer>=1) { return answer; } else { return -1; } } else { query.finish(); //qDebug() << "Awards::getQSOIdofAward: 0"; return -2; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOIdofAward: Query error"; return -3; } } int Awards::getDXCCWorked(const int _logNumber) { //qDebug() << "Awards::getDXCCWorked (logNumber): " << QString::number(_logNumber); 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; if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "Awards::getDXCCWorked: " << QString::number((query.value(0)).toInt()); return v; } else { //qDebug() << "Awards::getDXCCWorked: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getDXCCWorked: Query error"; return 0; } } int Awards::getDXCCConfirmed(const int _logNumber) { //qDebug() << "Awards::getDXCCConfirmed (logNumber): " << QString::number(_logNumber); return dataProxy->getFieldInBand (DXCC, "ALL", true, "ALL", _logNumber); } int Awards::getWAZWorked(const int _logNumber) { //qDebug() << "Awards::getWAZWorked (logNumber): " << QString::number(_logNumber); 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 { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return 0; } } int Awards::getWAZConfirmed(const int _logNumber) { //qDebug() << "Awards::getWAZConfirmed (logNumber): " << QString::number(_logNumber); 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 { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return 0; } } int Awards::getDXStatus (EntityStatus _entityStatus) { //qDebug() << Q_FUNC_INFO<< ": 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; // TODO: Maybe a status per band/mode... check how WSJTX is doing it /* 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 */ //qDebug() << Q_FUNC_INFO<< ": dxccEntity: " << QString::number(_entityStatus.dxcc); if (_entityStatus.dxcc<=0) { //qDebug() << Q_FUNC_INFO<< ": dxccEntity <= 0, return -1"; return -1; } bool checkingMode = true; if ( (_entityStatus.modeId==-1) || (manageModes==false)) { checkingMode = false; //qDebug() << Q_FUNC_INFO<< ": checkingMode = FALSE"; } int wb = dxccStatusBand(_entityStatus.dxcc, _entityStatus.bandId, _entityStatus.logId); //-1 error / 0 Not worked / 1 worked / 2 confirmed int wm = -1; if (checkingMode) { wm = dxccStatusMode(_entityStatus.dxcc, _entityStatus.modeId, _entityStatus.logId); //-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() << Q_FUNC_INFO<< ": wb=" << QString::number(wb) << " - wm=" << QString::number(wm); //qDebug() << Q_FUNC_INFO<< ": dxccStatus: " << QString::number(dxccStatus(dxccEntity, _logNumber)); switch(dxccStatus(_entityStatus.dxcc, _entityStatus.logId)) { case 0: //qDebug() << Q_FUNC_INFO<< ": return 0"; 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() << Q_FUNC_INFO<< ": return 4"; return 4; } else { //qDebug() << Q_FUNC_INFO<< ": return 1"; return 1; } } else { //qDebug() << Q_FUNC_INFO<< ": return 4 nc"; return 4; } case 1: // Worked in this band if (checkingMode) { if (wm==1) { //qDebug() << Q_FUNC_INFO<< ": return 3"; return 3; } else { //qDebug() << Q_FUNC_INFO<< ": return 2"; return 2; } } else { //qDebug() << Q_FUNC_INFO<< ": return 3 nc"; return 3; } default: // ERROR //qDebug() << Q_FUNC_INFO<< ": default return -1 - 1"; return -1; } case 2: // Confirmed if (wb==2) { if (checkingMode) { if (wm==2) { //qDebug() << Q_FUNC_INFO<< ": return 13"; return 13; } else if (wm==1) { //qDebug() << Q_FUNC_INFO<< ": return 12"; return 12; } else { //qDebug() << Q_FUNC_INFO<< ": return 11"; return 11; } } else { //qDebug() << Q_FUNC_INFO<< ": return 13 nc"; return 13; } } else if ((wb ==1) || (wb == 0)) { if (checkingMode) { if (wb==1) { if (wm==1) { //qDebug() << Q_FUNC_INFO<< ": return 8"; return 8; } else { //qDebug() << Q_FUNC_INFO<< ": return 6"; return 6; } } else { if (wm==1) { //qDebug() << Q_FUNC_INFO<< ": return 7"; return 7; } else { //qDebug() << Q_FUNC_INFO<< ": return 5"; return 5; } } } else { if (wb==0) { //qDebug() << Q_FUNC_INFO<< ": return 7 nc"; return 7; } else { //qDebug() << Q_FUNC_INFO<< ": return 8 nc"; return 8; } } } else { //qDebug() << Q_FUNC_INFO<< ": return -1 - 2"; return -1; } default: //qDebug() << Q_FUNC_INFO<< ": return -1 default2"; return -1; } // END OF SWITCH //qDebug() << Q_FUNC_INFO<< ": END, return -1"; //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() << Q_FUNC_INFO << ": " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode); QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << Q_FUNC_INFO << ": Checking Mode TRUE"; 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() << Q_FUNC_INFO << ": Checking Mode FALSE"; 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() << Q_FUNC_INFO << ": return - 2"; query.finish(); return 2; } status = 1; } } query.finish(); } else { // The query fails... //qDebug() << Q_FUNC_INFO << ": return - -1"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return -1; } //qDebug() << Q_FUNC_INFO << ": return - 0-4"; return status; } int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << Q_FUNC_INFO << ": " << QString::number(_ent); 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() << Q_FUNC_INFO << ": query exec OK: " << query.lastQuery(); while (query.next()) { //qDebug() << Q_FUNC_INFO << ": query VALUE: " << (query.value(0)).toString(); if ( query.isValid() ) { //qDebug() << Q_FUNC_INFO << ": query valid OK"; if(((query.value(0)).toString() == "Y") || ((query.value(1)).toString() == "Y")) { //qDebug() << Q_FUNC_INFO << ": value = 1 - return 2"; query.finish(); return 2; } worked = 1; } } //qDebug() << Q_FUNC_INFO << ": return "<< QString::number(worked) ; query.finish(); //qDebug() << Q_FUNC_INFO << ": END: " << QString::number(worked); return worked; } else { // The query fails... //qDebug() << Q_FUNC_INFO << ": return -1" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return -1; } //qDebug() << Q_FUNC_INFO << ": return 0" ; //return worked; } QColor Awards::getQRZDXStatusColor(EntityStatus _entitystatus) { //qDebug() << Q_FUNC_INFO << " - Start: " ; //qDebug() << Q_FUNC_INFO << " - Entityd: " << _entitystatus.dxcc; //qDebug() << Q_FUNC_INFO << " - BandId: " << _entitystatus.bandId; //qDebug() << Q_FUNC_INFO << " - ModeId: " << _entitystatus.modeId; //qDebug() << Q_FUNC_INFO << " - Log: " << _entitystatus.logId; /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ QColor returnedColor; int status = getDXStatus(_entitystatus); //qDebug() << Q_FUNC_INFO<< ": status: " << QString::number(status) << "/" << getDXStatusString(status); //qDebug() << Q_FUNC_INFO<< ": status: " << QString::number(status); switch (status) { case 0: //qDebug() << Q_FUNC_INFO<< ": returning newOneColor"; returnedColor = newOneColor; break; case 1: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 2: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 3: //qDebug() << Q_FUNC_INFO<< ": returning workedColor"; returnedColor = workedColor; break; case 4: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 5: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 6: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 7: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 8: //qDebug() << Q_FUNC_INFO<< ": returning workedColor"; returnedColor = workedColor; break; case 9: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 10: //qDebug() << Q_FUNC_INFO<< ": returning workedColor"; returnedColor = workedColor; break; case 11: //qDebug() << Q_FUNC_INFO<< ": returning neededColor"; returnedColor = neededColor; break; case 12: //qDebug() << Q_FUNC_INFO<< ": returning workedColor"; returnedColor = workedColor; break; case 13: //qDebug() << Q_FUNC_INFO<< ": returning confirmedColor"; returnedColor = confirmedColor; break; //break; default: //qDebug() << Q_FUNC_INFO<< ": returning defaultColor"; returnedColor = defaultColor; break; } return returnedColor; } QSOStatus Awards::getQSOStatus(const int &_status) { switch (_status) { case 0: return ATNO; break; case 1: return needed; break; case 2: return needed; break; case 3: return worked; break; case 4: return needed; break; case 5: return needed; break; case 6: return needed; break; case 7: return needed; break; case 8: return worked; break; case 9: return needed; break; case 10: return worked; break; case 11: return needed; break; case 12: return worked; break; case 13: return confirmed; break; //break; default: return unknown; break; } } QString Awards::getDXStatusString (const int &_status) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_status); 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; } QSOStatus 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 ()); EntityStatus indexEntityStatus; QSOStatus status = QSOStatus::needed; // bool worked = false; foreach (indexEntityStatus, dxccStatusList) { //qDebug() << Q_FUNC_INFO << " DXCC: " << QString::number(indexEntityStatus.dxcc); //qDebug() << Q_FUNC_INFO << " Band: " << QString::number(indexEntityStatus.bandId); if (indexEntityStatus.dxcc == _dxcc) { if (indexEntityStatus.bandId == _band) { if (indexEntityStatus.status == QSOStatus::confirmed ) { //qDebug() << Q_FUNC_INFO << " Confirmed " ; return QSOStatus::confirmed; } else { // This is important because it may happoen that the entity/bandId is confirmed in some modes but not in others status = QSOStatus::worked; //worked = true; } } } } //qDebug() << Q_FUNC_INFO << " Returning -" ; //if (worked) // return QSOStatus::worked; 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; //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; //qDebug() << "Awards::checkIfValidIOTA (numb): " << _number; // 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 Awards::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << ": " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; defaultColor = _default; neededColor = _needed; workedColor = _worked; confirmedColor = _confirmed; newOneColor = _newOne; } QColor Awards::getDefaultColor(){return defaultColor;} void Awards::recalculateAwards() { //qDebug() << Q_FUNC_INFO; if (updateDXCCStatus()) emit awardDXCCUpdated(); //dataProxy->updateAwardWAZ(); //qDebug() << Q_FUNC_INFO << " - END"; } int Awards::getQSOsInLog(const int _logNumber) { //qDebug() << "Awards::getQSOsInLog: " << QString::number(_logNumber); 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().text(), 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() { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_qsoId); //dataProxy->setDXCCAwardStatus(_qsoId); //ataProxy->setWAZAwardStatus(_qsoId); recalculateAwards(); } int Awards::setDXCCToQSO(const int _dxcc, const int _qsoid) // Defines the DXCC in a QSO { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_dxcc) << "/" << QString::number(_qsoid); //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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << ": DXCC Updated in Log but failed...."; int errorCode = query.lastError().text().toInt(); query.finish(); //qDebug() << Q_FUNC_INFO << ": LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << ": LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << ": LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << ": LastError-n: " << QString::number(query.lastError().text() ); return errorCode; } } int Awards::setCQToQSO(const int _cqz, const int _qsoid) // Defines the CQ in a QSO { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_cqz) << "/" << QString::number(_qsoid); //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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << ": DXCC Updated in Log but failed...."; int errorCode = query.lastError().text().toInt(); query.finish(); //qDebug() << Q_FUNC_INFO << ": LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << ": LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << ": LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << ": LastError-n: " << QString::number(query.lastError().text() ); return errorCode; } } bool Awards::getIsDXCCConfirmed(const int _dxcc, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << _dxcc; for (const auto& indexEntityStatus : dxccStatusList) { if (indexEntityStatus.dxcc == _dxcc && indexEntityStatus.status == QSOStatus::confirmed && (_logNumber <= 0 || indexEntityStatus.logId == _logNumber)) { return true; } } return false; } int Awards::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonQSO: " << QString::number(_year); return dxMarathon->getDXMarathonQSO(_year, _logNumber); } int Awards::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonDXCC: " << QString::number(_year); return dxMarathon->getDXMarathonDXCC(_year, _logNumber); } int Awards::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_year); return dxMarathon->getDXMarathonCQ(_year, _logNumber); } int Awards::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_year); 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() << Q_FUNC_INFO << ": " << QString::number(_ent) << "/" << QString::number(_band); QSqlQuery query = QSqlQuery(); QString queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; //qDebug() << Q_FUNC_INFO << ": " << queryString; 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().text(), query.lastQuery()); query.finish(); return -1; } //qDebug() << Q_FUNC_INFO << ": return - 0.3"; 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() << Q_FUNC_INFO << ": " << QString::number(_ent) << "/" << QString::number(_mode); 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().text(), 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::updateDXCCStatus(const int _logNumber) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_logNumber); QSqlQuery query; QString stringQuery = QString(); if (_logNumber>0) { stringQuery = QString("SELECT dxcc, bandid, modeid, qsl_rcvd, lotw_qsl_rcvd, lognumber, MIN(id) as id FROM log WHERE lognumber = :lognumber GROUP BY dxcc, bandid, modeid, qsl_rcvd, lotw_qsl_rcvd ORDER BY dxcc;"); } else { stringQuery = QString("SELECT dxcc, bandid, modeid, qsl_rcvd, lotw_qsl_rcvd, lognumber, MIN(id) as id FROM log GROUP BY dxcc, bandid, modeid, qsl_rcvd, lotw_qsl_rcvd ORDER BY dxcc;"); } if (_logNumber>0) { if (!query.prepare(stringQuery)) return false; query.bindValue(":lognumber", _logNumber); } if (!executeQuery(query, stringQuery)) { return false; } int qsos = processQueryResults(query); populateDXCCStatusMap(); // Populate the multi-hash map query.finish(); return !(dxccStatusList.isEmpty() && qsos > 0); } void Awards::populateDXCCStatusMap() { //qDebug() << Q_FUNC_INFO << " - Start"; dxccStatusMap.clear(); // Clear the multi-hash map for (const EntityStatus &status : dxccStatusList) { dxccStatusMap.insert(status.dxcc, status); } } QList Awards::findEntityStatusByDXCC(int dxcc) const { return dxccStatusMap.values(dxcc); // Return all EntityStatus instances for the given dxcc } QSOStatus Awards::getStatus(const QSqlQuery &query, const QSqlRecord &rec) { if ((query.value(rec.indexOf("qsl_rcvd")).toString() == "Y") || (query.value(rec.indexOf("lotw_qsl_rcvd")).toString() == "Y")) { return QSOStatus::confirmed; } else { return QSOStatus::worked; } } int Awards::processQueryResults(QSqlQuery &query) { //qDebug()() << Q_FUNC_INFO << " - Start "; int qsos = 0; dxccStatusList.clear(); while (query.next()) { if (!query.isValid()) { emit queryError(Q_FUNC_INFO, "Invalid query result", "", query.lastQuery()); return qsos; } qsos++; EntityStatus ent = extractEntityStatus(query); if (updateOrAddEntityStatus(ent)) { dxccStatusList.append(ent); } } return qsos; } EntityStatus Awards::extractEntityStatus(QSqlQuery &query) { QSqlRecord rec = query.record(); EntityStatus ent; ent.dxcc = query.value(rec.indexOf("dxcc")).toInt(); ent.bandId = query.value(rec.indexOf("bandid")).toInt(); ent.modeId = query.value(rec.indexOf("modeid")).toInt(); ent.status = getStatus(query, rec); ent.qsoId = query.value(rec.indexOf("id")).toInt(); ent.logId = query.value(rec.indexOf("lognumber")).toInt(); return ent; } bool Awards::updateOrAddEntityStatus(const EntityStatus &ent) { for (qsizetype i = 0; i < dxccStatusList.count(); ++i) { if (dxccStatusList[i].dxcc == ent.dxcc && dxccStatusList[i].bandId == ent.bandId && dxccStatusList[i].modeId == ent.modeId) { if (ent.status == confirmed && dxccStatusList[i].status != confirmed) { dxccStatusList[i].status = ent.status; dxccStatusList[i].qsoId = ent.qsoId; dxccStatusList[i].logId = ent.logId; return false; // Entity was updated } return false; // Entity was not added or updated } } return true; // Entity is new and will be added } bool Awards::executeQuery(QSqlQuery &query, const QString &stringQuery) { if (!query.exec(stringQuery)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } return true; } QString Awards::status2String(const QSOStatus &_status, bool shortString) { switch (_status) { case QSOStatus::ATNO: if (shortString) return tr("A", "Do not translate"); return tr("ATNO", "All Time New One, Do not translate"); case QSOStatus::needed: if (shortString) return tr("N", "Needed, please try to keep the N"); return tr("Needed"); case QSOStatus::worked: if (shortString) return tr("W", "Worked, please try to keep the W"); return tr("Worked"); case QSOStatus::confirmed: if (shortString) return tr("C", "Confirmed, please try to keep the C"); return tr("Confirmed"); default: if (shortString) if (shortString) return tr("U", "Unknown"); return tr("Unknown"); } } void Awards::printEntityStatus(const QString &_callingFunction, const EntityStatus &ent) { // This is a debug function Q_UNUSED(_callingFunction); Q_UNUSED(ent); //qDebug() << Q_FUNC_INFO << " ------------------------------------------------------------------------------------"; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - DXCC : " << ent.dxcc; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - Band : " << ent.bandId; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - Mode : " << ent.modeId; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - QSOid : " << ent.qsoId; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - LogId : " << ent.logId; //qDebug() << Q_FUNC_INFO << " - " << _callingFunction << " - Status : " << status2String(ent.status); //qDebug() << Q_FUNC_INFO << " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"; } klog-2.4.1/INSTALL.txt0000644000175000017500000000031215003153303013266 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-2.4.1/statisticswidget.cpp0000644000175000017500000002460015003153303015527 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) { //qDebug() << Q_FUNC_INFO << "Start"; dataProxy = dp; statisticToShowComboBox = new QComboBox(); logComboBox = new QComboBox(); stackedWidget = new QStackedWidget ; w1 = new StatsQSOsPerYearBarChartWidget(dataProxy, this); w2 = new StatsEntitiesPerYearBarChartWidget(dataProxy, this); w3 = new StatsCQZPerYearBarChartWidget(dataProxy, this); w4 = new StatsQSOsPerBandBarChartWidget(dataProxy, nullptr); w5 = new StatsQSOsPerModeBarChartWidget(dataProxy, nullptr); w6 = new StatsQSOsPerDXCCBarChartWidget(dataProxy, nullptr); w7 = new StatsQSOsPerContinentBarChartWidget(dataProxy, nullptr); w8 = new StatsQSOsPerHourBarChartWidget(dataProxy, nullptr); w9 = new StatsQSOsPerMonthBarChartWidget(dataProxy, nullptr); w10 = new StatsWorkedConfirmedPieChartWidget(dataProxy, nullptr); w11 = new StatsWorkedSentPieChartWidget(dataProxy, nullptr); w12 = new StatsSentConfirmedPieChartWidget(dataProxy, nullptr); w13 = new StatsGridsOnSatsWidget(dataProxy, nullptr); w14 = new StatsDXCCOnSatsWidget(dataProxy, nullptr); w15= new StatsFieldPerBandWidget(dataProxy, GridSquare, nullptr); w16 = new StatsFieldPerBandWidget(dataProxy, DXCC, nullptr);; statisticsToShowList.clear(); createUI(); connect(statisticToShowComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChartComboBoxChanged() ) ) ; connect(logComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLogComboBoxChanged() ) ) ; //qDebug() << Q_FUNC_INFO << "END"; } StatisticsWidget::~StatisticsWidget() { //qDebug() << Q_FUNC_INFO << "Start-END"; } void StatisticsWidget::clear() { //qDebug() << Q_FUNC_INFO << "Start-END"; //qDebug() << "StatisticsWidget::clear()"; } void StatisticsWidget::closeEvent(QCloseEvent *event) { //qDebug() << "StatisticsWidget::closeEvent"; //barChartStats->clear(); //qDebug() << Q_FUNC_INFO << "Start-END"; event->accept(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::showEvent(QShowEvent *event) { //qDebug() << "StatisticsWidget::showEvent"; //qDebug() << Q_FUNC_INFO << "Start"; fillLogCombo(); event->accept(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::slotChartComboBoxChanged() { //qDebug() << "StatisticsWidget::slotChartComboBoxChanged: " << statisticToShowComboBox->currentText() ; //qDebug() << Q_FUNC_INFO << "Start"; updateChart(); statisticToShowComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::slotLogComboBoxChanged() { //qDebug() << Q_FUNC_INFO << "Start"; updateChart(); logComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::updateChart() { //qDebug() << Q_FUNC_INFO << "Start"; QString text = statisticToShowComboBox->currentText(); text.truncate(2); //qDebug() << Q_FUNC_INFO << " - 010"; int log = ((logComboBox->currentText()).section('-', 0, 0)).toInt(); //qDebug() << Q_FUNC_INFO << " - 011"; //qDebug() << Q_FUNC_INFO << " Text : " << logComboBox->currentText(); //qDebug() << Q_FUNC_INFO << " Log : " << QString::number(log); //barChartStats->prepareChart(text.toInt(), log); switch (text.toInt()) { case 1: { //qDebug() << Q_FUNC_INFO << "10"; w1->prepareChart (log); //qDebug() << Q_FUNC_INFO << "11"; stackedWidget->setCurrentWidget (w1); //qDebug() << Q_FUNC_INFO << "12"; } break; case 2: { //qDebug() << Q_FUNC_INFO << "20"; w2->prepareChart (log); stackedWidget->setCurrentWidget (w2); } break; case 3: { //qDebug() << Q_FUNC_INFO << "30"; w3->prepareChart (log); stackedWidget->setCurrentWidget (w3); } break; case 4: { //qDebug() << Q_FUNC_INFO << "40"; w4->prepareChart (log); stackedWidget->setCurrentWidget (w4); } break; case 5: { //qDebug() << Q_FUNC_INFO << "50"; w5->prepareChart (log); stackedWidget->setCurrentWidget (w5); } break; case 6: { //qDebug() << Q_FUNC_INFO << "60"; w6->prepareChart (log); stackedWidget->setCurrentWidget (w6); } break; case 7: { // How many QSO per Continent //qDebug() << Q_FUNC_INFO << "70"; w7->prepareChart (log); stackedWidget->setCurrentWidget (w7); } break; case 8: { //qDebug() << Q_FUNC_INFO << "80"; w8->prepareChart (log); stackedWidget->setCurrentWidget (w8); } break; case 9: { //qDebug() << Q_FUNC_INFO << "90"; w9->prepareChart (log); stackedWidget->setCurrentWidget (w9); } break; case 10: { //qDebug() << Q_FUNC_INFO << "100"; w10->prepareChart (log); stackedWidget->setCurrentWidget (w10); } break; case 11: { //qDebug() << Q_FUNC_INFO << "110"; w11->prepareChart (log); stackedWidget->setCurrentWidget (w11); } break; case 12: { //qDebug() << Q_FUNC_INFO << "120"; w12->prepareChart (log); stackedWidget->setCurrentWidget (w12); } break; case 13: { //qDebug() << Q_FUNC_INFO << "130"; w13->prepareChart (log); stackedWidget->setCurrentWidget (w13); } break; case 14: { //qDebug() << Q_FUNC_INFO << "140"; w14->prepareChart (log); stackedWidget->setCurrentWidget (w14); } break; case 15: { //qDebug() << Q_FUNC_INFO << "150"; w15->prepareChart (log); stackedWidget->setCurrentWidget (w15); //genchart = new StatsFieldPerBandWidget(dataProxy, GridSquare, nullptr); } break; case 16: { //qDebug() << Q_FUNC_INFO << "160"; w16->prepareChart (log); stackedWidget->setCurrentWidget (w16); //genchart = new StatsFieldPerBandWidget(dataProxy, DXCC, nullptr); } break; } //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::createUI() { //qDebug() << Q_FUNC_INFO << "Start"; stackedWidget->addWidget(w1); stackedWidget->addWidget(w2); stackedWidget->addWidget(w3); stackedWidget->addWidget(w4); stackedWidget->addWidget(w5); stackedWidget->addWidget(w6); stackedWidget->addWidget(w7); stackedWidget->addWidget(w8); stackedWidget->addWidget(w9); stackedWidget->addWidget(w10); stackedWidget->addWidget(w11); stackedWidget->addWidget(w12); stackedWidget->addWidget(w13); stackedWidget->addWidget(w14); stackedWidget->addWidget(w15); stackedWidget->addWidget(w16); 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(stackedWidget); setLayout(layout); resize(420,300); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::fillLogCombo() { //qDebug() << Q_FUNC_INFO << "Start"; 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(); logs<< ids.at(i) + "-" + dataProxy->getLogDateFromLog((ids.at(i)).toInt()) + "-" + dataProxy->getStationCallSignFromLog((ids.at(i)).toInt()); } logComboBox->clear(); logComboBox->addItems(logs); //qDebug() << Q_FUNC_INFO << "END"; } klog-2.4.1/awardswidget.h0000644000175000017500000000720215003153303014262 0ustar develdevel#ifndef KLOG_AWARDSWIDGET_H #define KLOG_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 logLevel; Awards *awards; }; #endif // AWARDSWIDGET_H klog-2.4.1/setupdialog.cpp0000644000175000017500000006632515003153303014463 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 "callsign.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupDialog::SetupDialog(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << Q_FUNC_INFO ; Q_UNUSED(parent); //contentsWidget->update(); //pagesWidget->update(); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": 01"; locator = new Locator(); tabWidget = new QTabWidget; //qDebug() << Q_FUNC_INFO << ": 01.0"; userDataPage = new SetupPageUserDataPage(dataProxy); //qDebug() << Q_FUNC_INFO << ": 01.10"; bandModePage = new SetupPageBandMode(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.20"; dxClusterPage = new SetupPageDxCluster(this); //qDebug() << Q_FUNC_INFO << ": 01.30"; colorsPage = new SetupPageColors(this); //qDebug() << Q_FUNC_INFO << ": 01.40"; miscPage = new SetupPageMisc(this); //qDebug() << Q_FUNC_INFO << ": 01.50"; worldEditorPage = new SetupPageWorldEditor (dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.60"; logsPage = new SetupPageLogs(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.70"; eLogPage = new SetupPageELog(this); //qDebug() << Q_FUNC_INFO << ": 01.80"; UDPPage = new SetupPageUDP(this); //qDebug() << Q_FUNC_INFO << ": 01.90"; satsPage = new SetupPageSats(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.100"; hamlibPage = new SetupPageHamLib(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.101"; logViewPage = new SetupPageLogView(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 02"; 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"; tabWidget->addTab(hamlibPage, tr ("HamLib")); //qDebug() << "SetupDialog::SetupDialog 03"; 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"; setLayout(mainLayout); setWindowTitle(tr("Settings")); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupDialog::init(const QString &_softwareVersion, const int _page, const bool _alreadyConfigured) { //qDebug() << Q_FUNC_INFO; logLevel = None; constrid = 2; nolog = true; firstTime = true; version = QString(); pageRequested = 0; //qDebug() << Q_FUNC_INFO << "00"; //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); userDataPage->setPrefixes (); //qDebug() << Q_FUNC_INFO << "000"; firstTime = !_alreadyConfigured; if (firstTime) { //qDebug() << Q_FUNC_INFO << " - Running for the FIRST TIME"; } version = _softwareVersion; pageRequested = _page; logViewPage->init(); slotReadConfigData(); if ((pageRequested==6) && (logsPageTabN>0))// The user is opening a new log { //qDebug() << Q_FUNC_INFO << ": 5.2"; tabWidget->setCurrentIndex(logsPageTabN); } //qDebug() << Q_FUNC_INFO << ": 5.3"; nolog = !(haveAtleastOneLog()); connectActions(); //qDebug() << Q_FUNC_INFO << " - END"; } SetupDialog::~SetupDialog() { //qDebug() << Q_FUNC_INFO ; delete(locator); delete(userDataPage); delete(bandModePage); delete(dxClusterPage); delete(miscPage); delete(worldEditorPage); delete(logsPage); delete(eLogPage); delete(colorsPage); delete(UDPPage); delete(satsPage); delete(hamlibPage); delete(logViewPage); delete(util); } void SetupDialog::connectActions() { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); 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 (eLogPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); connect (colorsPage, SIGNAL(darkModeChanged(bool)), this, SLOT(slotDarkModeChanged(bool))); logEvent(Q_FUNC_INFO, "END", Debug); } //void SetupDialog::slotQRZCOMAuto(const bool _b) //{ //emit qrzcomAuto(_b); //} void SetupDialog::slotDarkModeChanged(const bool _dm) { emit darkModeChanged(_dm); } void SetupDialog::setData(const QString &_softwareVersion, const int _page, const bool _alreadyConfigured) { //qDebug() << Q_FUNC_INFO << " - " << _softwareVersion << "/" << QString::number(_page); logEvent(Q_FUNC_INFO, "Start", Debug); nolog = !(haveAtleastOneLog()); firstTime = !_alreadyConfigured; if (firstTime) { //qDebug() << Q_FUNC_INFO << " - Running for the FIRST time"; } else { //qDebug() << Q_FUNC_INFO << " - Running NOT for the FIRST time"; miscPage->setUseDefaultDBPath(miscPage->getDefaultDBPath()); } //qDebug() << Q_FUNC_INFO << " - 10"; setSoftVersion(_softwareVersion); //qDebug() << Q_FUNC_INFO << " - 20"; slotReadConfigData (); //qDebug() << Q_FUNC_INFO << " - 30"; setPage(_page); //qDebug() << Q_FUNC_INFO << " - 40"; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupDialog::setSoftVersion(const QString &_softwareVersion) { //qDebug() << "SetupDialog::setSoftVersion"; logEvent(Q_FUNC_INFO, "Start", Debug); version = _softwareVersion; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setPage(const int _page) { //qDebug() << "SetupDialog::setPage("<0))// The user is opening a new log { tabWidget->setCurrentIndex(pageRequested); } logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotCancelButtonClicked() { //qDebug() << "SetupDialog::slotCancelButtonClicked"; logEvent(Q_FUNC_INFO, "Start", Debug); 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", logLevel); emit exitSignal(2); return; } else { emit debugLog (Q_FUNC_INFO, "END-2", logLevel); return; } } } hamlibPage->stopHamlib(); QDialog::reject (); close(); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::createIcons() { //qDebug() << "SetupDialog::createIcons"; logEvent(Q_FUNC_INFO, "Start", Debug); 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*))); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) { //qDebug() << "SetupDialog::changePage"; logEvent(Q_FUNC_INFO, "Start", Debug); if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current)); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::loadDarkMode() {// Reads the config to setup the DarkMode //qDebug() << Q_FUNC_INFO; colorsPage->loadDarkMode (); } bool SetupDialog::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; if (!QFile::exists(util->getCfgFile ())) { //qDebug() << Q_FUNC_INFO << " - Nothing to load"; return false; } QSettings settings(util->getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - 10 - General"; version = settings.value ("Version").toString(); //latestBackup = settings.value ("LatestBackup").toString (); //qDebug() << Q_FUNC_INFO << " - 20 - user"; userDataPage->loadSettings(); //qDebug() << Q_FUNC_INFO << " - 30 - bands"; settings.beginGroup ("BandMode"); QStringList listAux; listAux.clear(); listAux << "SSB" << "CW"; readActiveModes (settings.value("Modes", listAux).toStringList ()); listAux.clear(); listAux << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; readActiveBands (settings.value("Bands", listAux).toStringList ()); modes.removeDuplicates(); bandModePage->setActiveModes(modes); bands.removeDuplicates(); bandModePage->setActiveBands (bands); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 40 - logview"; logViewPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 50 - dxcluster"; dxClusterPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 60 - colors"; colorsPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 70 - misc"; miscPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 80 - logs"; logsPage->loadSettings(); //qDebug() << Q_FUNC_INFO << " - 90 - elog"; eLogPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 100 - UDP"; UDPPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 110 - Sats"; hamlibPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 120 - END"; return true; } void SetupDialog::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; //QSettings settings(util->getCfgFile (), QSettings::IniFormat); userDataPage->saveSettings(); // Groups done bandModePage->saveSettings (); // Groups done logViewPage->saveSettings (); dxClusterPage->saveSettings (); miscPage->saveSettings (); colorsPage->saveSettings (); logsPage->saveSettings(); eLogPage->saveSettings (); UDPPage->saveSettings (); hamlibPage->saveSettings (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupDialog::slotOkButtonClicked() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); 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", logLevel); return; } Callsign callsign(userDataPage->getMainCallsign()); if (!callsign.isValid()) { 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", logLevel); return; } if (!haveAtleastOneLog()) { //qDebug() << "SetupDialog::slotOkButtonClicked - NO LOG!"; 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 //qDebug() << Q_FUNC_INFO << "END-3" ; emit debugLog (Q_FUNC_INFO, "END-3", logLevel); return; } //qDebug() << "SetupDialog::slotOkButtonClicked - 10"; saveSettings(); hamlibPage->stopHamlib(); //qDebug() << "SetupDialog::slotOkButtonClicked - just before leaving"; QDialog::accept(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::slotOkButtonClicked - END"; close(); } void SetupDialog::slotReadConfigData() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); if (firstTime) //if (!QFile::exists (util->getCfgFile ())) { //qDebug() << Q_FUNC_INFO << " - FirstTime"; setDefaults(); bands.removeDuplicates(); modes.removeDuplicates(); //logViewFields.removeDuplicates(); bandModePage->setActiveModes(modes); bandModePage->setActiveBands(bands); //logViewPage->setActiveFields(logViewFields); } //qDebug() << Q_FUNC_INFO << " - 30"; loadSettings(); //qDebug() << Q_FUNC_INFO << " - 40"; //dxClusterPage->setDxclusterServersComboBox(dxClusterServers); //dxClusterPage->setSelectedDxClusterServer(dxClusterServerToUse); if (modes.isEmpty()) { modes << "SSB" << "CW"; } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; } modes.removeDuplicates(); bandModePage->setActiveModes(modes); bands.removeDuplicates(); bandModePage->setActiveBands(bands); //logViewPage->setActiveFields(logViewFields); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::readActiveBands (const QStringList &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; logEvent(Q_FUNC_INFO, "Start", Debug); bool atLeastOne = false; QStringList values = actives; QStringList _abands; for (int i = 0; i < values.size() ; i++) { if (isValidBand(values.at(i))) { if (!atLeastOne) { atLeastOne = true; _abands.clear(); } _abands << values.at(i); } } bands.clear(); bands << dataProxy->getBandsInLog(-1); bands << _abands; bands.removeDuplicates(); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::readActiveModes (const QStringList &actives) { //qDebug() << "SetupDialog::readActiveModes: " << actives; logEvent(Q_FUNC_INFO, "Start", Debug); bool atLeastOne = false; QStringList _amodes; QStringList values = actives; 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(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::readActiveModes: " << modes.join(" / "); } bool SetupDialog::isValidBand (const QString &b) { //qDebug() << "SetupDialog::isValidBand: "<< b; logEvent(Q_FUNC_INFO, "Start", Debug); QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); logEvent(Q_FUNC_INFO, "END", Debug); return query.isValid(); } bool SetupDialog::isValidMode (const QString &b) { //qDebug() << "SetupDialog::isValidMode: " << b; logEvent(Q_FUNC_INFO, "Start", Debug); QString stringQuery = QString("SELECT id FROM mode WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); logEvent(Q_FUNC_INFO, "END", Debug); return query.isValid(); } void SetupDialog::setDefaults() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); 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->setDebugLogLevel(util->getDebugLevels().at(0)); //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->init (); logViewPage->init(); //dxClusterServers.clear(); //dxClusterServers.append("dxfun.com:8000"); //dxClusterServerToUse = "dxfun.com:8000"; if (modes.isEmpty()) { modes << "SSB" << "CW"; modes.removeDuplicates(); } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; bands.removeDuplicates(); } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } QString SetupDialog::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data; //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy logEvent(Q_FUNC_INFO, "Start", Debug); 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 logEvent(Q_FUNC_INFO, "END", Debug); return newString; } bool SetupDialog::haveAtleastOneLog() { logEvent(Q_FUNC_INFO, "Start", Debug); emit debugLog (Q_FUNC_INFO, "END-1", logLevel); return dataProxy->haveAtLeastOneLog(); //logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setClubLogActive(const bool _b) { logEvent(Q_FUNC_INFO, "Start", Debug); eLogPage->setClubLogActive(_b); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::checkIfNewBandOrMode() { //qDebug() << "SetupDialog::checkIfNewBandOrMode: logLevel: " << QString::number(logLevel); logEvent(Q_FUNC_INFO, "Start", Debug); QStringList _items; _items.clear(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -1"; _items << dataProxy->getBandsInLog(-1); //qDebug() << "SetupDialog::checkIfNewBandOrMode -2"; _items << bandModePage->getBands(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -3"; _items.removeDuplicates(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -4"; bandModePage->setActiveBands(_items); //qDebug() << "SetupDialog::checkIfNewBandOrMode -5"; _items.clear(); _items << dataProxy->getModesInLog(-1); _items << bandModePage->getModes(); _items.removeDuplicates(); bandModePage->setActiveModes(_items); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::checkIfNewBandOrMode END"; } void SetupDialog::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupDialog::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")"; //qDebug() << "SetupDialog::slotAnalyzeNewLogData"; // We receive the station callsign and operators from the logs tab logEvent(Q_FUNC_INFO, "Start", Debug); if (_qs.length()!=2) { emit debugLog (Q_FUNC_INFO, "END-1", logLevel); return; } userDataPage->setMainCallsign(_qs.at(0)); userDataPage->setOperators(_qs.at(1)); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotSetStationCallSign(const QString &_p) { //qDebug() << "SetupDialog::slotSetStationCallSign: " << _p; logEvent(Q_FUNC_INFO, "Start", Debug); logsPage->setDefaultStationCallsign(_p); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotSetOperators(const QString &_p) { //qDebug() << "SetupDialog::slotSetOperators: " << _p; logEvent(Q_FUNC_INFO, "Start", Debug); logsPage->setDefaultOperators(_p); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setLogLevel(const DebugLogLevel _sev) { logLevel = _sev; miscPage->setDebugLogLevel(util->debugLevelToString(_sev)); } void SetupDialog::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { logEvent(Q_FUNC_INFO, "Start", Debug); emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotFocusOK() { okButton->setFocus(Qt::OtherFocusReason); } void SetupDialog::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO; //qDebug() << Q_FUNC_INFO << " - selectedLog: " << QString::number(logsPage->getSelectedLog()); QWidget::showEvent(event); eLogPage->loadSettings (); miscPage->loadSettings (); userDataPage->setStationFocus(); } void SetupDialog::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.4.1/INSTALL-win.txt0000644000175000017500000000014715003153303014067 0ustar develdevelInstalling KLog on a Windows system is easy. Just double-click on the installer and follow the steps. klog-2.4.1/qml/0000755000175000017500000000000015003153303012214 5ustar develdevelklog-2.4.1/qml/marker.qml0000644000175000017500000000501715003153303014213 0ustar develdevel/*************************************************************************** mapqmlfile.qml - 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 . * * * *****************************************************************************/ import QtQuick import QtLocation MapQuickItem{ id: marker anchorPoint.x: marker.width / 4 anchorPoint.y: marker.height property alias text: locatorText.text //sourceItem: Image{ // id: icon // source: "../img/marker.png" // sourceSize.width: 40 // sourceSize.height: 40 //} sourceItem: Rectangle{ id: rectaMap Image{ id: icon //source: "../img/marker.png" source: "qrc:/img/marker.png" sourceSize.width: 40 sourceSize.height: 40 } Text{ id: locatorText //text: 'IN80' //width: rectaMap.width color: focus?"red":"black" anchors.top: icon.bottom anchors.horizontalCenter: icon.horizontalCenter horizontalAlignment: icon.AlignHCenter } } } klog-2.4.1/qml/mapqmlfile.qml0000644000175000017500000001743315003153303015066 0ustar develdevel/*************************************************************************** mapqmlfile.qml - 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 . * * * *****************************************************************************/ import QtQuick import QtQuick.Window import QtLocation import QtPositioning import QtQuick.Controls Rectangle { width: 640 height: 480 visible: true property alias zoom: map.zoomLevel property alias lat: map.center.latitude property alias lon: map.center.longitude property double oldZoom //property alias mapLocale: map.plugin.locales Location { // Define location that will be "center" of map id: mapCenter } //function addMarker(latitude: double, longitude: double, locatorText: String) function addMarker(latitude: double, longitude: double) { var Component = Qt.createComponent("qrc:qml/marker.qml") //var item = Component.createObject(Rectangle, { // coordinate: QtPositioning.coordinate(latitude, longitude), text: locatorText // }) var item = Component.createObject(Rectangle, { coordinate: QtPositioning.coordinate(latitude, longitude) }) //if (zoom>5) //{ // console.log("Zoom>5: ", zoom); //} map.addMapItem(item) } FocusScope { anchors.fill: parent } Plugin { id: mapPlugin name: "osm" // Names in local language //name: "esri" // Names not in local language but english //name: "googleMap" //name: "mapboxgl" PluginParameter { name: "osm.mapping.custom.host" value: "https://tile.openstreetmap.org/" } } Map { id: map anchors.fill: parent plugin: mapPlugin center: mapCenter.coordinate Plugin { name: "osm" //locales: "en_US" } //Component.onCompleted:addMarker(40.18, -3.649, "OOO") //onCenterChanged: //{ // console.log("Map Center X: ", lat, " - Map Center Y: ", lon); //} zoomLevel: 14 activeMapType: supportedMapTypes[supportedMapTypes.length - 1] MouseArea { hoverEnabled: true anchors.fill: parent //acceptedButtons: Qt.LeftButton //onClicked: //{ // console.log("left button clicked!") //} //onPositionChanged: //{ // Qt.point(mouseX, mouseY) // var coordinate = map.toCoordinate(Qt.point(mouse.x,mouse.y)) // console.log("Mouse Position (", mouseX, ", ", mouseY, ")"); // console.log("Mouse GeoPosition (", coordinate.latitude, ", ", coordinate.longitude, ")"); //} } MouseArea { hoverEnabled: true anchors.fill: parent //acceptedButtons: Qt.RightButton //onClicked: //{ // console.log("right button clicked!") // contextMenu.popup() //} //Menu { // id: contextMenu // MenuItem {text: "Show QSOs"} //} } Rectangle { id: buttonout width: 30 height: 30 border.color: "red" radius: 5 // Let's round the rectangle's corner a bit, so it resembles more a button //anchors.centerIn: parent anchors.right: parent.right; anchors.bottom: parent.bottom Text { id: buttonText text: "-" color: "black" anchors.centerIn: parent } MouseArea { // We make the MouseArea as big as its parent, i.e. the rectangle. So pressing anywhere on the button will trigger the event anchors.fill: parent // Exploit the built-in "clicked" signal of the MouseArea component to do something when the MouseArea is clicked. // Note that the code associated to the signal is plain JavaScript. We can reference any QML objects by using their IDs onClicked: { oldZoom = zoom zoom = oldZoom - 1 } } } Rectangle { id: buttonin width: 30 height: 30 border.color: "red" radius: 5 // Let's round the rectangle's corner a bit, so it resembles more a button anchors.bottom: buttonout.top; anchors.right: buttonout.right //anchors.right: parent.right; anchors.bottom: parent.bottom Text { id: buttonTextout text: "+" color: "black" anchors.centerIn: parent } MouseArea { // We make the MouseArea as big as its parent, i.e. the rectangle. So pressing anywhere on the button will trigger the event anchors.fill: parent // Exploit the built-in "clicked" signal of the MouseArea component to do something when the MouseArea is clicked. // Note that the code associated to the signal is plain JavaScript. We can reference any QML objects by using their IDs onClicked: { oldZoom = zoom zoom = oldZoom + 1 //buttonText.text = qsTr("Clicked"); //buttonText.color = "black"; } } } MapItemView { model: rectangle_model delegate: MapRectangle { border.width: 2 topLeft : model.north bottomRight : model.south color : model.color //opacity : 0.5 } } MapItemView { model: circle_model delegate: MapCircle{ center: model.coordinate radius: 5000.0 color: 'green' border.width: 10 } } } } klog-2.4.1/updatesatsdata.cpp0000644000175000017500000002445315003153303015146 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(Q_FUNC_INFO); dataProxy = dp; } UpdateSatsData::~UpdateSatsData() { delete(util); } bool UpdateSatsData::satDataFileRead(const QString& tfileName) { //qDebug() << "UpdateSatsData::satDataFileRead: " << tfileName; 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; return false; } if (dataProxy->clearSatList()) { //qDebug() << "UpdateSatsData::satDataFileRead Sats YES deleted" ; } else { //qDebug() << "UpdateSatsData::satDataFileRead Sats NOT deleted" ; 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" ; //file.seek(pos); //START reading SAT data... //qDebug() << "UpdateSatsData::satDataFileRead: Start reading data" ; 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" ; if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); fields.clear(); //qDebug() << "UpdateSatsData::satDataFileRead-line:" << line; fields << line.split("<", QT_SKIP); foreach (aux, fields) { aux = aux.simplified(); //qDebug() << "UpdateSatsData::satDataFileRead-aux:" << aux; fieldToAnalyze = util->getValidADIFFieldAndData("<" + aux); if (fieldToAnalyze.size() == 2) { field = fieldToAnalyze.at(0); data = fieldToAnalyze.at(1); //qDebug() << "UpdateSatsData::satDataFileRead-Field:" << field; //qDebug() << "UpdateSatsData::satDataFileRead-Data:" << data; if (field == "EOR") { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED!"; if (haveId && haveName) { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED and have it all!"; 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; 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"; } else if (field == "APP_KLOG_SATS_NAME") { satName = data; haveName = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_NAME"; } else if (field == "APP_KLOG_SATS_UPLINK") { satUpLink = data; //haveUpLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_UPLINK"; } else if (field == "APP_KLOG_SATS_DOWNLINK") { satDownLink = data; //haveDownLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_DOWNLINK"; } else if (field == "APP_KLOG_SATS_MODE") { satMode = data; //haveMode = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_MODE"; } else if (field == "APP_KLOG_DATA") { //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_DATA"; if (data != "SATS") { return false; } } } } //qDebug() << "UpdateSatsData::satDataFileRead: foreach end" ; } //qDebug() << "UpdateSatsData::satDataFileRead: out of foreach" ; } else { noMoreRegisters = true; } //qDebug() << "UpdateSatsData::satDataFileRead: While END" ; } if (errorFound) { //qDebug() << "UpdateSatsData::satDataFileRead: errorFound = true" ; return false; } else { //qDebug() << "UpdateSatsData::satDataFileRead: END" ; emit satsUpdatedSignal(true); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The Satellites information has been updated.")); msgBox.exec(); } //qDebug() << "UpdateSatsData::satDataFileRead: END " ; return true; } bool UpdateSatsData::readSatDataFile() { //qDebug() << Q_FUNC_INFO << " - Start"; //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 { return satDataFileRead(fileName); } //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/softwareupdatedialog.cpp0000644000175000017500000001050415003153303016344 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" ; 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" ; } void SoftwareUpdateDialog::setVersion(const QString tversion, const bool updateNeeded) { //qDebug() << "SoftwareUpdateDialog::setVersion: " << tversion; _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" ; } void SoftwareUpdateDialog::slotAcceptButtonClicked() { //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked" ; accept(); //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked END" ; } void SoftwareUpdateDialog::keyPressEvent(QKeyEvent *event) { //qDebug() << "SoftwareUpdateDialog::keyPressEvent" ; if (event->key()>=0) { slotAcceptButtonClicked(); } //qDebug() << "SoftwareUpdateDialog::keyPressEvent END" ; } klog-2.4.1/startwizard.h0000644000175000017500000001136415003153303014157 0ustar develdevel#ifndef KLOG_STARTWIZARD_H #define KLOG_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 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-2.4.1/tipsdialog.cpp0000644000175000017500000003005515003153303014271 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"; logLevel = Info; //7 Debug /0=emergency or no debug logEvent(Q_FUNC_INFO, "Start", Debug); tipTextQLabel = new QLabel; tipId = 1; tipMax = 19; setWindowTitle(tr("KLog tips")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); 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))); tip = new QWidget; QGridLayout *layout1 = new QGridLayout; layout1->addWidget(tipTextQLabel, 0, 1, 4, 4); tip->setLayout(layout1); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(tip); layout->addWidget(buttonBox); setLayout(layout); logEvent(Q_FUNC_INFO, "END", Debug); } TipsDialog::~TipsDialog(){} void TipsDialog::slotPrevButtonClicked() { logEvent(Q_FUNC_INFO, "Start", Debug); if (tipId>1) { tipId--; } else { tipId = tipMax; } setTip(tipId); logEvent(Q_FUNC_INFO, "END", Debug); } void TipsDialog::slotNextButtonClicked() { logEvent(Q_FUNC_INFO, "Start", Debug); if (tipIdFill 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); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "TipsDialog::setTip: END" ; } void TipsDialog::slotLinkActivated(const QString &_link) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "TipsDialog::slotLinkActivated: " << _link; //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(); } logEvent(Q_FUNC_INFO, "END", Debug); } void TipsDialog::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.4.1/logwindow.cpp0000644000175000017500000007265415003153303014156 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(Awards *awards, QWidget *parent) : QWidget(parent), awards(awards) { //qDebug() << Q_FUNC_INFO << " - Start"; dataProxy = awards->dataProxy; logModel = new LogModel(dataProxy, this); util = new Utilities(Q_FUNC_INFO); connect(logModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); logView = new QTableView; columns.clear(); currentLog = -1; //awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "LogWindow::LogWindow: - END" ; } LogWindow::~LogWindow() { //qDebug() << Q_FUNC_INFO << " - Start"; delete(util); //delete(awards); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::setColumns(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO << " - Start"; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(_columns); logModel->setColumns(columns); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::sortColumn(const int _c) { //qDebug() << Q_FUNC_INFO << " - Start"; logModel->sort(_c, Qt::AscendingOrder); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::clear() { //qDebug() << Q_FUNC_INFO << " - Start/END"; } void LogWindow::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; logView->setContextMenuPolicy(Qt::CustomContextMenu); logView->setSortingEnabled(true); logView->horizontalHeader ()->setSectionsMovable (true); //logView->setDragDropMode (QAbstractItemView::InternalMove); //logView->setDropIndicatorShown (true); //retoreColumsOrder(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(logView); setLayout(layout); } void LogWindow::retoreColumsOrder() { // Restore the column order from the settings QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup("LogWindow"); QList columnOrder = settings.value("columnOrder").value>(); settings.endGroup(); if (!columnOrder.isEmpty()) { for (int i = 0; i < columnOrder.size(); ++i) { logView->horizontalHeader()->moveSection(logView->horizontalHeader()->visualIndex(columnOrder[i]), i); } } } void LogWindow::setDefaultData() { //qDebug() << Q_FUNC_INFO << " - Start"; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(util->getDefaultLogFields()); //qDebug() << "LogWindow::setDefaultData" ; //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::createlogPanel(const int _currentLog) { //qDebug() << Q_FUNC_INFO << " - Start : " << QString::number(_currentLog); currentLog = _currentLog; if (!logModel->createlogModel(currentLog)) { //qDebug() << Q_FUNC_INFO << " - ERROR creating model"; } 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); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::setColumnsOfLog(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO << " - Start: 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().text(), 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 << "calling filterValidFields"; columns << dataProxy->filterValidFields(temPColumns); //foreach(aux, columns) //{ //qDebug() << Q_FUNC_INFO << ":-2: " << aux; //} foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ": " << aux; showColumn(aux); } //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::showColumn(const QString &_columnName) { //qDebug() << Q_FUNC_INFO << " - Start"; 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().text(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.indexOf(_columnName); logView->setColumnHidden(columns, false); } void LogWindow::refresh() { //qDebug() << Q_FUNC_INFO << " - Start"; if (!logModel->select()) { //qDebug() << Q_FUNC_INFO << " - ERROR on select()"; //qDebug() << Q_FUNC_INFO << " - Error refreshing log:" << logModel->lastError().text(); QMessageBox msgBox; msgBox.setText(tr("There was a problem with the log, please restart KLog and contact the development team if the error persist.")); msgBox.setIcon(QMessageBox::Critical); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::createActions() { //qDebug() << Q_FUNC_INFO << " - Start"; createActionsCommon(); showMenuRightButtonFromLogCreateActions(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::createActionsCommon() { //qDebug() << Q_FUNC_INFO << " - Start"; //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(logView->horizontalHeader(), &QHeaderView::sectionMoved, this, &LogWindow::slotOnSectionMoved); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << Q_FUNC_INFO << " - Start"; int row = (logView->indexAt(pos)).row(); QItemSelectionModel *select = logView->selectionModel(); QModelIndexList list = select->selectedRows(); if (select->hasSelection() && (list.length()>1) ) { rightButtonMultipleFromLogMenu(); } else { rightButtonFromLogMenu(row); } //qDebug() << Q_FUNC_INFO << " - END"; //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::rightButtonMultipleFromLogMenu() { //qDebug() << Q_FUNC_INFO << " - Start"; 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()); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::rightButtonFromLogMenu(const int trow) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(trow); //qDebug() << Q_FUNC_INFO; int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID); 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) { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); qslSentViaBureauFromLogAct->setData(trow); qslSentViaDirectFromLogAct->setData(trow); } if (!qslReceived) { 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()); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << Q_FUNC_INFO << " - Start Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()); 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()); //qDebug() << "LogWindow::slotDoubleClickLog: emitted: " << QString::number (((logModel->index(row, Qt::DisplayRole)).data(0)).toInt()); 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(); //qDebug() << Q_FUNC_INFO << " - END"; } bool LogWindow::isQSLReceived(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start " << QString::number(_qsoId); return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL //return dataProxy->isQSLReceived(_qsoId); } bool LogWindow::isQSLSent(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_qsoId); return dataProxy->isQSLSent(_qsoId); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << Q_FUNC_INFO << " - Start"; 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() )); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSOsSelectAll() { //qDebug() << Q_FUNC_INFO << " - Start"; logView->selectAll(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSOsDeselectAll() { //qDebug() << Q_FUNC_INFO << " - Start"; logView->selectionModel()->clearSelection(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSLSentViaBureauFromLog() { //qDebug() << Q_FUNC_INFO << " - Start: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSLSentViaDirectFromLog() { //qDebug() << Q_FUNC_INFO << " - Start: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); 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()); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSLRecViaBureauFromLog() { //qDebug() << Q_FUNC_INFO << " - Start"; int _qsoId = ((logModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); //qDebug() << Q_FUNC_INFO << " - END"; //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSLRecViaDirectFromLog() { //qDebug() << Q_FUNC_INFO << " - Start: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); 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() << Q_FUNC_INFO << " - Start: " << (qsoToEditFromLogAct->data()).toString(); //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); //qDebug() << Q_FUNC_INFO << " - END"; //TODO: To be added to the logWindow and create an action that emit the QSO id } void LogWindow::deleteQSO(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_qsoId); emit actionDeleteQSO(_qsoId); //qDebug() << Q_FUNC_INFO << " - END"; } /* void LogWindow::deleteQSO(const int _qsoID) { //qDebug() << "LogWindow::deleteQSO: " << QString::number(_qsoID); 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() << Q_FUNC_INFO << " - Start: " << (delQSOFromLogAct->data()).toString(); //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); /* switch (ret) { case QMessageBox::Yes: //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): -1"; deleteQSO(QSOid); break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } */ //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSOsDeleteFromLog() { //qDebug() << Q_FUNC_INFO << " - Start"; 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()) ; //qDebug() << "LogWindow::slotshowRighButtonFromLog: " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit deleteTheseQSOs(qsos); } //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSOsExportFromLog() { //qDebug() << Q_FUNC_INFO << " - Start"; 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()) ; //qDebug() << "LogWindow::slotQSOsExportFromLog: " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit exportToADIFTheseQSOs(qsos); } //qDebug() << "LogWindow::slotQSOsExportFromLog - END - " << QString::number(qsos.length()); } void LogWindow::slotQSOsUploadToLoTWFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotQSOsUploadToClubLogFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotQSOsQRZUploadFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; 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() << Q_FUNC_INFO << " : " << QString::number(index.row()) ; //qDebug() << Q_FUNC_INFO << " : " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit uploadToQRZcomTheseQSOs(qsos); } //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQSOsUploadToEQSLFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLSentViaBureauFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLSentViaDirectFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLRecViaBureauFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLRecViaDirectFromLog() { //qDebug() << Q_FUNC_INFO << " - Start - TO BE IMPLEMENTED"; } void LogWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_qsoId); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); } void LogWindow::qslRecViaBureau(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(); //Update the Award status refresh(); emit updateAwards(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false); awards->setAwards(); refresh(); emit updateAwards(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); } void LogWindow::slotCheckQRZCom() { //qDebug() << Q_FUNC_INFO << " - Start"; 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() << Q_FUNC_INFO << " : " << _qrz; util->openQrzcom (_qrz); //QString url = "https://www.qrz.com/db/" + _qrz; //QDesktopServices::openUrl(QUrl(url)); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotCheckDXHeatCom() { //qDebug() << Q_FUNC_INFO << " - Start"; 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() << Q_FUNC_INFO << " : " << _qrz; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); //qDebug() << Q_FUNC_INFO << " - END"; } void LogWindow::slotOnSectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex) { Q_UNUSED(logicalIndex); Q_UNUSED(oldVisualIndex); Q_UNUSED(newVisualIndex); // Get the current column order QStringList header = getOrderedVisibleHeaders(); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup("LogWindow"); settings.setValue("ColumnOrder", QVariant::fromValue(header)); settings.endGroup(); } QStringList LogWindow::getOrderedVisibleHeaders() const { QStringList orderedHeaders; QHeaderView* headerView = logView->horizontalHeader(); for (int i = 0; i < headerView->count(); ++i) { int logicalIndex = headerView->logicalIndex(i); if (!logView->isColumnHidden(logicalIndex)) { QString header = logModel->headerData(logicalIndex, Qt::Horizontal).toString(); orderedHeaders.append(util->getLogColumnDBName(header)); } } return orderedHeaders; } klog-2.4.1/INSTALL-es.txt0000644000175000017500000000034015003153303013674 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-2.4.1/flags/0000755000175000017500000000000015003153303012517 5ustar develdevelklog-2.4.1/flags/in.png0000644000175000017500000000076715003153303013645 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"` *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-2.4.1/flags/ck.png0000644000175000017500000000111215003153303013615 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-2.4.1/flags/td.png0000644000175000017500000000107215003153303013634 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-2.4.1/flags/qa.png0000644000175000017500000000070215003153303013625 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-2.4.1/flags/iq.png0000644000175000017500000000100315003153303013630 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@,/^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-2.4.1/flags/southbritish.png0000644000175000017500000000100215003153303015745 0ustar develdevelPNG  IHDR n pHYs  tIME8vW|IDAT(c<1{|#[$^yPr܈+_[$؋0m~V~R[\9#"b=L?p / j>ç ?~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-2.4.1/flags/dz.png0000644000175000017500000000110615003153303013640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbT ǯ_|af[(` @,o}$,*)T? 2x:` ٿ@>1 ZϿNK|#@4!(#ӏB%scHNp 51jQ T"?f(W]su m`Xj9_j/9$ؘ ~342`T @_QPhR@`! =ڮIENDB`klog-2.4.1/flags/kp.png0000644000175000017500000000106115003153303013635 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-2.4.1/flags/sg.png0000644000175000017500000000072415003153303013641 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-2.4.1/flags/pk.png0000644000175000017500000000107115003153303013636 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#|Ez4 f1XH1߿ߛfl 㯏? e_ ZGh@1ATC?U+[;F,,@A5%$v8(aٶ#"ϟo[%'ēߚNꯟ_~3X + /oWy>?@/0XQI  /Ԙ&y 6!j IENDB`klog-2.4.1/flags/ph.png0000644000175000017500000000103215003153303013630 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-2.4.1/flags/northernireland.png0000644000175000017500000000075215003153303016427 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-2.4.1/flags/mo.png0000644000175000017500000000111415003153303013635 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-2.4.1/flags/tk.png0000644000175000017500000000117615003153303013650 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-2.4.1/flags/mk.png0000644000175000017500000000123015003153303013630 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-2.4.1/flags/gw.png0000644000175000017500000000100415003153303013635 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-2.4.1/flags/sh.png0000644000175000017500000000120515003153303013635 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-2.4.1/flags/kz.png0000644000175000017500000000115015003153303013646 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-2.4.1/flags/cf.png0000644000175000017500000000114615003153303013617 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbԿ/Vҿ9~axA/c 2L1ئ}2k m<n_9loO R? ). IDATxb#L) @,@?DN!/^ Ld@1  PUcvOw?h?P m_N7n|"gbb_?p1@ 03 ֻo^a; Xƃۗ3ݼ0xW{e95Cݻ[>>>dc,HwAb0]/uTIENDB`klog-2.4.1/flags/uz.png0000644000175000017500000000100315003153303013655 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: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-2.4.1/flags/zw.png0000644000175000017500000000107615003153303013671 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 @+( H ܿ>81 ()̌ @ 516F23   po濿?~g{W;$ _ϿTܐKt@(!.?_?wS1>4@120#G$A$@/Z:YIENDB`klog-2.4.1/flags/bg.png0000644000175000017500000000071615003153303013621 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&47t 7 QBÔ C_aK!H(@L _-X gcb 2A  :f @,L_= tr17㟿 7 *p4ҌB#G =4(d| %J:`7YOEIENDB`klog-2.4.1/flags/wf.png0000644000175000017500000000105215003153303013637 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`A0@UWہ+/9_/c&i=7ʏ T?1!+ T@ 1@_2~fQ UtHĒ011|m흲wvHN)* 4 X.:0{:?׿~ttI <@,߿6d}%{z$RS_,Xm`v@1ſ@a$!߿7KJ]]nH?CU5]ɓ@?eQQ* _ IJ0Y d A?q)7cp00A=qtݯIENDB`klog-2.4.1/flags/kg.png0000644000175000017500000000077615003153303013640 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-2.4.1/flags/io.png0000644000175000017500000000122215003153303013631 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<$IDATxb^ۻ\g 1la700a`As0@1[GI%$   &C1  >{Ue;UM.w~S_([gIYit ;?1BP" 1 ̷R=<.Ϻ.IÝw4LUg#,\4_ r[fέ F>?\?L[8)~Q 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-2.4.1/flags/cx.png0000644000175000017500000000114015003153303013633 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-2.4.1/flags/va.png0000644000175000017500000000105115003153303013630 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-2.4.1/flags/az.png0000644000175000017500000000111515003153303013635 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-2.4.1/flags/nu.png0000644000175000017500000000107415003153303013651 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-2.4.1/flags/tj.png0000644000175000017500000000076015003153303013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπ gCV"`Ml_O(H_@Ư~l@WNNN$i` fSb{?,f&G AT̲y.@gb{Ǐ<<~a#{O_ϯ 7]ϟ`W)H @L @glӞ/p0~]zӗo?}Ǐa4`O  &9w a?0S f@i FK(-r 9IENDB`klog-2.4.1/flags/kw.png0000644000175000017500000000074615003153303013655 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-2.4.1/flags/mw.png0000644000175000017500000000102115003153303013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd  &3`c"a>jN !Lgdl_s `K ~I0U@,`m*;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-2.4.1/flags/om.png0000644000175000017500000000073615003153303013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<pIDATxbπ d`   PÇoqYZ>oh(?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-2.4.1/flags/tm.png0000644000175000017500000000112115003153303013640 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-2.4.1/flags/ru.png0000644000175000017500000000064415003153303013657 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-2.4.1/flags/gb.png0000644000175000017500000000112715003153303013616 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-2.4.1/flags/tw.png0000644000175000017500000000072115003153303013657 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-2.4.1/flags/li.png0000644000175000017500000000103115003153303013624 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-2.4.1/flags/cg.png0000644000175000017500000000101115003153303013607 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-2.4.1/flags/ax.png0000644000175000017500000000122715003153303013637 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<)IDATxbT?.%<7M`ɔ~b/  3C-6{G̿߯? 1P8)0SߺV,!HF:cSvEp/VfV_ _n;~_0߿?9Z@,,d|ߌ ~2'#Pۏ?2 IJ 1*^  k֔Toj9"wd@/ʋrY!z w\7 X:B,~ [q[!SȂr@, >Y~a`bf!!?0 3ʅ3(OL< #6qL-AIENDB`klog-2.4.1/flags/sc.png0000644000175000017500000000114015003153303013626 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`sw!IENDB`klog-2.4.1/flags/ge.png0000644000175000017500000000112215003153303013614 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-2.4.1/flags/kh.png0000644000175000017500000000104515003153303013627 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-2.4.1/flags/um.png0000644000175000017500000000107315003153303013647 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-2.4.1/flags/dk.png0000644000175000017500000000075715003153303013634 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb zAR Q] VxyK}ϟ3I /7m 㤭YL0"5bT_?s' *!@ͽn202 TMbar H1cd`Xy1Ph HHP@_CW~xPP?ДSނg m! tɏ/nV7/π2$bL^ @P6в@`IEt|rIENDB`klog-2.4.1/flags/co.png0000644000175000017500000000074315003153303013632 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<uIDATxb|?(b @,@ !j@ /P ۲ X&OJ@z@*~_`]h @ȼ` Xe`l0d0500#/!Ha(~hIba~Cd0ofk1 \~ XM($\>@)+g8@,l ~0I D a @w  DC@`k/|IENDB`klog-2.4.1/flags/gh.png0000644000175000017500000000075215003153303013627 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-2.4.1/flags/do.png0000644000175000017500000000077415003153303013637 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-2.4.1/flags/ua.png0000644000175000017500000000067615003153303013643 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-2.4.1/flags/mz.png0000644000175000017500000000111015003153303013644 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-2.4.1/flags/scotland.png0000644000175000017500000000121115003153303015027 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-2.4.1/flags/cd.png0000644000175000017500000000102015003153303013604 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-2.4.1/flags/rw.png0000644000175000017500000000102515003153303013653 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx$ pviSS > 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-2.4.1/flags/hu.png0000644000175000017500000000066015003153303013643 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-2.4.1/flags/un.png0000644000175000017500000000050415003153303013646 0ustar develdevelPNG  IHDR  fbKGD pHYsgRtIME;>,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-2.4.1/flags/bz.png0000644000175000017500000000113015003153303013633 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-2.4.1/flags/ro.png0000644000175000017500000000075715003153303013656 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-2.4.1/flags/th.png0000644000175000017500000000070415003153303013641 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-2.4.1/flags/na.png0000644000175000017500000000120715003153303013623 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`_ -2q/)W` 1~}C  26OK h*U;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-2.4.1/flags/sk.png0000644000175000017500000000106215003153303013641 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-2.4.1/flags/mh.png0000644000175000017500000000116415003153303013633 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-2.4.1/flags/es.png0000644000175000017500000000072515003153303013640 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-2.4.1/flags/pg.png0000644000175000017500000000112115003153303013626 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA ?I6IL#9.&Ө 1 "X@0eݚ6p7g*|b")Ky*͞bjxSC__7?bjh߽mWi~w?H @ϟĘ%G_~_4bi`aa̜1}Vu~_~ 8@J}K 󤈰B5E)헮iWSS ЈMff ?  % 999wܙ1cP5 !Wٟߑ2F@4GRRׯ_ S/+@1 @g4IENDB`klog-2.4.1/flags/np.png0000644000175000017500000000067315003153303013650 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-2.4.1/flags/ne.png0000644000175000017500000000103115003153303013622 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-2.4.1/flags/ml.png0000644000175000017500000000073215003153303013637 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-2.4.1/flags/sj.png0000644000175000017500000000100015003153303013630 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-2.4.1/flags/cu.png0000644000175000017500000000106315003153303013634 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-2.4.1/flags/lk.png0000644000175000017500000000116315003153303013634 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-2.4.1/flags/lt.png0000644000175000017500000000077415003153303013654 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-2.4.1/flags/cv.png0000644000175000017500000000102115003153303013627 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-2.4.1/flags/ch.png0000644000175000017500000000055715003153303013626 0ustar develdevelPNG  IHDR &qgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπP@, ^u5###7Ï0gl`S-d:II$/T~7@hYe@ׯ@ 020q/@m,*~  fe֭PIssSeeR@_@q)@T0HQ|?ڀ)&ǏIENDB`klog-2.4.1/flags/ht.png0000644000175000017500000000074715003153303013650 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-2.4.1/flags/shm.png0000644000175000017500000000053615003153303014020 0ustar develdevelPNG  IHDRvbKGD pHYsgRtIME0uluIDAT(c'1NfpT #/`e\W<,2b `M u2eswcxW{AX~}á`/+  s0te030 r1ܼwP?p0p2Ä| Uݿb%> |`59bC_^̓IENDB`klog-2.4.1/flags/is.png0000644000175000017500000000102415003153303013635 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdПϥcfVYaï? LD`Pm l#1QBaKwi^fz ,CtԮ ? ϣG@_T_ :94_@H`@=@@% [g&޴ 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-2.4.1/flags/sz.png0000644000175000017500000000120315003153303013655 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-2.4.1/flags/pm.png0000644000175000017500000000126115003153303013641 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-2.4.1/flags/ai.png0000644000175000017500000000120315003153303013612 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-2.4.1/flags/pe.png0000644000175000017500000000061515003153303013633 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-2.4.1/flags/bh.png0000644000175000017500000000071115003153303013615 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-2.4.1/flags/lc.png0000644000175000017500000000101015003153303013613 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;*+._\DE9H߿ ſ~Rl6bb|-???~Cd~u@iQgx a!A HpcdXG X@I  0eF_ 0~G-@12l)R0@Z gu}a^eNIENDB`klog-2.4.1/flags/ir.png0000644000175000017500000000100015003153303013626 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd 10da / ծ @￿ϟ?o X|}_?߿Hc`b1Z     **V߿@' >}@LB e߼тObBW 11>D5s-;;3g~?A4!,?`?(YL ̓"K{IENDB`klog-2.4.1/flags/balear.png0000644000175000017500000000061615003153303014456 0ustar develdevelPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<0IDATxTMKA UUŏPԛTxAUۃ+ Kw233;KLƘj,TbU9u f(fLjW'YBHZYer$3L +Lt؂i! 3ӓ/Abs㗿&I8/'fiA 49P{AzK8 (UX_120F8IRS]IENDB`klog-2.4.1/flags/marquesas.png0000644000175000017500000000056315003153303015232 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-2.4.1/flags/mp.png0000644000175000017500000000112515003153303013640 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-2.4.1/flags/nc.png0000644000175000017500000000111715003153303013625 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-2.4.1/flags/al.png0000644000175000017500000000113015003153303013614 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-2.4.1/flags/bn.png0000644000175000017500000000117715003153303013632 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbzPƿ? P0 bl0 07\Q :F+@BkW+PZ8&Ԛ/X 3D3տ~y'N_~f`/FV=aem [G~(?``߷~[1wyybhh" yhpQQÇ?V,T?-O`b|Q~fj$ׯߝ2Yu޿1u#u311cee555Ev?gA>w߿~篊ŋR@9Ff?LlV} O<@ӠXF_Pdbad4 paw p1iIENDB`klog-2.4.1/flags/mt.png0000644000175000017500000000064415003153303013651 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb#ÿ LL Hߛ7< @,@rMmm-FXX1?/6˿?ܿٳ?)g QVh@0hhh~)7P@{  oqUgj?J|$N W7P$ /߿@5Ăq 22 @A_ @ ޼yւWlAc0M[yvIENDB`klog-2.4.1/flags/ca.png0000644000175000017500000000116415003153303013612 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb&p>̀$LX ``@,=,/J0~ ~}Y,YY,#sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-2.4.1/flags/mn.png0000644000175000017500000000075415003153303013645 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-2.4.1/flags/bq.png0000644000175000017500000000064015003153303013627 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-2.4.1/flags/cl.png0000644000175000017500000000070215003153303013622 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-2.4.1/flags/cs.png0000644000175000017500000000066715003153303013643 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-2.4.1/flags/bo.png0000644000175000017500000000076415003153303013634 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-2.4.1/flags/bj.png0000644000175000017500000000074615003153303013627 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-2.4.1/flags/fk.png0000644000175000017500000000121015003153303013617 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=+ _Rh(_} d96?W?.:ϝ?}sb}󟷟2J^fW7 j /?z13AĂP+4Y9e@,%$w/W0Ƚa_v/(X$)7㟿@9߿ad"/q_Cb1/IENDB`klog-2.4.1/flags/fam.png0000644000175000017500000000102415003153303013765 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-2.4.1/flags/yt.png0000644000175000017500000000112115003153303013654 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-2.4.1/flags/rs.png0000644000175000017500000000064715003153303013660 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-2.4.1/flags/ni.png0000644000175000017500000000077415003153303013643 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-2.4.1/flags/ug.png0000644000175000017500000000102315003153303013634 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/|󅗕?|QXbh2P ?&_@Kj ?P_HP1@= 4b? lz0,rI`'HoA (t=@'1; 7aA XInI7eE###00)$bd(e`cP|`^]K @7dJr IENDB`klog-2.4.1/flags/mg.png0000644000175000017500000000070515003153303013632 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-2.4.1/flags/fo.png0000644000175000017500000000073215003153303013633 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-2.4.1/flags/sl.png0000644000175000017500000000066415003153303013651 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-2.4.1/flags/er.png0000644000175000017500000000121515003153303013632 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<0GaW9_0 ;33?7_?ѿ߿ɿ~i&b3%?ʗڱY?{5~c?߲ܲ@Kd?ր?Y?ړsEI'd?1G't;9!01WJG dX 7[џa _3s0?/l^ǎa[=@1<265 %dÿͦSLj]T7;-jC+㏟ ~B1+K4 q#5 1y-~p0FX@ P8PIENDB`klog-2.4.1/flags/pl.png0000644000175000017500000000056615003153303013647 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb# ?l X@ 3300G_= Ȍ##?H)VFj0ģ X?{? Yi I_ !~_ 69vXd<"T00H3 pE5ei`ARl_? `# $ A@pĀE\Ǵ]IENDB`klog-2.4.1/flags/pw.png0000644000175000017500000000104615003153303013654 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-2.4.1/flags/vi.png0000644000175000017500000000115015003153303013640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#L) @,@q]ƌL_ IE߿} 1Z@1 Y > 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-2.4.1/flags/sardinia.png0000644000175000017500000000070715003153303015023 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-2.4.1/flags/vu.png0000644000175000017500000000113415003153303013656 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-2.4.1/flags/pr.png0000644000175000017500000000105415003153303013646 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-2.4.1/flags/cc.png0000644000175000017500000000116115003153303013611 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~/_`@,`H/=P @ ?Hnԯp! S AM Ȇ߿n?4d#IvX*_g@V00H3ċ` P@ L0HJl$"pP1@1~EH|IENDB`klog-2.4.1/flags/vc.png0000644000175000017500000000110115003153303013626 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-2.4.1/flags/sb.png0000644000175000017500000000116015003153303013627 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf>"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-2.4.1/flags/bs.png0000644000175000017500000000101615003153303013627 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-2.4.1/flags/mv.png0000644000175000017500000000103615003153303013647 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-2.4.1/flags/ec.png0000644000175000017500000000076415003153303013623 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-2.4.1/flags/au.png0000644000175000017500000000124115003153303013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx? ?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-2.4.1/flags/sd.png0000644000175000017500000000075415003153303013641 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxLA A6I`);]LAQ)\܀abBWξL1?a߿F~ٴ X0Pcek =@ H(+ @DuI C3Gpt~y2`c?/ bc5[+؀@ ϯ7y61gp{3dP?XY33Oß^r^:pf/0:JY篊ŋ +NC\B  0$`J-N:cIENDB`klog-2.4.1/flags/sn.png0000644000175000017500000000102415003153303013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdhd@ @&@TVY R1e`?0̟"l@,`?e~_@Ռ@490sT7Z:pZ_XR+@2Uϟ~{?P%i￿+~mR\! /Xm0e.ۯ_v@? l`; @~/g C&n<h0I@_= b0PO@, ~#- 8X~32Iq àN Fd/z=O`,[XIENDB`klog-2.4.1/flags/sv.png0000644000175000017500000000076515003153303013665 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-2.4.1/flags/cm.png0000644000175000017500000000101515003153303013621 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-2.4.1/flags/it.png0000644000175000017500000000064415003153303013645 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-2.4.1/flags/fr.png0000644000175000017500000000104115003153303013630 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-2.4.1/flags/pa.png0000644000175000017500000000100715003153303013623 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-2.4.1/flags/se.png0000644000175000017500000000103615003153303013634 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-2.4.1/flags/gi.png0000644000175000017500000000071715003153303013631 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<aIDATxb|= B"3ϟ?@ X@m`8߿ 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-2.4.1/flags/st.png0000644000175000017500000000111015003153303013644 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-2.4.1/flags/ae.png0000644000175000017500000000063015003153303013611 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-2.4.1/flags/am.png0000644000175000017500000000076115003153303013626 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-2.4.1/flags/za.png0000644000175000017500000000120215003153303013632 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-2.4.1/flags/gr.png0000644000175000017500000000074715003153303013645 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-2.4.1/flags/cr.png0000644000175000017500000000073515003153303013636 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-2.4.1/flags/zm.png0000644000175000017500000000076415003153303013662 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-2.4.1/flags/nf.png0000644000175000017500000000113215003153303013625 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-2.4.1/flags/us.png0000644000175000017500000000114115003153303013651 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-2.4.1/flags/sr.png0000644000175000017500000000100115003153303013641 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-2.4.1/flags/il.png0000644000175000017500000000065715003153303013641 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-2.4.1/flags/mc.png0000644000175000017500000000057415003153303013632 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-2.4.1/flags/dm.png0000644000175000017500000000115415003153303013626 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-2.4.1/flags/de.png0000644000175000017500000000104115003153303013611 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-2.4.1/flags/mu.png0000644000175000017500000000076015003153303013651 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-2.4.1/flags/tl.png0000644000175000017500000000100215003153303013635 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxLA ]=3=\$IfMNp :J!s#5^ 1|?@?$˦Mp¿Oc/ $ f@ ?/aJAC40 @L@ Gg 6biknn8syI_`?6Hm[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-2.4.1/flags/bd.png0000644000175000017500000000077015003153303013616 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-2.4.1/flags/sa.png0000644000175000017500000000104715003153303013632 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdf@ H @#(,lg2EYi) i~P_~ˏ2B@tah,ǧ1132{NK Z@ `?})# y~~7 ̿]@L@on_|ڋklמ_`k; $  @a,WBڇroYZBc  3:%xXWdj  g-÷@ Xq > pEF+.ONHh'P@12(D$O 0z79NIENDB`klog-2.4.1/flags/ceuta.png0000644000175000017500000000070115003153303014324 0ustar develdevelPNG  IHDR v 9bKGD pHYs  tIME4$I.NIDAT(ύKaǟ A1 ")!,! ;\@hr!g]ZB$Z"zit`z'w>|UUb u#^|>Nl+jl~<(, c 3=σeYM6onm^Z過'4uN$. 3Ub '8?J({R 4OI=i  65{jU@Ǐ!p{?}~|c:}$5" YL5*e 0q az@$ bȿ`$X@12dU@ Df08v%3%&IENDB`klog-2.4.1/flags/ki.png0000644000175000017500000000122015003153303013623 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<"IDATxb`? PL?0qb12g_ߟ?O?> 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-2.4.1/flags/ly.png0000644000175000017500000000064315003153303013654 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-2.4.1/flags/ee.png0000644000175000017500000000065515003153303013624 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 @ 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-2.4.1/flags/as.png0000644000175000017500000000120715003153303013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbTT`@Ʋr4l 1+! %12: =7l6P .ZemKݽH?8D X7.Ek9ٝs˞_>"$|lu{؟r2rqOڕ L |~}"# @1!;&  ; !6[1D# 0/JN&rH 鿿~ z:|5s6y,l\1YY21= ?X~`'0A?z11`?|MZyˋ` d.$1310H10 !IENDB`klog-2.4.1/flags/aw.png0000644000175000017500000000101415003153303013630 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-2.4.1/flags/by.png0000644000175000017500000000100215003153303013630 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-2.4.1/flags/mr.png0000644000175000017500000000107115003153303013642 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd0c@?8P(60CSd5b`2Zt\=9cEoϧ^>{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-2.4.1/flags/tg.png0000644000175000017500000000106215003153303013636 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-2.4.1/flags/la.png0000644000175000017500000000106315003153303013621 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-2.4.1/flags/gl.png0000644000175000017500000000072615003153303013634 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-2.4.1/flags/af.png0000644000175000017500000000113415003153303013612 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbXY  V2LL``qݻwMMM@ 7㟿̿~(_?\<{1@PW~{%>CKh @߿@@ /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-2.4.1/flags/gq.png0000644000175000017500000000103115003153303013627 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-2.4.1/flags/ve.png0000644000175000017500000000102015003153303013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxba &!@# e æE^ y af/6 ? *(  ߌ@e !/P7P@1vv# JJ ? >PHUm>mެT A@e@ _/R=mګ_UV7!&3uvVo5?@SA$+$Rz X1e=!Cp?`@,@k~aEd0@H :+4f&Zt8IENDB`klog-2.4.1/flags/ba.png0000644000175000017500000000112115003153303013602 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-2.4.1/flags/eh.png0000644000175000017500000000077415003153303013631 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb` ld`  U__$ ?~bZݸ X:?} (~$߯_s}@,JU @,"R"ܬ `̙'Oy9PCKKٟ?  b`  f+WϚ@j@P)@1셫-II׮/BB9?N) A߿u,aTRzs@(7(x70   "MϖxbIIџ@$0oЌ;@ ~j9v^f0 O :uIENDB`klog-2.4.1/flags/tc.png0000644000175000017500000000116015003153303013631 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbܟ_CsǧOXp`$0yf)7n0|OJO˃ߟ?~ "ߦN1 ɾ?4 eS6'_neeWVx5N/~SgIXkKj v~L\\>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-2.4.1/flags/re.png0000644000175000017500000000104115003153303013627 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-2.4.1/flags/br.png0000644000175000017500000000112115003153303013623 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-2.4.1/flags/lu.png0000644000175000017500000000074115003153303013647 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-2.4.1/flags/gt.png0000644000175000017500000000075515003153303013646 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-2.4.1/flags/to.png0000644000175000017500000000065215003153303013652 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<}/Sh-k `b```􏁑? >0=W($-*;sc O <IENDB`klog-2.4.1/flags/bm.png0000644000175000017500000000114315003153303013622 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<^IzzK,L /eeDI}X:?0F@13kX:ɧƲeοu ׵8c,0Z]_/߿deV4U-7}(Ω([~]ʕ χ))@W3_< 31ۓ_?kM'I@ 1try!H kJe[\MMJyů}y_9t/? aT/ O/cֲsqp X@! 8P Q %Y rꟿ@4UR<߿_ ĸ,"X-$@5K]IENDB`klog-2.4.1/flags/wales.png0000644000175000017500000000121415003153303014336 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-2.4.1/flags/ye.png0000644000175000017500000000063515003153303013646 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe</IDATxb|π`$2IbJpV1?D7doŒM6OD~3 Vo0׿߿l&iY "ޞm$A:A @AFo,WNNN3!.#bD5Hn@YFFbi 5he„>ϟ?ȇpT  F3߿ ~D N8@`HHHHC -@ V3azDIENDB`klog-2.4.1/flags/id.png0000644000175000017500000000065615003153303013630 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<@IDATxb//P_;P _ ߟ 7q{"ba`9H_4 տ,%  X2VT7Ͽ߿@_ ?@9b9׿_>jP~P@r`r2 ? @?0!n{b###H=>Y/ R4mhD d@@.H @~h0bvBIENDB`klog-2.4.1/flags/fi.png0000644000175000017500000000075115003153303013626 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-2.4.1/flags/cz.png0000644000175000017500000000073415003153303013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<nIDATxbd? & 8@+{_EB/^ & g/G+C3b!@s@4纋-Kß?o?ߟ+߾ZI d Q@!/ 6  s~ׯA߿I%??@5؝hwn#T ~1Ik@ X~>@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-2.4.1/flags/bf.png0000644000175000017500000000076115003153303013620 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@,`JCL7P@1#P5Pş? ~ 4 X10rq@_@bׯ {X\b` Z|?>ן~u\5 (7T} @ B.c^=VBzE҈Rf a,l@, @ԁLj D #- 6N f/@123@T$p<31ShBIENDB`klog-2.4.1/flags/ls.png0000644000175000017500000000116415003153303013645 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb|- ?@}r8@,@/Nգ3^ BԣOϯ~fV~mv_@?_[= @1 &:]'<^O䇗w Ji000>Fj?|׷b~o `1'@(@]ۯ>?z,o~ Ÿ@  @^6rgo~ϟ~1KϮ \`x տ1Mec`z<&I>mP!j&@IENDB`klog-2.4.1/flags/eg.png0000644000175000017500000000072115003153303013620 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<cIDATxb| pI anl%#eaw.;R! 09O2)P߿@Q 7H/ ׿_L@ԔISAT j}@LB]~~g-j0?Ĩ_XXkR_MZ]$mmmr}ZZڽ{~/00@$4EEEŋ V@)(0[b_* @NcHIENDB`klog-2.4.1/flags/vg.png0000644000175000017500000000116615003153303013645 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-2.4.1/flags/ws.png0000644000175000017500000000073415003153303013662 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-2.4.1/flags/gf.png0000644000175000017500000000104115003153303013615 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-2.4.1/flags/tn.png0000644000175000017500000000075715003153303013657 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|/_"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-2.4.1/flags/tr.png0000644000175000017500000000075415003153303013660 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-2.4.1/flags/gd.png0000644000175000017500000000117515003153303013623 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-2.4.1/flags/sy.png0000644000175000017500000000064615003153303013666 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-2.4.1/flags/nl.png0000644000175000017500000000070515003153303013640 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-2.4.1/flags/england.png0000644000175000017500000000076015003153303014640 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb#߷/礥10ܾ P?T'zQѿ?#gϞ D\5H߿߿@@,h!$P_J;@f`x@@'aW"__`b B Xcl@@#0/ïPL@ӧ@gr2:ן@@%'3L /vo!.7A?T=L@JJ@ba@/#0!!T.^\1 Pp,IENDB`klog-2.4.1/flags/ps.png0000644000175000017500000000073015003153303013647 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-2.4.1/flags/hm.png0000644000175000017500000000124115003153303013627 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATxb<^|CrǻXV*Dsg101KMy<"[M-ܣ1  =F;! 鐎>_aQY.3߲we~pkt ano!$AXx?~/(4!1# /ଜݢ! )  Hu?|PWz5%3_]Hƛ1e,i73feqp놅0Əϊa:@};~%"x߿C$n7`ee>3@aC얯& }h&tIENDB`klog-2.4.1/flags/sm.png0000644000175000017500000000076615003153303013655 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb??0!?`Ib)?#3G| `ƿU322- L~?nd  wۋ~|r~N\d=0#C>oD פO"͇x?K1-h@L tc <_zl @@ɯ9{2ߘ  @e2_5-k߿ /ba&n% 70(FͻßpcȐh!(. `DOaIENDB`klog-2.4.1/flags/an.png0000644000175000017500000000075015003153303013625 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 #sdv@m@$ H 9 @ɂgqq&&=ffܬ? l줷v~|o7~aQVz@d@ g'D/ H'?f ?$A.,_P3@WaQމ̮ 1$`$ZlIENDB`klog-2.4.1/flags/dj.png0000644000175000017500000000107415003153303013624 0ustar develdevelPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb<|= /1p100??~Ͽ"~3~cca p1߿/? f@,@< f*Nf?Ha@ @K7/j@1a_ s3x&b0go'`F qt &A'';æg>_~&VbWb:@,@'1|W|<F"I O{_P?f >CL\22@u # !~1˴ӊ3|``0&` ` |^#iIENDB`klog-2.4.1/flags/jo.png0000644000175000017500000000073115003153303013636 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@`@￿ . * * * *****************************************************************************/ #include //#include #include //#include #include #include #include #include #include #include #include #include "startwizard.h" #include "mainwindow.h" #include "utilities.h" int showNoDB() { QMessageBox msgBox; Utilities util(Q_FUNC_INFO); QString msg = QString("There is no DB in the KLog folder and could not create it. KLog can't continue like this.\n") + QString("Please remove or rename the %1 file and restart KLog.").arg(util.getCfgFile()); msgBox.setWindowTitle("KLog"); msgBox.setIcon(QMessageBox::Critical); msgBox.setTextFormat(Qt::RichText); msgBox.setText(msg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return -1; } int showErrorUpdatingTheDB() { QMessageBox msgBox; Utilities util(Q_FUNC_INFO); QString msg = QString("KLog could not update the DB and it is a critical step for this release. KLog can't continue like this.\n") + QString("Please use the previews version of KLog to export your log to ADIF. Then do a clean installation of the new KLog version and import the ADIF file. If that doesn't work, please contact the KLog development team."); msgBox.setWindowTitle("KLog"); msgBox.setIcon(QMessageBox::Critical); msgBox.setTextFormat(Qt::RichText); msgBox.setText(msg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return -1; } // Function to handle missing translation files void loadTranslations(QApplication &app, QTranslator &myappTranslator) { Utilities util(Q_FUNC_INFO); QString translationPath, translationPath2; QString language = (QLocale::system().name()).left(2); bool missingTranslation = true; // Check possible translation paths #if defined(Q_OS_WIN) translationPath = QCoreApplication::applicationDirPath() + "/translations/klog_" + language + ".qm"; #elif defined(Q_OS_OSX) translationPath = QCoreApplication::applicationDirPath() + "/translations/klog_" + language + ".qm"; #else translationPath = "/usr/share/klog/translations/klog_" + language + ".qm"; translationPath2 = util.getHomeDir() + "/translations/klog_" + language + ".qm"; #endif if (myappTranslator.load(translationPath) || myappTranslator.load(translationPath2)) { missingTranslation = false; } if (missingTranslation && language != "en") { QMessageBox::warning(nullptr, "KLog", QString("No translation files for your language were found. KLog will be shown in English.\n") + QString("If you have the klog_%1.qm file for your language, copy it to the translations folder and restart KLog.") .arg(language)); } app.installTranslator(&myappTranslator); } int main(int argc, char *argv[]) { //qDebug() << Q_FUNC_INFO << " - Start! "; //qDebug() << Q_FUNC_INFO << " - " << QSslSocket::supportsSsl() << QSslSocket::sslLibraryBuildVersionString() << QSslSocket::sslLibraryVersionString(); QT_REQUIRE_VERSION(argc, argv, "5.9") //qDebug() << QT_VERSION_STR; QDir d1 = QDir(); //qDebug() << Q_FUNC_INFO << " - STARTED: "; Utilities util(Q_FUNC_INFO); 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() << Q_FUNC_INFO << " - -10 "; // Now we check if the user is executing from the command line // Command-line arguments QTextStream cout(stdout); QStringList arguments = app.arguments(); if (arguments.size() > 1) { Utilities util(Q_FUNC_INFO); if (arguments.contains("-v")) { cout << "Version: KLog-" << app.applicationVersion() << "\n"; } else { util.printCommandHelp(); } return 0; } /* 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 KLOG_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 // Load translations //qDebug() << Q_FUNC_INFO << " - Start of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - Detected language: " << (QLocale::system().name()).left(2) << ".qm"; QTranslator myappTranslator; loadTranslations(app, myappTranslator); QString klogDir = util.getHomeDir(); //qDebug() << Q_FUNC_INFO << " - 10"; //qDebug() << Q_FUNC_INFO << " - Setting klog dir: " << (QTime::currentTime()).toString("HH:mm:ss")<< QT_ENDL;; // First step when running KLog, if the KLog folder does not exist, KLog creates it if (!QDir::setCurrent (klogDir) ) { //qDebug() << Q_FUNC_INFO << " - KLogDir does not exist.... creating "; if (d1.mkdir(klogDir)) { if (QDir::setCurrent (klogDir) ) { //qDebug() << Q_FUNC_INFO << " - KLogDir has just been created and pointed "; } } } //qDebug() << Q_FUNC_INFO << " - Setting klog dir - finished: " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - Setting config file: " << (QTime::currentTime()).toString("HH:mm:ss") ; QPixmap pixmap(":img/klog_512x512.png"); //qDebug() << Q_FUNC_INFO << " - 51" << (QTime::currentTime()).toString("HH:mm:ss"); QSplashScreen splash(pixmap); //int firstTime = true; // If the KLog configuration file does not exist, we launch the wizard. if (!((QFile::exists(util.getCfgFile ())))) { //qDebug() << Q_FUNC_INFO << " - Starting wizard... "; StartWizard *wizard = new StartWizard(klogDir, version); wizard->setModal(true); wizard->exec(); } else { // KLog configuration file exists, let's look for the DB //qDebug() << Q_FUNC_INFO << " - Start of DB Activities" << (QTime::currentTime()).toString("HH:mm:ss"); //firstTime = false; DataBase *db = new DataBase(Q_FUNC_INFO, version, util.getKLogDBFile()); //qDebug() << Q_FUNC_INFO << " - After Start of DB Activities"; if (!db->createConnection(Q_FUNC_INFO)) { //qDebug() << Q_FUNC_INFO << " - Conection not created"; return showNoDB(); //return -1; // Exits with an error; no DB has been created } else { //qDebug() << Q_FUNC_INFO << " - DB to be updated"; if (!db->updateIfNeeded()) // Check if we need to update the DB { //qDebug() << Q_FUNC_INFO << " - DB NOT Updated"; } //qDebug() << Q_FUNC_INFO << " - DB Updated"; } //qDebug() << Q_FUNC_INFO << " - 98" << (QTime::currentTime()).toString("HH:mm:ss"); db->~DataBase(); //qDebug() << Q_FUNC_INFO << " - 99" << (QTime::currentTime()).toString("HH:mm:ss"); } //qDebug() << Q_FUNC_INFO << " - 100 - Show" << (QTime::currentTime()).toString("HH:mm:ss"); splash.show(); //qDebug() << Q_FUNC_INFO << " - 101 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Creating the Data Base..."); DataProxy_SQLite dataProxy (Q_FUNC_INFO, version); splash.showMessage ("Creating window..."); //qDebug() << Q_FUNC_INFO << " - 102 " << (QTime::currentTime()).toString("HH:mm:ss"); MainWindow mw(&dataProxy); splash.showMessage ("Initializing window..."); //qDebug() << Q_FUNC_INFO << " - 103 " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - 104 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.init(); //qDebug() << Q_FUNC_INFO << " - 105 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Checking for new versions..."); //qDebug() << Q_FUNC_INFO << " - 106 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.checkIfNewVersion(); //qDebug() << Q_FUNC_INFO << " - 107 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Checking if backup is needed..."); //qDebug() << Q_FUNC_INFO << " - 108 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.recommendBackupIfNeeded(); //qDebug() << Q_FUNC_INFO << " - 109 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Showing window..."); //qDebug() << Q_FUNC_INFO << " - 110 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.show(); //qDebug() << Q_FUNC_INFO << " - 111 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.finish(&mw); //qDebug() << Q_FUNC_INFO << " - 112 " << (QTime::currentTime()).toString("HH:mm:ss"); //mw.showNotWar(); //qDebug() << Q_FUNC_INFO << " - 113 " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - END"; return app.exec(); } klog-2.4.1/locator.cpp0000644000175000017500000004677015003153303013610 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(const QString &tlocator, QObject *parent) : QObject{parent}{} 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; //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; } } } } } Coordinate Locator::getLocatorCoordinate(const QString _tlocator) { Coordinate _position; _position.lat = 0.0; _position.lon = 0.0; if (!isValidLocator(_tlocator)) { //qDebug() << Q_FUNC_INFO << ": Not valid: " << tlocator; return _position; } _position.lat = getLat (_tlocator); _position.lon = getLon (_tlocator); return _position; } Coordinate Locator::getLocatorCorner (const QString& tlocator, bool northWest) { //qDebug() << Q_FUNC_INFO << ": " << tlocator; Coordinate _position, _north, _south; _position.lat = 0.0; _position.lon = 0.0; Coordinate _positionC = _position; _north = _position; _south = _position; if (!isValidLocator(tlocator)) { //qDebug() << Q_FUNC_INFO << ": Not valid: " << tlocator; return _position; } _positionC.lat = getLat (tlocator); _positionC.lon = getLon (tlocator); if (tlocator.length() == 2) { _north.lat = _positionC.lat + 5; _north.lon = _positionC.lon - 10; _south.lat = _positionC.lat - 5; _south.lon = _positionC.lon + 10; } else if (tlocator.length() == 4) { _north.lat = _positionC.lat + 0.5; _north.lon = _positionC.lon -1; _south.lat = _positionC.lat - 0.5; _south.lon = _positionC.lon + 1; } else if (tlocator.length() == 6) { _north.lat = _positionC.lat ;//+ 0.020833333333333; //(2.5/60/2); _north.lon = _positionC.lon - 0.0416666666666667;//(5/60/2); _south.lat = _positionC.lat - (2*0.020833333333333); //(2.5/60/2); _south.lon = _positionC.lon + 0.0416666666666667;//(5/60/2); } //qDebug() << Q_FUNC_INFO; //qDebug() << "Center: lat/lon" << QString::number(_positionC.lat) << "/" << QString::number(_positionC.lon); //qDebug() << QString ("North : %1, %2").arg(_north.lat).arg(_north.lon); //qDebug() << QString ("South : %1, %2").arg(_south.lat).arg(_south.lon); if (northWest) { return _north; //qDebug() << QString ("North : %1, %2").arg(_position.lat).arg(_position.lon); } else { return _south; //qDebug() << QString ("South : %1, %2").arg(_position.lat).arg(_position.lon); } } 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; } QString aux = tlocator.toUpper(); if (aux.length() == 2) { return (((aux.at(1)).toLatin1() - 'A') * 10) - 85; } if (aux.length() == 4) { //return (((aux.at(1)).toLatin1() - 'A') * 10) + ((aux.at(3)).toLatin1() - '0' * 1) - 85; return (((aux.at(1)).toLatin1() - 'A') * 10) + ((aux.at(3)).digitValue() + 0.5) - 90; } if (aux.length() == 6) { double result = (((aux.at(1)).toLatin1() - 'A') * 10 ) + (aux.at(3).digitValue()) + (((aux.at(5)).toLatin1() - 'A') * (2.5/60)) + (static_cast(2.5/60)) - 90; //qDebug() << QString("%1: Locator/Latitude: %2/%3").arg(Q_FUNC_INFO).arg(aux).arg(result); return result; } if (aux.length()== 8) { return ((aux.at(1)).toLatin1() - 'A') * 10 + ((aux.at(3)).digitValue() * 1) + (((aux.at(5)).toLatin1() - 'A') * (2.5/60)) + ((aux.at(7)).toLatin1() - '0' * 0.5) / 240 - 90; } if (aux.length()== 10) { return ((aux.at(1)).toLatin1() - 'A') * 10 + ((aux.at(3)).toLatin1() - '0') + ((aux.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((aux.at(7)).toLatin1() - '0' + 0.0) / 240 + static_cast((aux.at(9)).toLatin1() - 'A' + 0.5) / 240 / 24 - 90; } else { return 0.0; } } double Locator::getLon(const QString& tlocator) { //qDebug() << "Locator::getLon: " << tlocator; if (!isValidLocator(tlocator)) { return 0.0; } QString aux = tlocator.toUpper (); if (aux.length() == 2) { return (((aux.at(0)).toLatin1() - 'A') * 20) + 10 - 180; } if (aux.length() == 4) { //qDebug() << QString("%1 + %2 + %3 - 180 = %4") // .arg((((aux.at(0)).toLatin1() - 'A') * 20)) // .arg((((aux.at(2)).digitValue () ) * 2)) // .arg(1) // .arg((((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) +1 - 180); // return ((aux.at(0)).toLatin1() - 'A') * 20 + 10 + (((aux.at(2)).digitValue () ) * 2) + 0.0416666666666667 - 180; return (((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + 1 - 180; } if (aux.length() == 6) { //qDebug() << QString("%1 + %2 + %3 + %4 - 180 = %5").arg((((aux.at(0)).toLatin1() - 'A') * 20)).arg((((aux.at(2)).digitValue () ) * 2)).arg((((aux.at(4)).toLatin1() - 'A')/12 )).arg(0.0416666666666667).arg((((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + (static_cast((aux.at(4)).toLatin1() - 'A')/12.0 ) + 0.0416666666666667 - 180); return (((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + (static_cast(((aux.at(4)).toLatin1()) - 'A')/12.0 ) + 0.0416666666666667 - 180; } if (aux.length()== 8) { return ((aux.at(0)).toLatin1() - 'A') * 20 + ((aux.at(2)).digitValue()) * 2 + static_cast((aux.at(4)).toLatin1() - 'A' + 0.0) / 12 + static_cast((aux.at(6)).toLatin1() - '0' + 0.5) / 120 - 180; } //else if (aux.length()== 10) //{ // return ((aux.at(0)).toLatin1() - 'A') * 20 + ((aux.at(2)).toLatin1() - '0') * 2 + ((aux.at(4)).toLatin1() - 'A' + 0.0) / 12 + ((aux.at(6)).toLatin1() - '0' + 0.0) / 120 + ((aux.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); //qDebug() << "Locator::getBeam2: " << QString::number(lon2) << "/" << QString::number(lat2); 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); /* 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) << ")"; // << QString::number(lat1) << ") - DxPos(" << QString::number(lon2) << "/" << QString::number(lat2) << ")"; 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)); 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); 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, int length) 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) << ")"; 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)); locat = locat + QChar(alo+'A'); locat = locat + QChar(bla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; if (length == 2) { return locat; } lo=(lo-(double(alo)))*10; la=(la-(double(bla)))*10; clo = int(floor(lo)); dla = int(floor(la)); locat = locat + QChar(clo+'0'); locat = locat + QChar(dla+'0'); //qDebug() << Q_FUNC_INFO << ": " << locat; if (length == 4) { return locat; } elo = int(floor((lo-double(clo) ) * 24 )) ; fla = int(floor((la-double(dla) ) * 24 )); locat = locat + QChar(elo+'A'); locat = locat + QChar(fla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; //locat = locat + QChar(elo+'A'); //locat = locat + QChar(fla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; return locat; } int Locator::getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2) { //qDebug() << "Locator::getBeamBetweenLocators: " << tlocator1 << "/" << tlocator2; 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); } } QStringList Locator::getAll(int _length) { //qDebug() << Q_FUNC_INFO << QString(" - %1").arg(_length); QStringList list; list.clear(); QString locator; QChar letter1, letter2, letter3, letter4, num1, num2; for (int i = 0; i<18; i++) { letter1 = QChar('A' + i); //qDebug() << Q_FUNC_INFO << ": L1: " << letter1; for (int j = 0; j<18; j++) { letter2 = QChar('A'+ j); //qDebug() << Q_FUNC_INFO << ": L2: " << letter2; if (_length<=2) { locator.append(letter1); locator.append(letter2); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } else { for (int k = 0; k<10; k++) { num1 = QChar('0' + k); //qDebug() << Q_FUNC_INFO << ": N1: " << num1; for (int l = 0; l<10; l++) { num2 = QChar('0' + l); //qDebug() << Q_FUNC_INFO << ": N2: " << num2; if (_length<=4) { locator.append(letter1); locator.append(letter2); locator.append(num1); locator.append(num2); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } else { for (int m = 0; m<24; m++) { //letter3 = QChar('a' + m); //qDebug() << Q_FUNC_INFO << ": L3: " << letter3; for (int n = 0; n<24; n++) { letter4 = QChar('a' + n); //qDebug() << Q_FUNC_INFO << ": L4: " << letter4; if (_length<=6) { locator.append(letter1); locator.append(letter2); locator.append(num1); locator.append(num2); locator.append(letter3); locator.append(letter4); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } } } } } } } } } return list; } QStringList Locator::getShortLocators(const QStringList &locators, const int _length) { QStringList shortLocators; shortLocators.clear (); foreach(QString i, locators) { if (i.length() == _length) { shortLocators << i; } else if (i.length()>_length) { QString a = i; a.truncate(4); shortLocators << a; } } shortLocators.removeDuplicates(); shortLocators.sort(); return shortLocators; } klog-2.4.1/frequency.cpp0000644000175000017500000001256415003153303014140 0ustar develdevel/*************************************************************************** frequency.cpp - description ------------------- begin : apr 2024 copyright : (C) 2024 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 "frequency.h" #include Frequency::Frequency(){} //Frequency::Frequency(const Frequency &f) { // freq = f.freq; //} Frequency::Frequency(const double _f, FreqUnits _u) { freq = normalize(_f, _u); setTolerance(1, _u); } Frequency::~Frequency(){} void Frequency::clear() { freq = 0.0; bandInMHz = QString(); } bool Frequency::fromDouble(const double _f, FreqUnits _u) { freq = normalize(_f, _u); return isValid(); } bool Frequency::fromQString(const QString &_f, FreqUnits _u) { //qDebug() << Q_FUNC_INFO << ": " << _f; bool ok; freq =_f.toDouble(&ok); //qDebug() << Q_FUNC_INFO << " - freq: " << _f; if (!ok) return false; //qDebug() << Q_FUNC_INFO << " - Trying to normalize..."; freq = normalize(freq, _u); //qDebug() << Q_FUNC_INFO << " - freqNormalized: " << _f; return isValid(); } /* bool Frequency::fromBand(const QString &_bandName) { DataProxy_SQLite dataProxy(Q_FUNC_INFO); int id = dataProxy.getIdFromBandName(_bandName); freq = fromQString(dataProxy.getFreqFromBandId(id)); return isValid(); } */ double Frequency::toDouble(FreqUnits _u) { return deNormalize(freq, _u); } QString Frequency::toQString(FreqUnits _u) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(freq); //qDebug() << Q_FUNC_INFO << ":u: " << QString::number(_u); double d = toDouble(_u); //qDebug() << Q_FUNC_INFO << ":d: " << QString::number(freq); int dec = getDecimals(_u); //qDebug() << Q_FUNC_INFO << ":u: " << QString::number(_u); //qDebug() << Q_FUNC_INFO << ": Freq: " << QString::number(toDouble()); //qDebug() << Q_FUNC_INFO << ": dec: " << QString::number(dec); return QString("%1").arg(d, 0, 'f', dec); } double Frequency::normalize(const double _f, const FreqUnits _u) { // Convert to MHz any frequency switch (_u) { case Hz: return _f / 1000000; break; case KHz: return _f / 1000; break; case GHz: return _f * 1000; break; case THz: return _f * 1000000; break; default: // Default is in MHz return _f; break; } } double Frequency::deNormalize(const double _f, const FreqUnits _u) { // Convert MHz to other unit switch (_u) { case Hz: return _f * 1000000; break; case KHz: return _f * 1000; break; case GHz: return _f / 1000; break; case THz: return _f / 1000000; break; default: // Default is in MHz return _f; break; } } int Frequency::getDecimals(const FreqUnits _u) { // Get the right number of decimals to display switch (_u) { case Hz: return 0; break; case KHz: return 0; break; case MHz: return 3; break; case GHz: return 6; break; case THz: return 9; break; default: // Default is in MHz return 6; break; } } void Frequency::setTolerance(const double _t, FreqUnits _u) { if (_t<=0.0) return; switch (_u) { case KHz: tolerance = _t * 1000; break; case MHz: tolerance = _t * 1000000; break; default: tolerance = _t; break; } } /* QString Frequency::band() { DataProxy_SQLite dataProxy(Q_FUNC_INFO); return dataProxy.getBandNameFromFreq(toDouble()); } int Frequency::bandId() { DataProxy_SQLite dataProxy(Q_FUNC_INFO); return dataProxy.getBandIdFromFreq(toDouble()); } */ bool Frequency::isValid() { return (freq>0.0); } void Frequency::operator=(Frequency const &_f2) { freq = _f2.freq; } klog-2.4.1/aboutdialog.cpp0000644000175000017500000003021515003153303014422 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"; 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-2023


" + 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)"; 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 translator_ca = QString("Catalan") + QString("Josep Ma. Ferrer") + QString("KDE Catalan translation team"); QString translator_hr = QString("Croatian") + QString("Kristijan Conkas") + QString("M0NKC"); QString translator_cs = QString("Czech") + QString("Ladislav Foldyna") + QString("OK1MLG"); QString translator_fi = QString("Finnish") + QString("Kristjan Lorents") + QString("Finnish Debian translation team"); QString translator_fr = QString("French") + QString("Christophe Lefebvre") + QString("F4HWL"); QString translator_da = QString("Danish") + QString("Peter Andreasen, Joe Hansen") + QString("Danish Debian translation team"); QString translator_de = QString("German") + QString("Burhard Lück") + QString("KDE German translation team"); QString translator_it = QString("Italian") + QString("Simona Pisano") + QString("IU5HIU"); QString translator_ja = QString("Japanese") + QString("Nick and Akihiro Koda") + QString("JJ1TGT and JL3OXR"); QString translator_nl = QString("Dutch") + QString("F Holtrop") + QString("PA3FNT/a>"); QString translator_pl = QString("Polish") + QString("Piotr Ludwig") + QString("LA7RRA"); QString translator_es = QString("Spanish") + QString("Jaime Robles") + QString("EA4K"); QString translator_uk = QString("Ukrainian") + QString("Mykola Papirovsky and Volodymyr Karpenko") + QString("UR6QV and UR3QJW"); QString translator_ru = QString("Rusian") + QString("Arnis Armans") + QString("YL3GBC"); QString translator_lv = QString("Latvian") + QString("Arnis Armans") + QString("YL3GBC"); 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 + "
" + translator_ca + translator_cs + translator_da + translator_de + translator_es + translator_fi + translator_fr + translator_hr + translator_it + translator_ja+ translator_lv + translator_nl + translator_pl + translator_uk + translator_ru + "
"; 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"; } 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-2.4.1/mainwindow.cpp0000644000175000017500000074363515003153303014325 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 "callsign.h" #include "updatesettings.h" //#include "database.h" #include "mainwindow.h" MainWindow::MainWindow(DataProxy_SQLite *dp): // dataProxy(Q_FUNC_INFO, tversion), awards(dp, Q_FUNC_INFO) // Pass Awards instance to DXCCStatusWidget { dataProxy = dp; softwareVersion = dataProxy->getSoftVersion(); //qDebug() << Q_FUNC_INFO << ": " << " Ver: " << softwareVersion << QTime::currentTime().toString("hh:mm:ss") ; //logEvent(Q_FUNC_INFO, "Start: " + _klogDir + "/" + tversion, Debug); dxccStatusWidget = std::make_unique(&awards, this); dxClusterWidget = std::make_unique(&awards, this); searchWidget = std::make_unique(&awards, this); logWindow = std::make_unique(&awards, this); showKLogLogWidget = new ShowKLogLogWidget; showErrorDialog = new ShowErrorDialog(); UDPLogServer = new UDPServer(); util = new Utilities(Q_FUNC_INFO); //util->setVersion(softwareVersion); //qDebug() << Q_FUNC_INFO << " - Creating qso - "; //qso = new QSO; //QThread::sleep(std::chrono::microseconds{1000}); //qDebug() << Q_FUNC_INFO << " - Creating backupQSO - "; backupQSO = new QSO; //QThread::sleep(std::chrono::microseconds{1000}); //qDebug() << Q_FUNC_INFO << " - Creating modifyingQSO - "; //modifyingQSO = new QSO; logLevel = Info; sendQSLByDefault = true; // This must be before reading the config dupeSlotInSeconds = 15; needToEnd = false; upAndRunning = false; // To define some actions that can only be run when starting the software QRZCOMAutoCheckAct = new QAction(tr("Always check the current callsign in QRZ.com"), this); //qDebug() << "MainWindow::MainWindow: Debug File: "<< util->getDebugLogFile() ; //dataProxy = new DataProxy_SQLite(Q_FUNC_INFO, softwareVersion); world = new World(dataProxy, Q_FUNC_INFO); world->create(util->getCTYFile()); //qDebug() << Q_FUNC_INFO << ": BEFORE HAMLIB " << QTime::currentTime().toString("hh:mm:ss") ; hamlib = new HamLibClass(); //qDebug() << Q_FUNC_INFO << ": AFTER HAMLIB " << QTime::currentTime().toString("hh:mm:ss") ; //qDebug() << Q_FUNC_INFO << ": AFTER dataproxy "; lotwUtilities = new LoTWUtilities(util->getHomeDir (), softwareVersion, Q_FUNC_INFO, dataProxy); //qDebug() << Q_FUNC_INFO << ": AFTER lotwUtilities"; eqslUtilities = new eQSLUtilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": AFTER eQSLUtilities"; mapWindow = new MapWindowWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": Before DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") ; //dxccStatusWidget = new DXCCStatusWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": After DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") ; elogClublog = new eLogClubLog(); //qDebug() << Q_FUNC_INFO << ": 00082: " << QTime::currentTime().toString("hh:mm:ss") ; elogQRZcom = new eLogQrzLog(dataProxy, Q_FUNC_INFO, softwareVersion); //qDebug() << Q_FUNC_INFO << ": 00083: " << QTime::currentTime().toString("hh:mm:ss") ; updateSatsData = new UpdateSatsData(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00084: " << QTime::currentTime().toString("hh:mm:ss") ; statsWidget = new StatisticsWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00085: " << QTime::currentTime().toString("hh:mm:ss") ; infoLabel1 = new QLabel(tr("Status bar ...")); infoLabel2 = new QLabel(tr("DX Entity")); //qDebug() << "MainWindow::MainWindow: 00086" << QTime::currentTime().toString("hh:mm:ss") ; //logWindow = new LogWindow(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087: " << QTime::currentTime().toString("hh:mm:ss") ; //searchWidget = new SearchWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087.1: " << QTime::currentTime().toString("hh:mm:ss") ; //advancedSearchWidget = new AdvancedSearchWidget(dataProxy, this); //qDebug() << "MainWindow::MainWindow: 00087.2" << QTime::currentTime().toString("hh:mm:ss") ; infoWidget = new InfoWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00088: " << QTime::currentTime().toString("hh:mm:ss") ; awardsWidget = new AwardsWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 0009: " << QTime::currentTime().toString("hh:mm:ss") ; aboutDialog = new AboutDialog(softwareVersion); tipsDialog = new TipsDialog(); downloadcty = new DownLoadCTY(util->getHomeDir (), softwareVersion); statusBarMessage = tr("Starting KLog"); //qDebug() << Q_FUNC_INFO << ": 40: " << QTime::currentTime().toString("hh:mm:ss") ; //qDebug() << Q_FUNC_INFO << ": 50: " << QTime::currentTime().toString("hh:mm:ss") ; //qDebug() << Q_FUNC_INFO << ": 51: " << QTime::currentTime().toString("hh:mm:ss") ; setupDialog = new SetupDialog(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": satTabWidget to be created " ; satTabWidget = new MainWindowSatTab(dataProxy); //qDebug() << Q_FUNC_INFO << ": 52: " << QTime::currentTime().toString("hh:mm:ss") ; QSOTabWidget = new MainWindowInputQSO(dataProxy); //qDebug() << Q_FUNC_INFO << ": 53: " << QTime::currentTime().toString("hh:mm:ss") ; myDataTabWidget = new MainWindowMyDataTab(dataProxy); //qDebug() << Q_FUNC_INFO << ": 54: " << QTime::currentTime().toString("hh:mm:ss") ; commentTabWidget = new MainWindowInputComment(); //qDebug() << Q_FUNC_INFO << ": 55: " << QTime::currentTime().toString("hh:mm:ss") ; othersTabWidget = new MainWindowInputOthers(dataProxy); //qDebug() << Q_FUNC_INFO << ": 56: " << QTime::currentTime().toString("hh:mm:ss") ; eQSLTabWidget = new MainWindowInputEQSL(dataProxy); //qDebug() << Q_FUNC_INFO << ": 57: " << QTime::currentTime().toString("hh:mm:ss") ; QSLTabWidget = new MainWindowInputQSL(dataProxy); //qDebug() << Q_FUNC_INFO << ": 58: " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget = new MainQSOEntryWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": locator to be created 59" << QTime::currentTime().toString("hh:mm:ss") ; //locator = new Locator(); mainWidget = new QWidget(this); //qDebug() << Q_FUNC_INFO << ": 60 " << QTime::currentTime().toString("hh:mm:ss") ; dateTime = std::make_unique(); // UI DX infoLabel2 = new QLabel(tr("DX Entity")); loggWinAct = new QAction(tr("&Log Window"), this); //dxClusterAssistant = new DXClusterAssistant(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": Awards to be created " << QTime::currentTime().toString("hh:mm:ss") ; //awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": Awards created " << QTime::currentTime().toString("hh:mm:ss") ; // if (needToEnd) { exit(0); } //qDebug() << Q_FUNC_INFO << ": Software update to be created " << QTime::currentTime().toString("hh:mm:ss") ; softUpdate = new SoftwareUpdate(softwareVersion); //qDebug() << Q_FUNC_INFO << ": FileManager to be created " << QTime::currentTime().toString("hh:mm:ss") ; filemanager = new FileManager(dataProxy); //qDebug() << Q_FUNC_INFO << ": FileAwardManager to be created " << QTime::currentTime().toString("hh:mm:ss") ; //fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); lotwCallTQSL = new QAction(tr("Upload queued QSOs to LoTW"), this); //qDebug() << Q_FUNC_INFO << ": AdifLoTWExportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") ; adifLoTWExportWidget = new AdifLoTWExportWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": ShowAdifImportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") ; showAdifImportWidget = new ShowAdifImportWidget(dataProxy, Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": END " << QTime::currentTime().toString("hh:mm:ss") ; } MainWindow::~MainWindow() { logEvent(Q_FUNC_INFO, "Start", Debug); if (hamlibActive) { hamlib->stop(); } delete(showErrorDialog); delete(lotwUtilities); delete(eqslUtilities); delete(elogQRZcom); //delete(elogClublog); delete(downloadcty); delete(world); delete(mapWindow); //delete(locator); //delete(qso); delete(backupQSO); //delete(modifyingQSO); //dateTime.reset(); //delete(dateTime); //delete(dateTimeTemp); //delete(awards); delete(softUpdate); delete(filemanager); //delete(fileAwardManager); delete(util); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::saveWindowsSize() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); windowSize = this->size(); //int height = windowSize.height(); //int width = windowSize.width(); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.setValue ("MainWindowSize", windowSize); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::windowsSizeAndPosition: END" ; } void MainWindow::setWindowSize(const QSize &_size) { logEvent(Q_FUNC_INFO, "Start", Debug); //QSize size; //size.setHeight(_height); //size.setWidth(_width); if (_size.isValid ()) { this->resize(_size); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::init_variables() { //qDebug() << Q_FUNC_INFO << " - Start"; QRZCOMAutoCheckAct->setCheckable(true); QRZCOMAutoCheckAct->setChecked(false); manualMode = false; qrzAutoChanging = false; logEvents = true; //Default band/modes bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW"; //qDebug() << Q_FUNC_INFO << " - 00" << (QTime::currentTime()).toString("HH:mm:ss") ; hamlibActive = false; hamlibModeNotADIFSupported = false; hamlibChangingMode = false; yearChangedDuringModification = false; readingTheUI = false; itIsANewversion = false; infoLabel1T = QString(); infoLabel2T = QString(); infoTimeout = 2000; // default timeout defaultADIFLogFile = "klog.adi"; InValidCharsInPrevCall = false; 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() << Q_FUNC_INFO << " - 20" << (QTime::currentTime()).toString("HH:mm:ss") ; currentMode = 1; currentModeShown = currentMode; currentBand = 1; currentBandShown = currentBand; currentLog = 1; operatorQRZ = ""; stationCallsign = ""; mainQRZ = ""; dxLocator =""; UDPServerStart = false; // By default the UDP server is started //qDebug() << Q_FUNC_INFO << " - 30" << (QTime::currentTime()).toString("HH:mm:ss") ; 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. 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; dxclusterSendSpotsToMap = false; keepSatPage = false; //qDebug() << Q_FUNC_INFO << " - 40" << (QTime::currentTime()).toString("HH:mm:ss") ; clublogActive = false; clublogRealTime = false; eQSLActive = false; qrzcomActive = false; lotwActive = false; qrzcomSubscriber = false; callingUpdate = false; // to control whether the update is mannually launched or at the begining selectedYear = (dateTime->currentDateTime()).date().year(); loggWinAct->setShortcut(Qt::CTRL | Qt::Key_L); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); clublogAnswer = -1; //qDebug() << Q_FUNC_INFO << " - Changing colors to default"; defaultColor.fromString(QAnyStringView("slategrey")); //To be replaced by .fromString in Qt6.6 neededColor.fromString(QAnyStringView("yellow")); workedColor.fromString(QAnyStringView("blue")); confirmedColor.fromString(QAnyStringView("red")); newOneColor.fromString(QAnyStringView("green")); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::checkDebugFile() { QFile debugFile(util->getDebugLogFile()); if (!debugFile.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ { 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 { debugFile.close(); logEvent(Q_FUNC_INFO, "KLog started!", Debug); } } void MainWindow::checkHomeDir() { if (!QDir::setCurrent ( util->getHomeDir () )){ QDir d1(util->getHomeDir ()); if (d1.mkdir(util->getHomeDir ())) { if (!QDir::setCurrent ( util->getHomeDir () )) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - KLog folder not found")); QString aux = tr("It was not possible to define the KLog folder. Some functions may not work properly!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } } } void MainWindow::init() { //qDebug() << Q_FUNC_INFO << " - Start - " << (QTime::currentTime()).toString("HH:mm:ss") ; logLevel = Debug; logEvent(Q_FUNC_INFO, "Start", Debug); checkHomeDir(); checkDebugFile(); //qDebug() << Q_FUNC_INFO << " - 00" ; setupDialog->init(softwareVersion, 0, configured); //qDebug() << Q_FUNC_INFO << " - 01" ; filemanager->init(); init_variables(); hamlib->initClass(); qsoInUI.clear(); setCleaning(false); //qDebug() << Q_FUNC_INFO << " - 10" ; dxClusterWidget->init(); setModifying(false); //qDebug() << Q_FUNC_INFO << " - 50" << (QTime::currentTime()).toString("HH:mm:ss") ; checkExistingData(); readSettingsFile(); //qDebug() << Q_FUNC_INFO << " - 70" << (QTime::currentTime()).toString("HH:mm:ss") ; mapWindow->init(); //qDebug() << Q_FUNC_INFO << " - 71" << (QTime::currentTime()).toString("HH:mm:ss") ; logWindow->createlogPanel(currentLog); //qDebug() << Q_FUNC_INFO << " - 72" << (QTime::currentTime()).toString("HH:mm:ss") ; awards.setManageModes(manageMode); //qDebug() << Q_FUNC_INFO << " - 73" << (QTime::currentTime()).toString("HH:mm:ss") ; if (dataProxy->getNumberOfManagedLogs()<1) { //qDebug() << Q_FUNC_INFO << " - 73.1" << (QTime::currentTime()).toString("HH:mm:ss") ; openSetup(6); //qDebug() << Q_FUNC_INFO << " - 73.2" << (QTime::currentTime()).toString("HH:mm:ss") ; } //qDebug() << Q_FUNC_INFO << " - 74" << (QTime::currentTime()).toString("HH:mm:ss") ; awardsWidget->fillOperatingYears(); awardsWidget->showAwards(); awardsWidget->setManageDXMarathon(manageDxMarathon); dxClusterWidget->setCurrentLog(currentLog); //dxClusterAssistant->init(); //qDebug() << Q_FUNC_INFO << " - 80" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << Q_FUNC_INFO << ": calling Software update ..." << (QTime::currentTime()).toString("HH:mm:ss") ; checkVersions(); //qDebug() << Q_FUNC_INFO << " - 90" << (QTime::currentTime()).toString("HH:mm:ss") ; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << Q_FUNC_INFO << " - 91" << (QTime::currentTime()).toString("HH:mm:ss") ; currentModeShown = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); //qDebug() << Q_FUNC_INFO << " - 92" << (QTime::currentTime()).toString("HH:mm:ss") ; currentBand = currentBandShown; currentMode = currentModeShown; timerInfoBars = new QTimer(this); //qDebug() << Q_FUNC_INFO << " - Calling createUI" << (QTime::currentTime()).toString("HH:mm:ss") ; createUI(); //qDebug() << Q_FUNC_INFO << " - Calling slotClearButtonClicked" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << Q_FUNC_INFO << " - 100"; slotClearButtonClicked(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 110"; infoWidget->showInfo(-1); //qDebug() << Q_FUNC_INFO << " - 120"; upAndRunning = true; mainQSOEntryWidget->setUpAndRunning(upAndRunning); //qDebug() << Q_FUNC_INFO << " - 130"; applySettings (); //qDebug() << Q_FUNC_INFO << " - END" << (QTime::currentTime()).toString("HH:mm:ss") ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::checkExistingData() { //qDebug() << Q_FUNC_INFO << " - " << (QTime::currentTime()).toString("HH:mm:ss") ; bool existingData = QFile::exists(util->getKLogDBFile()); //qDebug() << Q_FUNC_INFO << " - 1" ; ctyDatFile = util->getCTYFile(); //qDebug() << Q_FUNC_INFO << " - 2" ; if ((!existingData) || (!world->hasSpecialEntities())) { //qDebug() << Q_FUNC_INFO << " - Recreating world" ; world->recreate(ctyDatFile); //qDebug() << Q_FUNC_INFO << " - 3" ; //world->create(ctyDatFile); //qDebug() << Q_FUNC_INFO << " - 4" ; 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 update 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() << Q_FUNC_INFO << " - 7" << (QTime::currentTime()).toString("HH:mm:ss") ; } //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::readSettingsFile() { if (util->fileExists(util->getCfgFile())) { UpdateSettings settingsUpdate; if (settingsUpdate.updateFile()) { configured = loadSettings(); } } QSettings settings(util->getCfgFile(), QSettings::IniFormat); settings.setValue("Version", softwareVersion); } void MainWindow::checkVersions() { if (checkNewVersions) { if (reportInfo) { softUpdate->addCall(stationCallsign); } softUpdate->needToUpdate(); } } 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", Debug); connect(util, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); //qDebug() << Q_FUNC_INFO << " - Connecting QSO"; connect(&qsoInUI, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); //qDebug() << Q_FUNC_INFO << " - Connected QSO"; connect(QSOTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(QSOTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotLocatorTextChanged(QString) ) ); connect(myDataTabWidget, SIGNAL(myLocChangedSignal(QString)), this, SLOT(slotMyLocatorTextChanged(QString) ) ); connect(myDataTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(myDataTabWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); 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(QString)), this, SLOT(slotClearButtonClicked(QString)) ); 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(manualModeSignal(bool)), this, SLOT(slotManualMode(bool) ) ); // LOGVIEW connect(logWindow.get(), SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(logWindow.get(), SIGNAL(actionDeleteQSO ( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(logWindow.get(), SIGNAL(deleteTheseQSOs ( QList ) ), this, SLOT(slotQSOsDelete(QList) ) ); connect(logWindow.get(), SIGNAL(exportToADIFTheseQSOs ( QList ) ), this, SLOT(slotQSOsExportToADIF(QList) ) ); connect(logWindow.get(), SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(logWindow.get(), SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); //CLUSTER connect(dxClusterWidget.get(), SIGNAL(dxspotclicked(DXSpot)), this, SLOT(slotAnalyzeDxClusterSignal(DXSpot) ) ); connect(dxClusterWidget.get(), SIGNAL(dxspotArrived(DXSpot)), this, SLOT(slotDXClusterSpotArrived(DXSpot) ) ); // 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 (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))); connect(world, &World::queryError, this, &MainWindow::slotQueryErrorManagement); //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.get(), SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(searchWidget.get(), SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(searchWidget.get(), SIGNAL(logRefresh() ), this, SLOT(slotLogRefresh() ) ); connect(searchWidget.get(), SIGNAL(toStatusBar(QString) ), this, SLOT(slotUpdateStatusBar(QString) ) ); connect(searchWidget.get(), SIGNAL(requestBeingShown() ), this, SLOT(slotShowSearchWidget() ) ); connect(searchWidget.get(), SIGNAL(actionQSODelete( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(searchWidget.get(), 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.get(), SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(dxccStatusWidget.get(), SIGNAL(showQsos(QList)), this, SLOT(slotShowQSOsFromDXCCWidget(QList) ) ); connect(dxccStatusWidget.get(), 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(clearSignal(QString)), this, SLOT(slotClearButtonClicked(QString) ) ); connect(UDPLogServer, SIGNAL(logged(QSO)), this, SLOT(slotQSOReceived(QSO) ) ); 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(setupDialog, SIGNAL(darkModeChanged(bool)), this, SLOT(slotDarkModeChanged(bool)) ); 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(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())); // SATELLITES TAB //connect(satTabWidget, SIGNAL(newBandsToBeAdded(QStringList)), this, SLOT(slotDefineNewBands(QStringList)) ); connect(satTabWidget, SIGNAL(satTxFreqChanged(double)), this, SLOT(slotFreqTXChangedFromSat(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 (satBandTXChanged(QString)), this, SLOT (slotSatBandTXComboBoxChanged(QString))); connect(satTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); connect(othersTabWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); 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(qsosToSend(QString, QList, ExportMode)), this, SLOT(slotADIFExportSelection(QString, QList, ExportMode)) ); connect(adifLoTWExportWidget, SIGNAL(askingToClose()), this, SLOT(slotADIFExportClose()) ); 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(showKLogLogWidget, SIGNAL(newLogLevel(DebugLogLevel)), this, SLOT(slotNewLogLevel(DebugLogLevel)) ); //connect(this, SIGNAL(focusC), this, SLOT(slotTimeOutInfoBars()) ); // Following calls answer calls from the QSO to receive information. connect (&qsoInUI, SIGNAL(getModeSignal(QString)), this, SLOT(slotQSO_SetMode(QString))); connect(&qsoInUI, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQSO_SetMode(const QString _submode) { qsoInUI.setMode (dataProxy->getNameFromSubMode (_submode)); } void MainWindow::recommendBackupIfNeeded() { logEvent(Q_FUNC_INFO, "Start", Debug); if (dataProxy->getHowManyQSOInLog(-1)<1) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } QDateTime lastBackupDate; lastBackupDate = QDateTime(); lastBackupDate = filemanager->getDateTimeOfLastBackup(); //qDebug() << Q_FUNC_INFO << " - lastDate: " << util->getDateTimeSQLiteStringFromDateTime(lastBackupDate) << (QTime::currentTime()).toString(" HH:mm:ss") ; bool backupNeeded = false; QString msg; if (lastBackupDate == QDateTime()) { backupNeeded = true; msg = tr("You seem to have never backed up or exported your log to ADIF."); } else if (lastBackupDate.addMonths(1) < QDateTime::currentDateTime()) { //qDebug() << Q_FUNC_INFO << " - More than a month" << (QTime::currentTime()).toString(" HH:mm:ss") ; backupNeeded = true; msg = tr("Your latest backup seems older than one month."); } if (backupNeeded) { //qDebug() << Q_FUNC_INFO << " - We need to backup" << (QTime::currentTime()).toString(" HH:mm:ss") ; 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("Regular backups prevent data loss and are good operator practice.\n" "Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite 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 = util->getBackupADIFile(); //qDebug() << Q_FUNC_INFO << " - Backup to: " << filename << (QTime::currentTime()).toString(" HH:mm:ss") ; 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("Backup completed successfully")); msgBox.setInformativeText(tr("KLog will remind you again in approximately one month.")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Backup failed.")); msgBox.setInformativeText(tr("Periodic data backups are recommended to prevent data loss and corruption of your log.")); } msgBox.exec(); break; } } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::checkIfNewVersion() { //qDebug() << Q_FUNC_INFO << " - " << util->getVersion(); logEvent(Q_FUNC_INFO, "Start", Debug); //itIsANewversion = true; if (itIsANewversion) { if (util->getVersion() == "2.2") { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - New version detected!")); msgBox.setText(tr("This version of KLog requires that the DXCC database is updated.")); msgBox.setInformativeText(tr("The database will be updated.")); msgBox.exec(); slotWorldReload(true); } 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 now open to allow you to change your settings.")); msgBox.exec(); openSetup(0); } //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::createStatusBar() { logEvent(Q_FUNC_INFO, "Start", Debug); statusBar()->showMessage(tr("Ready")); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowMap() { Locator locator; Coordinate center = locator.getLocatorCoordinate(world->getQRZLocator(stationCallsign)); mapWindow->setCenter(center); QSize size = this->size(); //qDebug() << Q_FUNC_INFO << QString(" - Size: %1x%2").arg(size.width()).arg(size.height()); size = size/2; //qDebug() << Q_FUNC_INFO << QString(" - Size: %1x%2").arg(size.width()).arg(size.height()); mapWindow->resize(size); mapWindow->show(); //QStringList a; //a.clear(); //a << dataProxy->getFilteredLocators("All", "All", "All", "All"); //a << locator->getAll(); //foreach (QString ai, a) //{ // mapWindow->addMarker (locator->getLocatorCoordinate (ai)); //} //mapWindow->addLocators(a, QColor(0, 0, 255, 127)); } //void MainWindow::slotShowDXClusterAssistant() //{ //dxClusterAssistant->show(); //} void MainWindow::setMainWindowTitle() { //qDebug() << Q_FUNC_INFO << " - Start"; QString aux = dataProxy->getCommentsFromLog(currentLog); int numberOfQSOs = dataProxy->getHowManyQSOInLog (currentLog); //qDebug() << Q_FUNC_INFO << " - (comment): " << aux ; 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() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); createStatusBar(); setWindowTitle(tr("KLog")); createUIDX(); createActionsCommon(); createMenusCommon(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotTimeOutInfoBars() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - - Start" ; slotShowInfoLabel(infoLabel1T); infoLabel2->setText(infoLabel2T); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::setModeFromFreq() { //TODO: define frequency ranges for the different modes if (hamlibActive && !manualMode) { 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() << Q_FUNC_INFO << " - " << _b ; logEvent(Q_FUNC_INFO, "Start", Debug); if ((!upAndRunning) || (_b.length()<2)) { //qDebug() << Q_FUNC_INFO << " - !upAndRunning or band short" ; return; } if (updatingBands) { //qDebug() << "MainWindow::slotBandChanged: updating Bands" ; logEvent(Q_FUNC_INFO, "END-1", Debug); 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" ; logEvent(Q_FUNC_INFO, "END-2", Debug); 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" ; //qDebug() << "MainWindow::slotBandChanged: Band: " << mainQSOEntryWidget->getBand() ; //qDebug() << "MainWindow::slotBandChanged: Freq: " << QString::number(QSOTabWidget->getTXFreq()) ; double txFr = (dataProxy->getFreqFromBandId(currentBandShown)).toDouble(); //qDebug() << "MainWindow::slotBandChanged: New Freq: " << QString::number(txFr) ; slotFreqTXChanged (txFr); //if (!dataProxy->isThisFreqInBand(_b, QString::number(rxFreqSpinBox->value ()))) //{ // rxFreqSpinBox->setvalue (QSOTabWidget->getTXFreq()); //} } //qDebug() << "MainWindow::slotBandChanged: Checking to update Freq - DONE" ; EntityStatus _entityStatus; _entityStatus.dxcc = currentEntity; _entityStatus.bandId = currentBandShown; _entityStatus.modeId = currentModeShown; _entityStatus.logId = currentLog; //qDebug() << "MainWindow:: - calling showStatusOfDXCC-02 " ; if (currentEntity>0) { showStatusOfDXCC(_entityStatus); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotBandChanged: END" ; } void MainWindow::slotModeChanged (const QString &_m) { logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { return; } //qDebug() << "MainWindow::slotModeChanged: " << _m ; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBandShown2: " << QString::number(currentBandShown) ; currentModeShown = dataProxy->getIdFromModeName(_m); currentBand = currentBandShown; currentMode = currentModeShown; EntityStatus _entityStatus; _entityStatus.dxcc = currentEntity; _entityStatus.bandId = currentBandShown; _entityStatus.modeId = currentModeShown; _entityStatus.logId = currentLog; showStatusOfDXCC(_entityStatus); if (!modify) { QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); } //QString _modeSeen = mainQSOEntryWidget->getMode(); if (hamlibActive && !manualMode) { hamlib->setMode (mainQSOEntryWidget->getMode()); } /* if (_modeSeen == "SSB") { setModeFromFreq(); } */ logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - " << mainQSOEntryWidget->getMode() ; } void MainWindow::slotOKButtonClicked(){ logEvent(Q_FUNC_INFO, "Start", Debug); slotQRZReturnPressed(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQRZReturnPressed() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start" ; if (mainQSOEntryWidget->getQrz().length()<=0) { //qDebug() << Q_FUNC_INFO << " - no QRZ" ; return; } readingTheUI = true; if (!readQSOFromUI()) { //qDebug() << Q_FUNC_INFO << " - readQSOFromUI returned FALSE"; return; } if (!qsoInUI.isValid()) { //qDebug() << Q_FUNC_INFO << " - QSO Not valid!"; return; } int addedOK = qsoInUI.toDB (modifyingQSOid); //qDebug() << Q_FUNC_INFO << ": id: " << QString::number(addedOK); if (addedOK>0) { //qDebug() << Q_FUNC_INFO << ": QSO Added: " << QString::number(addedOK); mapWindow->addLocator(qsoInUI.getGridSquare(), workedColor); actionsJustAfterAddingOneQSO(); } // Just to prepare or some tasks before reading DATA from UI yearChangedDuringModification = false; readingTheUI = false; //qDebug() << Q_FUNC_INFO << "Just before cleaning"; slotClearButtonClicked(Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::actionsJustAfterAddingOneQSO() { //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); int lastId = -1; needToSave = true; if (modify) { //qDebug() << Q_FUNC_INFO << " - Modifying! " ; needToSave = true; if(modifyingQSOid>0) { awards.setAwards(); if (yearChangedDuringModification) { awardsWidget->fillOperatingYears(); yearChangedDuringModification = false; } if ((clublogActive) && (clublogRealTime)) { //qDebug() << Q_FUNC_INFO << " - (Modifiying ClubLog) Lastid: "<< QString::number(lastId) ; // Delete QSO in CLubLog elogClublog->deleteQSO(clublogPrevQSO); // Add modified QSO in ClubLog elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSOid)); } else { //qDebug() << Q_FUNC_INFO << " - (No ClubLog) Lastid: "<< QString::number(lastId) ; } awards.setAwards(); //Update the DXCC award status } // CHECK WHAT WAS THE QSOID to add the awards, if needed } else { //qDebug() << Q_FUNC_INFO << " - Not Modifying " ; lastId = dataProxy->getLastQSOid(); if (lastId>=0) { //qDebug() << Q_FUNC_INFO << " - Lastid: "<< QString::number(lastId) ; awards.setAwards(); //Update the DXCC award status // Send to CLUBLOG if enabled if ((clublogActive) && (clublogRealTime)) { //qDebug() << Q_FUNC_INFO << " - (Sending ClubLog) Lastid: "<< QString::number(lastId) ; elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(lastId)); } else { //qDebug() << Q_FUNC_INFO << " - (No ClubLog) Lastid: "<< QString::number(lastId) ; } // } else { //qDebug() << Q_FUNC_INFO << " - Lastid < 0 "<< QString::number(lastId) ; } //awards.setAwards(lastId); } logWindow->refresh(); //awards.updateDXCCStatus(-1); dxccStatusWidget->refresh(); searchWidget->refresh(); awardsWidget->showAwards (); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } bool MainWindow::checkValidCallBeforeAddingToLog(const QString &_call) { //qDebug() << Q_FUNC_INFO << " : " << _call; Callsign callsign(_call); if (!callsign.isValid()) { 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(_call); 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 return true; case QMessageBox::No: return false; default: // should never be reached return true; } } return true; } int MainWindow::checkDXCCBeforeAddingToLog(const int dxcc_Call, const int dxcc_qso) { if (dxcc_Call!=dxcc_qso) { QString dxcc1_name = world->getEntityName(dxcc_Call); QString dxcc1_prefix = world->getEntityMainPrefix(dxcc_Call); QString dxcc2_name = world->getEntityName(dxcc_qso); QString dxcc2_prefix = world->getEntityMainPrefix(dxcc_qso); QString message = QString(tr("The entity that is selected is different from the one proposed by KLog:") + "\n\n"); QString message_dxcc_qso = dxcc1_prefix + " - " + dxcc1_name + "\n\n"; if (dxcc1_prefix.length()<1) { dxcc1_prefix = tr ("Unknown", "Keep it short, its a button text"); message_dxcc_qso = QString(tr("- There is no selected DXCC.") + "\n\n"); } QString message_dxcc_klog = dxcc2_prefix + " - " + dxcc2_name; if (dxcc2_prefix.length()<1) { dxcc2_prefix = tr ("Unknown", "Keep it short, its a button text"); message_dxcc_klog = QString (tr("- KLog couldn't find a DXCC") + "\n\n"); } message = message + message_dxcc_qso + message_dxcc_klog + "\n\n" + tr("Please select the one you want to keep for this QSO."); QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(dxcc1_prefix); button2->setText(dxcc2_prefix); int ret; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Select correct entity")); msgBox.setText(message); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { return dxcc_qso; } else if (ret == QMessageBox::ActionRole) { return dxcc_Call; } else if (ret == QMessageBox::Cancel) { return -1; } } return dxcc_Call; } void MainWindow::getQSODataFromUI() { //qDebug() << Q_FUNC_INFO << " - Call-01 : " << qsoInUI.getCall(); qsoInUI.clear(); qsoInUI = mainQSOEntryWidget->getQSOData(qsoInUI); qsoInUI = QSOTabWidget->getQSOData(qsoInUI); qsoInUI = commentTabWidget->getQSOData(qsoInUI); qsoInUI = othersTabWidget->getQSOData(qsoInUI); qsoInUI = eQSLTabWidget->getQSOData(qsoInUI); qsoInUI = QSLTabWidget->getQSOData(qsoInUI); qsoInUI = mainQSOEntryWidget->getQSOData(qsoInUI); qsoInUI = satTabWidget->getQSOData(qsoInUI); qsoInUI = myDataTabWidget->getQSOData(qsoInUI); //*qso = mainQSOEntryWidget->getQSOData(*qso); //*qso = QSOTabWidget->getQSOData(*qso); //*qso = commentTabWidget->getQSOData(*qso); //*qso = othersTabWidget->getQSOData(*qso); //*qso = eQSLTabWidget->getQSOData(*qso); //*qso = QSLTabWidget->getQSOData(*qso); //*qso = mainQSOEntryWidget->getQSOData(*qso); //*qso = satTabWidget->getQSOData(*qso); //*qso = myDataTabWidget->getQSOData(*qso); //qDebug() << Q_FUNC_INFO << " - Call-02 : " << qsoInUI.getCall(); } bool MainWindow::readQSOFromUI() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - 010"; //qDebug() << Q_FUNC_INFO << " - CALL-01 : " << qsoInUI.getCall(); getQSODataFromUI(); if (!checkValidCallBeforeAddingToLog(qsoInUI.getCall())) { //qDebug() << Q_FUNC_INFO << ": Not valid Call" ; return false; } //qDebug() << Q_FUNC_INFO << " - 030"; QString tqrz = (qsoInUI.getCall()); //qDebug() << Q_FUNC_INFO << " - tqrz: " << tqrz; //qDebug() << Q_FUNC_INFO << " - ARRLid: " << world->getQRZARRLId(tqrz); //qDebug() << Q_FUNC_INFO << " - DXCC : " << qsoInUI.getDXCC(); int dxcc = checkDXCCBeforeAddingToLog(world->getQRZARRLId(tqrz), qsoInUI.getDXCC()); //qDebug() << Q_FUNC_INFO << ": " << dxcc; if (dxcc < 0) { return false; } qsoInUI.setDXCC (dxcc); //qDebug() << Q_FUNC_INFO << " - 040"; qsoInUI.setContinent (dataProxy->getContinentShortNameFromEntity(dxcc)); qsoInUI.setCQZone(infoWidget->getCQ()); qsoInUI.setItuZone(infoWidget->getITU()); qsoInUI.setMyCQZone(my_CQz); qsoInUI.setMyITUZone(my_ITUz); qsoInUI.setLogId (currentLog); //qDebug() << Q_FUNC_INFO << " - 050"; if (qsoInUI.getDistance()<=0.0) qsoInUI.setDistance (infoWidget->getDistance ()); keepSatPage = satTabWidget->getKeep(); //qDebug() << Q_FUNC_INFO << " - 060"; //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::slotQSOsExportToADIF(QList _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id.length ()), Debug); if (_id.length()<1) { return; // NO QSO TO EXPORT } //qDebug() << Q_FUNC_INFO << " - xxy"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); //qDebug() << Q_FUNC_INFO << fileName ; if ((!fileName.endsWith(".adi")) && ( !fileName.endsWith(".adif") )) { //qDebug() << "MainWindow::slotQSOsExportToADIF: Adding the .adi to the file" << fileName ; fileName = fileName + ".adi"; } //qDebug() << "MainWindow::slotQSOsExportToADIF-1: " << fileName ; filemanager->adifQSOsExport(fileName, _id); //qDebug() << "MainWindow::slotQSOsExportToADIF-3" ; showNumberOfSavedQSO(fileName, _id.count()); //qDebug() << "MainWindow::slotQSOsExportToADIF - END" ; } void MainWindow::slotQRZcomUpload(QList _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id.length ()), Debug); elogQRZcom->sendQSOs(_id); //qDebug() << "MainWindow::slotQRZcomUpload - END" ; } void MainWindow::slotQSOsDelete(QList _id) { //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(_id.length()) ; //foreach(int i, _id) //{ // //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(i) ; //} 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" ; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" ; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" ; } } } dxccStatusWidget->refresh(); logWindow->refresh(); slotShowAwards(); break; case QMessageBox::No : break; } } void MainWindow::slotQSODelete(const int _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id), Debug); //qDebug() << "MainWindow::slotQSODelete " << QString::number(_id) ; 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" ; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" ; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" ; } dxccStatusWidget->refresh(); logWindow->refresh(); searchWidget->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 " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowSearchWidget() { logEvent(Q_FUNC_INFO, "Start", Debug); dxUpRightTab->setCurrentIndex(dxUpRightTab->indexOf(searchWidget.get())); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLogRefresh() { logEvent(Q_FUNC_INFO, "Start", Debug); logWindow->refresh(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogDisable(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); clublogActive = !_b; //setupDialog->setClubLogActive(clublogActive); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", _b); settings.endGroup(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) + "/" + QString::number(_qsos.length ()), Debug); 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" ; } else { //qDebug() << "MainWindow::slotElogClubLogFileUploaded file DOES NOT exist" ; } 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); slotLogRefresh(); // 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 ; } 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 ; } //i = msgBox.exec(); } } else { QFile::remove(fileName); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogShowMessage(const QString &_s) { logEvent(Q_FUNC_INFO, "Start", Debug); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogProcessAnswer(const int _i, const int _qID) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_i) + "/" + QString::number(_qID), Debug); clublogAnswer = _i; if (clublogAnswer == 0) // NO ERROR { dataProxy->setClubLogSent(_qID, "Y", eQSLTabWidget->getClubLogDate()); } else { dataProxy->setClubLogSent(_qID, "M", eQSLTabWidget->getClubLogDate()); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogEQSLFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) , Debug); 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 ; } else { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file DOES NOT exist" ; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to eQSL?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToeQSL = dataProxy->eQSLSentQSOs(_qsos); slotLogRefresh(); // 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 ; } 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 ; } //i = msgBox.exec(); } } else { QFile::remove(fileName); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogQRZCOMDisable(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); 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; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", false); settings.endGroup (); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogQRZCOMLogUploaded (QNetworkReply::NetworkError _error, QList _qsos) { //qDebug() << "MainWindow::slotElogQRZCOMLogUploaded: " << QString::number(_error) ; logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) , Debug); 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" ; } else { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file DOES NOT exist" ; } 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); slotLogRefresh(); // 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" ; } void MainWindow::slotElogQRZCOMShowMessage(const QString &_s) { //qDebug() << "MainWindow::slotElogQRZCOMShowMessage: " << _s ; logEvent(Q_FUNC_INFO, "Start", Debug); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::cleanQRZCOMreceivedDataFromUI() { //qDebug() << Q_FUNC_INFO; if (!modify) { QSOTabWidget->cleanQRZCOM(true); } completedWithPreviousName = false; completedWithPreviousLocator = false; } void MainWindow::slotElogQRZCOMFoundData(const QString &_t, const QString & _d) { //qDebug() << Q_FUNC_INFO << ": " << _t << "/" << _d ; if (_t == "name") { if (QSOTabWidget->getName().length()<1) { qrzAutoChanging = true; QSOTabWidget->setName(_d); qrzAutoChanging = false; } } else if (_t == "grid") { //qDebug() << Q_FUNC_INFO << " Grid found: " << _d; if ((QSOTabWidget->getDXLocator()).length()<1) { qrzAutoChanging = true; QSOTabWidget->setDXLocator(_d); qrzAutoChanging = false; } else { //qDebug() << Q_FUNC_INFO << " There was already a Grid: " << QSOTabWidget->getDXLocator(); } } else if (_t == "qth") { if (QSOTabWidget->getQTH().length()<1) { qrzAutoChanging = true; QSOTabWidget->setQTH(_d); qrzAutoChanging = false; } } else if (_t == "qslmgr") { //QSLTabWidget->setQSLVia(_d); } else if (_t == "error") { //qDebug() << Q_FUNC_INFO << " ERROR" << _t << "/" << _d ; if (_d.contains("Not found: ")) { cleanQRZCOMreceivedDataFromUI(); //qDebug() << Q_FUNC_INFO << ": call Not found" ; 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() << Q_FUNC_INFO << ": QRZ value not recognized" ; } } void MainWindow::slotElogQRZCOMCheckThisCall() { //qDebug() << Q_FUNC_INFO ; if (qrzcomActive) { elogQRZcom->checkQRZ(mainQSOEntryWidget->getQrz()); } else { showMessageToEnableTheOnlineService(QRZ) ; } //qDebug() << Q_FUNC_INFO << " - END" ; } 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()) ; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ); return; } QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomAuto", false); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotExitFromSlotDialog(const int exitID) { //qDebug() << "MainWindow::slotExitFromSlotDialog: " << QString::number(exitID) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (exitID == 2) { needToEnd = true; exitQuestion(); } //qDebug() << "MainWindow::slotExitFromSlotDialog: END " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFileClose() { logEvent(Q_FUNC_INFO, "Start", Debug); exitQuestion(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::exitQuestion() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainWindow::exitQuestion" ; 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!", Debug); //maybeSave(); saveWindowsSize(); close(); exit(0); default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQRZTextChanged(QString _qrz) { //qDebug()<< Q_FUNC_INFO << ": " << _qrz ; logEvent(Q_FUNC_INFO, QString("Start: %1").arg(_qrz), Debug); //qDebug()<< Q_FUNC_INFO << " - 10" ; if (_qrz.length()<1) { //qDebug()<< Q_FUNC_INFO << " - 11" ; infoLabel1->clear(); infoLabel2->clear(); slotClearButtonClicked(Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END-Empty", Devel); return; } //qDebug()<< Q_FUNC_INFO << " - 20" ; if (cleaning) { //qDebug()<< Q_FUNC_INFO << ": Cleaning" ; logEvent(Q_FUNC_INFO, "END-Cleaning", Devel); return; } //qDebug()<< Q_FUNC_INFO << " - 30" ; if (modify) { logEvent(Q_FUNC_INFO, "END-Modify", Devel); return; } //qDebug()<< Q_FUNC_INFO << ": checking for modify or length<1" ; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug()<< Q_FUNC_INFO << ": MODIFY or Lenght < 1" ; qrzSmallModDontCalculate=false; logEvent(Q_FUNC_INFO, "END-Small QRZ, don't calculate", Devel); return; } //qDebug()<< Q_FUNC_INFO << " - 40" ; //qDebug()<< Q_FUNC_INFO << ": running ..." ; 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 ; currentEntity = world->getQRZARRLId(_qrz); //qDebug()<< Q_FUNC_INFO << " - 50 - currentEntity: " << QString::number(currentEntity) ; logEvent(Q_FUNC_INFO, QString("Entity: %1").arg(currentEntity), Devel); //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 << " - 60" ; //qDebug()<< Q_FUNC_INFO << ": CQ: " << QString::number(dx_CQz) ; //qDebug()<< Q_FUNC_INFO << ": CQe: " << QString::number(dxE_CQz) ; //qDebug()<< Q_FUNC_INFO << ": ITU: " << QString::number(dx_ITUz) ; //qDebug()<< Q_FUNC_INFO << ": ITUe: " << QString::number(dxE_ITUz) ; if (dx_CQz == dxE_CQz) { dx_CQz = dxE_CQz; } if (dx_ITUz == dxE_ITUz) { dx_ITUz = dxE_ITUz; } EntityStatus _entityStatus; _entityStatus.dxcc = currentEntity; _entityStatus.bandId = currentBandShown; _entityStatus.modeId = currentModeShown; _entityStatus.logId = currentLog; Locator locator; //qDebug()<< Q_FUNC_INFO << ": 60 - currentEntity: " << QString::number(currentEntity) ; if ( locator.isValidLocator(QSOTabWidget->getDXLocator())) { dxLocator = QSOTabWidget->getDXLocator(); } else { dxLocator = world->getLocator(currentEntity); } //TODO: Look for a way to prevent updating when not needed. i.e. if the prefix is already defined and only suffix is being sent // Maybe a wat could be to send the hostprefix and not the callsign? //qDebug()<< Q_FUNC_INFO << " - currentEntity: " << QString::number(currentEntity); //qDebug()<< Q_FUNC_INFO << " - c_qrz : " << _qrz; othersTabWidget->setEntityAndPrefix(currentEntity, _qrz); //qDebug()<< Q_FUNC_INFO << ": Going to check the DXCC" ; //qDebug()<< Q_FUNC_INFO << ": current/previous" << QString::number(currentEntity) << "/" << QString::number(previousEntity) ; 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) ; previousEntity = currentEntity; InValidCharsInPrevCall = false; infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), dxLocator); //qDebug()<< Q_FUNC_INFO << ": 70"; showStatusOfDXCC(_entityStatus); showDXMarathonNeeded(currentEntity, dx_CQz, mainQSOEntryWidget->getDate().year(), currentLog); //othersTabWidget->setEntity(currentEntity); // we need to update the list of Primary Subdivisions } else if ((dx_CQz == dxE_CQz) || (dx_ITUz == dxE_ITUz)) { //qDebug()<< Q_FUNC_INFO << ": 101" ; //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); } else { //qDebug()<< Q_FUNC_INFO << ": 110" ; } //qDebug()<< Q_FUNC_INFO << ": 120" ; qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug()<< Q_FUNC_INFO << ": 150 - cursorP at the end : " ; if (completeWithPrevious) { //qDebug()<< Q_FUNC_INFO << ": 160" ; completeWithPreviousQSO(_qrz); } //qDebug()<< Q_FUNC_INFO << ": 170" ; if (!modify) { //qDebug()<< Q_FUNC_INFO << ": 180" ; searchWidget->setCallToSearch(_qrz); //qDebug() << Q_FUNC_INFO << " qrz.length>2: " << _qrz; //qDebug() << Q_FUNC_INFO << " qrzcomActive: " << util->boolToQString (qrzcomActive); //qDebug() << Q_FUNC_INFO << " QRZCOMAutoCheckAct: " << util->boolToQString (QRZCOMAutoCheckAct->isChecked()); if (qrzcomActive && QRZCOMAutoCheckAct->isChecked() && (_qrz.length ()>2)) { //qDebug()<< Q_FUNC_INFO << ": 185 Checking QRZ.com"; elogQRZcom->checkQRZ(_qrz); } else { //qDebug()<< Q_FUNC_INFO << ": 189 NOT checking QRZ.com"; } } //qDebug()<< Q_FUNC_INFO << ": 190" ; //qrzAutoChanging = false; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << ": END" ; } void MainWindow::setCleaning(const bool _c) { logEvent(Q_FUNC_INFO, "Start", Debug); cleaning = _c; mainQSOEntryWidget->setCleaning(cleaning); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotClearButtonClicked(const QString &_func) { //qDebug() << Q_FUNC_INFO << " - Start: " << _func ; logEvent(Q_FUNC_INFO, "Start", Debug); Q_UNUSED(_func); bool needToRecover = modify; setCleaning(true); yearChangedDuringModification = false; setModifying(false); currentEntity = -1; //dateTimeTemp = dateTime; modifyingQSOid = -1; QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); //qDebug() << Q_FUNC_INFO << " - 10" ; if (currentBand < 0) { currentBand = defaultBand; } if (currentMode < 0) { currentMode = defaultMode; //qDebug() << Q_FUNC_INFO << " 12b - currentMode: " << QString::number(currentMode) ; } //qDebug() << Q_FUNC_INFO << " - 20" ; clublogAnswer = -1; clublogPrevQSO.clear(); //qDebug() << Q_FUNC_INFO << " - 11" ; setCleaning(false); //qDebug() << Q_FUNC_INFO << " - 25" ; //qDebug() << Q_FUNC_INFO << " Log: " << QString::number(currentLog) ; setMainWindowTitle(); //qDebug() << Q_FUNC_INFO << " - 27" ; if (needToRecover) { //qDebug() << Q_FUNC_INFO << " - 28" ; //qDebug() << Q_FUNC_INFO << ": Recovening the previous status..."; restoreCurrentQSO(true); } else { //qDebug() << Q_FUNC_INFO << " - 40" ; clearUIDX(); // Clear the UI qsoInUI.clear(); // Clear the QSO statusBar()->clearMessage(); //qDebug() << Q_FUNC_INFO << ": NOT recovening the previous status..."; } //qDebug() << Q_FUNC_INFO << " - currentMode = " << QString::number(currentMode) ; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::clearUIDX(bool _full) { //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); mainQSOEntryWidget->clear(); QSOTabWidget->clear(); commentTabWidget->clear(_full); infoLabel1->clear(); infoLabel2->clear(); eQSLTabWidget->clear(); QSLTabWidget->clear(); othersTabWidget->clear(_full); infoWidget->clear(); satTabWidget->clear(_full); myDataTabWidget->clear(_full); completedWithPreviousName = false; completedWithPreviousQTH = false; completedWithPreviousLocator = false; //qDebug() << Q_FUNC_INFO << " deciding wether to change or not the Freq: " << QString::number(QSOTabWidget->getTXFreq()) ; if (QSOTabWidget->getTXFreq()<=0) { //qDebug() << Q_FUNC_INFO << " Setting TX Freq from: " << QString::number(QSOTabWidget->getTXFreq()) ; QSOTabWidget->setTXFreq((dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()))).toDouble()); //qDebug() << Q_FUNC_INFO << " Setting TX Freq to: " << QString::number(QSOTabWidget->getTXFreq()) ; QSOTabWidget->setRXFreq(QSOTabWidget->getTXFreq()); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotRefreshDXCCWidget() { logEvent(Q_FUNC_INFO, "Start", Debug); dxccStatusWidget->slotRefreshButtonClicked(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::closeEvent(QCloseEvent *event) { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); saveWindowsSize(); if (maybeSave()) { //qDebug() << Q_FUNC_INFO << " saving needed" ; dataProxy->unMarkAllQSO(); dataProxy->compressDB(); event->accept(); } else { //qDebug() << Q_FUNC_INFO << " not saving needed" ; event->ignore(); } //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::maybeSave() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); QString str = tr("The logfile has been modified.") + "\n" + tr("Do you want to save your changes?"); if (alwaysADIF) { //qDebug() << Q_FUNC_INFO << "- Saving" ; 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", Debug); //qDebug() << Q_FUNC_INFO << " - Use default file name" ; 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() << Q_FUNC_INFO << " - Log exported" ; return true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The ADIF export was not properly done.")); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - ERROR Log not exported" ; return false; } } else { logEvent(Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - Going to import??" ; slotADIFImport(); return true; //return saveFileAs(); } } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-3", Debug); //qDebug() << Q_FUNC_INFO << "- Cancel" ; return false; } } else { //qDebug() << Q_FUNC_INFO << " - Not needing to save" ; } } else { //qDebug() << Q_FUNC_INFO << "- Not Checking if needed to save" ; } logEvent(Q_FUNC_INFO, "END", Debug); return true; } /* void MainWindow::slotAWAImport() { //qDebug() << Q_FUNC_INFO ; fileAwardManager->importNewAwardFile(); //qDebug() << Q_FUNC_INFO << " - END" ; } */ void MainWindow::createMenusCommon() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); 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 QSOs 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.")); showMapAct = new QAction (tr("Show Map"), this); toolMenu->addAction(showMapAct); connect(showMapAct, SIGNAL(triggered()), this, SLOT(slotShowMap())); showMapAct->setToolTip(tr("Show the statistics of your radio activity.")); //dxClusterAssistantAct = new QAction (tr("DXCluster Assistant"), this); //toolMenu->addAction(dxClusterAssistantAct); //connect(dxClusterAssistantAct, SIGNAL(triggered()), this, SLOT(slotShowDXClusterAssistant())); //dxClusterAssistantAct->setToolTip(tr("Show the statistics of your radio activity.")); //qDebug() << "MainWindow::createMenusCommon before" ; //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" ; //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", Debug); #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", Debug); showKLogLogWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } /* void MainWindow::slotTest() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; //showKLogLogWidget->setWindowModality(false); showKLogLogWidget->show(); //advancedSearchWidget->show(); //qDebug() << Q_FUNC_INFO << " - END "; logEvent(Q_FUNC_INFO, "END", Debug); } */ void MainWindow::slotSearchToolNeededQSLToSend() { logEvent(Q_FUNC_INFO, "Start", Debug); slotShowSearchWidget(); searchWidget->searchToolNeededQSLToSend(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchRequestedQSLToSend() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchRequestedQSLToSend(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchNeededQSLPendingToReceive() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchNeededQSLPendingToReceive(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchNeededQSLRequested() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchNeededQSLRequested(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolLoTWMarkAllQueuedThisLog() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); //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", Debug); } } /* void MainWindow::slotLoTWTest() { //qDebug() << "MainWindow::slotLoTWTest: " ; slotLoTWDownloadedFileProcess("lotwimport.adi"); //qDebug() << "MainWindow::slotLoTWTest - END" ; } */ void MainWindow::slotLoTWDownloadedFileProcess(const QString &_fn) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << _fn ; //QList a; //a.clear(); //a.append(filemanager->adifLoTWReadLog2(_fn, currentLog)); int added_qsos = filemanager->adifLoTWReadLog2(_fn, currentLog); QString aux; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (added_qsos>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(added_qsos); 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(); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolLoTWMarkAllQueued() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); //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", Debug); } } bool MainWindow::callTQSL(const QString &_filename, const QString &_call) { //https://lotw.arrl.org/lotw-help/cmdline/ logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << lotwTQSLpath ; 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() << Q_FUNC_INFO << " -ok: " << QString::number(ok) ; switch (ok) { case 0: // success: all qsos submitted were signed and saved or signed and uploaded //qDebug() << Q_FUNC_INFO << ": 0" ; //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() << Q_FUNC_INFO << ": 1" ; 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() << Q_FUNC_INFO << ": 2" ; msg = tr("Error #2: Upload was rejected by LoTW, please check your data."); break; case 3: // unexpected response from TQSL server //qDebug() << Q_FUNC_INFO << "L: 3" ; msg = tr("Error #3: The TQSL server returned an unexpected response."); break; case 4: // TQSL error //qDebug() << Q_FUNC_INFO << ": 4" ; msg = tr("Error #4: There was a TQSL error."); break; case 5: // TQSLlib error //qDebug() << Q_FUNC_INFO << ": 5" ; msg = tr("Error #5: There was a TQSLLib error."); break; case 6: // unable to open input file //qDebug() << Q_FUNC_INFO << ": 6" ; msg = tr("Error #6: It was not possible to open the input file."); break; case 7: // unable to open output file //qDebug() << Q_FUNC_INFO << "L: 7" ; 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() << Q_FUNC_INFO << ": 8" ; 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() << Q_FUNC_INFO << ": 9" ; 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() << Q_FUNC_INFO << ": 10" ; 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() << Q_FUNC_INFO << ": 11" ; 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", Debug); } QString MainWindow::selectStationCallsign() { logEvent(Q_FUNC_INFO, "Start", Debug); 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); Callsign callsign(stationCallToUse); if (ok && callsign.isValid()) //if (ok && !stationCallToUse.isEmpty()) { logEvent(Q_FUNC_INFO, "END-1", Debug); 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) { callsign(stationCallToUse); if (callsign.isValid()) { logEvent(Q_FUNC_INFO, "END-2", Debug); 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", Debug); return QString(); } void MainWindow::slotToolLoTWMarkAllYesThisLog() { //qDebug() << Q_FUNC_INFO ; //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); logEvent(Q_FUNC_INFO, "Start", Debug); 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", Debug); } void MainWindow::slotToolLoTWMarkAllYes() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); 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", Debug); } void MainWindow::slotReceiveQSOListToShowFromFile(QStringList _qs) { //qDebug() << Q_FUNC_INFO << QString::number(_qs.length()) ; logEvent(Q_FUNC_INFO, "Start", Debug); // Receiving: modifiedQSOList << _call << _date + "-" +_time << _band << _mode << _qslrdate; // Must send QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qs.length()!=4) { //qDebug() << Q_FUNC_INFO << " - NO valid qso list received - length: " << QString::number(_qs.length()) ; return; } Callsign callsign(_qs.at(0)); if (!callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - NO valid QRZ received - " << _qs.at(0) ; return; } if (dataProxy->getIdFromBandName(_qs.at(2))<0) { //qDebug() << Q_FUNC_INFO << " - NO valid BAND received"<< _qs.at(2) ; return; } if (dataProxy->getIdFromModeName(_qs.at(3))<0) { //qDebug() << Q_FUNC_INFO << " - NO valid Mode received" << _qs.at(3); return; } if (!util->isValidDateTimeFromString(_qs.at(1))) { //qDebug() << Q_FUNC_INFO << " No valid date" ; return; } //qDebug() << Q_FUNC_INFO << " ALL OK" ; //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", Debug); } void MainWindow::slotAboutQt() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); QMessageBox::aboutQt(this,tr("About ...")); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHelpAboutAction() { //qDebug() << Q_FUNC_INFO ; // QMessageBox::about(this, tr("About KLog"), // tr("KLog " // "Find the last release at https://jaime.robles.es/klog.")); logEvent(Q_FUNC_INFO, "Start", Debug); aboutDialog->exec(); logEvent(Q_FUNC_INFO, "END", Debug); //helpAboutDialog->exec(); } void MainWindow::slotTipsAction() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); tipsDialog->exec(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHelpCheckUpdatesAction() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); callingUpdate = true; softUpdate->addCall(stationCallsign); softUpdate->needToUpdate(true); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowSoftUpdateResults(const bool _b) { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); if (_b == true) { //qDebug() << Q_FUNC_INFO << " _b = TRUE " ; } else { //qDebug() << Q_FUNC_INFO << " _b = FALSE " ; } if (callingUpdate == true) { if (_b == false) { //qDebug() << Q_FUNC_INFO << " UPDATE NOT NEEDED" ; 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() << Q_FUNC_INFO << ": UPDATE NEEDED" ; } } callingUpdate = false; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLogWinShow() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!(logWindow->isVisible()) ) { logWinAct->setChecked ( true ); logWindow->show(); }else { logWinAct->setChecked ( false ); logWindow->hide(); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotSetup(const int _page) { //qDebug() << Q_FUNC_INFO << QString::number(_page) ; logEvent(Q_FUNC_INFO, "Start", Debug); configured = false; //qDebug() << Q_FUNC_INFO << " - 010" ; backupCurrentQSO(); //qDebug() << Q_FUNC_INFO << " - 020" ; openSetup(_page); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::openSetup(const int _page) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_page) ; logEvent(Q_FUNC_INFO, "Start", Debug); //int result = -1; //qDebug() << Q_FUNC_INFO << " - 000 - " << (QTime::currentTime()).toString("HH:mm:ss"); hamlib->stop(); //qDebug() << Q_FUNC_INFO << " - 001 - " << (QTime::currentTime()).toString("HH:mm:ss"); if (!needToEnd) { //qDebug() << Q_FUNC_INFO << " - 010 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before setData", Devel); //qDebug() << "MainWindow::openSetup - Just before setupDialog->exec-1" ; if (upAndRunning) { //qDebug() << Q_FUNC_INFO << " - 011 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->setData(softwareVersion, _page, !configured); //qDebug() << Q_FUNC_INFO << " - 012 - " << (QTime::currentTime()).toString("HH:mm:ss"); } else { //qDebug() << Q_FUNC_INFO << " - 013 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->setData(softwareVersion, 0, !configured); //qDebug() << Q_FUNC_INFO << " - 014 - " << (QTime::currentTime()).toString("HH:mm:ss"); } if ( (!configured) || (itIsANewversion) ) { //qDebug() << Q_FUNC_INFO << " - 015 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before SetupDialog->exec", Devel); itIsANewversion = false; //setupDialog->exec(); setupDialog->setModal(true); //qDebug() << Q_FUNC_INFO << " - 016 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->show(); //qDebug() << Q_FUNC_INFO << " - 017 - " << (QTime::currentTime()).toString("HH:mm:ss"); // move part of this code to slotSetupDialogFinished logEvent(Q_FUNC_INFO, "Just after setupDialog->show", Devel); //qDebug() << "MainWindow::openSetup - Just after setupDialog->show" ; } else { //qDebug() << Q_FUNC_INFO << " - 020 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "No setupDialog->exec needed", Devel); //qDebug() << "MainWindow::openSetup - No setupDialog->show needed" ; } } //qDebug() << Q_FUNC_INFO << " - 050 - " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotSetupDialogFinished (const int _s) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_s) << " - " << (QTime::currentTime()).toString ("HH:mm:ss"); if (needToEnd) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } //bool restoreQSOConfig = false; if (_s == QDialog::Accepted) { //qDebug() << Q_FUNC_INFO << " - QDialog::Accepted - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before loadSettings", Debug); //readConfigData(); configured = loadSettings (); applySettings (); //qDebug() << Q_FUNC_INFO << " - 010 - " << (QTime::currentTime()).toString ("HH:mm:ss"); reconfigureDXMarathonUI(manageDxMarathon); logEvent(Q_FUNC_INFO, "Just after loadSettings", Debug); //qDebug() << "MainWindow::slotSetupDialogFinished: logmodel to be created-2" ; logEvent(Q_FUNC_INFO, "logmodel to be created-2", Debug); //qDebug() << Q_FUNC_INFO << " - 011 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logWindow->createlogPanel(currentLog); //qDebug() << Q_FUNC_INFO << " - 012 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "logmodel has been created-2", Debug); //defineStationCallsign(stationCallsign); //qDebug() << Q_FUNC_INFO << " - 013 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "before db->reConnect", Debug); //qDebug() << "MainWindow::openSetup: before db->reConnect" ; dataProxy->reconnectDB(); //qDebug() << Q_FUNC_INFO << " - 014 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "after db->reConnect", Debug); //qDebug() << "MainWindow::openSetup: after db->reConnect" ; } else { //qDebug() << Q_FUNC_INFO << " - !QDialog::Accepted"; //qDebug() << Q_FUNC_INFO << " - 019 - " << (QTime::currentTime()).toString ("HH:mm:ss"); } //qDebug() << Q_FUNC_INFO << " - 020 - " << (QTime::currentTime()).toString ("HH:mm:ss"); if (qsoInUI.getBackup()) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 021 - "; //qDebug() << Q_FUNC_INFO << ": Restoring..." ; restoreCurrentQSO (QDialog::Accepted); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 022 - " ; } else { //qDebug() << "MainWindow::slotSetupDialogFinished: NO Restoring qsoInUI..." ; //qDebug()<< (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 023 - "; } //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 030 - " ; hamlibActive = setHamlib(hamlibActive); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::slotOpenKLogFolder() { //qDebug() << "MainWindow::slotOpenKLogFolder: " << util->getHomeDir() ; logEvent(Q_FUNC_INFO, "Start", Debug); 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" ; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::slotUpdateStatusBar(const QString &statusm) { //qDebug() << "MainWindow::slotUpdateStatusBar: " << statusm ; logEvent(Q_FUNC_INFO, "Start", Debug); statusBar()->showMessage(statusm, 2000); logEvent(Q_FUNC_INFO, "END", Debug); } //bool MainWindow::readCtyFile() //{ // logEvent(Q_FUNC_INFO, "Start", Debug); // logEvent(Q_FUNC_INFO, "END", Debug); // return false; //} void MainWindow::slotDoubleClickLog(const int _qsoID) { //qDebug() << Q_FUNC_INFO << ": QSOid: " << QString::number(_qsoID) ; logEvent(Q_FUNC_INFO, "Start", Debug); //int row = _qsoID.row(); qsoToEdit(_qsoID); logEvent(Q_FUNC_INFO, "END", Debug); //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) ; //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_b) ; QString errorMSG, aux; if (_b) { //qDebug() << Q_FUNC_INFO << ": Starting the server" ; if (!UDPLogServer->isStarted()) { //qDebug() << Q_FUNC_INFO << ": Server is not started, starting..."; if (!UDPLogServer->start()) { //qDebug() << Q_FUNC_INFO << ": Server could not be started, exiting..."; 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") ; } return true; } else { return true; //qDebug() << Q_FUNC_INFO << ": UDP Log server already started no need to restart!" << QTime::currentTime().toString("hh:mm:ss") ; } } else { //qDebug() << Q_FUNC_INFO << ": UDPServerStart FALSE" << QTime::currentTime().toString("hh:mm:ss") ; if (UDPLogServer->isStarted()) { //qDebug() << Q_FUNC_INFO << ": Server is startted and should be Disabled"; if (!UDPLogServer->stop()) { //qDebug() << Q_FUNC_INFO << ": Server should be disabled and I can't stop it"; 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 { //qDebug() << Q_FUNC_INFO << ": UDP Log server stopped!" << QTime::currentTime().toString("hh:mm:ss") ; return false; } } else { //qDebug() << Q_FUNC_INFO << ": UDP Log server already stopped no need to restop!" ; return false; } } //qDebug() << Q_FUNC_INFO << ": It should not reach this, default to false"; return false; } bool MainWindow::setHamlib(const bool _b) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": " << util->boolToQString (_b) ; if (!upAndRunning) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib upAndRunning FALSE"; return false; } if (_b) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib active"; hamlib->init(true); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": After Hamlib active"; return hamlib->readRadio(true); // Forcing the radio update } else { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib NOT active"; hamlib->init(false); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": After Hamlib NOT active"; return false; } } void MainWindow::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO ; (void)event; setWindowSize(windowSize); } void MainWindow::keyPressEvent(QKeyEvent *event){ //qDebug() << "MainWindow::keyPressEvent: " ; logEvent(Q_FUNC_INFO, "Start", Debug); switch (event->key()) { case Qt::Key_Return: // ENTER PRESSED slotQRZReturnPressed(); //qDebug() << "MainWindow::keyPressEvent: RETURN" ; break; case Qt::Key_Enter: // ENTER PRESSED //qDebug() << "MainWindow::keyPressEvent: ENTER" ; slotQRZReturnPressed(); break; case Qt::Key_F1: slotOpenWiki(); break; case Qt::Key_F4: //qDebug << "MainWindow::keyPressEvent: F4" ; mainQSOEntryWidget->toggleRealTime (); break; default: //QFrame::keyPressEvent(event); break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotOpenWiki() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; QDesktopServices::openUrl(QUrl("https://github.com/ea4k/klog/wiki/")); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << "Confirmed: " << _newOne.name(QColor::HexRgb) << " / Needed: " << _needed.name(QColor::HexRgb) ; // " / Worked: " << _worked.name(QColor::HexRgb) << " / Confirmed: " << _confirmed.name(QColor::HexRgb) << // " / Default: " << _default.name(QColor::HexRgb); searchWidget->setColors(_newOne, _needed, _worked, _confirmed, _default); awards.setColors (_newOne, _needed, _worked, _confirmed, _default); mapWindow->setColors (_worked, _confirmed, _default); dxClusterWidget->setColors (_newOne, _needed, _worked, _confirmed, _default); infoWidget->setColors(_newOne, _needed, _worked, _confirmed, _default); dxccStatusWidget->setColors(_newOne, _needed, _worked, _confirmed, _default); } bool MainWindow::applySettings() { //qDebug() << Q_FUNC_INFO << " - Start"; if ((useDefaultLogFileName) && (defaultADIFLogFile.length()>0)) { useDefaultLogFileName = true; } else { useDefaultLogFileName = false; } checkIfNewBandOrMode (); infoWidget->setImperialSystem(imperialSystem); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); dxClusterWidget->setDXClusterSpotConfig(dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY ); setMainWindowTitle(); dxClusterWidget->setMyQRZ(stationCallsign); elogClublog->setDefaultCallsign (stationCallsign); if (qrzcomActive) { //elogQRZcom->setCredentials(qrzcomUser, qrzcomPass); elogQRZcom->login(); } util->setVersion(softwareVersion); searchWidget->setVersion(softwareVersion); searchWidget->setCurrentLog(currentLog); infoWidget->setCurrentLog(currentLog); satTabWidget->refreshData(); adifLoTWExportWidget->setLogNumber (currentLog); //setWindowSize (windowSize); if (upAndRunning) { startServices(); } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::startServices() { //qDebug() << QTime::currentTime().toString("hh:mm:ss - ") ; logEvent(Q_FUNC_INFO, "Start", Debug); hamlibActive = setHamlib(hamlibActive); setUDPServer(UDPServerStart); logEvent(Q_FUNC_INFO, "END", Debug); } 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") ; logEvent(Q_FUNC_INFO, "Start", Debug); 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") ; QStringList bandsInLog = dataProxy->getBandsInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 2 " << QTime::currentTime().toString("hh:mm:ss") ; QStringList modesInLog = dataProxy->getModesInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3 " << QTime::currentTime().toString("hh:mm:ss") ; QStringList qsTemp; qsTemp.clear(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.1 " << QTime::currentTime().toString("hh:mm:ss") ; bands << bandsInLog; bands.removeDuplicates(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.2 " << QTime::currentTime().toString("hh:mm:ss") ; qsTemp << dataProxy->sortBandNamesBottonUp(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.3 " << QTime::currentTime().toString("hh:mm:ss") ; bands.clear(); bands = qsTemp; modes << modesInLog; modes.removeDuplicates(); modes.sort(); //qDebug() << "MainWindow::checkIfNewBandOrMode - bands -" << QString::number(bands.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget->setBands(bands); satTabWidget->addBands(bands); mapWindow->setBands(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - modes -" << QString::number(modes.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget->setModes(modes); mapWindow->setModes(modes); //qDebug() << "MainWindow::checkIfNewBandOrMode - setting bands" << QTime::currentTime().toString("hh:mm:ss") ; 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") ; if (bands.contains(currentBand)) { mainQSOEntryWidget->setBand(currentBand); } else { selectDefaultBand(); } //qDebug() << "MainWindow::checkIfNewBandOrMode-99 " << QTime::currentTime().toString("hh:mm:ss") ; if (modes.contains(currentMode)) { mainQSOEntryWidget->setMode(currentMode); } else { selectDefaultMode(); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::checkIfNewBandOrMode END " << QTime::currentTime().toString("hh:mm:ss") ; } void MainWindow::selectDefaultBand() { //qDebug() << "MainWindow::selectDefaultBand" ; logEvent(Q_FUNC_INFO, "Start", Debug); 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", Debug); //qDebug() << "MainWindow::selectDefaultBand_END" ; } void MainWindow::selectDefaultMode() { //qDebug() << "MainWindow::selectDefaultMode" ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { return; } //int aux = 1; defaultMode = dataProxy->getMostUsedMode(currentLog); //qDebug() << "MainWindow::selectDefaultMode: " << QString::number(defaultMode) ; if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(mainQSOEntryWidget->getBand(0)); //defaultMode = dataProxy->getSubModeIdFromSubMode((modeComboBox->itemText(0))); //qDebug() << "MainWindow::selectDefaultMode2: " << QString::number(defaultMode) ; //qDebug() << "MainWindow::selectDefaultMode2S: " ; } //aux = dataProxy->getNameFromSubModeId(defaultMode); mainQSOEntryWidget->setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << "MainWindow::selectDefaultMode3: " << QString::number(defaultMode) ; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::selectDefaultMode-END" ; } void MainWindow::readActiveBands (const QStringList actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); foreach (QString aux, actives) { //qDebug() << Q_FUNC_INFO << ": " << aux; } bool atLeastOne = false; QString aux; bands.clear(); QStringList __bands; __bands.clear(); __bands = actives; __bands << dataProxy->getBandsInLog(currentLog); __bands.removeDuplicates(); bands = __bands; for (int i = 0; i < __bands.size() ; i++) { if (dataProxy->getIdFromBandName(__bands.at(i)) > 0) { if (!atLeastOne) { atLeastOne = true; } aux = __bands.at(i); if (aux.length()>0) { //qDebug() << Q_FUNC_INFO << ": " << aux; bands << aux; } } } bands.removeDuplicates(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::readActiveBands - END" ; } void MainWindow::readActiveModes (const QStringList actives) { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); QString aux; aux.clear(); QStringList __modes; __modes.clear(); __modes = actives; __modes << dataProxy->getModesInLog(currentLog); __modes.removeDuplicates(); modes.clear(); for (int i = 0; i < __modes.size() ; i++) { //qDebug() << "MainWindow::readActiveModes: checking: " << __modes.at(i) ; if (dataProxy->getIdFromModeName(__modes.at(i)) > 0) { //qDebug() << "MainWindow::readActiveModes: checking-exist: " << __modes.at(i) ; aux = __modes.at(i); if (aux.length()>0) { //qDebug() << "MainWindow::readActiveModes: adding: " << aux ; modes << aux; } } } modes.removeDuplicates(); modes.sort(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::readActiveModes - END" ; } void MainWindow::createUIDX() { // //qDebug() << "MainWindow::createUIDX ; logEvent(Q_FUNC_INFO, "Start", Debug); infoLabel1->setToolTip(tr("Status of the DX entity.")); //qDebug() << "MainWindow::createUIDX-13" ; infoLabel2->setToolTip(tr("Name of the DX entity.")); //qDebug() << "MainWindow::createUIDX-14" ; dxUpLeftInputFrame = new QFrame; dxUpLeftTab = new QTabWidget; dxUpRightTab = new QTabWidget; dxBottonTab = new QTabWidget; dxUpLeftTab->setTabPosition(QTabWidget::North); dxUpRightTab->setTabPosition(QTabWidget::South); //qDebug() << "MainWindow::createUIDX-30" ; 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(dataProxy->getEntitiesNames()); dxUpLeftTab->addTab(othersTabWidget, tr("Others")); dxUpLeftTab->addTab(myDataTabWidget, tr("My Data")); dxUpLeftTab->addTab(satTabWidget, tr("Satellite")); //qDebug() << "MainWindow::createUIDX-90" ; 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" ; reconfigureDXMarathonUI(manageDxMarathon); //qDebug() << "MainWindow::createUIDX-122" ; dxUpRightTab->addTab(awardsWidget, tr("Awards")); dxUpRightTab->addTab(searchWidget.get(), tr("Search")); dxBottonTab->addTab(logWindow.get(), tr("Log")); dxBottonTab->addTab(dxClusterWidget.get(), tr("DX-Cluster")); dxBottonTab->addTab(dxccStatusWidget.get(), 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" ; #ifdef Q_OS_WIN //qDebug() << "MainWindow::createUIDX - WINDOWS DETECTED!" ; dxUpLeftInputFrame->setFrameShadow(QFrame::Raised); dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "MainWindow::createUIDX - NO WINDOWS DETECTED!" ; dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif setCentralWidget(mainWidget); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::createUIDX-END" ; } void MainWindow::slotADIFExport() { //qDebug() << "MainWindow::slotADIFExport - Start" ; adifLoTWExportWidget->setExportMode(ModeADIF); adifLoTWExportWidget->show(); //filemanager->adifLogExport(fileName, currentLog); //qDebug() << "MainWindow::slotADIFExport -END " ; } void MainWindow::showNumberOfSavedQSO(const QString &_fn, const int _n) { //qDebug() << "MainWindow::showNumberOfSavedQSO: " << _fn << "/" << QString::number(_n) ; 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" ; } /* void MainWindow::fileExportADIF(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate) { //qDebug() << Q_FUNC_INFO << ": " << _st ; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _grid, _startDate, _endDate, currentLog, ModeADIF); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << Q_FUNC_INFO << " - END"; } */ void MainWindow::fileExportADIF2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO ; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeADIF, currentLog); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::slotADIFExportAll() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); QString _callToUse = "ALL"; QList _qsos; _qsos.clear(); _qsos.append(-1); //Code to specify to export ALL QSOs; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList2(fileName, _callToUse, _qsos, ModeADIF, currentLog); showNumberOfSavedQSO(fileName, dataProxy->getHowManyQSOInLog(-1)); //qDebug() << "MainWindow::slotADIFExportAll-1: " << fileName ; //QList qsos = filemanager->adifLogExportReturnList(fileName, _callToUse, QString(), dataProxy->getFirstQSODateFromCall(_callToUse), dataProxy->getLastQSODateFromCall(_callToUse), -1, ModeADIF); //qDebug() << "MainWindow::slotADIFExportAll-3" ; //showNumberOfSavedQSO(fileName, qsos.count()); //filemanager->adifLogExport(fileName, 0); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::fileExportLoTW2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); if (_qsos.length ()<1) { //TODO SHOW MESSAGE Asking for at least one QSO and exit } QMessageBox msgBox; Callsign callsign(_call); if (!callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - no valid call" ; if (_call == "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; } QString fileName = util->getLoTWAdifFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeLotW, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; return; } //qDebug() << Q_FUNC_INFO << " - 50" ; bool uploadedToLoTW = callTQSL(fileName, _call); //qDebug() << Q_FUNC_INFO << " - 51" ; 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); slotLogRefresh(); 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); } } } else { QFile::remove(fileName); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::fileExportClubLog2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); QMessageBox msgBox; Callsign callsign(_call); if (!callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - no valid call" ; if (_call == "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; } QString fileName = util->getClubLogFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeClubLog, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The selection you have done does not include any QSO")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); 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() << Q_FUNC_INFO << " - 50" ; elogClublog->sendLogFile(fileName, _qsos, overwrite); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " - END " ; } void MainWindow::fileExportEQSL2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << QString(" - Start: QSOs: %2" ).arg(_qsos.length ()); //QString fileName = "klog-eqsl-upload.adi"; QString fileName = util->getEQSLFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeEQSL, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The selection you have done does not include any QSO.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } eqslUtilities->sendLogFile(fileName, _qsos); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << "-END " ; } void MainWindow::slotADIFExportSelection(const QString &_call, QList _qsos, ExportMode _eM) { //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); //qDebug() << Q_FUNC_INFO << " - Trigered by signal: selection"; switch (_eM) { case ModeADIF: // General ADIF fileExportADIF2(_call, _qsos); break; case ModeLotW: // LoTW //qDebug() << Q_FUNC_INFO << " - LoTW" ; fileExportLoTW2(_call, _qsos); break; case ModeClubLog: // ClubLog //qDebug() << Q_FUNC_INFO << " - ClubLog" ; fileExportClubLog2(_call, _qsos); break; case ModeEQSL: // General eQSL //qDebug() << Q_FUNC_INFO << " - eQSL" ; fileExportEQSL2(_call, _qsos); break; case ModeQRZ: // General eQSL //qDebug() << Q_FUNC_INFO << " - QRZ.com" ; elogQRZcom->sendQSOs(_qsos); break; } logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " - END " ; } void MainWindow::slotADIFExportClose() { adifLoTWExportWidget->close(); } 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" ; // bool emptyCall = false; if (!lotwActive) { showMessageToEnableTheOnlineService(LoTW); return; } adifLoTWExportWidget->setExportMode(ModeLotW); adifLoTWExportWidget->show(); //qDebug() << "MainWindow::slotLoTWExport- END" ; } void MainWindow::slotLoTWDownload() { //qDebug() << "MainWindow::slotDownUpload - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); 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 ; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", Debug); 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", Debug); return; } lotwUtilities->download(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotDownUpload - END" ; } void MainWindow::slotLoTWFullDownload() { //qDebug() << "MainWindow::slotLoTWFullDownload - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); 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 ; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", Debug); 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", Debug); return; } lotwUtilities->fullDownload(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotLoTWFullDownload - END" ; } 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", Debug); if (!clublogActive) { showMessageToEnableTheOnlineService(ClubLog); return; } adifLoTWExportWidget->setExportMode(ModeClubLog); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::sloteQSLLogUpload() { logEvent(Q_FUNC_INFO, "Start", Debug); if (!eQSLActive) { showMessageToEnableTheOnlineService(eQSL) ; return; } adifLoTWExportWidget->setExportMode(ModeEQSL); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQRZCOMLogUpload() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ) ; //qDebug() << Q_FUNC_INFO << " - END" ; return; } if (!qrzcomSubscriber) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it.") ); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - END" ; 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" ; return; } adifLoTWExportWidget->setExportMode(ModeQRZ); adifLoTWExportWidget->show(); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotRQSLExport() { logEvent(Q_FUNC_INFO, "Start", Debug); QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifReqQSLExport(fileName); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotADIFImport(){ //qDebug() << "MainWindow::slotADIFImport " ; logEvent(Q_FUNC_INFO, "Start", Debug); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); if (!fileName.isNull()) { //qDebug() << "MainWindow::slotADIFImport -1" ; //filemanager->adifReadLog(fileName, currentLog); int loggedQSOs = filemanager->adifReadLog2(fileName, QString(), currentLog); // Empty StationCallsign by default if (loggedQSOs>0) { updateQSLRecAndSent(); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " -3"; checkIfNewBandOrMode(); //qDebug() << Q_FUNC_INFO << " -4" ; awardsWidget->fillOperatingYears(); //qDebug() << Q_FUNC_INFO << " -5" ; slotShowAwards(); awardsWidget->showAwards(); //qDebug() << Q_FUNC_INFO << " -6" ; } //qDebug() << "MainWindow::slotADIFImport-7" ; } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotADIFImport-END" ; } void MainWindow::sendQSOToUI(const QSO &_qso) { mainQSOEntryWidget->setQSOData(_qso); commentTabWidget->setQSOData(_qso); satTabWidget->setQSOData(_qso); othersTabWidget->setQSOData(_qso); QSLTabWidget->setQSOData(_qso); eQSLTabWidget->setQSOData(_qso); myDataTabWidget->setQSOData(_qso); satTabWidget->setQSOData(_qso); QSOTabWidget->setQSOData(_qso); } void MainWindow::qsoToEdit (const int _qso) { //qDebug() << Q_FUNC_INFO << QString::number(_qso) ; logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - 000"; if (!modify) { backupCurrentQSO (); //qDebug() << Q_FUNC_INFO << ": Callsign: " << backupQSO->getCall(); } //qDebug() << Q_FUNC_INFO << " - 005"; clearUIDX(true); readingTheUI = true; setModifying(true); //qDebug() << Q_FUNC_INFO << " - 010"; modifyingQSOid = _qso; //qDebug() << Q_FUNC_INFO << " - 051 "; if ((clublogActive) && (clublogRealTime)) { clublogPrevQSO = dataProxy->getClubLogRealTimeFromId(modifyingQSOid); } manualMode = true; // We stop hamlib & wsjtx receiving data while editing a QSO mainQSOEntryWidget->setManualMode (manualMode); // ** Start of SAT data //qDebug() << Q_FUNC_INFO << " - SATELLITE - satName" ; satTabWidget->setFillingToEdit(true); QSO qsoE; qsoE.fromDB(modifyingQSOid); qsoInUI.copy(qsoE); //qDebug() << Q_FUNC_INFO << " - m: " << modifyingQSO->getMyCity(); sendQSOToUI(qsoE); QString currentQrz = qsoE.getCall(); currentEntity = world->getQRZARRLId(currentQrz); currentEntity = qsoE.getDXCC(); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); //qDebug() << Q_FUNC_INFO << " - in default - 101" ; EntityStatus _entityStatus; _entityStatus.dxcc = currentEntity; _entityStatus.bandId = currentBandShown; _entityStatus.modeId = currentModeShown; _entityStatus.logId = currentLog; //qDebug() << Q_FUNC_INFO << " - in default - 104" ; showStatusOfDXCC(_entityStatus); readingTheUI = false; satTabWidget->setFillingToEdit(false); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::setModifying(const bool _m) { logEvent(Q_FUNC_INFO, "Start", Debug); modify = _m; QSOTabWidget->setModifying (modify); mainQSOEntryWidget->setModify(modify); satTabWidget->setModifying(modify); myDataTabWidget->setModify (modify); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLocatorTextChanged(const QString &_loc) {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << "MainWindow::slotLocatorTextChanged: " << _loc; logEvent(Q_FUNC_INFO, "Start", Debug); Locator locator; if ( locator.isValidLocator(_loc) ) { infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), _loc); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotMyLocatorTextChanged(const QString &_loc) { //qDebug() << "MainWindowMy::slotMyLocatorTextChanged: " <<_loc ; logEvent(Q_FUNC_INFO, "Start", Debug); Locator locator; if ( locator.isValidLocator(_loc)) { dxccStatusWidget->setMyLocator(_loc); slotLocatorTextChanged(QSOTabWidget->getDXLocator()); } else { logEvent(Q_FUNC_INFO, "END-2", Debug); return; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::showStatusOfDXCC(EntityStatus _entityStatus) { //qDebug() << Q_FUNC_INFO << " - Entity: " << _entityStatus.dxcc << "/ Bandid :" << _entityStatus.bandId << "/Modeid: " << _entityStatus.modeId ; logEvent(Q_FUNC_INFO, "Start", Debug); // 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 */ //qDebug() << Q_FUNC_INFO << " - 10"; if (_entityStatus.bandId <= 0) // is the status valid? { //qDebug() << Q_FUNC_INFO << " - 20"; infoWidget->clear(); slotShowInfoLabel("--"); //infoLabel1->setText("--"); logEvent(Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END-1" ; return; } //qDebug() << Q_FUNC_INFO << " - 30"; // Set the status bar with the appropriate message int status = awards.getDXStatus (_entityStatus); //qDebug() << Q_FUNC_INFO << " - " << QString::number(status) ; QString message = awards.getDXStatusString(status); //qDebug() << Q_FUNC_INFO << " - 40"; slotShowInfoLabel(message); //qDebug() << Q_FUNC_INFO << " - 10"; //infoLabel1->setText(message); //infoWidget->showInfo((_qs.at(0)).toInt(), (_qs.at(1)).toInt(), (_qs.at(2)).toInt(), (_qs.at(3)).toInt() ); //qDebug() << Q_FUNC_INFO << " - 50"; infoWidget->showInfo(_entityStatus.dxcc); //qDebug() << Q_FUNC_INFO << " - 51"; //qDebug() << Q_FUNC_INFO << " - END-2" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log) { //qDebug() << "MainWindow::showDXMarathonNeeded" ; logEvent(Q_FUNC_INFO, "Start", Debug); if ((_dxcc<=0) || (_cqz<=0) || (!manageDxMarathon)) { logEvent(Q_FUNC_INFO, "END-1", Debug); 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", Debug); } void MainWindow::slotShowAwards() { //To be called from the logWindow & searchWidget //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); awards.recalculateAwards(); //qDebug() << Q_FUNC_INFO << " - 1"; //logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " - 2"; awardsWidget->showAwards(); //qDebug() << Q_FUNC_INFO << " - 3"; //dxccStatusWidget->refresh(); setMainWindowTitle(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::fillQSOData() { // Updates all QSO with the dxcc, CQZ, ... if empty. //qDebug() << "MainWindow::fillQSOData" ; logEvent(Q_FUNC_INFO, "Start", Debug); 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().text(), 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("id"); if ( (query.value (nameCol)).isValid() ) { _id = (query.value (nameCol)).toString(); } //qDebug() << Q_FUNC_INFO << ": ID: " << _id ; //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() << Q_FUNC_INFO << ": DXCC" ; nameCol = rec.indexOf("dxcc"); _dxcc = (query.value (nameCol)).toInt(); //qDebug() << Q_FUNC_INFO << ": DXCC: " << QString::number(_dxcc) ; if (_dxcc < 1) { aux1 = QString::number(world->getQRZARRLId(_call) ); //qDebug() << Q_FUNC_INFO << ": DXCC proposed: " << aux1 ; updateString = updateString + ", dxcc='" + aux1 + "'"; toModify = true; _dxcc = aux1.toInt(); } else { //qDebug() << Q_FUNC_INFO << ": DXCC already existed" ; } nameCol = rec.indexOf("cont"); if (( (query.value (nameCol)).toString()).length() < 2 ) { aux1 = world->getContinentShortName(_dxcc); updateString = updateString + ", cont='" + aux1 + "'"; toModify = true; } //_dxcc = -1; //qDebug() << "MainWindow::fillQSOData1: " << updateString ; if (toModify) { updateString = updateString + " WHERE id = " + "'" + _id + "'"; //qDebug() << "MainWindow::fillQSOData2: " << updateString ; sqlOK = query1.exec(updateString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << ": sqlOK=True" ; } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); //qDebug() << Q_FUNC_INFO << ": sqlOK=False" ; } } 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: " ; noMoreQso = true; } } // Closes the next.isValid } // Closes the While logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFillEmptyDXCCInTheLog() { logEvent(Q_FUNC_INFO, "Start", Debug); world->fillEmptyDXCCInTheLog(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotUpdateCTYDAT() { //qDebug() << "MainWindow::slotUpdateCTYDAT" ; logEvent(Q_FUNC_INFO, "Start", Debug); downloadcty->download(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotUpdateSATSDAT() { //qDebug() << "MainWindow::slotUpdateSATSDAT" ; logEvent(Q_FUNC_INFO, "Start", Debug); updateSatsData->readSatDataFile(); satTabWidget->refreshData(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowStats() { logEvent(Q_FUNC_INFO, "Start", Debug); statsWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotWorldReload(const bool _b) { //qDebug() << "MainWindow::slotWorldReload" ; //TODO: world.recreate returns a boolean, so it is possible to manage the errors logEvent(Q_FUNC_INFO, "Start", Debug); if (_b) { world->recreate(ctyDatFile); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFilePrint() { //qDebug() << "MainWindow::slotFilePrint" ; logEvent(Q_FUNC_INFO, "Start", Debug); 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().text(), query.lastQuery()); logEvent(Q_FUNC_INFO, "END-1", Debug); 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); 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 ; nameCol = rec.indexOf("modeid"); //qDebug() << "MainWindow::slotFilePrint: nameCol: " << QString::number(nameCol) ; aux = (query.value (nameCol)).toString(); //qDebug() << "MainWindow::slotFilePrint: Mode1: " << aux ; aux = dataProxy->getNameFromSubModeId(aux.toInt()); //qDebug() << "MainWindow::slotFilePrint: Mode2: " << aux ; if (aux.length()>1) { cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(aux); } else { //qDebug() << "MainWindow::slotFilePrint: ERROR: " << aux ; } 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", Debug); } //DX-CLUSTER - DXCLUSTER void MainWindow::slotAnalyzeDxClusterSignal(const DXSpot &_spot) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); DXSpot spot = _spot; //if (spot.isValid()) //qDebug() << Q_FUNC_INFO << " - Spot is Valid"; //else //qDebug() << Q_FUNC_INFO << " - Spot is NOT Valid"; //qDebug() << Q_FUNC_INFO << ": spot-dxCall : " << spot.getDxCall(); //qDebug() << Q_FUNC_INFO << ": spot-Spotter : " << spot.getSpotter(); //qDebug() << Q_FUNC_INFO << ": spot-Freq : " << spot.getFrequency().toQString(); //qDebug() << Q_FUNC_INFO << ": spot-Comment : " << spot.getComment(); EntityStatus _entityStatus; _entityStatus.dxcc = world->getQRZARRLId(spot.getDxCall()); if (!manageMode) { _entityStatus.modeId = -1; } if (spot.getClickStatus() == SingleClick) { infoLabel2->setText(world->getEntityName(_entityStatus.dxcc)); infoWidget->showEntityInfo(_entityStatus.dxcc ); // Becareful, he Frecuency arrives in KHz instead of bandid!! // db.getBandFromFreq expects a MHz! //(ql.at(1)).toDouble() _entityStatus.bandId = dataProxy->getBandIdFromFreq((spot.getFrequency().toDouble())); //qls << QRZ << BandId << ModeId << lognumber; showStatusOfDXCC(_entityStatus); } else if (spot.getClickStatus() == DoubleClick) { clusterSpotToLog(spot.getDxCall(), spot.getFrequency()); } int statusI = awards.getDXStatus (_entityStatus); //proposedQSOs pQSO; //pQSO.status = awards.getQSOStatus(statusI); //Callsign callsign(spot.getDxCall()); //if (callsign.isValid()) //{ // pQSO.call = spot.getDxCall(); // dxClusterAssistant->newDXClusterSpot(pQSO); //} logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotDXClusterSpotArrived(const DXSpot &_spot) { //qDebug() << Q_FUNC_INFO; //(void)_dxCall; //(void)_freq; DXSpot sp = _spot; if (!sp.isValid()) return; Callsign callsign(sp.getDxCall()); //if (callsign.isValid()) //{ // proposedQSOs pQSO; // pQSO.call = sp.getDxCall(); // pQSO.status = ATNO; // pQSO.freq = sp.getFrequency(); // dxClusterAssistant->newDXClusterSpot(pQSO); //qDebug() << Q_FUNC_INFO << ": DXCall not valid: " << pQSO.call; //} //else //{ //qDebug() << Q_FUNC_INFO << ": DXCall not valid: " << sp.getDxCall(); //} if (!dxclusterSendSpotsToMap) { return; } logEvent(Q_FUNC_INFO, "Start", Debug); QString dxGrid = world->getQRZLocator (sp.getDxCall()); Locator locator; Coordinate coord = locator.getLocatorCoordinate (dxGrid); //qDebug() << Q_FUNC_INFO << QString(" %1: Locator: %2 - (lat/lon)=>(%3/%4)").arg(sp.getDxCall()).arg(dxGrid).arg(coord.lat).arg(coord.lon); //qDebug() << "Lat: " << QString::number(coord.lat) << " - Lon: " << QString::number(coord.lon); mapWindow->addMarker(coord, dxGrid); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::clusterSpotToLog(const QString &_call, Frequency _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); QString _aux; double _freqN = _fr.toDouble(MHz); //qDebug() << Q_FUNC_INFO << " - calling setQRZ-2" ; mainQSOEntryWidget->setQRZ(_call); QSOTabWidget->setTXFreq (_freqN); QSOTabWidget->setRXFreq(_freqN); //freqQLCDNumber->display(_freqN); //_aux = QString::number(_freqN); //qDebug() << Q_FUNC_INFO << " - Freq: " << _aux ; int _bandi = dataProxy->getBandIdFromFreq(_freqN); //qDebug() << Q_FUNC_INFO << " - Bandi: " << QString::number(_bandi) ; _aux = QString::number(_bandi); _aux = QString("SELECT name FROM band WHERE id ='%1'").arg(_aux); //qDebug() << Q_FUNC_INFO << " - Band: " << _aux ; 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() << Q_FUNC_INFO << " - END " ; logEvent(Q_FUNC_INFO, "END", Debug); } //DX-CLUSTER - DXCLUSTER void MainWindow::updateQSLRecAndSent() { //qDebug() << "MainWindow::updateQSLRecAndSent " ; logEvent(Q_FUNC_INFO, "Start", Debug); // 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().text(), 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().text(), query.lastQuery()); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::updateQSLRecAndSent - END" ; } QString MainWindow::findStationCallsignToUse() { //QString foundCall = dataProxy->getStationCallSignFromLog (currentLog); QString foundCall = dataProxy->getStationCallSignFromLog (currentLog); Callsign callsign(foundCall); if (callsign.isValid()) return foundCall; return mainQRZ; } void MainWindow::defineStationCallsign() { logEvent(Q_FUNC_INFO, "Start", Debug); QString logQRZ = findStationCallsignToUse(); //qDebug() << Q_FUNC_INFO << ": StationCallsign: " << logQRZ; Callsign callsign(logQRZ); if (!callsign.isValid()) { return; } stationCallsign = logQRZ; //qDebug() << Q_FUNC_INFO << ": " << stationCallsign ; filemanager->setStationCallSign(stationCallsign); //qDebug() << Q_FUNC_INFO << ": AFTER" ; myDataTabWidget->setData(stationCallsign, operatorQRZ, myDataTabWidget->getMyLocator()); dxccStatusWidget->setMyLocator(myDataTabWidget->getMyLocator()); searchWidget->setStationCallsign(stationCallsign); if (lotwActive) { lotwUtilities->setStationCallSign(stationCallsign); } dxClusterWidget->setMyQRZ(stationCallsign); adifLoTWExportWidget->setDefaultStationCallsign(stationCallsign); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": " << stationCallsign << " - END" ; } void MainWindow::slotSetPropModeFromSat(const QString &_p, bool _keep) { //qDebug() << Q_FUNC_INFO << ": " << _p << "- _keep: " << util->boolToQString(_keep) ;; logEvent(Q_FUNC_INFO, "Start", Debug); othersTabWidget->setPropMode(_p, _keep); QSOTabWidget->setPropModeFromSat(_p); logEvent(Q_FUNC_INFO, "END", Debug); //int indexC = propModeComboBox->findText(" - " + _p + " - ", Qt::MatchContains); //propModeComboBox->setCurrentIndex(indexC); } void MainWindow::slotSetPropModeFromOther(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; if (_p!="SAT") { //qDebug() << Q_FUNC_INFO << ": Is NOT SAT propagation mode"; satTabWidget->setNoSat(); } } void MainWindow::clearIfNotCompleted() { if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } if (completedWithPreviousQSLVia) { QSLTabWidget->setQSLVia(""); completedWithPreviousQSLVia = false; } } void MainWindow::completeWithPreviousQSO(const QString &_call) { //qDebug() << "MainWindow::completeWithPreviousQSO" ; //This function completes: Name, QTH, Locator, Entity, Iota logEvent(Q_FUNC_INFO, "Start", Debug); int previousQSOId = dataProxy->isWorkedB4(_call, -1); if ((!completeWithPrevious) || (_call.length()<=0) || (previousQSOId<=0)) //if ( (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) { //qDebug() << "MainWindow::completeWithPreviousQSO NOT completing..." ; QSOTabWidget->setName(QString()); QSOTabWidget->setQTH(QString()); QSOTabWidget->setDXLocator(QString()); clearIfNotCompleted(); logEvent(Q_FUNC_INFO, "END-1", Debug); return; } QSO prevQSO; prevQSO.fromDB(previousQSOId); //qDebug() << "MainWindow::completeWithPreviousQSO completing..." ; QString aux = QString(); QSOTabWidget->setName(prevQSO.getName(), true); QSOTabWidget->setQTH(prevQSO.getQTH(), true); QSOTabWidget->setDXLocator(prevQSO.getGridSquare(), true); aux = prevQSO.getIOTA(); if ((aux.length()>=0) && (othersTabWidget->isIOTAModified()) ) { aux = awards.checkIfValidIOTA(aux); if ((aux.length())==6) { othersTabWidget->setIOTA(aux); completedWithPreviousIOTA=true; } else if (completedWithPreviousIOTA && (aux != othersTabWidget->getIOTA())) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } } else if (completedWithPreviousIOTA ) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } aux = prevQSO.getQSLVia(); 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", Debug); } void MainWindow::slotValidBandsReceived(const QStringList &_b) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; dxccStatusWidget->setBands(Q_FUNC_INFO, _b, true); satTabWidget->addBands(_b); mapWindow->setBands(_b); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqRXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_fr); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - not running" ; return; } int bandId = dataProxy->getBandIdFromFreq(_fr); if (bandId < 1) { //qDebug() << Q_FUNC_INFO << " - wrong band" ; return; } // The following line is needed to ensure that the band of the freqRX is included // in the list of available bands and include it if it is not. mainQSOEntryWidget->setFreq (_fr, true); QSOTabWidget->setRXFreq (_fr); satTabWidget->setDownLinkFreq(_fr); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqTXChangedFromSat(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } if (dataProxy->isThisFreqInBand (mainQSOEntryWidget->getBand (), QString::number(_fr))) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } slotFreqTXChanged (_fr); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqTXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_fr); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } //qDebug() << Q_FUNC_INFO << " - 10"; QSOTabWidget->setTXFreq (_fr); //qDebug() << Q_FUNC_INFO << " - 11"; mainQSOEntryWidget->setFreq (_fr); //qDebug() << Q_FUNC_INFO << " - calling setUpLinkFreq"; satTabWidget->setUpLinkFreq(_fr); if (hamlibActive && !manualMode) { hamlib->setFreq(_fr); } mainQSOEntryWidget->setMode(util->getDefaultModeForFreq(_fr)); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::slotShowQSOsFromDXCCWidget(QList _qsos) { //qDebug() << "MainWindow::slotShowQSOsFromDXCCWidget" ; logEvent(Q_FUNC_INFO, "Start", Debug); slotShowSearchWidget(); searchWidget->showQSOs(_qsos); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQSOReceived(const QSO &_qso) { //qDebug() << Q_FUNC_INFO << " - Start"; //logEvent(Q_FUNC_INFO, "Start", Debug); if (!wsjtxAutoLog) if (!askToAddQSOReceived(_qso)) return; //qDebug() << Q_FUNC_INFO << "010"; QSO q; //qDebug() << Q_FUNC_INFO << "020"; q.copy(_qso); q.setLogId(currentLog); //qDebug() << Q_FUNC_INFO << "030"; //qDebug() << Q_FUNC_INFO << "Call: " << q.getCall(); //qDebug() << Q_FUNC_INFO << "Mode: " << q.getMode(); int dxcc = world->getQRZARRLId(q.getCall()); //qDebug() << Q_FUNC_INFO << "040"; dxcc = util->getNormalizedDXCCValue (dxcc); //qDebug() << Q_FUNC_INFO << "050"; q.setDXCC(dxcc); //qDebug() << Q_FUNC_INFO << "060"; if (!showWSJTXDuplicatedMSG(q)) return; //qDebug() << Q_FUNC_INFO << "070"; int addedQSO = q.toDB(); //qDebug() << Q_FUNC_INFO << "addedQSO: " << addedQSO; if (addedQSO>0) { //qDebug() << Q_FUNC_INFO << "090"; //qDebug() << Q_FUNC_INFO << " - QSO added: " << QString::number(addedQSO); actionsJustAfterAddingOneQSO(); slotShowInfoLabel(tr("QSO logged from WSJT-X:")); infoLabel2->setText(q.getCall() + " - " + dataProxy->getBandNameFromFreq(q.getFreqTX()) + "/" + q.getMode()); slotClearButtonClicked(Q_FUNC_INFO); } else { //qDebug() << Q_FUNC_INFO << "100"; } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::askToAddQSOReceived(const QSO &_qso) { //qDebug() << Q_FUNC_INFO << " - Start"; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - QSO received - NEW")); msgBox.setTextFormat(Qt::RichText); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); QSO qsoM(_qso); QString aux = QString(tr("ASK-The following QSO data has been received from to be logged:\n\n" "" "" "" "" "" "" "" "" "" "" "" "" "
Callsign:%1
Freq:%2
Mode:%3
Time On:%4
Time Off:%5
RST TX:%6
RST RX:%7
Comment:%8
DX-Grid:%9
Local-Grid:%10
Station Callsign:%11
Operator Callsign:%12
")).arg(qsoM.getCall(), QString::number(qsoM.getFreqTX()), qsoM.getMode(), util->getADIFTimeFromQTime(qsoM.getTimeOn()), util->getADIFTimeFromQTime(qsoM.getTimeOff()), qsoM.getRSTTX(), qsoM.getRSTRX(), qsoM.getComment(), qsoM.getGridSquare(), qsoM.getMyGridSquare(), qsoM.getStationCallsign(), qsoM.getOperatorCallsign()); msgBox.setText(aux); int ret = msgBox.exec(); switch (ret) { //case QMessageBox::Yes: //break; case QMessageBox::No: //logTheQso = false; return false; break; default: // should never be reached //logTheQso = false; return true; break; } } bool MainWindow::showWSJTXDuplicatedMSG(const QSO &_qso) { QSO q = _qso; //qDebug() << Q_FUNC_INFO << " - Calling isThisQSODuplicated with call: " << q.getCall(); if (!((dataProxy->isThisQSODuplicated(q, dupeSlotInSeconds)).length()>0)) return true; 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", Debug); return true; break; case QMessageBox::Discard: logEvent(Q_FUNC_INFO, "END-1", Debug); return false; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", Debug); return false; // The user wants to keepseeing errors //break; } } bool MainWindow::checkIfNewMode(const QString &_mode) { //qDebug() << "MainWindow::checkIfNewMode: " << _mode ; logEvent(Q_FUNC_INFO, "Start", Debug); 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 ; 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", Debug); return false; // The user wants to keepseeing errors //break; case QMessageBox::No: logEvent(Q_FUNC_INFO, "END-1", Debug); return true; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", Debug); 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 ; addNewValidMode(_mode); } logEvent(Q_FUNC_INFO, "END", Debug); 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", Debug); (void)_sub_mode; if (manualMode) { return; } if (modify) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } //qDebug() << Q_FUNC_INFO << " type: " << QString::number(_type) ; //qDebug() << Q_FUNC_INFO << " dxcall: " << _dxcall ; //qDebug() << Q_FUNC_INFO << " freq: " << QString::number(_freq/1000000) ; //qDebug() << Q_FUNC_INFO << " mode: " << _mode ; //qDebug() << Q_FUNC_INFO << " report: " << _report ; //qDebug() << Q_FUNC_INFO << " de_call: " << _de_call ; //qDebug() << Q_FUNC_INFO << " _de_grid: " << _de_grid ; //qDebug() << Q_FUNC_INFO << " dx_grid: " << _dx_grid ; //qDebug() << Q_FUNC_INFO << " sub_mode: " << _sub_mode ; if ((!mainQSOEntryWidget->isModeExisting(_mode)) && (!noMoreModeErrorShown)) { noMoreModeErrorShown = checkIfNewMode(_mode); } switch (_type) { case 0: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT/IN - Heartbeat" ; break; case 1: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT - Status" ; //qDebug() << Q_FUNC_INFO << " - calling setQRZ-3" ; 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) ; 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" ; break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::addNewValidMode(const QString &_mode) { //qDebug() << "MainWindow::addNewMode: " << _mode ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList _newM; _newM.clear(); _newM << _mode; _newM << mainQSOEntryWidget->getModes(); readActiveModes (_newM); mainQSOEntryWidget->setModes(modes); mapWindow->setModes(modes); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::addNewValidMode: END" ; } void MainWindow::slotClearNoMorErrorShown() { logEvent(Q_FUNC_INFO, "Start", Debug); noMoreErrorShown = false; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed) { //qDebug() << Q_FUNC_INFO << " - Function: " << functionFailed ; //qDebug() << Q_FUNC_INFO << " - Error: - " << errorCodeS; //qDebug() << Q_FUNC_INFO << " - Native: - " << nativeError; //qDebug() << Q_FUNC_INFO << " - QueryFailed: - " << queryFailed; logEvent(Q_FUNC_INFO, "Start", Debug); if (noMoreErrorShown) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } QString aux; bool showDebug = true; if (nativeError.toInt() == 2067) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); if (functionFailed == "int QSO::toDB(int)") { msgBox.setWindowTitle(tr("KLog - QSO Dupe")); msgBox.setText(tr("A dupe QSO has been detected in the file and will not be added to the log.")); msgBox.setInformativeText(tr("Please check the QSO information file and ensure it is properly added.") ); showDebug = false; } else if (functionFailed == "virtual bool DataProxy_SQLite::addSatellite(QString, QString, QString, QString, QString)") { msgBox.setWindowTitle(tr("KLog - Duplicated satellite")); 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(); return; } if (showDebug) { // 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 aux = "
" + tr("An unexpected error ocurred!!") + "

" + tr("If the problem persists, please contact the developers") + "(klog@groups.io)" + 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", Debug); } void MainWindow::slotDefineNewBands (const QStringList _bands) { //qDebug() << "MainWindow::defineNewBands: " ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList qsTemp; qsTemp.clear(); //qsTemp << _bands; //qsTemp.removeDuplicates(); qsTemp << dataProxy->sortBandNamesBottonUp(_bands); qsTemp.removeDuplicates(); bands.clear(); bands = qsTemp; mainQSOEntryWidget->setBands(bands); mapWindow->setBands(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::defineNewBands - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHamlibTXFreqChanged(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (manualMode) { return; } if (upAndRunning) { if (!util->isSameFreq (_f, QSOTabWidget->getTXFreq ())) { //qDebug() << Q_FUNC_INFO << ": Updating the freq... " ; QSOTabWidget->setTXFreq (_f); } else { //qDebug() << "MainWindow::slotHamlibTXFreqChanged - Not updating Freq" ; } } else { //qDebug() << "MainWindow::slotHamlibTXFreqChanged - Not Up&Running" ; } //qDebug() << "MainWindow::slotHamlibTXFreqChanged - END " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHamlibModeChanged(const QString &_m) { logEvent(Q_FUNC_INFO, "Start", Debug); if (manualMode) { return; } if (_m.length()<2) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } if ((mainQSOEntryWidget->getMode()).toUpper() == _m.toUpper()) { return; } hamlibChangingMode = true; if (checkIfNewMode(_m)) { hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END-2", Debug); return; } if (mainQSOEntryWidget->isModeExisting(_m)) { //qDebug() << "slotHamlibModeChanged: Mode in the Combobox: " ; mainQSOEntryWidget->setMode(_m); //modeComboBox->setCurrentIndex(modeComboBox->findText(_m, Qt::MatchCaseSensitive)); } else { //qDebug() << "MainWindow::slotHamlibModeChanged: Mode not found in combobox" << _m ; } hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END", Debug); } /* void MainWindow::slotRotatorShow() { rotatorWidget->show(); } */ void MainWindow::slotUpdateLocator(QString _loc) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainWindow::slotUpdateLocator: " << _loc; QSOTabWidget->setDXLocator (_loc); //qDebug() << "MainWindow::slotUpdateLocator - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::reconfigureDXMarathonUI(const bool _dxM) { logEvent(Q_FUNC_INFO, "Start", Debug); dxClusterWidget->setDXMarathon(_dxM); awardsWidget->setManageDXMarathon(_dxM); //awardsWidget->reconfigureDXMarathonUI(_dxM); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowInfoLabel(const QString &_m) { infoLabel1->setText(_m); } void MainWindow::slotAwardsWidgetSetLog() { awardsWidget->setLog(currentLog); } void MainWindow::slotAwardsWidgetSetYear() { awardsWidget->setYear(selectedYear); } void MainWindow::slotManualMode(bool _enable) { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_enable); manualMode = _enable; if ((manualMode) && (hamlibActive)) { hamlib->readRadio(true); } } void MainWindow::backupCurrentQSO() { // This function reads the full UI and stores it in a QSO //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); backupQSO->clear(); getQSODataFromUI(); backupQSO->copy(qsoInUI); backupQSO->setBackup (true); backupQSO->setModifying (mainQSOEntryWidget->getModifying()); backupQSO->setRealTime (mainQSOEntryWidget->getRealTime()); backupQSO->setManualMode (mainQSOEntryWidget->getManualMode()); backupQSO->setLogId (currentLog); backupQSO->setKeepComment (commentTabWidget->getKeep ()); backupQSO->setKeepOthers (othersTabWidget->getKeep ()); backupQSO->setKeepMyData (myDataTabWidget->getKeep ()); backupQSO->setKeepSatTab (satTabWidget->getKeep ()); //qDebug() << Q_FUNC_INFO << ": Callsign: " << backupQSO->getCall(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; //qDebug() << Q_FUNC_INFO << ": Realtime: " << util->boolToQString (backupQSO->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 (backupQSO->getModifying()) { mainQSOEntryWidget->setModify(true); } //qso = backupQSO; //qDebug() << Q_FUNC_INFO << " - calling setQRZ-4" ; mainQSOEntryWidget->setQRZ(backupQSO->getCall ()); mainQSOEntryWidget->setBand (backupQSO->getBand ()); mainQSOEntryWidget->setMode (backupQSO->getMode ()); mainQSOEntryWidget->setDateTime (backupQSO->getDateTimeOn ()); //qDebug() << Q_FUNC_INFO << ": restoring config: " << util->boolToQString (restoreConfig); if (restoreConfig) { mainQSOEntryWidget->setRealTime (backupQSO->getRealTime()); manualMode = backupQSO->getManualMode(); //qDebug() << Q_FUNC_INFO << ": manualMode: " << util->boolToQString (manualMode); mainQSOEntryWidget->setManualMode (manualMode); } // MainWindowInputQSO QSOTabWidget->setRSTRX (backupQSO->getRSTRX ()); QSOTabWidget->setRSTTX (backupQSO->getRSTTX ()); QSOTabWidget->setTXFreq (backupQSO->getFreqTX ()); QSOTabWidget->setRXFreq (backupQSO->getFreqRX ()); QSOTabWidget->setDXLocator (backupQSO->getGridSquare ()); QSOTabWidget->setName (backupQSO->getName ()); QSOTabWidget->setQTH (backupQSO->getQTH ()); QSOTabWidget->setRXPwr (backupQSO->getRXPwr ()); // MainWindowInputQSL QSLTabWidget->setQSLSenStatus (backupQSO->getQSL_SENT ()); QSLTabWidget->setQSLRecStatus (backupQSO->getQSL_RCVD ()); QSLTabWidget->setQSLRecDate (backupQSO->getQSLRDate ()); QSLTabWidget->setQSLSenDate (backupQSO->getQSLSDate ()); QSLTabWidget->setQSLSenVia (backupQSO->getQSLSentVia()); QSLTabWidget->setQSLRecVia (backupQSO->getQSLRecVia()); QSLTabWidget->setQSLVia (backupQSO->getQSLVia ()); QSLTabWidget->setQSLMsg (backupQSO->getQSLMsg ()); // MainWindowInputEQSL eQSLTabWidget->setClubLogStatus (backupQSO->getClubLogStatus ()); eQSLTabWidget->setClubLogDate (backupQSO->getClubLogDate ()); eQSLTabWidget->setEQSLSenStatus (backupQSO->getEQSLQSL_SENT ()); eQSLTabWidget->setEQSLSenDate (backupQSO->getEQSLQSLSDate ()); eQSLTabWidget->setEQSLRecStatus (backupQSO->getEQSLQSL_RCVD ()); eQSLTabWidget->setEQSLRecDate (backupQSO->getEQSLQSLRDate ()); eQSLTabWidget->setLOTWSenStatus (backupQSO->getLoTWQSL_SENT ()); eQSLTabWidget->setLOTWSenDate (backupQSO->getLoTWQSLSDate ()); eQSLTabWidget->setLOTWRecStatus (backupQSO->getLoTWQSL_RCVD ()); eQSLTabWidget->setLOTWRecDate (backupQSO->getLoTWQSLRDate ()); eQSLTabWidget->setQRZCOMStatus (backupQSO->getQRZCOMStatus ()); eQSLTabWidget->setQRZCOMDate (backupQSO->getQRZCOMDate ()); // MainWindowInputComment commentTabWidget->setData (backupQSO->getComment ()); commentTabWidget->setKeep (backupQSO->getKeepComment ()); // MainWindowInputOthers othersTabWidget->setVUCCGrids (backupQSO->getVUCCGrids ()); othersTabWidget->setSOTA (backupQSO->getSOTA_REF ()); othersTabWidget->setAge(backupQSO->getAge ()); othersTabWidget->setDistance(backupQSO->getDistance()); othersTabWidget->setPOTA_REF(backupQSO->getPOTA_Ref()); othersTabWidget->setSIG(backupQSO->getSIG()); othersTabWidget->setSIG_INFO(backupQSO->getSIG_INFO()); othersTabWidget->setWWFF_Ref(backupQSO->getWWFF_Ref()); othersTabWidget->setEntity (backupQSO->getDXCC ()); othersTabWidget->setIOTA (backupQSO->getIOTA ()); //qDebug() << Q_FUNC_INFO << ": Restoring propMode"; othersTabWidget->setPropMode (backupQSO->getPropMode ()); //qDebug() << Q_FUNC_INFO << ": Restoring Keep"; othersTabWidget->setKeep (backupQSO->getKeepOthers ()); //qDebug() << Q_FUNC_INFO << ": END"; // MainWindowMyDataTab if (backupQSO->getLogId () == currentLog) { myDataTabWidget->setStationCallsign (backupQSO->getStationCallsign()); } else { myDataTabWidget->setStationCallsign (stationCallsign); } myDataTabWidget->setMyPower (backupQSO->getTXPwr ()); myDataTabWidget->setOperator (backupQSO->getOperatorCallsign()); myDataTabWidget->setMyLocator (backupQSO->getMyGridSquare ()); myDataTabWidget->setKeep (backupQSO->getKeepMyData ()); myDataTabWidget->setMyRig (backupQSO->getMyRig ()); myDataTabWidget->setMyAntenna (backupQSO->getMyAntenna ()); myDataTabWidget->setMySOTA (backupQSO->getMySOTA_REF ()); myDataTabWidget->setMyVUCCGrids (backupQSO->getMyVUCCGrids ()); myDataTabWidget->setMyPota_ref(backupQSO->getMyPOTA_Ref()); myDataTabWidget->setMySig(backupQSO->getMySig()); myDataTabWidget->setMySig_info(backupQSO->getMySigInfo()); myDataTabWidget->setMyWWFF_Ref(backupQSO->getMyWWFF_Ref()); //MainWindowSatTab satTabWidget->setSatName (backupQSO->getSatName ()); satTabWidget->setSatMode (backupQSO->getSatMode ()); satTabWidget->setKeep (backupQSO->getKeepSatTab ()); backupQSO->setBackup (false); backupQSO->clear(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::setLogLevel(const DebugLogLevel _sev) { //qDebug() << Q_FUNC_INFO << ": " << util->debugLevelToString(_sev); logEvent(Q_FUNC_INFO, "Start", Debug); logLevel = _sev; showKLogLogWidget->setLogLevel(logLevel); //setupDialog->setLogLevel(logLevel); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("DebugLog",util->debugLevelToString (logLevel)); settings.endGroup (); tipsDialog->setLogLevel(logLevel); dataProxy->setLogLevel(logLevel); mainQSOEntryWidget->setLogLevel(logLevel); util->setLogLevel(logLevel); qsoInUI.setLogLevel(logLevel); othersTabWidget->setLogLevel(logLevel); logEvent(Q_FUNC_INFO, "END", Debug); } 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() << Q_FUNC_INFO << _func << "/" << _msg << "/" << QString::number(_level); logEvent(_func, _msg, _level); } void MainWindow::slotNewLogLevel(DebugLogLevel l) { //qDebug() << Q_FUNC_INFO; setLogLevel(l); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("DebugLog", util->debugLevelToString(l)); settings.endGroup (); } bool MainWindow::loadSettings() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - 10 - General"; QString value = settings.value ("Version").toString (); if (softwareVersion!=value) { //qDebug() << Q_FUNC_INFO << " - It seems it is a new version "; //qDebug() << Q_FUNC_INFO << QString("softwareversion: %1 / version: %2").arg(softwareVersion).arg(value); itIsANewversion = true; } currentLog = settings.value ("SelectedLog").toInt(); setWindowSize (settings.value ("MainWindowSize").toSize ()); //qDebug() << Q_FUNC_INFO << " - 20 - user"; settings.beginGroup ("UserData"); value = settings.value ("Callsign").toString (); //qDebug() << Q_FUNC_INFO << " stationCallSign: " << value; Callsign callsign(value); if (callsign.isValid()) { mainQRZ = value; } my_ITUz = 0; my_CQz = 0; my_CQz = settings.value ("CQz").toInt (); my_ITUz = settings.value ("ITUz").toInt (); // We Select the log after the mainQRZ is defined to prevent call conflicts selectTheLog(currentLog); Locator locator; value = settings.value ("StationLocator").toString (); if ( locator.isValidLocator(value) ) { myDataTabWidget->setMyLocator(value.toUpper()); adifLoTWExportWidget->setDefaultMyGrid(value.toUpper()); } settings.endGroup (); myDataTabWidget->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 30 - modes"; settings.beginGroup ("BandMode"); QStringList listAux; listAux.clear(); listAux << "SSB" << "CW"; readActiveModes (settings.value("Modes", listAux ).toStringList ()); //qDebug() << Q_FUNC_INFO << " - 31 - bands"; listAux.clear(); listAux << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; readActiveBands (settings.value("Bands", listAux).toStringList ()); settings.endGroup (); logWindow->setColumns(settings.value ("LogViewFields").toStringList ()); //qDebug() << Q_FUNC_INFO << " - 41 - logs"; //qDebug() << Q_FUNC_INFO << " - 50 - dxcluster"; settings.beginGroup ("DXCluster"); // Get the server string from settings QString server = settings.value("DXClusterServerToUse", "dxfun.com:8000").toString(); // Split the server string into host and port QStringList serverList = server.split(':'); QString host = "dxfun.com"; int port = 8000; // Check if the server string has both host and port if (serverList.size() == 2) { host = serverList.at(0); // Extract host port = serverList.at(1).toInt(); // Convert port to integer } dxClusterWidget->setDXClusterServer(host, port); dxClusterWidget->setSaveSpots(settings.value ("DXClusterSave", false).toBool ()); dxClusterShowHF = settings.value ("DXClusterShowHF", true).toBool (); dxClusterShowVHF = settings.value ("DXClusterShowVHF", true).toBool (); dxClusterShowWARC = settings.value ("DXClusterShowWARC", true).toBool (); dxClusterShowWorked = settings.value ("DXClusterShowWorked", true).toBool (); dxClusterShowConfirmed = settings.value ("DXClusterShowConfirmed", true).toBool (); dxClusterShowAnn = settings.value ("DXClusterShowAnn", true).toBool (); dxClusterShowWWV = settings.value ("DXClusterShowWWV", true).toBool (); dxClusterShowWCY = settings.value ("DXClusterShowWCY", true).toBool (); dxclusterSendSpotsToMap = settings.value ("DXClusterSendToMap", true).toBool (); dxClusterWidget->loadSettings (); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 60 - colors"; settings.beginGroup ("Colors"); newOneColor = settings.value("NewOneColor").value(); neededColor = settings.value("NeededColor").value(); workedColor = settings.value("WorkedColor").value(); confirmedColor = settings.value("ConfirmedColor").value(); defaultColor = settings.value("DefaultColor").value(); bool darkMode = settings.value("DarkMode", false).toBool (); //qDebug() << Q_FUNC_INFO << " - NewOneColor: " << newOneColor.name(QColor::HexRgb); //qDebug() << Q_FUNC_INFO << " - NewOneColor: " << newOneColor.name(); //qDebug() << Q_FUNC_INFO << " - NeededColor: " << neededColor.name(QColor::HexRgb); //qDebug() << Q_FUNC_INFO << " - WorkedColor: " << workedColor.name(QColor::HexRgb); //qDebug() << Q_FUNC_INFO << " - ConfirmedColor: " << confirmedColor.name(QColor::HexRgb); //qDebug() << Q_FUNC_INFO << " - DefaultColor: " << defaultColor.name(QColor::HexRgb); settings.endGroup (); setColors(newOneColor, neededColor, workedColor, confirmedColor, defaultColor); setupDialog->loadDarkMode (); setDarkMode(darkMode); //qDebug() << Q_FUNC_INFO << " - 70 - misc"; settings.beginGroup ("Misc"); mainQSOEntryWidget->setRealTime (settings.value ("RealTime", true).toBool ()); mainQSOEntryWidget->setShowSeconds (settings.value ("ShowSeconds", false).toBool ()); useDefaultLogFileName = (settings.value ("UseDefaultName", true).toBool ()); imperialSystem = (settings.value ("ImperialSystem", false).toBool ()); sendQSLWhenRec = (settings.value ("SendQSLWhenRec", true).toBool ()); manageDxMarathon = (settings.value ("ManageDXMarathon", false).toBool ()); awardsWidget->setManageDXMarathon (manageDxMarathon); searchWidget->setShowCallInSearch(settings.value ("ShowCallsignInSearch", true).toBool ()); checkNewVersions = settings.value ("CheckNewVersions", true).toBool (); reportInfo = false; alwaysADIF = settings.value ("AlwaysADIF", true).toBool (); setLogLevel(util->stringToDebugLevel(settings.value ("DebugLog").toString ())); mainQSOEntryWidget->setUTC(settings.value ("UTCTime", true).toBool ()); sendQSLByDefault = settings.value ("SendEQSLByDefault", true).toBool (); eQSLTabWidget->setQueueSentByDefault(sendQSLByDefault); dupeSlotInSeconds = settings.value ("DuplicatedQSOSlot", 300).toInt (); filemanager->setDuplicatedQSOSlot(dupeSlotInSeconds); mainQSOEntryWidget->setDuplicatedQSOSlot(dupeSlotInSeconds); completeWithPrevious = settings.value ("CompleteWithPrevious", true).toBool (); defaultADIFLogFile = settings.value ("DefaultADIFFile").toString (); deleteAlwaysAdiFile = settings.value ("DeleteAlwaysAdiFile", true).toBool (); //util->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); //mainQSOEntryWidget->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); //filemanager->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); //adifLoTWExportWidget->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 90 - elog"; settings.beginGroup ("ClubLog"); clublogActive = settings.value ("ClubLogActive", false).toBool (); //setupDialog->setClubLogActive(clublogActive); clublogRealTime = settings.value ("ClubLogRealTime", false).toBool (); settings.endGroup (); elogClublog->loadSettings (); settings.beginGroup ("QRZcom"); qrzcomActive = settings.value ("QRZcomActive", false).toBool (); //setupDialog->setQRZCOMAutoCheckActive(QRZCOMAutoCheckAct->isChecked()); qrzcomSubscriber = settings.value ("QRZcomSubscriber", false).toBool (); elogQRZcom->setSubcription (qrzcomSubscriber); QRZCOMAutoCheckAct->setChecked(settings.value ("QRZcomSubscriber", false).toBool ()); //setupDialog->setQRZCOMAutoCheckActive(settings.value ("QRZcomSubscriber", false).toBool ()); elogQRZcom->setUser (settings.value ("QRZcomUser").toString ()); elogQRZcom->setPassword (settings.value ("QRZcomPass").toString ()); elogQRZcom->setLogBookKey(settings.value ("QRZcomLogBookKey").toString ()); settings.endGroup (); settings.beginGroup ("eQSL"); eQSLActive = settings.value ("eQSLActive", false).toBool (); eqslUtilities->setUser(settings.value ("eQSLCall").toString ()); eqslUtilities->setPass(settings.value ("eQSLPass").toString ()); settings.endGroup (); settings.beginGroup ("LoTW"); lotwActive = settings.value ("LoTWActive", false).toBool (); lotwTQSLpath = settings.value ("LoTWPath").toString (); lotwUtilities->setUser(settings.value ("LoTWUser").toString ()); lotwUtilities->setPass(settings.value ("LoTWPass").toString ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 50 - UDPServer"; UDPLogServer->loadSettings (); settings.beginGroup ("UDPServer"); UDPServerStart = settings.value ("UDPServer", false).toBool (); //qDebug() << Q_FUNC_INFO << "UDPServer = " << util->boolToQString (UDPServerStart); //UDPLogServer->setNetworkInterface(settings.value ("UDPNetworkInterface").toString ()); //UDPLogServer->setPort(settings.value ("UDPServerPort", 2237).toInt ()); infoTimeout = settings.value ("InfoTimeOut", 2000).toInt (); //UDPLogServer->setLogging(settings.value ("LogFromWSJTX", false).toBool ()); //UDPLogServer->setRealTimeUpdate(settings.value ("RealTimeFromWSJTX", false).toBool ()); wsjtxAutoLog = settings.value ("LogAutoFromWSJTX", false).toBool (); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 110 - Sats"; //qDebug() << Q_FUNC_INFO << " - 120 - HamLib"; settings.beginGroup ("HamLib"); hamlib->loadSettings (); hamlibActive = settings.value ("HamlibActive").toBool (); settings.endGroup (); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; return true; } void MainWindow::setDarkMode(const bool _dm) { othersTabWidget->setDarkMode(_dm); QSOTabWidget->setDarkMode(_dm); myDataTabWidget->setDarkMode(_dm); } void MainWindow::slotDarkModeChanged(const bool _dm) { setDarkMode(_dm); } void MainWindow::selectTheLog(const int _i) { //qDebug() << Q_FUNC_INFO; currentLog = _i; if (!dataProxy->doesThisLogExist(currentLog)) { int _howManyQSOMax = -1; // NUmber of QSO of the log with more QSO int _howManyQSOMaxT = 0; // Number of QSO in ine specific log int _logWithMoreQSOs = -1; QStringList logs = QStringList(); logs << dataProxy->getListOfManagedLogs(); for (int i = 0;igetHowManyQSOInLog(i); if (_howManyQSOMax < _howManyQSOMaxT) { _howManyQSOMax = _howManyQSOMaxT; _logWithMoreQSOs = (logs.at(i)).toInt(); } } if (_logWithMoreQSOs>0) { currentLog = _logWithMoreQSOs; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.setValue ("SelectedLog", 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; } } } defineStationCallsign (); dxClusterWidget->setCurrentLog(currentLog); dxccStatusWidget->setCurrentLog(currentLog); } void MainWindow::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //This function is the only one not logging the activity //qDebug() << Q_FUNC_INFO << "_level: " << _func << "/" << _msg << "/" << util->debugLevelToString(_level); //qDebug() << Q_FUNC_INFO << "upAndRunning: " << util->boolToQString(upAndRunning); showKLogLogWidget->add(_func, _msg, _level); return; if (!upAndRunning) { showKLogLogWidget->add(_func, _msg, None); return; } if (logLevel<=_level) showKLogLogWidget->add(_func, _msg, _level); } klog-2.4.1/setupdialog.h0000644000175000017500000001524315003153303014121 0ustar develdevel#ifndef KLOG_SETUPDIALOG_H #define KLOG_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/setuppageelog.h" #include "setuppages/setuppageudp.h" #include "setuppages/setuppagesats.h" #include "setuppages/setuppagehamlib.h" #include "setuppages/setuppagesubdivisions.h" #include "setuppages/setuppagelogview.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, QWidget *parent = nullptr); ~SetupDialog(); void init(const QString &_softwareVersion, const int _page=0, const bool _alreadyConfigured = true); void setData(const QString &_softwareVersion, const int _page = 0, const bool _alreadyConfigured=true); void setClubLogActive(const bool _b); //void setQRZCOMAutoCheckActive(const bool _b); void checkIfNewBandOrMode(); void setLogLevel(const DebugLogLevel _sev); void loadDarkMode(); // Reads the config to setup the DarkMode 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 darkModeChanged(bool darkMode); // Signal to notify other widgets //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 slotDarkModeChanged(const bool _dm); //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 saveSettings(); bool loadSettings(); void createIcons(); //bool processConfigLine(const QString &_line); void setDefaults(); void readActiveBands (const QStringList &actives); void readActiveModes (const QStringList &actives); bool isValidBand (const QString &b); bool isValidMode (const QString &b); QString checkAndFixASCIIinADIF(const QString &_data); bool haveAtleastOneLog(); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); 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, *closeButton; 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 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 logLevel; // Manages as syslog, the severity of the application debug log }; #endif // SETUPDIALOG_H klog-2.4.1/downloadcty.h0000644000175000017500000000602215003153303014123 0ustar develdevel#ifndef KLOG_DOWNLOADCTY_H #define KLOG_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-2.4.1/awarddxmarathon.h0000644000175000017500000000444315003153303014765 0ustar develdevel#ifndef KLOG_AWARDDXMARATHON_H #define KLOG_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-2.4.1/lotwutilities.cpp0000644000175000017500000006320215003153303015053 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 "callsign.h" #include #include #include #include //#include LoTWUtilities::LoTWUtilities(const QString &_klogDir, const QString &_klogVersion, const QString &_parentFunction, DataProxy_SQLite *dp) { Q_UNUSED(_parentFunction); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _klogDir << " - " << _parentFunction; #else #endif dataProxy = dp; calendar = new QCalendarWidget; 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() << Q_FUNC_INFO << ": - END" ; } LoTWUtilities::~LoTWUtilities() { delete(file); delete(pDialog); delete(calendar); delete(manager); //qDebug() << Q_FUNC_INFO << " - END" ; } void LoTWUtilities::slotCalendarDateSelected(const QDate _d) { //qDebug() << Q_FUNC_INFO << ": " << _d.toString("yyyyMMdd") ; firstDate = _d; startThefullDownload(); } void LoTWUtilities::setFileName(const QString &_fn) { //qDebug() << Q_FUNC_INFO << ": " << _fn ; if (_fn.length()>0) { fileName = _fn; } //qDebug() << Q_FUNC_INFO << ": - END" ; } QString LoTWUtilities::getFileName() { //qDebug() Q_FUNC_INFO << ": " << fileName ; return fileName; } bool LoTWUtilities::selectQuery(const int _queryId) { //qDebug() << Q_FUNC_INFO << ": - Start: " << QString::number(_queryId); 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() << Q_FUNC_INFO << ": - 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() << Q_FUNC_INFO << ": - END" << QT_ENDL; return true; } bool LoTWUtilities::setStationCallSign(const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; Callsign callsign(_call); if (!callsign.isValid()) { //qDebug() << Q_FUNC_INFO << ": FALSE 1" ; return false; } if (((dataProxy->getStationCallSignsFromLog(-1)).contains(_call))) { //qDebug() << Q_FUNC_INFO << ": TRUE" ; stationCallsign = _call; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << Q_FUNC_INFO << ": Date: " << startDate ; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << Q_FUNC_INFO << ": StartDate" << startDate ; } else { startDate.clear(); //qDebug() << Q_FUNC_INFO << ": StartDate not valid Date"; //qDebug() << Q_FUNC_INFO << "False 2 - END"; return false; } //qDebug() << Q_FUNC_INFO << ": startDate: " << startDate ; //qDebug() << Q_FUNC_INFO << "True 1 - END"; return true; } else if (dataProxy->getHowManyQSOInLog(-1) <1) { //qDebug() << Q_FUNC_INFO << ": TRUE Empty log" ; stationCallsign = _call; //qDebug() << Q_FUNC_INFO << "True 2 - END"; return true; } else { //qDebug() << Q_FUNC_INFO << ": Not a single QSO in the log with that StationCallsign: " << stationCallsign ; 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() << Q_FUNC_INFO << ": FALSE 2" ; //qDebug() << Q_FUNC_INFO << "FALSE 3 - END"; return false; } } } void LoTWUtilities::startRequest(QUrl url) { //qDebug() << Q_FUNC_INFO << ": " << url.toString() ; 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() << Q_FUNC_INFO << ": - 10" ; // 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() << Q_FUNC_INFO << ": - END"; } int LoTWUtilities::download() { //qDebug() << Q_FUNC_INFO << ": - Start"; if (!selectQuery(-1)) { //qDebug() << Q_FUNC_INFO << ": - END-1"; return -1; } //qDebug() << Q_FUNC_INFO << ": - 10"; QFileInfo fileInfo(url.path()); //qDebug() << Q_FUNC_INFO << ": - 11"; if (QFile::exists(fileName)) { //qDebug() << Q_FUNC_INFO << ": - 12"; 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() << Q_FUNC_INFO << ": - 13"; if (ret == QMessageBox::No) { //qDebug() <isOpen()) { //qDebug() << Q_FUNC_INFO << ": - 21 Filename: -"; file->setFileName(fileName); //qDebug() << Q_FUNC_INFO << ": - 22 Filename: -"; } //qDebug() << Q_FUNC_INFO << ": - 23 Filename: -"; 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() << Q_FUNC_INFO << ": - END - 3"; return -3; } //qDebug() << Q_FUNC_INFO << ": - 30"; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << Q_FUNC_INFO << ": - 31"; //progressDialog = new QProgressDialog(nullptr); //qDebug() << Q_FUNC_INFO << ": - 40"; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << Q_FUNC_INFO << ": - 41"; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << Q_FUNC_INFO << ": - 42"; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << Q_FUNC_INFO << ": - 43"; pDialog->reset(); //qDebug() << Q_FUNC_INFO << ": - 44"; pDialog->setRange(0, 0); //qDebug() << Q_FUNC_INFO << ": - 45"; pDialog->setMinimumDuration(0); //qDebug() << Q_FUNC_INFO << ": - 46"; pDialog->show(); //qDebug() << Q_FUNC_INFO << ": - 47"; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << Q_FUNC_INFO << ": - 50"; startRequest(url); //qDebug() << "LoTWUtilities::download - END"; return 1; } int LoTWUtilities::fullDownload() { //qDebug() << Q_FUNC_INFO << " - Start"; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << Q_FUNC_INFO << ": Date: " << startDate ; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << Q_FUNC_INFO << ": StartDate" << startDate ; } 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() << Q_FUNC_INFO << ": - Yes"; firstDate = date; startThefullDownload(); return 1; } calendar->setSelectedDate(firstDate); calendar->setGridVisible(true); calendar->setMaximumDate(QDate::currentDate()); calendar->show(); //qDebug() << Q_FUNC_INFO << ": - END"; return 2; } int LoTWUtilities::startThefullDownload() { //qDebug() << Q_FUNC_INFO << ": - Start"; if (calendar->isVisible()) { calendar->close(); } if (!selectQuery(2)) { //qDebug() << Q_FUNC_INFO << ": - END-1"; return -1; } //qDebug() << Q_FUNC_INFO << ": : - 10"; QFileInfo fileInfo(url.path()); //qDebug() << Q_FUNC_INFO << ": : - 11"; if (QFile::exists(fileName)) { //qDebug() << Q_FUNC_INFO << ": : - 12"; 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() << Q_FUNC_INFO << ": : - 13"; if (ret == QMessageBox::No) { //qDebug() << Q_FUNC_INFO << ": - END- 2"; return -2; } } //qDebug() << Q_FUNC_INFO << ": : - 20 Filename: -" << fileName << "-"; if (!file->isOpen()) { //qDebug() << Q_FUNC_INFO << ": : - 21 Filename: -"; file->setFileName(fileName); //qDebug() << Q_FUNC_INFO << ": : - 22 Filename: -"; } //qDebug() << Q_FUNC_INFO << ": : - 23 Filename: -"; 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() << Q_FUNC_INFO << ": - END - 3"; return -3; } //qDebug() << Q_FUNC_INFO << ": : - 30"; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << Q_FUNC_INFO << ": : - 31"; //progressDialog = new QProgressDialog(nullptr); //qDebug() << Q_FUNC_INFO << ": : - 40"; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << Q_FUNC_INFO << ": : - 41"; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << Q_FUNC_INFO << ": : - 42"; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << Q_FUNC_INFO << ": : - 43"; pDialog->reset(); //qDebug() << Q_FUNC_INFO << ": : - 44"; pDialog->setRange(0, 0); //qDebug() << Q_FUNC_INFO << ": : - 45"; pDialog->setMinimumDuration(0); //qDebug() << Q_FUNC_INFO << ": : - 46"; pDialog->show(); //qDebug() << Q_FUNC_INFO << ": : - 47"; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << Q_FUNC_INFO << ": : - 50"; startRequest(url); //qDebug() << Q_FUNC_INFO << ": - END"; return 1; } void LoTWUtilities::slotDownloadProgress(qint64 bytesRead) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(bytesRead); if (downloadAborted) { //qDebug() << Q_FUNC_INFO << ": CANCELLED"; return; } pDialog->setValue(bytesRead); //qDebug() << Q_FUNC_INFO << ": - END "; } void LoTWUtilities::slotReadyRead() { //qDebug() << Q_FUNC_INFO << ": " << reply->readLine(); if (file) { file->write(reply->readAll()); } //qDebug() << Q_FUNC_INFO << ": - END"; } void LoTWUtilities::slotFinished() { //qDebug() << Q_FUNC_INFO << ": - Started"; // when canceled if (downloadAborted) { if (file) { file->close(); file->remove(); //delete file; //file = nullptr; } //reply->deleteLater(); pDialog->cancel(); reply->close(); //qDebug() << Q_FUNC_INFO << ": - END Canceled"; return; } //qDebug() << Q_FUNC_INFO << ": - 10"; // download finished normally pDialog->cancel(); //qDebug() << Q_FUNC_INFO << ": - 11"; file->flush(); //qDebug() << Q_FUNC_INFO << ": - 12"; file->close(); //qDebug() << Q_FUNC_INFO << ": - 13"; // get redirection url QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); //qDebug() << Q_FUNC_INFO << ": - 14"; 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() << Q_FUNC_INFO << ": - Redirection"; 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() << Q_FUNC_INFO << ": - END-1"; return; } } else { //qDebug() << Q_FUNC_INFO << ": : " ; } //qDebug() << "LoTWUtilities::slotReadyRead - Going to parse ..."; parseDownloadedFile(file->fileName()); //qDebug() << "LoTWUtilities::slotReadyRead - END"; } void LoTWUtilities::slotCancelDownload() { //qDebug() << Q_FUNC_INFO << ": - Start"; downloadAborted = true; reply->abort(); //qDebug() << Q_FUNC_INFO << ": - END"; } void LoTWUtilities::setUser(const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; lotwUser = _call; //qDebug() << Q_FUNC_INFO << ": END"; } void LoTWUtilities::setPass(const QString &_pass) { //qDebug() << Q_FUNC_INFO << ": " << _pass; lotwPassword = _pass; //qDebug() << Q_FUNC_INFO << ": END"; } bool LoTWUtilities::getIsReady() { //qDebug() << Q_FUNC_INFO << ": user/station: -" << lotwUser <<"/" << stationCallsign << "-"; if ((lotwUser.length()>1) && (stationCallsign.length()>1)) { //qDebug() << Q_FUNC_INFO << ": true"; return true; } else { //qDebug() << Q_FUNC_INFO << ": false"; return false; } } void LoTWUtilities::parseDownloadedFile(const QString &_fn) { //qDebug() << Q_FUNC_INFO << ": " << _fn; QString _fileName = _fn; QMessageBox msgBox; QString aux; QFile file( _fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << ": File not found" << _fileName; 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() <")) { //qDebug() << Q_FUNC_INFO << ": EOH found"; hasHeader = true; } //else if (lineU.contains("LOTW")) //{ // //qDebug() << Q_FUNC_INFO << ": ProgramID found"; // hasProgramID = true; //} //else if (lineU.contains(Lotw_owncall)) //{ // //qDebug() << Q_FUNC_INFO << ": OWNCALL found"; // hasOwnCall = true; //} else if (lineU.contains("', QT_SKIP); numQSO = (data.at(1)).toInt(); //qDebug() << Q_FUNC_INFO << ": QSOs: " << QString::number(numQSO); } 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() << Q_FUNC_INFO << ": Header not found" << _fileName; 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() << Q_FUNC_INFO << ": END-2"; 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() << Q_FUNC_INFO << ": END-2"; 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" ; } /*void LoTWUtilities::showMessage(const int _messageIcon, const QString &_msg, const QString &_msgExt) { } */ klog-2.4.1/fileawardmanager.cpp0000644000175000017500000002353215003153303015425 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) { Q_UNUSED(_parentFunction); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); world = new World(dataProxy, Q_FUNC_INFO); } FileAwardManager::~FileAwardManager() { //delete(dataProxy); delete(util); delete(world); } bool FileAwardManager::importNewAwardFile() { //qDebug() << Q_FUNC_INFO << " - " ; QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << Q_FUNC_INFO << " - - file: " << fileName ; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - File not found" << fileName; 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() << Q_FUNC_INFO << " - File opened"; } 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() << Q_FUNC_INFO << " - : First read, counting and looking for errors: " << line; line = file.readLine().trimmed().toUpper(); //qDebug() << Q_FUNC_INFO << " - : " << line; number = number + line.count("EOR>"); if ((line.count("")>0) ) { hasEOH = true; } //qDebug() << " //FileAwardManager::importNewAwardFile in the while, end of loop" ; } //qDebug() << Q_FUNC_INFO << " - : While finished " ; 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() << Q_FUNC_INFO << " - : Reading header: " << aux; 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() << Q_FUNC_INFO << " - : Invalid AWA field found HEADER" << adifField.at(0); } } aux.clear(); } } else { // NOT in EOH // Read line, MODIFY AWARD //qDebug() << Q_FUNC_INFO << " - : Parsing : " << line; foreach (aux, fields) { aux = aux.trimmed(); aux = "<" + aux; QStringList adifField; adifField.clear(); adifField << util->getValidADIFFieldAndData(aux); //qDebug() << Q_FUNC_INFO << " - : Length: " << QString::number(adifField.count()); if (adifField.count()==2) { //qDebug() << Q_FUNC_INFO << " - : Parsing : (" << adifField.at(0) << "/" << adifField.at(1) << ")"; 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() << Q_FUNC_INFO << " - : EOR FOUND!\nLet's add the reference."; 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() << Q_FUNC_INFO << " - : Invalid AWA field found in BODY" << adifField.at(0); } } } } } return false; } void FileAwardManager::showError(const QString &_header, const QString &_msg, const QString &_detailedMsg) { //qDebug() << "FileAwardManager::showError: " << _msg; 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-2.4.1/locator.h0000644000175000017500000000743715003153303013252 0ustar develdevel#ifndef KLOG_LOCATOR_H #define KLOG_LOCATOR_H /*************************************************************************** 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 . * * * *****************************************************************************/ #include #include #include #include "klogdefinitions.h" 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(const QString &tlocator, QObject *parent = nullptr); ~Locator(); bool isValidLocator(const QString& tlocator); double getLat(const QString& tlocator); double getLon(const QString& tlocator); QString getLocator(const double lon1, const double lat1, int length=6) const; //IN80aa is the default length 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); Coordinate getLocatorCoordinate(const QString _tlocator); Coordinate getLocatorCorner (const QString& tlocator, bool northWest = true); //northWest = returns the Noth West corner, false implies South East bool checkCoords(const double lon1, const double lat1); QStringList getAll(int _length = 4); // Returns the list of All locators of the requested size, 4 as default QStringList getShortLocators(const QStringList &locators, const int _length=4); 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-2.4.1/utilities.cpp0000644000175000017500000015210115003153303014142 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 "utilities.h" #include "callsign.h" #include //bool c; Utilities::Utilities(const QString &_parentName) { //qDebug() << Q_FUNC_INFO << " - Start"; parentName = _parentName; //qDebug() << Q_FUNC_INFO << " (" << _parentName << ")"; init(); //qDebug() << Q_FUNC_INFO << " - END"; } Utilities::~Utilities(){} void Utilities::init() { //qDebug() << Q_FUNC_INFO << " - Start"; validateCalls = false; softwareVersion = "0.0"; //darkMode = false; logLevel = None; setARRLSect(); setContinent(); setSponsorsList(); logLevels.clear(); logLevels << "None" << "Info" << "Debug" << "Devel"; setLogColumnNames(); //qDebug() << Q_FUNC_INFO << " - END"; } void Utilities::InitializeHash() { ADIFHash = { {"ADDRESS", "MultiLineString"}, {"AGE", "Number"}, {"ALTITUDE", "Number"}, {"ANT_AZ", "Number"}, {"ANT_EL", "Number"}, {"ANT_PATH", "Enumeration"}, {"ARRL_SECT", "Enumeration"}, {"AWARD_SUBMITTED", "SponsoredAwardList"}, {"AWARD_GRANTED", "SponsoredAwardList"}, {"A_INDEX", "Number"}, {"BAND", "Enumeration"}, {"BAND_RX", "Enumeration"}, {"CALL", "String"}, {"CHECK", "String"}, {"CLASS", "String"}, {"CLUBLOG_QSO_UPLOAD_DATE", "Date"}, {"CLUBLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"CNTY", "Enumeration"}, {"COMMENT", "String"}, {"CONT", "Enumeration"}, {"CONTACTED_OP", "String"}, {"CONTEST_ID", "String"}, {"COUNTRY", "String"}, {"CQZ", "PositiveInteger"}, {"CREDIT_SUBMITTED", "CreditList"}, {"CREDIT_GRANTED", "CreditList"}, {"DARC_DOK", "Enumeration"}, {"DISTANCE", "Number"}, {"DXCC", "Enumeration"}, {"EMAIL", "String"}, {"EQ_CALL", "String"}, {"EQSL_QSLRDATE", "Date"}, {"EQSL_QSLSDATE", "Date"}, {"EQSL_QSL_RCVD", "Enumeration"}, {"EQSL_QSL_SENT", "Enumeration"}, {"FISTS", "PositiveInteger"}, {"FISTS_CC", "PositiveInteger"}, {"FORCE_INIT", "Boolean"}, {"FREQ", "Number"}, {"FREQ_RX", "Number"}, {"GRIDSQUARE", "GridSquare"}, {"GRIDSQUARE_EXT", "GridSquareExt"}, {"GUEST_OP", "String"}, {"HAMLOGEU_QSO_UPLOAD_DATE", "Date"}, {"HAMLOGEU_UPLOAD_STATUS", "Enumeration"}, {"HAMQTH_QSO_UPLOAD_DATE", "Date"}, {"HAMQTH_UPLOAD_STATUS", "Enumeration"}, {"HRDLOG_QSO_UPLOAD_DATE", "Date"}, {"HRDLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"IOTA", "IOTARefNo"}, {"IOTA_ISLAND_ID", "PositiveInteger"}, {"ITUZ", "PositiveInteger"}, {"K_INDEX", "Integer"}, {"LAT", "Location"}, {"LON", "Location"}, {"LOTW_QSLRDATE", "Date"}, {"LOTW_QSLSDATE", "Date"}, {"LOTW_QSL_RCVD", "Enumeration"}, {"LOTW_QSL_SENT", "Enumeration"}, {"MAX_BURSTS", "Number"}, {"MODE", "Enumeration"}, {"MS_SHOWER", "String"}, {"MY_ALTITUDE", "Number"}, {"MY_ANTENNA", "String"}, {"MY_ARRL_SECT", "Enumeration"}, {"MY_CITY", "String"}, {"MY_CNTY", "Enumeration"}, {"MY_COUNTRY", "String"}, {"MY_CQ_ZONE", "PositiveInteger"}, {"MY_DXCC", "Enumeration"}, {"MY_FISTS", "PositiveInteger"}, {"MY_GRIDSQUARE", "GridSquare"}, {"MY_GRIDSQUARE_EXT", "GridSquareExt"}, {"MY_IOTA", "IOTARefNo"}, {"MY_IOTA_ISLAND_ID", "PositiveInteger"}, {"MY_ITU_ZONE", "PositiveInteger"}, {"MY_LAT", "Location"}, {"MY_LON", "Location"}, {"MY_NAME", "String"}, {"MY_POSTAL_CODE", "String"}, {"MY_POTA_REF", "POTARef"}, {"MY_RIG", "String"}, {"MY_SIG", "String"}, {"MY_SIG_INFO", "String"}, {"MY_SOTA_REF", "SOTARef"}, {"MY_STATE", "Enumeration"}, {"MY_STREET", "String"}, {"MY_USACA_COUNTIES", "SecondarySubdivisionList"}, {"MY_VUCC_GRIDS", "GridSquareList"}, {"MY_WWFF_REF", "WWFFRef"}, {"NAME", "String"}, {"NOTES", "MultilineString"}, {"NR_BURSTS", "Integer"}, {"NR_PINGS", "Integer"}, {"OPERATOR", "String"}, {"OWNER_CALLSIGN", "String"}, {"PFX", "String"}, {"POTA_REF", "POTARef"}, {"PRECEDENCE", "String"}, {"PROP_MODE", "Enumeration"}, {"PUBLIC_KEY", "String"}, {"QRZCOM_QSO_UPLOAD_DATE", "Date"}, {"QRZCOM_QSO_UPLOAD_STATUS", "Enumeration"}, {"QSLMSG", "MultilineString"}, {"QSLRDATE", "Date"}, {"QSLSDATE", "Date"}, {"QSL_RCVD", "Enumeration"}, {"QSL_RCVD_VIA", "Enumeration"}, {"QSL_SENT", "Enumeration"}, {"QSL_SENT_VIA", "Enumeration"}, {"QSL_VIA", "String"}, {"QSO_COMPLETE", "Enumeration"}, {"QSO_DATE", "Date"}, {"QSO_DATE_OFF", "Date"}, {"QSO_RANDOM", "Boolean"}, {"QTH", "String"}, {"REGION", "Enumeration"}, {"RIG", "MultilineString"}, {"RST_RCVD", "String"}, {"RST_SENT", "String"}, {"RX_PWR", "Number"}, {"SAT_MODE", "String"}, {"SAT_NAME", "String"}, {"SFI", "Integer"}, {"SIG", "String"}, {"SIG_INFO", "String"}, {"SILENT_KEY", "Boolean"}, {"SKCC", "String"}, {"SOTA_REF", "SOTARef"}, {"SRX", "Integer"}, {"SRX_STRING", "String"}, {"STATE", "Enumeration"}, {"STATION_CALLSIGN", "String"}, {"STX", "Integer"}, {"STX_STRING", "String"}, {"SUBMODE", "String"}, {"SWL", "Boolean"}, {"TEN_TEN", "PositiveInteger"}, {"TIME_OFF", "Time"}, {"TIME_ON", "Time"}, {"TX_PWR", "Number"}, {"UKSMG", "PositiveInteger"}, {"USACA_COUNTIES", "SecondarySubdivisionList"}, {"VE_PROV", "String"}, {"VUCC_GRIDS", "GridSquareList"}, {"WEB", "String"}, {"WWFF_REF", "WWFFRef"}, {"APP_LOTW_RXQSL", "Date"}, {"APP_LOTW_RXQSO", "Date"}, {"APP_LOTW_QSO_TIMESTAMP", "Date"} }; return; } void Utilities::setLogLevel(DebugLogLevel _l) { logLevel = _l; } void Utilities::setARRLSect() { ARRL_sects.clear (); //QStringList fonts = { "Arial", "Helvetica", "Times" } QStringList preARRL_sects = {"AL", "AK", "AB", "AR", "AZ", "BC", "CO", "CT", "DE", "EB", "EMA", "ENY", "EPA", "EWA" "GA", "GTA", "ID", "IL", "IN", "IA", "KS", "KY", "LAX", "LA", "ME", "MB", "MAR", "MDC", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NM", "NLI", "NL", "NC", "ND", "NTX", "NFL", "NNJ", "NNY", "NT", "NWT", "OH", "OK", "ON", "ONE", "ONN", "ONS", "ORG", "OR", "PAC", "PR", "QC", "RI", "SV", "SDG", "SF", "SJV", "SB", "SCV", "SK", "SC", "SD", "STX", "SFL", "SNJ", "TN", "VI", "UT", "VT", "VA", "WCF", "WTX", "WV", "WMA", "WNY", "WPA", "WWA", "WI", "WY"}; ARRL_sects = preARRL_sects; } void Utilities::setContinent() { continent = QStringList(); QStringList continentList = {"NA", "SA", "EU", "AF", "OC", "AS", "AN"}; continent = continentList; } void Utilities::setSponsorsList() { sponsorsList.clear (); QStringList preSponsorsList = {"ADIF_", "ARI_", "ARRL_", "CQ_", "DARC_", "EQSL_", "IARU_", "JARL_", "RSGB_", "TAG_", "WABAG_"}; sponsorsList = preSponsorsList; } 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() << Q_FUNC_INFO << ": " << QString::number(totalSteps); 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'; return 'N'; } QString Utilities::boolToQString(const bool _b) { if (_b) return "True"; return "False"; } bool Utilities::QStringToBool(const QString &_s) { //qDebug() << Q_FUNC_INFO << ": " << _s; if (_s.toUpper() == "Y") return true; return false; //return ((_s.toUpper()) == "Y"); } QString Utilities::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data ; //TODO This function should be moved to the class ADIF // This function is not really working with ASCII but with Unicode 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::getDefaultModeForFreq(const double _f) { //qDebug() << Q_FUNC_INFO << " - Freq: " << QString::number (_f); if (_f<10.0) { if ((_f>=5.0) && (_f<6.0)) return "USB"; return "LSB"; } return "USB"; } QString Utilities::getKLogDefaultDatabaseFile() { //TODO: To be removed when the defaultDir is saved in the config file return getHomeDir() ; } QString Utilities::getDBPath() { //Returns the path (folder level) of the DB QSettings settings(getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); QString dbPath = settings.value ("DBPath").toString (); if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } return dbPath; } QString Utilities::getKLogDBFile() { // Returns the full path to the main DB //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - CFG: " << getCfgFile(); QString dbFile; QString filename = "/logbook.dat"; if (!QFile::exists(getCfgFile ())) return getDBPath() + filename; //qDebug() << Q_FUNC_INFO << " - Config file DOES NOT Exist"; //CRITICAL ERROR TO BE MANAGED, KLOG SHOULD STOP settings.beginGroup ("Misc"); if (!settings.contains("DBPath")) { //qDebug() << Q_FUNC_INFO << " - DBPath DOES NOT Exist, returning default"; return getDBPath() + filename; } dbFile = settings.value("DBPath").toString () + filename; //qDebug() << Q_FUNC_INFO << "DBPath: " << dbFile; if (QFile::exists(dbFile)) return dbFile; //qDebug() << Q_FUNC_INFO << " - DBPath file DOES NOT Exist, returning default"; return getDBPath() + filename; } QString Utilities::getKLogDBBackupFile() { // Returns the full path to the backup DB return getDBPath() + "/" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + "-backup-logbook.dat" ; } 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) { //qDebug() << Q_FUNC_INFO << QString(": %1").arg(_dxcc); if (_dxcc >1000) { //qDebug() << Q_FUNC_INFO << QString(": Special: %1 / Normalized: %2").arg(_dxcc).arg(((QString::number(_dxcc)).last(3)).toInt()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return ((QString::number(_dxcc)).last(3)).toInt(); #else return ((QString::number(_dxcc)).rightRef(3)).toInt(); //To be replaced by .fromString in Qt6.0 #endif } 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; } /* QString Utilities::getCheckedComplexCall(const QString &_c) { // Normalices calls //qDebug() << Q_FUNC_INFO << " - Start: " << _c; QString call = _c; if (call.isNull()) return QString(); call.replace('\\', '/'); if (call=="/") return QString(); QStringList parts; parts.clear(); parts << call.split('/'); if (parts.count()<2) { return call; } if ((parts.at(0)).isNull()) { call = parts.at(1); } else if ((parts.at(1)).isNull()) { call = parts.at(0); } else { call = parts.at(0) + "/" + parts.at(1); } //qDebug() << Q_FUNC_INFO << " - END: " << call; return call; } */ QString Utilities::getMainCallFromComplexCall(const QString &_complexCall) { //TODO: To be replaced by QString Callsign::getHostFullPrefix(bool getHomeIfEmpty=true); // Return the part of the call that provides entity and prefix information: // EA4K/F => F // VK9/EA4K => VK9 // EA4K/MM => EA4K // MM/EA4K => MM Callsign calls(_complexCall); if (calls.isValid()) return calls.getHostFullPrefix(); if (calls.isValidPrefix()) return calls.getHostFullPrefix(); return QString(); } int Utilities::getAreaNumberFromCall(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; QString withAreaNumberPref = getPrefixFromCall(_c, true); QString withOutAreaNumberPref = getPrefixFromCall(_c, false); //qDebug() << Q_FUNC_INFO << ": With Area: " << withAreaNumberPref; //qDebug() << Q_FUNC_INFO << ": WithOut Area: " << withOutAreaNumberPref; QString areaString = withAreaNumberPref.remove(withOutAreaNumberPref); //qDebug() << Q_FUNC_INFO << ": Area Number: " << areaString; bool ok = false; int areaNumber = areaString.toInt(&ok, 10); if (ok) return areaNumber; return -1; } QString Utilities::getPrefixFromCall(const QString &_c, bool withAreaNumber) { //qDebug() << Q_FUNC_INFO << ": " << _c << " - WithAreaNumber=" << boolToQString(withAreaNumber); Callsign _callsign(_c); if (!_callsign.isValid() && !_callsign.isValidPrefix()) { //qDebug() << Q_FUNC_INFO << " - 020"; return QString(); } if (withAreaNumber) return _callsign.getHostFullPrefix(); else return _callsign.getHostPrefix(); } bool Utilities::isSameFreq(const double fr1, const double fr2) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << QString::number(fr1) << "/" << QString::number(fr2) << " = " << QString::number(fabs(fr1 - fr2)) ; if (fabs(fr1 - fr2) < 0.00001) // 10 Hz { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - true" ; return true; } else { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - 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) { return (_m>0); } bool Utilities::isValidFreq(const QString &_b) { return (_b.toDouble()>0); } bool Utilities::isValidGrid(const QString &_b) { Locator locator; return locator.isValidLocator(_b); } bool Utilities::isValidGrid_ext(const QString &_b) {// TODO: Implement the checks // https://www.adif.org/314/ADIF_314.htm#QSO_Field_GRIDSQUARE_EXT QString testLocator = _b.toUpper(); QRegularExpression rx; rx.setPattern("^([A-X][A-X])([0-9][0-9])?$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << Q_FUNC_INFO << ": " << testLocator; return true; } return false; } bool Utilities::isValidVUCCGrids(const QString &_b) { //qDebug() << Q_FUNC_INFO << ": " << _b; if(_b.endsWith (',')) return false; //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << _b; QStringList tmp; //QString a = _b; tmp.clear (); tmp << _b.split (',', QT_SKIP); //qDebug() << Q_FUNC_INFO << ": 10"; if ((tmp.length () !=2) && (tmp.length () !=4) ) { //qDebug() << Q_FUNC_INFO << ": 11 - not valid lenght"; return false; } //qDebug() << Q_FUNC_INFO << ": 20"; QString aux; foreach (aux, tmp) { aux = aux.trimmed (); //if ((!isValidGrid (aux)) || (aux.length ()!=4)) if (!isValidGrid (aux)) { //qDebug() << Q_FUNC_INFO << ": 30 - non valid: " << aux; return false; } else { //qDebug() << Q_FUNC_INFO << ": 31 - valid"; } } //qDebug() << Q_FUNC_INFO << ": 100 - VALID END"; return true; } bool Utilities::isValidRST(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidPower(const QString &_b) { return (_b.toDouble()>0); } bool Utilities::isValidComment(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidName(const QString &_b) { return (_b.length()>0); } bool Utilities::fileExists(const QString &_fileName) { //qDebug() << Q_FUNC_INFO << _file ; return (QFile::exists(_fileName)); } 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) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "I") || (c == "V")); } bool Utilities::isValidQSL_Sent(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "Q") || (c == "I")); } bool Utilities::isValidUpload_Status(const QString &c) { //qDebug() << Q_FUNC_INFO << " - " << c; return ((c == "Y") || (c == "N") || (c == "M")); } 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;ield = 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; } bool Utilities::areThoseListsTheSame(const QStringList &_list1, const QStringList &_list2) { //qDebug() << Q_FUNC_INFO << " - Start"; // If the lists don't have the same number of items are not the same. if (_list1.size() != _list2.size()) return false; // Let's order the lists and compare their elements QStringList _first, _second; _first.clear(); _first << _list1; _first.sort(Qt::CaseInsensitive); _second.clear(); _second << _list2; _second.sort(Qt::CaseInsensitive); for (int i=0;i<_first.count();i++) { //qDebug() << Q_FUNC_INFO << ": " << _first.at(i) << "/" << _second.at(i); if (_first.at(i) != _second.at(i)) return false; } //qDebug() << Q_FUNC_INFO << " - END true"; return true; } QString Utilities::getAValidCall (const QString &_wrongCall) { //qDebug() << "Utilities::getAValidCall: " << _wrongCall ; QString _confirmedCall; // Check if the provided call is empty or invalid if (_wrongCall.isEmpty()) { _confirmedCall = QObject::tr("An empty callsign has been detected. If it is possible, please enter the right call."); } else { _confirmedCall = 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); } // Prompt the user to enter a valid callsign bool ok; QString text = QInputDialog::getText(nullptr, QObject::tr("KLog - Not valid callsign found"), _confirmedCall, QLineEdit::Normal, _wrongCall, &ok); // Validate the entered callsign Callsign callsign(text); if (ok && callsign.isValid()) { _confirmedCall = text; } else { _confirmedCall.clear(); } 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 return (((_d > 0) && (_d < 523)) || (_d == 1206) || (_d == 1279) || (_d == 1248) || (_d == 2248) || (_d == 1259) || (_d == 1390)); } bool Utilities::isValidAntPath(const QString &_s) { // MOVE IT TO ADIF return ((_s == "G") || (_s == "O") || (_s == "S") || (_s == "L")); } bool Utilities::isValidARRLSect(const QString &_s) { return (ARRL_sects.contains (_s.toUpper ())); } 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) { return getADIFDateFromQDate(_d.date()); } QString Utilities::getADIFDateFromQDate(const QDate &_d) { if (!_d.isValid()) { return QString(); } else { return _d.toString("yyyyMMdd"); } } QString Utilities::getADIFTimeFromQDateTime(const QDateTime &_d) { return getADIFTimeFromQTime(_d.time()); } QString Utilities::getADIFTimeFromQTime(const QTime &_d) { if (!_d.isValid()) { return QString(); } else { if (_d.second() == 0) return _d.toString("hhmm"); return _d.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::getQSO_CompleteFromADIF(const QString &_s) { // Receives a valid QSO_COMPLETE ADIF data and returns // one char to be stored in the data base. // Default value is Y //Parece que falla al guardar este campo que no se traduce a un varchar(1) //qDebug() << Q_FUNC_INFO << ": " << _s; Adif adif(Q_FUNC_INFO); if (!adif.isValidQSO_COMPLETE(_s)) { //qDebug() << Q_FUNC_INFO << " No valid"; return "1"; } if (_s == "N") { return "2"; } else if (_s == "NIL") { return "3"; } else if (_s == "?") { return "4"; } else { return "1"; } } QString Utilities::getADIFQSO_CompleteFromDB(const QString &_s) {// Returns the ADIF QSO_COMPLETE //1=Y, 2=N, 3=NIL, 4=? //qDebug() << Q_FUNC_INFO << ": " << _s; int i = _s.toInt(); switch (i) { case 2: { return "N"; } case 3: { return "NIL"; } case 4: { return "?"; } default: { return "Y"; } } } 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 ('\''); } //void Utilities::setDarkMode(const QString &_dm) //{ // darkMode = trueOrFalse(_dm); //} //bool Utilities::isDarkMode() //{ // return darkMode; //} void Utilities::setLogColumnNames() { // QMap columnNames; //columnNames.insert("", QObject::tr("")); columnNames.insert("altitude", QObject::tr("Altitude")); columnNames.insert("qso_date", QObject::tr("Date")); columnNames.insert("call", QObject::tr("Call")); columnNames.insert("rst_sent", QObject::tr("RSTtx")); columnNames.insert("rst_rcvd", QObject::tr("RSTrx")); columnNames.insert("bandid", QObject::tr("Band")); columnNames.insert("comment", QObject::tr("Comment")); columnNames.insert("modeid", QObject::tr("Mode")); columnNames.insert("cqz", QObject::tr("CQz")); columnNames.insert("ituz", QObject::tr("ITUz")); columnNames.insert("dxcc", QObject::tr("DXCC")); columnNames.insert("address", QObject::tr("Address")); columnNames.insert("age", QObject::tr("Age")); columnNames.insert("cnty", QObject::tr("County")); columnNames.insert("a_index", QObject::tr("A_Index")); columnNames.insert("ant_az", QObject::tr("Ant_Az")); columnNames.insert("ant_el", QObject::tr("Ant_El")); columnNames.insert("ant_path", QObject::tr("Ant_Path")); columnNames.insert("arrl_sect", QObject::tr("ARRL_SECT")); columnNames.insert("award_submitted", QObject::tr("Award_Submitted")); columnNames.insert("award_granted", QObject::tr("Award_granted")); columnNames.insert("band_rx", QObject::tr("Band_RX")); columnNames.insert("checkcontest", QObject::tr("CheckContest")); columnNames.insert("class", QObject::tr("Class")); columnNames.insert("clublog_qso_upload_date", QObject::tr("ClubLog SDate", "Date when it was sent")); columnNames.insert("clublog_qso_upload_status", QObject::tr("ClubLog status")); columnNames.insert("cont", QObject::tr("Continent")); columnNames.insert("contacted_op", QObject::tr("Contacted_Op")); columnNames.insert("contest_id", QObject::tr("Contest Id")); columnNames.insert("country", QObject::tr("Country")); columnNames.insert("credit_submitted", QObject::tr("Credit Submitted")); columnNames.insert("credit_granted", QObject::tr("Credit granted")); columnNames.insert("darc_dok", QObject::tr("Darc Dok", "Do not translate if unsure, common hamradio term.")); columnNames.insert("distance", QObject::tr("Distance")); columnNames.insert("email", QObject::tr("Email")); columnNames.insert("eq_call", QObject::tr("EQ_Call")); columnNames.insert("eqsl_qslrdate", QObject::tr("eQSL RDate")); columnNames.insert("eqsl_qslsdate", QObject::tr("eQSL SDate", "Date when it was sent")); columnNames.insert("eqsl_qsl_rcvd", QObject::tr("eQSL Rcvd")); columnNames.insert("eqsl_qsl_sent", QObject::tr("eQSL Sent")); columnNames.insert("fists", QObject::tr("Fists", "Do not translate if unsure, common hamradio term.")); columnNames.insert("fists_cc", QObject::tr("Fists CC", "Do not translate if unsure, common hamradio term.")); columnNames.insert("force_init", QObject::tr("Force Init")); columnNames.insert("freq", QObject::tr("Freq")); columnNames.insert("freq_rx", QObject::tr("Freq RX")); columnNames.insert("gridsquare", QObject::tr("Gridsquare")); columnNames.insert("gridsquare_ext", QObject::tr("Gridsquare ext", "Extended gridsquare")); columnNames.insert("hamlogeu_qso_upload_status", QObject::tr("HamLog status")); columnNames.insert("hamlogeu_qso_upload_date", QObject::tr("HamLog SDate", "Date when it was sent")); columnNames.insert("hrdlog_qso_upload_date", QObject::tr("HRDLog SDate", "Date when it was sent")); columnNames.insert("hrdlog_qso_upload_status", QObject::tr("HRDLog status")); columnNames.insert("hamqth_qso_upload_status", QObject::tr("HamQTH status")); columnNames.insert("hamqth_qso_upload_date", QObject::tr("HamQTH SDate", "Date when it was sent")); columnNames.insert("iota", QObject::tr("IOTA")); columnNames.insert("iota_island_id", QObject::tr("IOTA Island id")); columnNames.insert("k_index", QObject::tr("K Index")); columnNames.insert("lat", QObject::tr("Lat")); columnNames.insert("lon", QObject::tr("Lon")); columnNames.insert("lotw_qslrdate", QObject::tr("LoTW RDate")); columnNames.insert("lotw_qslsdate", QObject::tr("LoTW SDate", "Date when it was sent")); columnNames.insert("lotw_qsl_rcvd", QObject::tr("LoTW Rcvd")); columnNames.insert("lotw_qsl_sent", QObject::tr("LoTW Sent")); columnNames.insert("marked", QObject::tr("Marcado")); columnNames.insert("max_bursts", QObject::tr("Max Bursts")); columnNames.insert("ms_shower", QObject::tr("MS Shower")); columnNames.insert("my_altitude", QObject::tr("My Altitude")); columnNames.insert("my_antenna", QObject::tr("My Antenna")); columnNames.insert("my_arrl_sect", QObject::tr("My ARRL Sect")); columnNames.insert("my_city", QObject::tr("My City")); columnNames.insert("my_cnty", QObject::tr("My Cnty")); columnNames.insert("my_country", QObject::tr("My Country")); columnNames.insert("my_cq_zone", QObject::tr("My CQz")); columnNames.insert("my_dxcc", QObject::tr("My DXCC")); columnNames.insert("my_fists", QObject::tr("My Fists", "Do not translate if unsure, common hamradio term.")); columnNames.insert("my_gridsquare", QObject::tr("My Gridsquare")); columnNames.insert("my_gridsquare_ext", QObject::tr("My Gridsquare Ext")); columnNames.insert("my_iota", QObject::tr("My IOTA")); columnNames.insert("my_iota_island_id", QObject::tr("My IOTA island id")); columnNames.insert("my_itu_zone", QObject::tr("My ITUz")); columnNames.insert("my_lat", QObject::tr("My Lat")); columnNames.insert("my_lon", QObject::tr("My Lon")); columnNames.insert("my_name", QObject::tr("My Name")); columnNames.insert("my_postal_code", QObject::tr("My Postal code")); columnNames.insert("my_pota_ref", QObject::tr("My POTA")); columnNames.insert("my_rig", QObject::tr("My Rig")); columnNames.insert("my_sig", QObject::tr("My Sig")); columnNames.insert("my_sig_info", QObject::tr("My Sig Info")); columnNames.insert("my_sota_ref", QObject::tr("My SOTA")); columnNames.insert("my_state", QObject::tr("My State")); columnNames.insert("my_street", QObject::tr("My Street")); columnNames.insert("my_usaca_counties", QObject::tr("My USACA counties")); columnNames.insert("my_vucc_grids", QObject::tr("My VUCC grids")); columnNames.insert("my_wwff_ref", QObject::tr("My WWFF")); columnNames.insert("name", QObject::tr("Name")); columnNames.insert("notes", QObject::tr("Notes")); columnNames.insert("nr_bursts", QObject::tr("Nr bursts", "Do not translate if unsure, common hamradio term.")); columnNames.insert("nr_pings", QObject::tr("Nr pings", "Do not translate if unsure, common hamradio term.")); columnNames.insert("operator", QObject::tr("Operator")); columnNames.insert("owner_callsign", QObject::tr("Owner Callsign")); columnNames.insert("pota_ref", QObject::tr("POTA")); columnNames.insert("pfx", QObject::tr("Pfx")); columnNames.insert("precedence", QObject::tr("Precedence")); columnNames.insert("prop_mode", QObject::tr("Prop Mode")); columnNames.insert("public_key", QObject::tr("Public Key")); columnNames.insert("qrzcom_qso_upload_date", QObject::tr("QRZcom SDate")); columnNames.insert("qrzcom_qso_upload_status", QObject::tr("QRZcom status")); columnNames.insert("qslmsg", QObject::tr("QSL msg")); columnNames.insert("qslrdate", QObject::tr("QSL RDate")); columnNames.insert("qslsdate", QObject::tr("QSL SDate")); columnNames.insert("qsl_rcvd", QObject::tr("QSL Rcvd")); columnNames.insert("qsl_sent", QObject::tr("QSL Sent")); columnNames.insert("qsl_rcvd_via", QObject::tr("QSL rcvd via")); columnNames.insert("qsl_sent_via", QObject::tr("QSL sent via")); columnNames.insert("qsl_via", QObject::tr("QSL via")); columnNames.insert("qso_complete", QObject::tr("QSO complete")); columnNames.insert("qso_random", QObject::tr("QSO random")); columnNames.insert("qth", QObject::tr("QTH")); columnNames.insert("region", QObject::tr("Region")); columnNames.insert("rig", QObject::tr("Rig")); columnNames.insert("rx_pwr", QObject::tr("RX Pwr")); columnNames.insert("sat_mode", QObject::tr("Sat mode")); columnNames.insert("sat_name", QObject::tr("Sat name")); columnNames.insert("sfi", QObject::tr("SFI")); columnNames.insert("sig", QObject::tr("Sig")); columnNames.insert("sig_info", QObject::tr("Sig Info")); columnNames.insert("silent_key", QObject::tr("Silent key", "Do not translate if unsure, common hamradio term.")); columnNames.insert("skcc", QObject::tr("SKCC")); columnNames.insert("sota_ref", QObject::tr("SOTA Ref")); columnNames.insert("srx_string", QObject::tr("SRX String")); columnNames.insert("srx", QObject::tr("SRX")); columnNames.insert("stx_string", QObject::tr("STX String")); columnNames.insert("state", QObject::tr("State")); columnNames.insert("station_callsign", QObject::tr("Station Callsign")); columnNames.insert("submode", QObject::tr("Submode")); columnNames.insert("swl", QObject::tr("SWL", "Do not translate if unsure, common hamradio term.")); columnNames.insert("uksmg", QObject::tr("UKSMG")); columnNames.insert("usaca_counties", QObject::tr("USACA counties")); columnNames.insert("ve_prov", QObject::tr("VE prov")); columnNames.insert("vucc_grids", QObject::tr("VUCC grids")); columnNames.insert("ten_ten", QObject::tr("Ten-Ten", "Do not translate, it is a hamradio group name.")); columnNames.insert("tx_pwr", QObject::tr("TX Pwr")); columnNames.insert("web", QObject::tr("Web")); columnNames.insert("wwff_ref", QObject::tr("WWFF")); columnNames.insert("qso_date_off", QObject::tr("QSO Date off")); columnNames.insert("lognumber", QObject::tr("Log number")); } QString Utilities::getLogColumnName(const QString &_column) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << _column; QString aux = columnNames.value(_column); if (aux.length()>0) { return aux; } return _column; } QString Utilities::getLogColumnDBName(const QString &_column) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << _column; QString aux = columnNames.key(_column); if (aux.length()>0) { return aux; } return _column; } bool Utilities::isValidContinent(const QString &_s) { return (continent.contains (_s.toUpper ())); } bool Utilities::isValidPropMode(const QString &_s) { //TODO MOVE IT TO ADIF QStringList propModes; propModes.clear (); propModes << "AS" << "AUE" << "AUR" << "BS" << "ECH" << "EME" << "ES" << "F2" << "FAI" << "GWAVE" << "INTERNET" << "ION" << "IRL" << "LOS" << "MS" << "RPT" << "RS" << "SAT" << "TEP" << "TR"; return propModes.contains (_s.toUpper ()); } bool Utilities::isValidEmail(const QString &_s) { //QRegExp mailREX("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"); QRegularExpression mailREX("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"); mailREX.setPatternOptions(QRegularExpression::CaseInsensitiveOption); //mailREX.setCaseSensitivity(Qt::CaseInsensitive); //mailREX.setPatternSyntax(QRegExp::RegExp) // match two digits followed by a space and a word QRegularExpressionMatch match = mailREX.match(_s); return match.hasMatch(); // true //return mailREX.exactMatch(_s); } //bool Utilities::isValidDistance(const double _d) //{ // return (_d>0); //} bool Utilities::isValidSponsor(const QString &_s) { return (sponsorsList.contains (_s.toUpper ())); } void Utilities::openQrzcom(const QString _call) { QString url = "https://www.qrz.com/lookup/" + _call; QDesktopServices::openUrl(QUrl(url)); } void Utilities::printCommandHelp(){ QTextStream cout(stdout); cout << "Usage: klog [OPTION]...\n"; cout << "Options:\n"; cout << " -? Display this help\n"; cout << " -h Display this help\n"; cout << " -v Display program version\n"; } QString Utilities::debugLevelToString(DebugLogLevel _l) { switch (_l) { case None: return "None"; break; case Info: return "Info"; break; case Debug: return "Debug"; break; case Devel: return "Devel"; break; default: return "Undefined"; break; } } DebugLogLevel Utilities::stringToDebugLevel(const QString &_s) { QString aux; aux = _s.toUpper(); if (aux == "INFO") return Info; else if (aux == "DEBUG") return Debug; else if (aux == "DEVEL") return Devel; else return None; } bool Utilities::isValidLogLevel(const QString &_s) { return logLevels.contains (_s); } QStringList Utilities::getDebugLevels() { return logLevels; } void Utilities::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { emit debugLog (_func, _msg, _level); /* //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << _func << ": " << _level << ": " << _msg; if (logLevel<=_level) { //qDebug() << _func << ": " << _level << ": " << _msg; emit debugLog (_func, _msg, _level); } */ } klog-2.4.1/mainqsoentrywidget.h0000644000175000017500000001425415003153303015537 0ustar develdevel#ifndef KLOG_MAINQSOENTRYWIDGET_H #define KLOG_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 "qso.h" class MainQSOEntryWidget : public QWidget { Q_OBJECT friend class tst_MainWindow; public: explicit MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainQSOEntryWidget(); 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); void setShowSeconds(const bool &t); void setQSOData(QSO _qso); QSO getQSOData(QSO &_qso); QString getQrz(); QString getBand(int _b=-1); QString getMode(int _m=-1); QStringList getModes(); QDate getDate(); QTime getTime(); QDateTime getDateTime(); void setRealTime(const bool _realTime); bool getRealTime(); void setManualMode(const bool _manualMode); bool getManualMode(); void toggleRealTime(); void setUTC(const bool _utc); void setModify(const bool _modify); bool getModifying(); void setUpAndRunning(const bool _u); void selectDefaultBand(bool _init = false); void selectDefaultMode(bool _init = false); void setDuplicatedQSOSlot (const int _secs); void setFocusToOK(); void setLogLevel (const DebugLogLevel _b); void clear(); bool getDarkMode(); 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(QString _func); void bandChanged(QString _band); void modeChanged(QString _mode); void OKClicked(); void validBands(QStringList _bands); void handOverFocusSignal(); void manualModeSignal(bool _active); // Returns if we are in dark mode or not private slots: void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level); void slotUpdateTime(); void slotQRZTextChanged(); void slotBandComboBoxChanged(const QString &_b); void slotModeComboBoxChanged(const QString &_m); void slotOKButtonClicked(); void slotClearButtonClicked(); void slotQRZButtonClicked(); //void slotRealtimeButtonClicked(); void slotCheckBoxClicked(); //void slotRealTimeCheckBoxChanged(); void slotStartDelayInputTimer(); void slotDelayInputTimedOut(); //void slotRealTimeButtonResize(); void slotManualModeCheckBoxClicked(); private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); 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, *QRZButton; QCheckBox *realtimeCheckBox, *manualModeCheckBox; //QPushButton *realtimeButton; //DebugLogLevel logLevel; bool cleaning; bool qrzAutoChanging; bool InValidCharsInPrevCall; bool qrzSmallModDontCalculate; bool upAndRunning; 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; DebugLogLevel logLevel; bool modifyingBands; }; #endif // MAINQSOENTRYWIDGET_H klog-2.4.1/img/0000755000175000017500000000000015003153303012177 5ustar develdevelklog-2.4.1/img/klog_logo.png0000644000175000017500000001076415003153303014671 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-2.4.1/img/klog_512x512.png0000644000175000017500000032151415003153303014656 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-2.4.1/img/klog.ico0000644000175000017500000032473515003153303013645 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-2.4.1/img/play.svg0000644000175000017500000000022715003153303013666 0ustar develdevelklog-2.4.1/img/stop.svg0000644000175000017500000000022715003153303013706 0ustar develdevelklog-2.4.1/img/klog_256x256.png0000644000175000017500000012210615003153303014664 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-2.4.1/img/marker.png0000644000175000017500000000436315003153303014174 0ustar develdevelPNG  IHDR,,y}uiCCPICC profile(}=H@_SůD:dh,8J`Zu0 4$).kŪ "%/)=BTkP5Hcb6*B@CDbH/f9]gys *y>xEAj88Ɗ=hrbKGD pHYs  tIME  6LtEXtCommentCreated with GIMPWIDATx;E 6nu!I//D9e !$D笽ǰ^93V}nU0;buDX)Jb`.P`(CD%,DJ,DJ,B / .K.BD B *K+B B ,J,B,B .KZ^Nh X h X|Qh XhQh X\Qh 2E}%X. `,.MԳ-rA\YKrD=#E\"yyF%V.h  r3&Xbh pdq, Y<[S , Z{f7ř=o+DKTY{X qX=+f]'Xx>Mx \Ù,B|I,Qʡwf )5,q>YW 1`P Ϊ`y9 78孋`|I>cϕXX֕ueeYY0`y`=/,  y,ߍ?eK7YX` X

k~ g[ @8' X`#Jθ`V?y, @ ,9p{Uu{Ǐ/XXKUmo`YK<[|1VzoG{΋`;揲qyr-,@Va `%,@+O|.jζ``)p. }7osƙx,,@|IBՏ= 槄uu68'Yg?1t) ,֕`54,,׋Vv>\h?ovnc5|)ʹ\9>y%CEuu%XVh3yYWܡ-B\u%XV*Xh, w-,V;4sF\&|+juxD:fo^\6|~mmy VXXd=;KE^/5,XT&\#VR (`4X].+X V `4M/"-{ɼ ,k7}K πeeueaV֕`aYYXWeea]aaV֕^V ^R x9]ɇ| VXXueaXXV֕`aYYXWXX:#X< Xe#X8 X%` X```B` b@,d1`aaeYWXXueaXXV```\$,R@\(E ,, +˺,,, ²,, +˺,,, ²,,\F,t˥!Gp9Ap  rYA@9dG,, +˺%F@,\f,¥!Fp,`  EpA@p,ޥ'C;\_sZ ʲ +˺+,,ʲ G+˺"X!X$ė`aʲ +˺XueYWXXe]aaXX+,,‚=WuB@ Bx@9 B@" D B@3 a a#MzIENDB`klog-2.4.1/aboutdialog.h0000644000175000017500000000413415003153303014070 0ustar develdevel#ifndef KLOG_ABOUTDIALOG_H #define KLOG_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-2.4.1/AUTHORS0000644000175000017500000000137115003153303012475 0ustar develdevelJaime Robles, EA4K - (2002-today) Juan Carlos Reig, EA5WA - (2021-today) Ladislav Foldyna, OK1MLG - (2021-2023) 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 - Peter Andreasen, Joe Hansen (debian-l10n-danish@list.debian.org - before 2024) German - Burkhard Lück (lueck@hube-lueck.de) Finnish - Kristjan Lorents (debian-i18n@lists.debian.org) French - Christophe, F4HWL Italian - Simona - IU5HIU Japanese - Nick, JJ1TGT, Aki, JL3OXR Latvian - Arnis Armans, YL3GBC Polish - Piotr, LA7RRA Spanish - Jaime, EA4K UKrainian - Mykola, UR6QV & Volodymyr, UR3QJW Russian - Arnis Armans, YL3GBC klog-2.4.1/searchwidget.cpp0000644000175000017500000006520115003153303014604 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" #include "callsign.h" SearchWidget::SearchWidget(Awards *awards, QWidget *parent) : QWidget(parent), awards(awards) // Initialize Awards reference { //qDebug() << "SearchWidget::SearchWidget" ; searchBoxLineEdit = new QLineEdit; dataProxy = awards->dataProxy; delayInputTimer = new QTimer; searchWindow = std::make_unique(awards, this); //searchWindow = new SearchWindow(dataProxy, this); //awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); filemanager = new FileManager(dataProxy); filemanager->init(); world = new World(dataProxy, Q_FUNC_INFO); mainStationCallsign = QString(); currentLog = -1; //qDebug() << "SearchWidget::SearchWidget: 00092"; 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" ; } SearchWidget::~SearchWidget() { //delete(dataProxy); //delete(searchWindow); //delete(awards); delete(util); delete(filemanager); delete(world); } 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()); if (qsoIdList.length()<0) { return; } //QString _call, _dateTime, _band, _mode, _freq, _qsltx, _qslrx, _id, _stationcallsign, _dxcc; //qDebug() << "SearchWidget::showQSOs query: : 01" ; int i = 0; QString filter; filter = QString(); while ( (qsoIdList.at(i)<= 0) && (isetFilterString(filter); } void SearchWidget::setStationCallsign(const QString &_st) { Callsign callsign(_st); if (callsign.isValid()) { 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.get()); 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.get(), SIGNAL( actionQSODoubleClicked(int)), this, SLOT(slotQSOToEditFromSearch(int))); connect(searchWindow.get(), SIGNAL( actionDeleteQSO(int)), this, SLOT( slotQsoDeleteFromSearch(int) )); connect(searchWindow.get(), SIGNAL( updateSearchLineEdit()), this, SLOT( slotSearchBoxTextChanged() )); connect(searchWindow.get(), SIGNAL( requestFocus()), this, SLOT( slotRequestFocus() )); } void SearchWidget::slotRequestFocus() { emit requestBeingShown(); } /* void SearchWidget::slotRightButtonSearch(const QPoint& pos) { //qDebug() << "SearchWidget::slotRightButtonSearch" ; searchBoxLineEdit->setFocus(); } */ void SearchWidget::slotQsoDeleteFromSearch(const int _qsoId) { //qDebug() << "SearchWidget::slotQsoDeleteFromSearch: " << QString::number(_qsoId); 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: "; 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: "; 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" ; 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" ; 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" ; fillStationCallsignComboBox(); slotSearchBoxTextChanged(); } void SearchWidget::slotStationCallsignChanged() { //qDebug() << "SearchWidget::slotStationCallsignChanged: " << stationCallsignComboBox->currentText(); slotSearchBoxTextChanged(); } /* void SearchWidget::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWidget::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate(); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END"; } */ void SearchWidget::slotQSOToEditFromSearch(const int _qsoId) { //qDebug() << "slotQSOToEditFromSearch: " << (qsoToEditFromSearchAct->data()).toString(); emit actionQSODoubleClicked(_qsoId); } /* void SearchWidget::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: "; 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: "; 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()) ); 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: "; int _qsoId = ((qslSentViaDirectFromSearchAct->data()).toInt()); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } //qslSentViaDirect(_qsoId); } /* void SearchWidget::slotQSLSentViaBureuMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureuMarkDXReqFromSearch"; 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"; int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01"; qslRecViaBureauMarkReq(_qsoId); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId); if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03"; searchWindow->slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04"; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05"; slotSearchBoxTextChanged(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06"; } //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07"; } */ /* void SearchWidget::searchModel() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END"; } */ /* 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" ; 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(); //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"; 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 ; //qDebug() << "SearchWidget::setModelFilter - stationCallFilter = " << stationCallsignFilter ; //qDebug() << "SearchWidget::setModelFilter - currentLog = " << currentLogFilter; 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 ; searchWindow->setFilterString(filter); } void SearchWidget::setCurrentLog(const int _log) { currentLog = _log; } void SearchWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: "; searchWindow->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; setNeedingQSL(false); //qslingNeeded = false; selectStationCallSign(); } void SearchWidget::slotSearchBoxSelectAllButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: "; if (searchSelectAllClicked) { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: UN-SELECTING"; searchSelectAllClicked = false; searchWindow->clearSelection(); searchBoxSelectAllButton->setText(tr("&Select All")); } else { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: SELECTING"; searchSelectAllClicked = true; searchWindow->selectAll(); searchBoxSelectAllButton->setText(tr("&Clear selection")); } } void SearchWidget::slotSearchBoxReSearchButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxReSearchButtonClicked: " ; 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: " ; /* 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().text(), query.lastQuery()); } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: query executed: " << query.lastQuery(); itemsSelected = true; } if (itemsSelected) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to Ask filename"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExportMarked(fileName); //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to callsign save file"; dataProxy->unMarkAllQSO(); } else { //No items were selected } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: unmarking..."; } 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 QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class searchWindow->setColors(_newOne, _needed, _worked, _confirmed, _default); } void SearchWidget::refresh() { slotSearchBoxTextChanged(); } klog-2.4.1/callsign.h0000644000175000017500000001331715003153303013375 0ustar develdevel#ifndef KLOG_CALLSIGN_H #define KLOG_CALLSIGN_H /*************************************************************************** callsign.h - description ------------------- begin : ago 2024 copyright : (C) 2024 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 object callsign to centralize all about callsigns The inspiration and part of the code is coming from QLog: https://github.com/foldynl/QLog/blob/master/core/Callsign.h Thank you Lada, OK1MLG. Important: https://cqwpx.com/rules.htm This classs hould not need to query the DB neither the DataProxy Class */ #include #include #include class Callsign : public QObject { Q_OBJECT public: Callsign(const QString &callsign, QObject *parent = nullptr); ~Callsign(); void operator()(const QString &newCallsign); //static QStringList secondarySpecialSuffixes; // K1/EA4K/QRP // Needed fields for a call are: // - hostFullPrefix (QString) K1 // - hostPrefix (QString) K // - hostAreaNumber (int) 1 // - homeCallsign EA4K // - homeFullPrefix (QString) EA4 // - homePrefix (QString) EA // - homeAreaNumber (int) 4 // - homeSuffix (QString) K // - suffix (QString) QRP QString getCallsign(); // Returns the FULL callsign (fullCall) QString getHostFullPrefix(); // The complete host prefix (simple + area number if exists) , if only prefix it should be false (hostFullPrefix) QString getHostPrefix(); // The host prefix (simple without area number if exists), if only prefix it should be false (hostPrefix) int getHostAreaNumber(); // Get host area number, if only prefix it should be false (hostAreaNumber) // if getHomeIfEmpty is true and no hostprefix is identified, it will return homePrefix QString getHomeCallsign(); // Returns the base / home callsign like EA4K in K1/EA4K, or EA4K/QRP (fullCall) QString getHomeFullPrefix(); // The complete home prefix (simple + area number if exists) (homeFullPrefix) QString getHomePrefix(); // The Home prefix without area number (homePrefix) int getHomeAreaNumber(); // Get the home area number (homeAreaNumber) QString getHomeSuffix(); // The suffix of the home call (homeSuffix) QString getSuffix(); // Additional suffixes like /P, /QRP, /MM, ... (generalSuffix) bool isValid(); // True if it is a full callsign bool isValidPrefix(); // True if it is a prefix, but not a call bool isSimple(); // True if it has no / nor \ characters, no prefix nor suffix bool isAOneLetterHostPrefix(); // True if is the prefix starts by B|F|G|I|K|M|N|R|U|W and is valid void clear(); private: static QString getSpecialPrefixes(); static QString callsignRegExString(); static QRegularExpression callsignRegEx(); static QString prefixRegExString(); static QRegularExpression prefixRegEx(); void initialize(const QString &callsign); // A helper to perform the initialization and prevent code duplication //Returns the list of special prefixes for the REGEX QString fullCall; // K1/EA4K/QRP QString hostFullPrefix; // K1 QString hostPrefix; // K int hostAreaNumber; // 1 QString homeCallsign; // EA4K QString homeFullPrefix; // EA4 QString homePrefix; // EA QString homeSuffix; // K int homeAreaNumber; // 4 QString generalSuffix; // QRP bool valid; // The entered string is a correct callsign bool prefValid; // The entered string is a correct prefix }; #endif // CALLSIGN_H klog-2.4.1/lotwutilities.h0000644000175000017500000000733215003153303014522 0ustar develdevel#ifndef KLOG_LOTWUTILITIES_H #define KLOG_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 "qso.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-2.4.1/klog.ico0000644000175000017500000032473515003153303013071 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-2.4.1/awards.h0000644000175000017500000002004215003153303013053 0ustar develdevel#ifndef KLOG_AWARDS_H #define KLOG_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 "klogdefinitions.h" class QProgressDialog; class Awards : public QObject { Q_OBJECT //friend class World; public: Awards(DataProxy_SQLite *dp, const QString &_parentFunction); ~Awards(); void setAwards(); 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 updateDXCCStatus(const int _logNumber=0); QList findEntityStatusByDXCC(int dxcc) const; int getQSOsInLog(const int _logNumber); bool getIsDXCCConfirmed(const int _dxcc, const int _logNumber); 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 (EntityStatus _entitystatus); QSOStatus getQSOStatus(const int &_status); // Needs to be called with the output of getDXStatus) QString getDXStatusString (const int &_status); // Needs to be called with the output of getDXStatus QSOStatus getDXCCStatusBand(const int _dxcc, const int _band); QString status2String(const QSOStatus &_status, bool shortString = true); //TODO: Just for debug void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default); QColor getQRZDXStatusColor(EntityStatus _entitystatus); // 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 */ DataProxy_SQLite *dataProxy; 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 bool executeQuery(QSqlQuery &query, const QString &stringQuery); //Executes queries int processQueryResults(QSqlQuery &query); QSOStatus getStatus(const QSqlQuery &query, const QSqlRecord &rec); // Gets the status void populateDXCCStatusMap(); bool updateOrAddEntityStatus(const EntityStatus &ent); // Adds a new EntityStatus to the list or modifies a current status EntityStatus extractEntityStatus(QSqlQuery &query); // Extract an entity status from the query void printEntityStatus(const QString &_callingFunction, const EntityStatus &ent); // DEBUG only function prints to console /* _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 /**/ //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; DXMarathon *dxMarathon; typedef QMultiHash DXStatus; DXStatus dxccWorked, dxccConfirmed, wazWorked, wazConfirmed; bool manageModes; QList dxccStatusList; // List of DXCC status QMultiHash dxccStatusMap; // Multi-hash map for quick lookup (dxcc, EntityStatus) signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void awardDXCCUpdated(); }; #endif // AWARDS_H klog-2.4.1/INSTALL-linux0000644000175000017500000000452715003153303013621 0ustar develdevelFollow these steps to build KLog. KLog requires Qt6 to be built. Currently, many distributions are still distributing Qt4 as a default Qt version so it may be needed that you install Qt6 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 There are dependencies to build KLog and dependencies to run KLog. The dependencies to build KLog are: - make qmake6 qt6-base-dev qt6-declarative-dev libhamlib-dev build-essential libgl1-mesa-dev qt6-serialport-dev qt6-positioning-dev qt6-charts-dev qt6-l10n-tools In Debian it is done with: apt install -y --fix-missing make qmake6 qt6-location-plugins qt6-base-dev qt6-declarative-dev libhamlib-dev build-essential libgl1-mesa-dev qt6-serialport-dev qt6-positioning-dev qt6-charts-dev qt6-l10n-tools *** TO BE UPDATED: The dependencies to run KLog once installed are: - libqt5sql5-sqlite, qml-module-qtquick-window2, qml-module-qtlocation, qml-module-qtpositioning, qml-module-qtquick2 & qml-module-qtquick-controls2 Again in Debian, it is done with: apt-get install libqt5sql5-sqlite qml-module-qtquick-window2 qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 qml-module-qtquick-controls2 If your are using the Debian KLog package the dependencies to run KLog will be automatically installed when installing the KLog package. In your distribution, you should know how to install new packages :-) Make sure you have qt6 available. You can do it with the qtchooser command. The output should be something like: user@debian:~$ qmake6 -v QMake version 3.1 Using Qt version 6.4.2 in /usr/lib/x86_64-linux-gnu If Qt is not at least Qt6, check your instalallation as one of the previous packages may be missing. 2.- Untar klog tar xvzf klog-version.tar.gz enter the KLog directory cd klog-version 3.- Generate the Makefile qmake6 PREFIX=/usr/local src.pro 4. Make everything. make If everything goes OK, you should have the klog executable in the folder. 5.- To install KLog, execute the following from the root account. make install Now you are done. Just execute klog and enjoy! 73 klog-2.4.1/statisticswidget.h0000644000175000017500000000767515003153303015211 0ustar develdevel#ifndef KLOG_STATISTICSWIDGET_H #define KLOG_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 #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" 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); QStackedWidget *stackedWidget; StatsQSOsPerYearBarChartWidget *w1; StatsEntitiesPerYearBarChartWidget *w2; StatsCQZPerYearBarChartWidget *w3; StatsQSOsPerBandBarChartWidget *w4; StatsQSOsPerModeBarChartWidget *w5; StatsQSOsPerDXCCBarChartWidget *w6; StatsQSOsPerContinentBarChartWidget *w7; StatsQSOsPerHourBarChartWidget *w8; StatsQSOsPerMonthBarChartWidget *w9; StatsWorkedConfirmedPieChartWidget *w10; StatsWorkedSentPieChartWidget *w11; StatsSentConfirmedPieChartWidget *w12; StatsGridsOnSatsWidget *w13; StatsDXCCOnSatsWidget *w14; StatsFieldPerBandWidget *w15; StatsFieldPerBandWidget *w16; DataProxy_SQLite *dataProxy; QComboBox *statisticToShowComboBox, *logComboBox; QStringList statisticsToShowList; }; #endif // STATISTICSWIDGET_H klog-2.4.1/udpserver.cpp0000644000175000017500000005756515003153303014170 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() << Q_FUNC_INFO << " - Start"; //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" ; } else { //qDebug() << "UDPServer::UDPServer - Multicast group joined NOK" ; } */ util = new Utilities(Q_FUNC_INFO); logging = false; realtime = false; connect(socketServer,SIGNAL(readyRead()),this,SLOT(slotReadPendingDatagrams())); //qDebug() << Q_FUNC_INFO << " - END"; } UDPServer::~UDPServer() { delete(util); } void UDPServer::slotReadPendingDatagrams() { //qDebug() << Q_FUNC_INFO << " - Start"; while (socketServer->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socketServer->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; //qDebug() << Q_FUNC_INFO << " : length = " << QString::number(socketServer->pendingDatagramSize()); socketServer->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); parse (datagram); //qDebug() << Q_FUNC_INFO << " = " << datagram; } //qDebug() << Q_FUNC_INFO << " - END"; } bool UDPServer::start() { //qDebug() << Q_FUNC_INFO << " - Start"; if ( (port>0) && (port<65535) ) { //qDebug() << Q_FUNC_INFO << ": calling startNow "; return startNow(port, groupAddress); } else { //qDebug() << Q_FUNC_INFO << ": FALSE"; return false; } } bool UDPServer::startNow(quint16 _port, QHostAddress const& _multicast_group_address) { //qDebug() << Q_FUNC_INFO << " - Start"; //if ((_port != port) || (_multicast_group_address != groupAddress)) if (1) { //qDebug() << Q_FUNC_INFO << ": starting..."; leaveMultiCastGroup(); if (socketServer->state() == QAbstractSocket::BoundState) { //qDebug() << Q_FUNC_INFO << ": closing socket"; socketServer->close(); } groupAddress = _multicast_group_address; auto address = _multicast_group_address.isNull () || QAbstractSocket::IPv4Protocol != groupAddress.protocol () ? QHostAddress::Any : QHostAddress::AnyIPv4; Q_UNUSED(address); if (_port && socketServer->bind(groupAddress, _port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint)) { port = _port; joinMultiCastGroup(); } else { //qDebug() << Q_FUNC_INFO << " port = 0"; port = 0; } } else { //qDebug() << Q_FUNC_INFO << " exiting with an error... "; } //qDebug() << Q_FUNC_INFO << " finalizing... "; return socketServer->isValid(); } void UDPServer::joinMultiCastGroup() { //qDebug() << Q_FUNC_INFO << " - Start"; 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() << Q_FUNC_INFO << ": socket valid"; } } bool joined {false}; socketServer->setMulticastInterface(networkInterface); joined |= socketServer->joinMulticastGroup(groupAddress, networkInterface); if (!joined) { groupAddress.clear(); } socketServer->setMulticastInterface(mcast_interface); } //qDebug() << Q_FUNC_INFO << " - END"; } void UDPServer::leaveMultiCastGroup() { //qDebug() << Q_FUNC_INFO << " - Start"; 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() << Q_FUNC_INFO << " - END"; } bool UDPServer::isStarted() { //qDebug() << Q_FUNC_INFO << " - Start"; return socketServer->isValid(); } void UDPServer::parse(const QByteArray &msg) { //qDebug() << Q_FUNC_INFO << " - Start: " << msg; //qDebug() << "UDPServer::parse: " << QString::fromStdString(msg.toStdString()); //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; 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); //qDebug() << "UDPServer::parse: - schema = " << QString::number(schema); //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type); //qDebug() << Q_FUNC_INFO << ": id = " << id; //if ((magic != 2914831322) || (id != "WSJT-X")) if (magic != 2914831322) { //qDebug() << Q_FUNC_INFO << ": Magic BAD FORMAT = " << QString::number(magic); return; } //qDebug() << Q_FUNC_INFO << ": TYPE: " << QString::number(type); switch (type) { case Heartbeat: //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - OUT/IN - Heartbeat"; break; case Status: //qDebug() << Q_FUNC_INFO << ": type" << QString::number(type) << " - OUT - Status"; // 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 //qDebug() << Q_FUNC_INFO << ": Status - Freq double = " << QString::number(frequencyDouble) ; //qDebug() << Q_FUNC_INFO << ": Status - Mode = " << mode; //qDebug() << Q_FUNC_INFO << ": Status - DXCall = " << dx_call; //qDebug() << Q_FUNC_INFO << ": Status - Report = " << report; //qDebug() << Q_FUNC_INFO << ": Status - Rx DF = " << rx_df; //qDebug() << Q_FUNC_INFO << ": Status - Tx DF = " << tx_df; //qDebug() << Q_FUNC_INFO << ": Status - De_Call = " << de_call; //qDebug() << Q_FUNC_INFO << ": Status - De_Grid = " << de_grid; //qDebug() << Q_FUNC_INFO << ": Status - SubMode = " << sub_mode; //qDebug() << Q_FUNC_INFO << ": Status - SpecialOp = " << QString::number(specialOpMode); //qDebug() << Q_FUNC_INFO << ": Status - Freq Tol = " << QString::number(freqTolerance); //qDebug() << Q_FUNC_INFO << ": Status - T/R Period = " << QString::number(TRPeriod); //qDebug() << Q_FUNC_INFO << ": Status - Conf Name = " << confName; emit status_update (type, dx_call, frequencyDouble, mode, report, de_call, de_grid, dx_grid, sub_mode); } else { //qDebug() << Q_FUNC_INFO << ": realtime = FALSE"; } break; case Decode: //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - OUT - Decode"; in >> newDecode >> time >> snr >> deltaTime >> drift >> mode >> message >> lowConfidence >> offAir; if (lowConfidence) { //qDebug() << Q_FUNC_INFO << ": Decode: Low Confidence"; } else { //qDebug() << Q_FUNC_INFO << ": Decode: Time = " << time.toString("hhmmss"); //qDebug() << Q_FUNC_INFO << ": Decode: SNR = " << QString::number(snr); //qDebug() << Q_FUNC_INFO << ": Decode: Delta = " << QString::number(deltaTime); //qDebug() << Q_FUNC_INFO << ": Decode: Drift = " << QString::number(drift); //qDebug() << Q_FUNC_INFO << ": Decode: Mode = " << mode; //qDebug() << Q_FUNC_INFO << ": Decode: Msg = " << message; } break; case Clear: //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - OUT - Clear"; emit clearSignal(Q_FUNC_INFO); break; case Reply: //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - IN - Replay "; break; case QSOLogged: //qDebug() << Q_FUNC_INFO << ": type = QSOLogged " ; 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() << Q_FUNC_INFO << ": QSOLogged: Time_off = " << time_off.toString("yyyyMMdd-hhmmss"); //qDebug() << Q_FUNC_INFO << ": QSOLogged: DXCall = " << dx_call; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Grid = " << dx_grid; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Freq = " << QString::number(frequency); //qDebug() << Q_FUNC_INFO << ": QSOLogged: Mode = " << mode; //qDebug() << Q_FUNC_INFO << ": QSOLogged: ReportSent = " << report_sent; //qDebug() << Q_FUNC_INFO << ": QSOLogged: ReportReceived = " << report_received; //qDebug() << Q_FUNC_INFO << ": QSOLogged: TX_PWR = " << tx_power; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Comments = " << comments; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Name = " << name; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Time = " << time_on.toString("yyyyMMdd-hhmmss"); //qDebug() << Q_FUNC_INFO << ": QSOLogged: DeCall = " << de_call; //qDebug() << Q_FUNC_INFO << ": QSOLogged: DeGrid = " << de_grid; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Exch Sent = " << exchange_sent; //qDebug() << Q_FUNC_INFO << ": QSOLogged: Exch Recv = " << exchange_received; if (logging) { //qDebug() << Q_FUNC_INFO << ": logging = true "; //qDebug() << Q_FUNC_INFO << ": QSO to be logged: Time_on: " << time_on; //qDebug() << Q_FUNC_INFO << ": QSO to be logged: Time_off: " << time_off; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //qDebug() << Q_FUNC_INFO << ": Data to be logged: Comment: " << comments; QSO qso; qso.clear(); qso.setCall(dx_call); qso.setMode(mode); qso.setFreq(frequencyDouble); qso.setGridSquare(dx_grid); qso.setMyGridSquare(de_grid); qso.setRSTRX(report_received); qso.setRSTTX(report_sent); qso.setComment(comments); qso.setStationCallsign(de_call); qso.setName(name); qso.setOperatorCallsign(operatorCall); qso.setDateTimeOn(time_on); qso.setTimeOff(time_off.time()); qso.setSrxString(exchange_received); qso.setStxString(exchange_sent); qso.setTXPwr(tx_power.toDouble()); emit logged(qso); } else { //qDebug() << Q_FUNC_INFO << ": logging = false"; } break; case Close: //qDebug() << Q_FUNC_INFO << ": type = Close" ; socketServer->close(); //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - OUT - Close "; break; case Replay: //qDebug() << Q_FUNC_INFO << ": type = Reply" ; //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - IN - Replay"; break; case HaltTx: //qDebug() << Q_FUNC_INFO << ": type = HaltTx" ; //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - IN - Halt TX"; break; case FreeText: //qDebug() << Q_FUNC_INFO << ": type = FreeText" ; //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - IN - Free Text"; break; case WSPRDecode: //qDebug() << Q_FUNC_INFO << ": type = WSPRDecode" ; in >> newDecode >> time >> snr >> deltaTime >> frequency >> drift >> decodedCall >> decodedGrid >> power >> offAir; //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Time = " << time.toString("yyyyMMdd-hhmmss"); //qDebug() << Q_FUNC_INFO << ": WSPRDecode: SNR = " << QString::number(snr); //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Delta = " << QString::number(deltaTime); //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Frec = " << QString::number(frequency); //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Drift = " << QString::number(drift); //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Call = " << decodedCall; //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Grid = " << decodedGrid; //qDebug() << Q_FUNC_INFO << ": WSPRDecode: Power = " << QString::number(power); break; case Location: //qDebug() << Q_FUNC_INFO << ": type = Location" ; break; case LoggedADIF: //qDebug() << Q_FUNC_INFO << ": type = LoggedADIF" ; //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - ADIF"; //in >> adifReceived; //adifParse(adifReceived); //qDebug() << "UDPServer::parse: ADIF: " << adifReceived; // Q_SIGNAL void logged_ADIF (QString const& id, QByteArray const& ADIF); break; case HighlightCallsign: //qDebug() << Q_FUNC_INFO << ": type = HighlightCallsign" ; break; case SwitchConfiguration: //qDebug() << Q_FUNC_INFO << ": type = SwitchConfiguration" ; break; case Configure: //qDebug() << Q_FUNC_INFO << ": type = Configure" ; break; default: //NO //qDebug() << Q_FUNC_INFO << ": type = " << QString::number(type) << " - ERROR on Type"; break; } //qDebug() << Q_FUNC_INFO << ": Magic: = " << QString::number(magic); } bool UDPServer::stop() { //qDebug() << Q_FUNC_INFO << " - Start"; socketServer->close(); if (socketServer->isValid()) { return false; } else { return true; } } void UDPServer::setPort(const int _port) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_port); if ((_port >= 0) && (_port<=65535)) { port = _port; } } void UDPServer::setNetworkInterface(const QString &_t) { //qDebug() << Q_FUNC_INFO << " - Start: " << _t; 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() << Q_FUNC_INFO << ": FOUND! :" << testInterface ; if ((i.flags().testFlag(QNetworkInterface::IsUp)) ) { networkInterface = i; haveNetworkInterface = true; } } } } /* void UDPServer::adifParse(QByteArray &msg) { //qDebug() << Q_FUNC_INFO << " - Start: " << msg; QSO qso; QStringList adifLine; adifLine.clear(); QString line = QString(msg); adifLine << line.split('<'); //qDebug() << Q_FUNC_INFO << ": before the while" << QT_ENDL; for (int i = 0; i < adifLine.length() ;i++) { //qDebug() << Q_FUNC_INFO << ": While-1" << QT_ENDL; QString type, data; QStringList field; field.clear(); //qDebug() << Q_FUNC_INFO << ": While-2" << QT_ENDL; QString aux = "<" + adifLine.at(i); //qDebug() << Q_FUNC_INFO << ": While-3" << QT_ENDL; field.clear(); field << util->getValidADIFFieldAndData(aux); if (field.length()==2) { //qDebug() << Q_FUNC_INFO << ": While-4" << QT_ENDL; type = (field.at(0)).toUpper(); //qDebug() << Q_FUNC_INFO << ": While-5" << QT_ENDL; data = field.at(1); //qDebug() << Q_FUNC_INFO << ": While-6" << QT_ENDL; if (type == "CALL") { qso.setCall(data); } else if (type == "GRIDSQUARE") { //qDebug() << Q_FUNC_INFO << ": Rec Grid: " << data << QT_ENDL; if (util->isValidGrid(data)) { qso.setGridSquare(data); //qDebug() << Q_FUNC_INFO << ": Rec Grid to export: " << dxgrid << QT_ENDL; } } else if (type == "MY_GRIDSQUARE") { //qDebug() << Q_FUNC_INFO << ": Rec mGrid: " << data << QT_ENDL; if (util->isValidGrid(data)) { qso.setMyGridSquare(data); //qDebug() << Q_FUNC_INFO << ": Rec mGrid to export: " << mygrid << QT_ENDL; } } else if (type == "MODE") { qso.setMode(data); } else if (type == "RST_SENT") { qso.setRSTRX(data); } else if (type == "RST_RCVD") { qso.setRSTTX(data); } else if (type == "QSO_DATE") { qso.setDate(util->getDateFromADIFDateString(data)); } else if (type == "TIME_ON") { qso.setTimeOn(util->getTimeFromADIFTimeString(data)); } else if (type == "QSO_DATE_OFF") { qso.setDateOff(util->getDateFromADIFDateString(data)); } else if (type == "TIME_OFF") { qso.setTimeOff(util->getTimeFromADIFTimeString(data)); } else if (type == "COMMENT") { qso.setComment(data); } else if (type == "BAND") { qso.setBand(data); } else if (type == "OPERATOR") { qso.setOperatorCallsign(data); } else if (type == "FREQ") { qso.setFreq(data.toDouble()); } else if (type == "STATION_CALLSIGN") { qso.setStationCallsign(data); } else if (type == "NAME") { qso.setName(data); } else if (type == "EOR") { if (!qso.isValid()) return; if (!qso.isComplete()) return; emit logged(qso); return; } } } //qDebug() << Q_FUNC_INFO << " - END"; } */ void UDPServer::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); setNetworkInterface (settings.value("UDPNetworkInterface").toString ()); setPort (settings.value("UDPServerPort").toInt ()); logging = settings.value("LogFromWSJTX").toBool (); realtime = settings.value ("RealTimeFromWSJTX", false).toBool (); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/global.h0000644000175000017500000000407715003153303013044 0ustar develdevel#ifndef KLOG_GLOBAL_H #define KLOG_GLOBAL_H /*************************************************************************** global.h - description ------------------- begin : Apr 2023 copyright : (C) 2023 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 defines global topics. */ extern bool g_callsignCheck; #if __cplusplus >= 201309L // use modern deprecation feature #define KLOG_DEPRECATED [[deprecated]] #else //... no idea how to handle this, but this seems overly noisy? #define KLOG_DEPRECATED #warning "KLOG_DEPRECATED is not defined yet!" #endif #endif klog-2.4.1/updatesatsdata.h0000644000175000017500000000454015003153303014606 0ustar develdevel#ifndef KLOG_UPDATESATSDATA_H #define KLOG_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); ~UpdateSatsData(); 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-2.4.1/world.cpp0000644000175000017500000007264015003153303013267 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" #include "callsign.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) { Q_UNUSED(_parentFunction); //qDebug() << Q_FUNC_INFO << " - Start from: " << _parentFunction; worldPrefixes.clear(); cqz = -1; ituz = -1; ret = false; continentId = -1; lat = 0.0; lon = 0.0; utc = 0.0; locator = new Locator(); created = false; dataProxy = dp; read = readWorld(); util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - END"; } World::~World() { //qDebug() << Q_FUNC_INFO; delete(locator); delete(util); } bool World::readEntities() { //qDebug() << Q_FUNC_INFO << " - Start"; entities = dataProxy->getAllEntiNameISOAndPrefix(); if (entities.count()<1) return false; //QMapIterator i(entities); // Just test, to see if we are doing ok //while (i.hasNext()) { // i.next(); // //qDebug() << " - " << i.key().name; //} //qDebug() << Q_FUNC_INFO << " - END" ; return true; } // Function to get EntityData based on dxcc ID EntityData World::getEntityDataFromDXCC(const int _dxcc) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_dxcc); for (auto it = entities.constBegin(); it != entities.constEnd(); ++it) { if (it.value() == _dxcc) { return it.key(); } } // If not found, return a default EntityData object return EntityData(); } QString World::getEntityMainPrefix(int _dxcc) { EntityData entity = getEntityDataFromDXCC(_dxcc); Callsign prefix(entity.mainprefix); QString aux = QString(); if (prefix.isValidPrefix()) aux = entity.mainprefix; return aux; } bool World::readWorld() { // Used to link a prefix with an Entity quickly, without quering the DB. //qDebug() << Q_FUNC_INFO << " - Start"; specialCalls.clear(); longPrefixes.clear(); worldPrefixes.clear(); worldPrefixes = dataProxy->getWorldData(); specialCalls << dataProxy->getSpecialCallsigns(); longPrefixes << dataProxy->getLongPrefixes(); //qDebug() << Q_FUNC_INFO << " - worldPrefixes: " << worldPrefixes.count(); //qDebug() << Q_FUNC_INFO << " - specialCalls : " << specialCalls.count(); //qDebug() << Q_FUNC_INFO << " - longPrefixes : " << longPrefixes.count(); if (!readEntities()) return false; if (worldPrefixes.isEmpty()) return false; if (specialCalls.isEmpty()) return false; return !longPrefixes.isEmpty(); } bool World::recreate(const QString &_worldFile) { //qDebug() << Q_FUNC_INFO << ": " << _worldFile; QSqlQuery query; // Delete from entity table if (!executeQuery(query, "DELETE FROM entity")) { emitQueryError(query); return false; } // Delete from prefixesofentity table if (!executeQuery(query, "DELETE FROM prefixesofentity")) { emitQueryError(query); return false; } // Create the world file //qDebug() << Q_FUNC_INFO << " - END-4"; return create(_worldFile); } bool World::create(const QString &_worldFile) { //qDebug() << Q_FUNC_INFO << " " << _worldFile; created = readCTYCSV(_worldFile); //qDebug() << Q_FUNC_INFO << " - 30" ; if (created) { //qDebug() << Q_FUNC_INFO << " - 40" ; created = insertSpecialEntities(); } if (created) { //qDebug() << Q_FUNC_INFO << " - 50" ; if (dataProxy->updateISONames()) { //qDebug() << Q_FUNC_INFO << " - 60" ; //qDebug() << Q_FUNC_INFO << " updateISONames TRUE" ; } else { //qDebug() << Q_FUNC_INFO << " - 70" ; //qDebug() << Q_FUNC_INFO << " updateISONames FALSE" ; } //qDebug() << Q_FUNC_INFO << " - 80" ; } if (created) { // Let's add the Primary Subdivisions to the DB created = dataProxy->addPrimarySubdivisions(); } //qDebug() << Q_FUNC_INFO << " - 90" ; read = readWorld (); //qDebug() << Q_FUNC_INFO << " - END" ; return created; } QStringList World::readZones (const QString &pref, const int _cq, const int _itu) { //Returns a QStringList: prefix, CQz, ITUz //qDebug() << Q_FUNC_INFO << ": (" << pref << "/" << QString::number(_cq) <<"/" << QString::number(_itu)<< ")"; QStringList result; int cq = _cq; int itu = _itu; QString azone; // Special zones start with a [ QString aux = pref; if(aux.count('[')==1) // Check if has special CQz { //qDebug() << Q_FUNC_INFO << ": DETECTED [ !!!!"; qsizetype pos = aux.indexOf('['); azone = aux.sliced(pos, 1); //Following line was migrated from qt5 //azone = (aux.midRef(aux.indexOf('[')+1)).toString(); //qDebug() << Q_FUNC_INFO << ": (ITU)-1: " << aux << " right of " << QString::number(aux.indexOf('[')) << " = " << azone; itu = (azone.left(azone.indexOf(']'))).toInt(); //qDebug() << Q_FUNC_INFO << ": (ITU)-2: " << azone.left(azone.indexOf(']')); aux = aux.left(aux.indexOf('[')); //qDebug() << Q_FUNC_INFO << ": (ITU): " << pref << "/" << QString::number(itu) << "/" << aux; } if(aux.count('(')==1) // Check if has special CQz { //qDebug() << Q_FUNC_INFO << ": DETECTED ( !!!!"; qsizetype pos = aux.indexOf('('); azone = aux.sliced(pos, 1); //Following line was migrated from qt5 //azone = (aux.midRef(aux.indexOf('(')+1)).toString(); cq = (azone.left(azone.indexOf(')'))).toInt(); aux = aux.left(aux.indexOf('(')); //qDebug() << Q_FUNC_INFO << ": (CQ): " << pref << "/" << QString::number(cq) << "/" << aux; } //qDebug() << Q_FUNC_INFO << ": (Pref/CQ/ITU): " << pref << "= " << aux <<"/" << QString::number(cq) << "/" << QString::number(itu); result << aux << QString::number(cq) << QString::number(itu); //qDebug() << Q_FUNC_INFO << ": (Pref/CQ/ITU): " << result; return result; } QString World::getQRZEntityName(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return QString(); } int prefixIDNumber = getQRZARRLId(_qrz); //qDebug() << Q_FUNC_INFO << " - " << prefixIDNumber; return getEntityName(prefixIDNumber); } QString World::getEntityName(const int _entityN) { //qDebug() << Q_FUNC_INFO << ": " << _entityN; int prefixIDNumber = _entityN; if (prefixIDNumber<=0) { return QString(); } return dataProxy->getEntityNameFromId(prefixIDNumber); } int World::getQRZCqz(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return -1; } QString aux = util->getPrefixFromCall(_qrz); return dataProxy->getCQzFromPrefix(aux); } int World::getQRZItuz(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return -1; } QString aux = util->getPrefixFromCall(_qrz); return dataProxy->getITUzFromPrefix(aux); } int World::getEntityCqz(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if (_enti < 1 ) { return -1; } return dataProxy->getCQzFromEntity(_enti); } int World::getEntityItuz(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if (_enti < 1 ) { return -1; } return dataProxy->getITUzFromEntity(_enti); } int World::getQRZARRLId(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; QString call = _qrz.toUpper(); Callsign callsign(call); if (!callsign.isValidPrefix()) return -1; QString prefix = callsign.getHostFullPrefix(); //qDebug() << Q_FUNC_INFO << " - prefix: " << prefix; int entID = worldPrefixes.value(prefix, -2); while ((prefix.length()>1) && (entID<=0)) { //qDebug() << Q_FUNC_INFO << " - " << QString("Pref: %1 / EntID: %2").arg(prefix).arg(entID); if (entID<=0) prefix.chop(1); entID = worldPrefixes.value(prefix, -3); //qDebug() << Q_FUNC_INFO << " - " << QString("New Pref: %1 / New EntID: %2").arg(prefix).arg(entID); } //qDebug() << Q_FUNC_INFO << " - " << QString("Callsign: %1 / Final EntID: %2").arg(_qrz).arg(entID); return entID; } QString World::getQRZEntityMainPrefix(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return ""; } int i = getQRZARRLId(_qrz); return getEntityMainPrefix(i); } bool World::isNewCQz(const int _cqz) { //qDebug() << Q_FUNC_INFO << ": " << _cqz; return dataProxy->isNewCQz(_cqz); } bool World::isNewEntity(const int _entityN) { //qDebug() << Q_FUNC_INFO << ": " << _entityN; if (_entityN <= 0) { return false; } return dataProxy->isNewEntity(_entityN); } QString World::getQRZContinentShortName(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; return getContinentShortName (getQRZARRLId(_qrz)); } QString World::getContinentShortName(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if ( _enti < 0 ) { return "--"; } QString a = dataProxy->getContinentShortNameFromEntity(_enti); if (a.length()!=2) { return "--"; } else { return a; } } QString World::getQRZContinentNumber(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; int i = getQRZARRLId(_qrz); return QString::number(getContinentNumber(i)); } int World::getContinentNumber(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if (_enti <= 0) { return -1; } return dataProxy->getContinentIdFromEntity(_enti); } double World::getLongitude(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if (_enti <= 0) { return 0.0; } return dataProxy->getLongitudeFromEntity(_enti); } double World::getLatitude(const int _enti) { //qDebug() << Q_FUNC_INFO << ": " << _enti; if (_enti <= 0) { return 0.0; } return dataProxy->getLatitudeFromEntity(_enti); } QString World::getQRZLocator(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << " - Start: " << _qrz; Callsign callsign(_qrz); if (!callsign.isValidPrefix()) return QString(); int entity = getQRZARRLId (_qrz); //qDebug() << Q_FUNC_INFO << " - Entity: " << entity; return locator->getLocator(getLongitude(entity), getLatitude (entity)); } QString World::getLocator(const int _entityN) { //qDebug() << Q_FUNC_INFO << ": " << _entityN; if (_entityN <= 0) { return ""; } return locator->getLocator(getLongitude(_entityN), getLatitude(_entityN)); } bool World::addEntity(const QString &_name, const int _cq, const int _itu, const int _contId, const double _lat, const double _lon, const double _utc, const int _dxcc, const QString &_mainpref) { //qDebug() << Q_FUNC_INFO << " - Start"; QSqlQuery query; query.prepare(QStringLiteral("INSERT INTO entity (name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) " "VALUES (:name, :cqz, :ituz, :continent, :latitude, :longitude, :utc, :dxcc, :mainprefix)")); query.bindValue(QStringLiteral(":name"), _name); // name query.bindValue(QStringLiteral(":cqz"), _cq); // CQ query.bindValue(QStringLiteral(":ituz"), _itu); // ITU query.bindValue(QStringLiteral(":continent"), _contId); // Cont query.bindValue(QStringLiteral(":latitude"), _lat); // Lat query.bindValue(QStringLiteral(":longitude"), _lon); // Lon query.bindValue(QStringLiteral(":utc"), _utc); // UTC query.bindValue(QStringLiteral(":dxcc"), _dxcc); // dxcc query.bindValue(QStringLiteral(":mainprefix"), _mainpref); // Mainprefix //qDebug() << Q_FUNC_INFO << " Entity name: " << _name; //qDebug() << Q_FUNC_INFO << " Entity cqz: " << QString::number(_cq); //qDebug() << Q_FUNC_INFO << " Entity ituz: " << QString::number(_itu); //qDebug() << Q_FUNC_INFO << " Entity cont: " << QString::number(_contId); //qDebug() << Q_FUNC_INFO << " Entity lat: " << QString::number(_lat); //qDebug() << Q_FUNC_INFO << " Entity lon: " << QString::number(_lon); //qDebug() << Q_FUNC_INFO << " Entity UTC: " << QString::number(_utc); //qDebug() << Q_FUNC_INFO << " Entity ARRL: " << QString::number(_dxcc); //qDebug() << Q_FUNC_INFO << " Entity Pref: " << _mainpref; if (query.exec()) { //qDebug() << Q_FUNC_INFO << " Entity data added OK: " << _name ; return true; } //else if (query.lastError().text() == QString::number(19)) //{ //qDebug() << Q_FUNC_INFO << " Entity data NOT added: error19: " << _name ; //} //else //{ //qDebug() << Q_FUNC_INFO << " Entity data NOT added: error else: " << _name ; //emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " Entity data NOT added" ; //qDebug() << Q_FUNC_INFO << " LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << " LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " LastError-n: " << query.lastError().text(); //} emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return false; } bool World::addPrefix(const QString &_pref, const int _dxcc, const int _cqz, const int _ituz) { //qDebug() << Q_FUNC_INFO << ": _pref: " << _pref; //qDebug() << Q_FUNC_INFO << ": _dxcc: " << QString::number(_dxcc); //qDebug() << Q_FUNC_INFO << ": _cqz: " << QString::number(_cqz); //qDebug() << Q_FUNC_INFO << ": _ituz: " << QString::number(_ituz); QSqlQuery query; query.prepare(QStringLiteral("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES (:pref, :dxcc, :cqz, :ituz)")); query.bindValue(QStringLiteral(":pref"), _pref); // Cont query.bindValue(QStringLiteral(":dxcc"), _dxcc); // Cont query.bindValue(QStringLiteral(":cqz"), _cqz); // CQ query.bindValue(QStringLiteral(":ituz"), _ituz); // ITU if (query.exec()) { //qDebug() << Q_FUNC_INFO << " Prefix data added OK: " << _pref ; //qDebug() << Q_FUNC_INFO << " query: " << query.executedQuery(); //qDebug() << Q_FUNC_INFO << " query: " << query.lastQuery(); return true; } else if ((query.lastError().nativeErrorCode()).toInt() == 2067) //else if (query.lastError().text() == QString::number(19)) { //#pragma "ERROR code 19 should be 2067 to indicate duplicate" //qDebug() << Q_FUNC_INFO << " :Prefix data NOT added: error19: " << _pref ; } else { //qDebug() << Q_FUNC_INFO << " Pref data NOT added: error else: " << _pref ; //qDebug() << Q_FUNC_INFO << " LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << " LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " LastError-n: " << query.lastError().text(); } emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return false; } bool World::readCTYCSV(const QString &_worldFile) { //qDebug() << Q_FUNC_INFO << ": " << _worldFile; QFile file(_worldFile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug() << Q_FUNC_INFO << ": File not found: END FALSE" << _worldFile; return false; } //qDebug() << Q_FUNC_INFO << "File found:" << _worldFile; QTextStream in(&file); int numberOfLines = 0; // First pass: count lines while (!in.atEnd()) { in.readLine(); numberOfLines++; } //qDebug() << Q_FUNC_INFO << "Number of lines:" << numberOfLines; // Reset the file position file.seek(0); in.seek(0); // Initialize progress dialog #ifndef KLOG_TESTING QProgressDialog progress(tr("Reading cty.csv..."), tr("Abort reading"), 0, numberOfLines); progress.setWindowModality(Qt::ApplicationModal); #endif int progressBarPosition = 0; QStringList stringList, stringListPrefixes; while (!in.atEnd()) { #ifndef KLOG_TESTING progress.setValue(progressBarPosition); if (progress.wasCanceled()) break; #endif progressBarPosition++; stringList.clear(); stringListPrefixes.clear(); QString line = in.readLine().simplified().trimmed(); line.remove(QChar(';'), Qt::CaseInsensitive); stringList = line.split(','); if (stringList.size() != 10) { continue; } int entityNumber = extractEntityNumber(stringList); QString mPrefix = stringList.at(0); QString entName = stringList.at(1); int contId = dataProxy->getContinentIdFromContinentShortName(stringList.at(3)); int cqz = stringList.at(4).toInt(); int ituz = stringList.at(5).toInt(); double lat = stringList.at(6).toDouble(); double lon = stringList.at(7).toDouble(); double utc = stringList.at(8).toDouble(); if (addEntity(entName, cqz, ituz, contId, lat, lon, utc, entityNumber, mPrefix)) { //qDebug() << Q_FUNC_INFO << "Entity added:" << entName; // stringList.at(9) contains an space separated list of prefixes for that entity addPrefixes(stringList.at(9), entityNumber, cqz, ituz); //TODO: Handle the error } else { //qDebug() << Q_FUNC_INFO << "Entity not added:" << entName; } #ifndef KLOG_TESTING progress.setLabelText("Reading cty.csv ... \nNow reading " + mPrefix + " data"); #endif //qDebug() << Q_FUNC_INFO << "Progress bar position:" << progressBarPosition; } #ifndef KLOG_TESTING progress.setValue(numberOfLines); #endif if (created) { dataProxy->updateISONames(); } return true; } bool World::addPrefixes(const QString &prefixes, int entityNumber, int cqz, int ituz) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList stringListPrefixes = prefixes.split(' '); QList>>> pairPrefixes; //pairPrefixes.append(qMakePair(QString("EA"), qMakePair(130, qMakePair(10, 20)))); for (const QString &prefix : stringListPrefixes) { QStringList stringListProcessedPrefix = readZones(prefix, cqz, ituz); if (stringListProcessedPrefix.size() == 3) { //TODO: Add some checks to ensure we are adding a prefix and 3 numbers //Returns a QStringList: prefix, CQz, ITUz pairPrefixes.append(qMakePair(stringListProcessedPrefix.at(0), qMakePair(entityNumber, qMakePair(stringListProcessedPrefix.at(1).toInt(), stringListProcessedPrefix.at(2).toInt())))); //if (addPrefix(stringListProcessedPrefix.at(0), entityNumber, stringListProcessedPrefix.at(1).toInt(), stringListProcessedPrefix.at(2).toInt())) { // //qDebug() << Q_FUNC_INFO << "Prefix added:" << stringListProcessedPrefix.at(0); //} else { // //qDebug() << Q_FUNC_INFO << "Prefix not added:" << stringListProcessedPrefix.at(0); //} } } return insertPrefixes(pairPrefixes); } bool World::insertPrefixes(const QList>>> &pairPrefixes) { //qDebug() << Q_FUNC_INFO << " - Start "; QSqlQuery query; query.prepare( "INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) " "VALUES (:pref, :dxcc, :cqz, :ituz)"); QSqlDatabase::database().transaction(); // Start the transaction foreach (const auto &prefix, pairPrefixes) { query.bindValue(":pref", prefix.first); query.bindValue(":dxcc", prefix.second.first); query.bindValue(":cqz", prefix.second.second.first); query.bindValue(":ituz", prefix.second.second.second); if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); QSqlDatabase::database().rollback(); // Rollback transaction on error return false; } } QSqlDatabase::database().commit(); // Commit the transaction return true; } int World::extractEntityNumber(const QStringList &stringList) { //qDebug() << Q_FUNC_INFO << " - Start "; int entityNumber; if (stringList.at(0).contains(QChar('*'), Qt::CaseInsensitive)) { entityNumber = stringList.at(2).toInt() + 1000; while ( !(getEntityMainPrefix((entityNumber)).isEmpty())) { entityNumber += 1000; } } else { entityNumber = stringList.at(2).toInt(); } return entityNumber; } int World::getHowManyEntities() { //qDebug() << Q_FUNC_INFO << " - Start "; return dataProxy->getHowManyEntities(); } bool World::insertSpecialEntities() { //https://en.wikipedia.org/wiki/Non-ITU_prefix //qDebug() << Q_FUNC_INFO << " - Start "; // T9 to E7 // 4N & YZ to 4O int entityID = dataProxy->getEntityIdFromMainPrefix("E7"); int cqz = dataProxy->getCQZFromId(entityID); int ituz = dataProxy->getITUzFromEntity(entityID); QSqlQuery query; query.prepare("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?)"); // Insert "T9" query.addBindValue("T9"); query.addBindValue(entityID); query.addBindValue(cqz); query.addBindValue(ituz); if (!query.exec()) { query.finish(); return false; } entityID = dataProxy->getEntityIdFromMainPrefix("4O"); cqz = dataProxy->getCQzFromEntity(entityID); ituz = dataProxy->getITUzFromEntity(entityID); // Insert "4N" query.addBindValue("4N"); query.addBindValue(entityID); query.addBindValue(cqz); query.addBindValue(ituz); if (!query.exec()) { query.finish(); return false; } // Insert "YZ" query.addBindValue("YZ"); query.addBindValue(entityID); query.addBindValue(cqz); query.addBindValue(ituz); if (!query.exec()) { query.finish(); return false; } return true; //qDebug() << Q_FUNC_INFO << " - END"; } 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 << " - Start "; 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().text(), query.lastQuery()); } query.finish(); return false; } bool World::isAKnownCall(const QString &_callsign) { //qDebug() << Q_FUNC_INFO << ": " << _callsign; return specialCalls.contains(_callsign); } bool World::isAKnownPrefix(const QString &_prefix) { //qDebug() << Q_FUNC_INFO << ": " << _prefix; return longPrefixes.contains(_prefix); } bool World::executeQuery(QSqlQuery &query, const QString &queryString) const { if (!query.exec(queryString)) { return false; } return true; } void World::emitQueryError(const QSqlQuery &query) const { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } int World::getHowManyEmptyDXCCorCont() { // Refactored from DataProxy_SQLite::fillEmptyDXCCInTheLog() QSqlQuery query; 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) { query.next(); qsos = (query.value(0)).toInt(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); return qsos; } bool World::fillEmptyDXCCInTheLog() { //qDebug() << Q_FUNC_INFO << " - Start"; int qsos = getHowManyEmptyDXCCorCont(); 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); QString queryString = QString("SELECT id, call FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { int nameCol = -1; QSqlRecord rec = query.record(); QString _call = QString(); int _id = -1; int _dxcc = -1; QString _aux = QString(); QString _continent = QString(); int j = 0; while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("call"); _call = (query.value(nameCol)).toString(); _dxcc = getQRZARRLId(_call); //_dxcc = QString::number(getPrefixId(_call)); _continent = dataProxy->getContinentShortNameFromEntity(_dxcc); //qDebug() << Q_FUNC_INFO << ": DXCC: " << _dxcc; //qDebug() << Q_FUNC_INFO << ": Cont: " << _continent; // UPDATE THE ID WITH THE DXCC sqlOK = updateDXCCAndContinent(_id, _dxcc, _continent); if (!sqlOK) { query.finish(); return false; } 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() << Q_FUNC_INFO << ": progress canceled"; query.finish(); return true; } j++; } } query.finish(); 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().text(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool World::updateDXCCAndContinent(const int _id, const int _dxcc, const QString &_cont) { // Refactored from DataProxy_SQLite::fillEmptyDXCCInTheLog() QString queryString = QString("UPDATE log SET dxcc = :dxcc', cont = :cont WHERE id = :id"); QSqlQuery query; query.prepare(queryString); query.bindValue(":dxcc", _dxcc); query.bindValue(":cont", _cont); query.bindValue(":id", _id); if (query.exec(queryString)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } klog-2.4.1/klog.10000644000175000017500000000271315003153303012444 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. klog-2.4.1/startwizard.cpp0000644000175000017500000015447615003153303014526 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; //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"; } void StartWizard::setVersion(const QString &tversion) { version = tversion; } /*void StartWizard::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "StartWizard::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total); ctyPage->updateProgress(received, total); } */ /* void StartWizard::slotDownloadFinished() { //qDebug() << "StartWizard::slotDownloadFinished"; //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::slotButtonFinishedClicked() { //qDebug() << "StartWizard::slotButtonFinishedClicked "; setResult(2); } /* bool StartWizard::doTheDownload() { //qDebug() << "StartWizard::doTheDownload"; 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); 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); Q_UNUSED(total); progressBar->setValue(received); } void CTYPage::slotDownloadButtonClicked() { //qDebug() << "CTYPage::slotDownloadButtonClicked"; progressBar->setEnabled(true); progressBar->reset(); progressBar->setRange(0, 0); dl->download(); //completed = true; } void CTYPage::slotIgnoreDownloadButtonClicked() { //qDebug() << "CTYPage::slotIgnoreDownloadButtonClicked"; //ignoreDownloadButton->setChecked(true); slotStopProgressBar(); hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); } void CTYPage::slotDownloadFinished(const int ret) { //qDebug() << "CTYPage::slotDownloadFinished: " << QString::number(ret); 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); } else if (ret == -1) // File could not be created! { //qDebug() << "CTYPage::slotDownloadFinished: (file could not be created): " << QString::number(ret); } else { //qDebug() << "CTYPage::slotDownloadFinished: (another result): " << QString::number(ret); } } void CTYPage::slotDownloadError(const int ret) { //qDebug() << "CTYPage::slotDownloadError: " << QString::number(ret); 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"; progressBar->reset(); progressBar->setRange(0,1); progressBar->setValue(1); } klog-2.4.1/filemanager.cpp0000644000175000017500000017360215003153303014412 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 "callsign.h" //#include FileManager::FileManager(DataProxy_SQLite *dp) //FileManager::FileManager(const QString &_klogDir, const QString &_softVersion, DataBase _db) { //qDebug() << Q_FUNC_INFO << " -3: Dir(2)" << _klogDir; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " -3: Dir(2) - END" ; } FileManager::~FileManager() { delete(db); delete(awards); delete(world); } void FileManager::init() { //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); klogVersion = dataProxy->getSoftVersion(); klogDir = util->getHomeDir(); defaultStationCallsign = QString(); //constrid = 1; //constrid = 2; ignoreUnknownAlways = false; usePreviousStationCallsignAnswerAlways = false; duplicatedQSOSlotInSecs = 15; sendEQSLByDefault = false; dbCreated = false; rstTXDefault = false; rstRXDefault = false; noMoreQso = false; //hashLogs.clear(); util->setVersion(klogVersion); } 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) "; return false; } QString q0 = qs.at(0); QString q1 = qs.at(1); //qDebug() << Q_FUNC_INFO << qs.at(0); //qDebug() << Q_FUNC_INFO << qs.at(1); 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() << Q_FUNC_INFO << " -1 "; return false; } //i = (qs.at(0)).indexOf(":"); //i = (qs.at(0)).length() - i -1; //qDebug() << "i = " << QString::number(i) << "/" << qs.at(0); //len = ( (qs.at(0)).right(i)).toInt(); //qDebug() << "len = " << QString::number(len); if ( (q1).length() != len ) { //qDebug() << Q_FUNC_INFO << " -2: " << (qs.at(1)) << " - " << QString::number((qs.at(1)).length()) << "/" << QString::number(len); return false; } if (len <= 0) { //qDebug() << Q_FUNC_INFO << " -3 "; return false; } //qDebug() << Q_FUNC_INFO << " -4 (true)"; return true; } bool FileManager::adifLogExport(const QString& _fileName, const int _logN) { //qDebug() << Q_FUNC_INFO << _fileName; return adifLogExportToFile(_fileName, _logN, false, false, false); } void FileManager::showError (const QString &_txt) { //qDebug() << Q_FUNC_INFO << ": " << _txt; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Error")); msgBox.setIcon(QMessageBox::Warning); QString aux = QString(_txt ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); } void FileManager::setSendQSLByDefault (const bool _send) { sendEQSLByDefault = _send; } QList FileManager::adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em) { //qDebug() << Q_FUNC_INFO << ": Start)" << _fileName << "/" << _callsign << "/ " << _grid; QList qsos; qsos.clear(); Callsign call(_callsign); if ((!call.isValid()) && (_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"; showError(tr("The selected log does not exist, please check it again.")); return qsos; } } QString queryStringCount; QString queryString; QString _queryStation; QString _queryGrid; if (_callsign == "NOT") { //qDebug() << Q_FUNC_INFO << ": else: " << _callsign; _queryStation = QString(" ((station_callsign ='') OR (station_callsign IS NULL))"); } else if (_callsign == "ALL") { //qDebug() << Q_FUNC_INFO << ": ALL: " << _callsign; _queryStation = QString(" station_callsign !='ALL'"); } else { //qDebug() << Q_FUNC_INFO << ": ValidCall: " << _callsign; _queryStation = QString(" station_callsign ='%1'").arg(_callsign); } //qDebug() << Q_FUNC_INFO << ": _queryStation: " << _queryStation; if (util->isValidGrid(_grid)) { _queryGrid = QString(" AND my_gridsquare = '%1'").arg(_grid); } else if (_grid == "NOT") { _queryGrid = QString(" AND (my_gridsquare = '' OR my_gridsquare IS NULL)"); } else { _queryGrid = QString(); } 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() << Q_FUNC_INFO << ": Exporting for LoTW"; // 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 + _queryGrid + 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() << Q_FUNC_INFO << ": Exporting for ClubLog"; 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() << Q_FUNC_INFO << ": Exporting for eQSL"; 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() << Q_FUNC_INFO << ": Exporting normal ADIF"; if (_callsign == "ALL") { queryStringCount = QString("SELECT COUNT (id) FROM log"); queryString = QString("SELECT * FROM log"); } else if (_callsign == "NOT") { queryStringCount = QString("SELECT COUNT (id) FROM log WHERE ") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; queryString = QString("SELECT * FROM log WHERE ") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; } else { queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; queryString = QString("SELECT * FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; } } //qDebug() << Q_FUNC_INFO << ": Query Count: " << queryStringCount; //qDebug() << Q_FUNC_INFO << ": Query data: " << queryString; int numberOfQsos = dataProxy->getHowManyQSOInLog(_logN); int i = 0; bool sqlOK = query.exec(queryStringCount); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query Error" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << ": " << QString::number(step); 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() << Q_FUNC_INFO << ": " << query.lastQuery(); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query Error" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return qsos; } int nameCol; //qDebug() << Q_FUNC_INFO << ": Entering the While..." ; QSqlRecord rec; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << ": Start of While" ; if (query.isValid()) { rec = query.record(); nameCol = rec.indexOf("id"); qsos.append((query.value(nameCol)).toInt()); writeQuery(rec, out, _em, false, false, _logN); // JustMarked = false, onlyRequested = false //Use std::move(query) instead of query? // Copy queries is deprecated i++; //qDebug() << Q_FUNC_INFO << ": Start of isValid" ; } // END of if (query.isValid()) else { //qDebug() << Q_FUNC_INFO << ": Querty NOT isValid" ; } //qDebug() << Q_FUNC_INFO << ": Checking if cancelled" ; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << ": ******************************** UPDATING THE MESSAGE! " << QString::number(i) ; QString aux = tr("Exporting ADIF file...\n QSO: %1 / %2 ").arg(i).arg(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); //qDebug() << Q_FUNC_INFO << ": ******************************** UPDATING THE MESSAGE: " << aux ; } 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() << Q_FUNC_INFO << ": End: " << QString::number(qsos.count()); progress.setValue(numberOfQsos); return qsos; } QList FileManager::adifLogExportReturnList2(const QString& _fileName, const QString &_callsign, QList _qsos, const ExportMode _em, const int _logN) { Q_UNUSED(_logN); //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " - QSOs: " << QString::number(_qsos.length ()); //qDebug() << Q_FUNC_INFO << ": Start)" << _fileName << "/" << _callsign << "/ " << _grid; QList qsos; qsos.clear(); Callsign call(_callsign); if ((!call.isValid()) && (_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; } QString queryString; if (_em == ModeLotW) { queryString = QString("call, freq, bandid, band_rx, freq_rx, modeid, gridsquare, my_gridsquare, qso_date, prop_mode, sat_name, station_callsign"); } else if (_em == ModeClubLog) { queryString = QString("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"); } else if (_em == ModeEQSL) { queryString = QString("call, rst_sent, freq, bandid, modeid, submode, qso_date, prop_mode, operator, station_callsign, sat_name, my_cnty, my_gridsquare, my_lat, my_lon, qslmsg, sat_mode, sat_name"); } else { // THis is ModeADIF and ModeQRZ we will upload ALL the ADIF files queryString = QString("*"); } if (adifQSOsExport2(_fileName, queryString, _qsos, _em)) { return _qsos; } else { return qsos; } //qDebug() << Q_FUNC_INFO << " - END"; return qsos; } bool FileManager::adifQSOsExport(const QString& _fileName, QList _qsos) { //qDebug() << Q_FUNC_INFO << _fileName; int numberOfQSOs = _qsos.length(); if (numberOfQSOs<1) { //TODO: Warn the user NO QSOS TO EXPORT //qDebug() << "FileManager::adifQSOsExport: No QSOs received to be exported"; } noMoreQso = false; //qDebug() << Q_FUNC_INFO << " - 01"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << Q_FUNC_INFO << " - 02"; QTextStream out(&file); QSqlQuery query; //qDebug() << Q_FUNC_INFO << " - 10"; QString numbers = QString(); foreach (int i, _qsos) { //qDebug() << Q_FUNC_INFO << " - query: " << QString("id = '%1'").arg(i) ; numbers = numbers + QString::number(i) ; if (i != _qsos.last()) { numbers = numbers + ", "; } } QString queryString = QString("SELECT * FROM log WHERE id IN (%1)").arg(numbers); //qDebug() << Q_FUNC_INFO << " - writing the header"; writeADIFHeader(out, ModeADIF, _qsos.length()); //qDebug() << Q_FUNC_INFO << " - writing the body"; bool sqlOK = query.exec(queryString); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " - query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << "FileManager::adifQSOsExport: query: " << 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")); int currentQso = 0; int step = util->getProgresStepForDialog(numberOfQSOs); QSqlRecord rec; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << "FileManager::adifLogExportToFile - Just in the While"; if (query.isValid()) { rec = query.record(); //qDebug() << "FileManager::adifLogExportToFile - Query is Valid"; writeQuery(rec, out, ModeADIF, false, false, -1); } // Closes the isValid else { //qDebug() << "FileManager::adifLogExportToFile - Query is NOT Valid"; } //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " ; 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); 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"; return true; } bool FileManager::adifQSOsExport2(const QString& _fileName, const QString& _fields, QList _qsos, ExportMode _em) { // The fields are the database fields that are to be selected in the query //qDebug() << Q_FUNC_INFO << " - Start"; int numberOfQSOs = _qsos.length(); if (numberOfQSOs<1) { //TODO: Warn the user NO QSOS TO EXPORT //qDebug() << Q_FUNC_INFO << " - No QSOs received to be exported"; } QString fields = _fields; if (_fields.length ()<1) { fields = "*"; } bool exportAll = false; if ((_qsos.at(0) == -1) && (_qsos.size() == 1)) { numberOfQSOs = dataProxy->getHowManyQSOInLog(-1); exportAll = true; } noMoreQso = false; //qDebug() << Q_FUNC_INFO << " - 01"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << Q_FUNC_INFO << " - 02"; QTextStream out(&file); QSqlQuery query; //qDebug() << Q_FUNC_INFO << " - 10"; QString numbers = QString(); foreach (int i, _qsos) { //qDebug() << Q_FUNC_INFO << " - query: " << QString("id = '%1'").arg(i) ; numbers = numbers + QString::number(i) ; if (i != _qsos.last()) { numbers = numbers + ", "; } } QString queryString; if (exportAll) { queryString = QString("SELECT %1 FROM log").arg(fields); } else { queryString = QString("SELECT %1 FROM log WHERE id IN (%2)").arg(fields).arg(numbers); } //qDebug() << Q_FUNC_INFO << " - writing the header"; writeADIFHeader(out, _em, numberOfQSOs); //qDebug() << Q_FUNC_INFO << " - writing the body"; bool sqlOK = query.exec(queryString); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " -query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - query: " << 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")); int currentQso = 0; int step = util->getProgresStepForDialog(numberOfQSOs); QSqlRecord rec; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << " - Just in the While"; if (query.isValid()) { rec = query.record(); //qDebug() << Q_FUNC_INFO << " - Query is Valid"; writeQuery(rec, out, ModeADIF, false, false, -1); } // Closes the isValid else { //qDebug() << Q_FUNC_INFO << " - Query is NOT Valid"; } //qDebug() << Q_FUNC_INFO << " - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " - Showing progress: " ; QString aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQSOs); progress.setLabelText(aux1); progress.setValue(currentQso); } //qDebug() << Q_FUNC_INFO << " - after showing progress (current%Step): " << QString::number(currentQso%step); 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() << Q_FUNC_INFO << " - END"; 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() << Q_FUNC_INFO << _fileName; Q_UNUSED(_lotw); bool exportJustMarkedQSO = justMarked; //bool marked = false; bool exportOnlyQSLRequested = _qslRequested; //bool haveMode = false; noMoreQso = false; //qDebug() << Q_FUNC_INFO << " - 10"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << Q_FUNC_INFO << " - 11"; 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(); //qDebug() << Q_FUNC_INFO << " - 20"; 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().text(), 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() << Q_FUNC_INFO << " - 30"; //qDebug() << "FileManager::adifLogExportToFile - end get numberOfQsos = " << QString::number(numberOfQsos); step = util->getProgresStepForDialog(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 31"; //qDebug() << "FileManager::adifLogExportToFile END - Steps = " << QString::number(step); //step = getProgresStepForDialog(numberOfQsos); writeADIFHeader(out, ModeADIF, numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 32"; 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); } } //qDebug() << Q_FUNC_INFO << " - 40"; QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - 41"; QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); QDateTime date; //qDebug() << Q_FUNC_INFO << " - 50"; QSqlRecord rec; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << " - 50.1"; if (query.isValid()) { rec = query.record(); writeQuery(rec, out, ModeADIF, exportJustMarkedQSO, exportOnlyQSLRequested, _logN); //qDebug() << Q_FUNC_INFO << " - 50.2"; } // Closes the isValid //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " ; aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux1); progress.setValue(currentQso); //qDebug() << Q_FUNC_INFO << " - 50.3"; } //qDebug() << "FileManager::adifLogExportToFile - after showing progress (current%Step): " << QString::number(currentQso%step); if ( progress.wasCanceled() ) { //qDebug() << Q_FUNC_INFO << " - 50.7"; 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() << Q_FUNC_INFO << " - 60"; //qDebug() << "FileManager::adifLogExportToFile - after the While"; progress.setValue(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 70"; if (noMoreQso) { //TODO: Remove the file (_fileName) //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = true"; file.remove(); //qDebug() << Q_FUNC_INFO << " - 70.1"; return false; } else { //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = false"; //qDebug() << Q_FUNC_INFO << " - 70.2"; return writeBackupDate(); } //qDebug() << Q_FUNC_INFO << " - END"; } bool FileManager::printQs(const QStringList &_line) //bool FileManager::printQs(const QString &_q, const QStringList _line) { QStringList qs = _line; for (int i = 0; i _qsos; _qsos.clear(); if (!dataProxy->doesThisLogExist(logN)) { //qDebug() << Q_FUNC_INFO << " - : ERROR: The log does not exist: " << QString::number(logN); return 0; } //qDebug() << Q_FUNC_INFO << " - - 10" ; //QString fn = "blotw.adi"; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - File not found" << fileName; 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 0; } //qDebug() << Q_FUNC_INFO << " - - 20" ; int numberOfQsos = 0; QString line = QString(); bool hasEOH = false; //qDebug() << Q_FUNC_INFO << " - - 30" ; 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(); Callsign callsign(stationCallSign); if (!callsign.isValid()) { stationCallSign = QString(); } } //qDebug() << Q_FUNC_INFO << " - - line-1: " << line ; numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { //qDebug() << Q_FUNC_INFO << " - - line-1: EOH FOUND!" ; hasEOH = true; pos = file.pos(); } } file.seek(pos); //qDebug() << Q_FUNC_INFO << " - END" ; return adifReadLog2(fileName, stationCallSign, logN); } int FileManager::adifReadLog2(const QString& tfileName, QString _stationCallsign, int logN) { //qDebug() << Q_FUNC_INFO << " - Start: " << tfileName << "/" << QString::number(logN); QFile file( tfileName ); if (!file.exists ()) { //qDebug() << Q_FUNC_INFO << " - END: file does not exist"; return false; } int qsos = howManyQSOsInFile (file); //qDebug() << Q_FUNC_INFO << " - QSOs: " << QString::number(qsos); qint64 pos = passHeader (file); // Position in the file to calculate where the header ends if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " File not found" ; return false; } file.seek (pos); // QSO Data starts here QSO qso; QStringList fields; // fields keeps the running array, fields.clear (); QString line = QString(); //line.clear(); qso.clear (); //qDebug() << Q_FUNC_INFO << ": Progress defined" ; QProgressDialog progress(tr("Reading ADIF file..."), tr("Abort reading"), 0, qsos, this); progress.setMaximum(qsos); progress.setWindowModality(Qt::ApplicationModal); progress.setValue(0); //progress.setWindowTitle(tr("Import")); progress.setAutoClose(true); int step = util->getProgresStepForDialog(qsos); int i = 0; bool noMoreQSO = false; //qDebug() << Q_FUNC_INFO << ": We start the while" ; while ((!file.atEnd()) && (!noMoreQSO)) { // One line is read and splitted into the list of fields // Fields are analyzed one by one and extracted from the list of fields // Fields are added to the QSO // If the field is the QSO is completed and added to the log. // Once the QSO is added to the log, QSO is cleared and process continues // Once the list of fields is empty, we read another file and start again // until we reach the end of file line.clear(); line.append(file.readLine().trimmed().toUpper()); //qDebug() << Q_FUNC_INFO << ": Reading the line: " << line ; fields << line.split("<", QT_SKIP); while (!fields.isEmpty()) { //qDebug() << Q_FUNC_INFO << QString(": Fields still has %1 items").arg(fields.count()) ; QString fieldToAnalyze = "<" + (fields.takeFirst()).trimmed(); //qDebug() << Q_FUNC_INFO << QString(": Extracted: %1").arg(fieldToAnalyze) ; if ((fieldToAnalyze.contains ("")) || (fieldToAnalyze.contains("")) ) { //qDebug() << Q_FUNC_INFO << QString(": EOR detected, QSO added"); qso.setLogId (logN); Callsign call1(_stationCallsign); Callsign call2(qso.getStationCallsign()); if ((call1.isValid()) && (!call2.isValid())) { qso.setStationCallsign(_stationCallsign); } qso.toDB (); qso.clear (); i++; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " MOD 0 - i = " << QString::number(i) ; QString aux = tr("Importing ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } else { //qDebug() << Q_FUNC_INFO << " Mod: "<< QString::number(i) << " mod " << QString::number(step) << " = " << QString::number(i % step); } } else { //qDebug() << Q_FUNC_INFO << QString(": Adding this to the QSO: %1").arg(fieldToAnalyze) ; //fieldToAnalyze must be an ADIF record: Data qso.setData (fieldToAnalyze); } if ( progress.wasCanceled() ) { //qDebug() << Q_FUNC_INFO << QString(": Progress Cancelled") ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString 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; } } //qDebug() << Q_FUNC_INFO << QString(": Field process finished: ").arg(fieldToAnalyze) ; } //qDebug() << Q_FUNC_INFO << QString(": List of fields is empty!") ; } //qDebug() << Q_FUNC_INFO << QString(": End of File or no more QSOs") ; file.close (); progress.setValue(qsos); // Closes the progressDialog //qDebug() << Q_FUNC_INFO << " - END"; return i; } qint64 FileManager::passHeader(QFile & _f) { //qDebug() << Q_FUNC_INFO << " - Start: " << _f.fileName (); QFile &file = _f; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " File not found" ; return false; } //bool hasEOH = false; qint64 pos = file.pos(); QString line; while ( !file.atEnd() ) { line = file.readLine ().toUpper (); //qDebug() << Q_FUNC_INFO << " - " << line; if (line.count ("")>0) { break; } } pos = file.pos(); file.close (); //qDebug() << Q_FUNC_INFO << " - END (" << QString::number(pos) << ")"; return pos; } QHash FileManager::SwitchHash; void FileManager::initializeSwitchHash() { SwitchHash = { {"CALL", 1}, {"QSO_DATE", 2}, {"BAND", 3}, {"MODE", 4}, {"SUBMODE", 5}, {"SRX", 6}, {"STX", 7}, {"TIME_ON", 8}, {"QSO_DATE_OFF", 9}, {"BAND_RX", 10}, {"TIME_OFF", 11}, {"RST_SENT", 12}, {"RST_RCVD", 13}, {"SRX_STRING", 14}, {"STX_STRING", 15}, {"CQZ", 16}, {"ITUZ", 17}, {"DXCC", 18}, {"ADDRESS", 19}, {"AGE", 20}, {"CNTY", 21}, {"COMMENT", 22}, {"A_INDEX", 23}, {"ANT_AZ", 24}, {"ANT_EL", 25}, {"ANT_PATH", 26}, {"ARRL_SECT", 27}, {"AWARD_GRANTED", 28}, {"AWARD_SUBMITTED", 29}, {"CHECKCONTEST", 30}, {"CLASS", 31}, {"CONT", 32}, {"CONTACTED_OP", 33}, {"CONTEST_ID", 34}, {"COUNTRY", 35}, {"CREDIT_SUBMITTED", 36}, {"CREDIT_GRANTED", 37}, {"DISTANCE", 38}, {"DARC_DOK", 39}, {"EQ_CALL", 40}, {"EMAIL", 41}, {"EQSL_QSLRDATE", 42}, {"EQSL_QSLSDATE", 43}, {"EQSL_QSL_RCVD", 44}, {"EQSL_QSL_SENT", 45}, {"FISTS", 46}, {"FISTS_CC", 47}, {"FORCE_INIT", 48}, {"FREQ", 49}, {"FREQ_RX", 50}, {"GRIDSQUARE", 51}, {"HRDLOG_QSO_UPLOAD_DATE", 53}, {"HRDLOG_QSO_UPLOAD_STATUS", 54}, {"MY_GRIDSQUARE", 55}, {"MY_ANTENNA", 56}, {"IOTA", 57}, {"IOTA_ISLAND_ID", 58}, {"MY_IOTA", 59}, {"MY_DXCC", 60}, {"MY_FISTS", 61}, {"MY_IOTA_ISLAND_ID", 62}, {"K_INDEX", 63}, {"LAT", 64}, {"LON", 65}, {"MY_LAT", 66}, {"MY_LON", 67}, {"MY_ITU_ZONE", 68}, {"MY_POSTAL_CODE", 69}, {"LOTW_QSLRDATE", 70}, {"LOTW_QSLSDATE", 71}, {"LOTW_QSL_RCVD", 72}, {"LOTW_QSL_SENT", 73}, {"CLUBLOG_QSO_UPLOAD_DATE", 74}, {"CLUBLOG_QSO_UPLOAD_STATUS", 75}, {"MAX_BURSTS", 76}, {"MS_SHOWER", 77}, {"MY_CITY", 78}, {"MY_CNTY", 79}, {"MY_COUNTRY", 80}, {"MY_CQ_ZONE", 81}, {"MY_NAME", 82}, {"NAME", 83}, {"OPERATOR", 84}, {"STATION_CALLSIGN", 85}, {"OWNER_CALLSIGN", 86}, {"MY_RIG", 87}, {"MY_SIG", 88}, {"MY_SIG_INFO", 89}, {"MY_SOTA_REF", 90}, {"MY_STATE", 91}, {"STATE", 92}, {"MY_STREET", 93}, {"MY_USACA_COUNTIES", 94}, {"MY_VUCC_GRIDS", 95}, {"NOTES", 96}, {"NR_BURSTS", 97}, {"NR_PINGS", 98}, {"PFX", 99}, {"PRECEDENCE", 100}, {"PROP_MODE", 101}, {"PUBLIC_KEY", 102}, {"QRZCOM_QSO_UPLOAD_DATE", 103}, {"QRZCOM_QSO_UPLOAD_STATUS", 104}, {"QSLMSG", 105}, {"QSLRDATE", 106}, {"QSLSDATE", 107}, {"QSL_RCVD", 108}, {"QSL_SENT", 109}, {"QSL_RCVD_VIA", 110}, {"QSL_SENT_VIA", 111}, {"QSL_VIA", 112}, {"QSO_COMPLETE", 113}, {"QSO_RANDOM", 114}, {"QTH", 115}, {"REGION", 116}, {"RIG", 117}, {"RX_PWR", 118}, {"TX_PWR", 119}, {"SAT_MODE", 120}, {"SAT_NAME", 121}, {"SFI", 122}, {"SIG", 123}, {"SIG_INFO", 124}, {"SILENT_KEY", 125}, {"SKCC", 126}, {"SOTA_REF", 127}, {"SWL", 128}, {"TEN_TEN", 129}, {"UKSMG", 130}, {"USACA_COUNTIES", 131}, {"VE_PROV", 132}, {"VUCC_GRIDS", 133}, {"WEB", 134}, {"APP_KLOG_TRX", 137}, {"APP_KLOG_LOGN", 138}, {"APP_N1MM_POINTS", 139} }; } bool FileManager::getStationCallsignFromUser(const QString &_qrzDX, const QDate &_dt) { //qDebug() << "FileManager::getStationCallsignFromUser: " << _qrzDX << "/" << util->getDateSQLiteStringFromDate(_dt) << "-"; bool ok; QString text; QString aux; QString _date = QString(); if (_dt.isValid()) { _date = ", on "+ util->getDateSQLiteStringFromDate(_dt) ; } Callsign callsign(_qrzDX); if (callsign.isValid()) { 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); } callsign(text); if (ok && callsign.isValid()) { defaultStationCallsign = text.toUpper(); return true; } else { return false; } } void FileManager::queryPreparation(const int _logN) { //qDebug() << "FileManager::queryPreparation log: " << QString::number(_logN); //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 " ; return; } for (int i=0;i'); file.close (); //qDebug() << Q_FUNC_INFO << " - END-1"; return ((data.at(1)).toInt()); } } } else if (line.contains("EOR")) { qsos++; } } file.close(); //qDebug() << Q_FUNC_INFO << " - END"; return qsos; } int FileManager::howManyLogsInFile(QFile& _f) { //qDebug() << "FileManager::howManyLogsInFile:"; QFile &file = _f; //qint64 pos; //Position in the file QString line = QString(); QStringList fields = QStringList(); QStringList logs = QStringList(); QString aux = QString(); QStringList data = QStringList(); bool atLeastOneLog = false; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileManager::howManyLogsInFile File not found"; return false; } //pos = file.pos(); while ( !file.atEnd() ) { //line = file.readLine(); line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("APP_KLOG_LOGN")) { fields.clear(); fields << line.split("<", QT_SKIP); foreach (aux, fields) { aux = aux.trimmed(); if (aux.contains("APP_KLOG_LOGN")) { data.clear(); data << aux.split('>'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0); //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1); if (!logs.contains(data.at(1))) { logs.append(data.at(1)); } } } } else if (line.contains("EOR")) { atLeastOneLog = true; } } //qDebug() << "FileManager::howManyLogsInFile: JUST ONE!" << aux; file.close(); if ( (logs.size()<2) && atLeastOneLog ) { return 1; } return logs.size(); } bool FileManager::fillHashLog(QFile &_f) { //qDebug() << Q_FUNC_INFO << " - Start" ; //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); //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1); 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; QStringList result; result.clear(); if (_field == "") { //qDebug() << "FileManager::readAdifField: EOR found!!"; result << "EOR" << "EOR"; return result; } if (!((_field.startsWith("<")) && (_field.contains(":")) && (_field.contains(">")))) { //qDebug() << "FileManager::readAdifField: NOT (contains : and >): " << _field; 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); int dataLength; QString field; QString fieldType; //qDebug() << "FileManager::readAdifField: analyzing..." ; 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"; return QStringList(); } field.remove('<'); data = data.left(dataLength); //qDebug() << "FileManager::readAdifField: field: " << field; //qDebug() << "FileManager::readAdifField: dataLength: " << QString::number(dataLength); //qDebug() << "FileManager::readAdifField: data: " << data; //qDebug() << "FileManager::readAdifField: fieldType: " << fieldType; if (data.length() != dataLength) { //qDebug() << "FileManager::readAdifField: data.length != dataLength: " << QString::number(data.length()) << "/" << QString::number(dataLength); return QStringList(); } result.clear(); result << field << data; //qDebug() << "FileManager::readAdifField: OK: " << field << "/" << data; return result; } QDateTime FileManager::getDateTimeOfLastBackup() { //qDebug() << "FileManager::getDateTimeOfLastBackup: " << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss")<< QT_ENDL; //qDebug() << "FileManager::getDateTimeOfLastBackup: " << util->getCfgFile(); 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"); //qDebug() << "FileManager::writeBackupDate: current: " << (getDateTimeOfLastBackup()).toString("yyyyMMdd-hhmmss"); 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() << Q_FUNC_INFO << " - " << _st; Callsign callsign(_st); if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - True"; defaultStationCallsign = _st; //qDebug() << Q_FUNC_INFO << " - " << defaultStationCallsign; } else { //qDebug() << Q_FUNC_INFO << " - FALSE"; } //qDebug() << Q_FUNC_INFO << " - -" << defaultStationCallsign << "-END"; } bool FileManager::askUserToUseAlwaysSameAnswer() { //qDebug() << Q_FUNC_INFO << " - Start " ; 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() << Q_FUNC_INFO << " - - END"; } bool FileManager::askUserToAddThisQSOToLog(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq) { Q_UNUSED(_freq); //qDebug() << Q_FUNC_INFO << " - " << _call; 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() << Q_FUNC_INFO << " - - END"; } 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 "; } else { out << "ADIF v3.1.0 Export from KLog\nhttps://www.klog.xyz/klog\n" << klogVersion << "\nKLOG "; out << "" << QString::number(_numberOfQsos); out << "" << QDateTime::currentDateTime().toString("yyyyMMdd-hhmm"); } out << "\n"; } void FileManager::writeQuery(QSqlRecord &rec, QTextStream &out, const ExportMode _em, const bool _justMarked, const bool _onlyRequested, const int _logN ) { out << dataProxy->getADIFFromQSOQuery(rec, _em, _justMarked, _onlyRequested, _logN); } klog-2.4.1/softwareupdatedialog.h0000644000175000017500000000436415003153303016020 0ustar develdevel#ifndef KLOG_SOFTWAREUPDATEDIALOG_H #define KLOG_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-2.4.1/inputwidgets/0000755000175000017500000000000015003153303014151 5ustar develdevelklog-2.4.1/inputwidgets/mainwindowinputothers.h0000644000175000017500000001433015003153303021004 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTOTHERS_H #define KLOG_INPUTWIDGETS_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" #include "../world.h" #include "../qso.h" class MainWindowInputOthers : public QWidget { Q_OBJECT friend class tst_MainWindowInputOthers; public: MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputOthers(); void setDarkMode (const bool _dm); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); void setEntitiesList(const QStringList _qs); void setEntity(const int _entity); // Move the external call to setEntityAndPrefix int getEntity(); QString getEntityPrefix(); void setEntityAndPrefix(const int _entity, const QString &_qrz); // Receives the entity & prefix of the call to check if // It is possible to focus the primary // subdivision. Updates also the IOTA continent 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 setDistance(const double _op); double getDistance(); bool setVUCCGrids(const QString &_op); QString getVUCCGrids(); bool setPOTA_REF(const QString &_op); QString getPOTA_REF(); bool setSIG(const QString &_op); QString getSIG(); bool setSIG_INFO(const QString &_op); QString getSIG_INFO(); bool setWWFF_Ref(const QString &_op); QString getWWFF_Ref(); void setIOTA(const QString &_qs); QString getIOTA(); void setIOTAContinent(const QString &_qs); bool isIOTAModified(); void clearIOTA(); void setKeep(const bool _b); bool getKeep(); bool setState(const QString &_op); // Sets a subdivision / State QString getState(); // Reads the subdivision / State void createUI(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setLogLevel (const DebugLogLevel _l); signals: void setPropMode(const QString _p); void debugLog (QString _func, QString _msg, DebugLogLevel _level); //void showAll(bool _showAll); 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(); void slotPrimarySubdivisionsComboBoxChanged(); void slotShowAllCheckBoxChanged(); void slotEntityNameComboBoxChanged(); 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(); void updateShowAll(); void setPaletteIOTA(const bool _ok); void updatePrimarySubdivisionsComboBox(QList _subdivisions); //bool getDarkMode(); void readDarkMode(); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); Utilities *util; DataProxy_SQLite *dataProxy; World *world; bool darkMode; QStringList entitiesList, propModeList; //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; QLineEdit *iotaNumberLineEdit; QCheckBox *keepPropCheckBox, *showAllCheckBox; QPalette palRed, palBlack, palWhite; bool autoUpdating; QComboBox *userDefinedADIFComboBox; QLineEdit *userDefinedADIFValueLineEdit; QStringList adifValidTypes; QString currentPref; int currentInt; // if the showAllCheckBox is toggled QString sota_ref, vucc_grids, pota_ref, sig, sig_info, wwff_ref; double age, distance; DebugLogLevel logLevel; }; #endif // MAINWINDOWINPUTOTHERS_H klog-2.4.1/inputwidgets/mainwindowmydatatab.h0000644000175000017500000001330715003153303020371 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWMYDATATAB_H #define KLOG_INPUTWIDGETS_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 "../klogdefinitions.h" #include "../locator.h" #include "../utilities.h" #include "../adif.h" #include "../dataproxy_sqlite.h" #include "../qso.h" //#include "dataproxy_sqlite.h" class MainWindowMyDataTab : public QWidget { Q_OBJECT public: explicit MainWindowMyDataTab(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowMyDataTab(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); void setDarkMode (const bool _dm); void createUI(); void setData(const QString &_stationCallsign, const QString &_operator, const QString &_myLocator); //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 setMyPota_ref(const QString &_op); QString getMyPota_ref(); bool setMySig(const QString &_op); QString getMySig(); bool setMySig_info(const QString &_op); QString getMySig_info(); bool setMyWWFF_Ref(const QString &_op); QString getMyWWFF_Ref(); 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); void setLogLevel (const DebugLogLevel _b); void loadSettings(); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); 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: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); bool setInitialADIFValues(); void setColorsForMyUserADIFLineEdit(); bool checkMyVUCC_GRIDS(const QString &_string); void readDarkMode(); bool darkMode; 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; DataProxy_SQLite *dataProxy; Utilities *util; bool modify; QString my_rig, my_sota, my_antenna, my_vucc_grids, my_pota_ref, my_sig, my_sig_info, my_wwff_ref; DebugLogLevel logLevel; //bool getDarkMode(); }; #endif // MAINWINDOWMYDATATAB_H klog-2.4.1/inputwidgets/mainwindowinputeqsl.h0000644000175000017500000001002415003153303020440 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTEQSL_H #define KLOG_INPUTWIDGETS_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" #include "../qso.h" class MainWindowInputEQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputEQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputEQSL(); //void setData(const QString &_comment); //QString getComment(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); 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-2.4.1/inputwidgets/mainwindowinputqsl.h0000644000175000017500000000727515003153303020311 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSL_H #define KLOG_INPUTWIDGETS_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" #include "../qso.h" class MainWindowInputQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSL(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); 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-2.4.1/inputwidgets/mainwindowinputqso.h0000644000175000017500000001131315003153303020300 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSO_H #define KLOG_INPUTWIDGETS_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" #include "../qso.h" class MainWindowInputQSO : public QWidget { Q_OBJECT friend class tst_MainWindowInputQSO; public: explicit MainWindowInputQSO(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSO(); void setDarkMode (const bool _dm); void setPaletteRightName(const bool _ok); void setPaletteRightQTH(const bool _ok); void setPaletteRightDXLocator(const bool _ok); QString getDXLocator(); void setDXLocator(const QString &_loc, bool _completing = false); QString getName(); void setName(const QString &_st, bool _completing = false); QString getQTH(); void setQTH(const QString &_st, bool _completing = false); 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(const bool _dataFromQRZCOM); void clearName(); void clearQTH(); void clearDXLocator(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); 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(); //void slotPaletteChanged(QPalette _p); private: bool eventFilter(QObject *object, QEvent *event); void createUI(); void setDefaultData(); bool getDarkMode(); void setSplitCheckBox(); void readDarkMode(); 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, completedWithPreviousName, completedWithPreviousQTH, completedWithPreviousLocator; bool darkMode; }; #endif // MAINWINDOWINPUTQSO_H klog-2.4.1/inputwidgets/mainwindowinputeqsl.cpp0000644000175000017500000006152615003153303021010 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" ; util = new Utilities(Q_FUNC_INFO); 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" ; } MainWindowInputEQSL::~MainWindowInputEQSL() { delete(util); //delete(dataProxy); } QSO MainWindowInputEQSL::getQSOData(QSO _qso) { QSO qso = _qso; qso.setClubLogStatus(getClubLogStatus()); qso.setEQSLQSL_RCVD(getEQSLRecStatus()); qso.setEQSLQSL_SENT(getEQSLSenStatus()); qso.setLoTWQSL_RCVD(getLOTWRecStatus()); qso.setLoTWQSL_SENT(getLOTWSenStatus()); qso.setQRZCOMStatus(getQRZCOMStatus()); qso.setClubLogDate(getClubLogDate()); qso.setEQSLQSLRDate(getEQSLRecDate()); qso.setEQSLQSLSDate(getEQSLSenDate()); qso.setLoTWQSLRDate(getLOTWRecDate()); qso.setLoTWQSLSDate(getLOTWSenDate()); qso.setQRZCOMDate(getQRZCOMDate()); return qso; } void MainWindowInputEQSL::setQSOData(const QSO &_qso) { QSO qso(_qso); setClubLogStatus(qso.getClubLogStatus()); setClubLogDate(qso.getClubLogDate()); setEQSLRecDate(qso.getEQSLQSLRDate()); setEQSLSenDate(qso.getEQSLQSLSDate()); setEQSLRecStatus(qso.getEQSLQSL_RCVD()); setEQSLSenStatus(qso.getEQSLQSL_SENT()); setLOTWRecDate(qso.getLoTWQSLRDate()); setLOTWSenDate(qso.getLoTWQSLSDate()); setLOTWRecStatus(qso.getLoTWQSL_RCVD()); setLOTWSenStatus(qso.getLoTWQSL_SENT()); setQRZCOMDate(qso.getQRZCOMDate()); setQRZCOMStatus(qso.getQRZCOMStatus()); } 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" ; // 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() << Q_FUNC_INFO << clublogComboBox->currentText(); _pm = (((clublogComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << " - From UI: " << _pm; return _pm; } QString MainWindowInputEQSL::getQRZCOMStatus() { QString _pm = QString(); _pm = (((qrzcomComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << " - From UI: " << _pm; return _pm; } QString MainWindowInputEQSL::getEQSLRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus:" << eqslRecComboBox->currentText(); _pm = (((eqslRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getEQSLSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus:" << eqslSentComboBox->currentText(); _pm = (((eqslSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus:" << lotwRecComboBox->currentText(); _pm = (((lotwRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus:" << lotwSentComboBox->currentText(); _pm = (((lotwSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } void MainWindowInputEQSL::setClubLogStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs; 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; 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; //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+" -"; if((( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: found: " << _qs << " - Index: " << QString::number(eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found"; if (queueSentByDefault) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is defined by default"; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("Q", Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is NOT defined by default"; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("N", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found"; //eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus - END"; } void MainWindowInputEQSL::setLOTWRecStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setLOTWRecStatus: " << _qs; 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; 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"; //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->setVisible(true); lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); break; case 4: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); break; default: //NO //lotwRecQDateEdit->setVisible(false); lotwRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotLotwSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwSentComboBoxChanged"; 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->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO //lotwSentQDateEdit->setVisible(false); lotwSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLRecvComboBoxChanged"; //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->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO //eqslRecQDateEdit->setVisible(false); eqslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLSentComboBoxChanged"; 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->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO //eqslSentQDateEdit->setVisible(false); 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->setVisible(true); clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: clublogQDateEdit->setVisible(true); clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO //clublogQDateEdit->setVisible(false); clublogQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setClubLogDate(const QDate _qs) { //qDebug() << Q_FUNC_INFO << "Date: " << _qs.toString("dd/MM/yyyy"); if (_qs.isValid()) { clublogQDateEdit->setDate(_qs); } else { clublogQDateEdit->setDate(QDate::currentDate()); } } void MainWindowInputEQSL::slotQRZCOMComboBoxChanged() { int i = qrzcomComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: qrzcomQDateEdit->setVisible(true); qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: qrzcomQDateEdit->setVisible(true); qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO //qrzcomQDateEdit->setVisible(false); qrzcomQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setQRZCOMDate(const QDate _qs) { if (_qs.isValid()) { qrzcomQDateEdit->setDate(_qs); } else { qrzcomQDateEdit->setDate(QDate::currentDate()); } } void MainWindowInputEQSL::setEQSLRecDate(const QDate _qs) { if (_qs.isValid()) { eqslRecQDateEdit->setDate(_qs); } else { eqslRecQDateEdit->setDate(QDate::currentDate()); } } void MainWindowInputEQSL::setEQSLSenDate(const QDate _qs) { if (_qs.isValid()) { eqslSentQDateEdit->setDate(_qs); } else { eqslSentQDateEdit->setDate(QDate::currentDate()); } } void MainWindowInputEQSL::setLOTWRecDate(const QDate _qs) { if (_qs.isValid()) { lotwRecQDateEdit->setDate(_qs); } else { lotwRecQDateEdit->setDate(QDate::currentDate()); } } void MainWindowInputEQSL::setLOTWSenDate(const QDate _qs) { if (_qs.isValid()) { lotwSentQDateEdit->setDate(_qs); } else { lotwSentQDateEdit->setDate(QDate::currentDate()); } } 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-2.4.1/inputwidgets/mainwindowinputqsl.cpp0000644000175000017500000002732215003153303020637 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" ; util = new Utilities(Q_FUNC_INFO); 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" ; } MainWindowInputQSL::~MainWindowInputQSL() { delete(util); } QSO MainWindowInputQSL::getQSOData(QSO _qso) { QSO qso = _qso; qso.setQSL_SENT(getQSLSenStatus()); qso.setQSLSDate(getQSLSenDate()); qso.setQSLSenVia(getSentVia()); qso.setQSL_RCVD(getQSLRecStatus()); qso.setQSLRDate(getQSLRecDate()); qso.setQSLRecVia(getRecVia()); qso.setQSLVia(getQSLVia()); qso.setQSLMsg(getQSLMsg()); return qso; } void MainWindowInputQSL::setQSOData(const QSO &_qso) { QSO qso(_qso); setQSLSenStatus(qso.getQSL_SENT()); setQSLSenDate(qso.getQSLSDate()); setQSLSenVia(qso.getQSLSentVia()); setQSLRecStatus(qso.getQSL_RCVD()); setQSLRecDate(qso.getQSLRDate()); setQSLRecVia(qso.getQSLRecVia()); setQSLVia(qso.getQSLVia()); setQSLMsg(qso.getQSLMsg()); } 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; return _pm; } QString MainWindowInputQSL::getRecVia() { QString _pm = QString(); _pm = (((qslRecViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputQSL::getRecVia: " << _pm; 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; 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()); 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-2.4.1/inputwidgets/mainwindowsattab.cpp0000644000175000017500000010023215003153303020226 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" ; satNameComboBox = new QComboBox; satNameLineEdit = new QLineEdit; satModeLineEdit = new QLineEdit; satOtherLabel = new QLabel; satBandTXComboBox = new QComboBox; satBandRXComboBox = new QComboBox; //txFreqSpinBox = new QDoubleSpinBox; //rxFreqSpinBox = new QDoubleSpinBox; keepThisDataForNextQSOQcheckbox = new QCheckBox; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); createUI(); populateSatComboBox(); qsoToEditInProcess = false; modifying = false; updatingBands = false; updatingSat = 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" ; } MainWindowSatTab::~MainWindowSatTab(){ delete(util); //delete(dataProxy); } QSO MainWindowSatTab::getQSOData(QSO _qso) { QSO qso = _qso; qso.setSatName(getSatName()); qso.setSatMode(getSatMode()); return qso; } void MainWindowSatTab::setQSOData(const QSO &_qso) { QSO qso(_qso); setSatName(qso.getSatName()); setSatMode(qso.getSatMode()); } 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 (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.")); 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 *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); 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() << Q_FUNC_INFO << ": " << satNameComboBox->currentText(); if (modifying || (satNameComboBox->currentText().length()<4)) { //qDebug() << Q_FUNC_INFO << ": Modifying: return"; return; } updatingSat = true; int i = satNameComboBox->currentIndex(); //qDebug() << Q_FUNC_INFO << ": SAT index: " << QString::number(i); satNameLineEdit->clear(); if (i == 0) { //qDebug() << Q_FUNC_INFO << ": i=0, emitting setPropModeSat - Not"; emit setPropModeSat("Not", false); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); satModeLineEdit->clear(); } else if(i == 1) { //qDebug() << Q_FUNC_INFO << ": i=1, emitting setPropModeSat - SAT"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(true); satOtherLabel->setEnabled(true); autofillSatMode(); } else { //qDebug() << Q_FUNC_INFO << ": i = else, emitting setPropModeSat - SAT"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); setBandsOfSat(satNameComboBox->currentText()); //dataProxy->getSatelliteMode(satNameComboBox->currentText()) autofillSatMode(); } updatingSat = false; //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatNameTextChanged() { //qDebug() << Q_FUNC_INFO << ": " << satNameLineEdit->text(); int cursor = satNameLineEdit->cursorPosition (); satNameLineEdit->setText((util->getClearSQLi (satNameLineEdit->text())).toUpper()); if (modifying ) { satNameLineEdit->setCursorPosition (cursor); //qDebug() << Q_FUNC_INFO << ": Modifying return"; return; } if ((satNameLineEdit->text()).length()>0) { //qDebug() << Q_FUNC_INFO << ": Emitting setPropModeSat -SAT- signal"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); } else if ((satModeLineEdit->text()).length()<1) { //qDebug() << Q_FUNC_INFO << ": Emitting setPropModeSat -Not- signal"; emit setPropModeSat("Not", false); } satNameLineEdit->setCursorPosition (cursor); //qDebug() << Q_FUNC_INFO << ": - END"; } void MainWindowSatTab::slotSatModeTextChanged() { //qDebug() << Q_FUNC_INFO << ": - " << satModeLineEdit->text(); /* satModeLineEdit->setText((satModeLineEdit->text()).toUpper()); if ((satModeLineEdit->text()).length()>0) { emit setPropModeSat("SAT"); } else if ((satNameLineEdit->text()).length()<1) { emit setPropModeSat("Not"); } */ //qDebug() << Q_FUNC_INFO << ": - END"; } 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() << Q_FUNC_INFO << ": - " << satNameComboBox->currentText(); QString _pm = QString(); QString satName = QString(); _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); //qDebug() << "MainWindowSatTab::satNameComboBox: " << _pm; if (satNameComboBox->currentIndex() == 0) { //qDebug() << Q_FUNC_INFO << ": 0 return "; return QString(); } else if(satNameComboBox->currentIndex() == 1) { satName = satNameLineEdit->text(); if (satName.length()>0) { //qDebug() << Q_FUNC_INFO << ": - satName.length>0 return: " << satName; return satName; } else { //qDebug() << Q_FUNC_INFO << ": - else return"; return QString(); } } else { //qDebug() << Q_FUNC_INFO << ": - return _pm: " << _pm; return _pm; } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setNoSat() { //qDebug() << Q_FUNC_INFO << ": - Start"; satNameComboBox->setCurrentIndex(0); setSatMode("-CLEAR-"); keepThisDataForNextQSOQcheckbox->setChecked(false); //qDebug() << Q_FUNC_INFO << "- END"; } void MainWindowSatTab::setSatName(const QString &_t) { //TODO: Check that the format is OK //qDebug() << Q_FUNC_INFO << ": " << _t; //satNameLineEdit->setText(_t); if (_t =="") { //qDebug() << Q_FUNC_INFO << ": empty- return"; return; } if (getSatIndex(_t) > 0) { setSatelliteCombo(_t); } else { satNameComboBox->setCurrentIndex(1); satNameLineEdit->setText(_t); } //qDebug() << Q_FUNC_INFO << " - END"; } QString MainWindowSatTab::getSatMode() { //qDebug() << Q_FUNC_INFO << ": " << satModeLineEdit->text(); return satModeLineEdit->text(); } void MainWindowSatTab::setSatMode(const QString &_t) { //qDebug() << Q_FUNC_INFO << ": " << _t ; if (_t == "-CLEAR-") { satModeLineEdit->clear(); } else { satModeLineEdit->setText(_t); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::clear(bool _full) { //qDebug() << Q_FUNC_INFO << " - Start" ; modifying = false; if ((keepThisDataForNextQSOQcheckbox->isChecked()) || (!_full)) { //qDebug() << Q_FUNC_INFO << " - Keep this data is checked or not Full clear" ; return; } else { satModeLineEdit->clear(); satNameComboBox->setCurrentIndex(0); satNameLineEdit->clear(); } if (_full) { //qDebug() << Q_FUNC_INFO << ": Clear the keepThisDataForNextQSOQcheckbox"; keepThisDataForNextQSOQcheckbox->setChecked (false); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::refreshData() { //qDebug() << Q_FUNC_INFO << " - Start" ; populateSatComboBox(); //autofillSatMode(); } void MainWindowSatTab::populateSatComboBox() { //qDebug() << Q_FUNC_INFO << " - Start" ; 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); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setSatelliteCombo(const QString &_p) { //qDebug() << Q_FUNC_INFO << " - Start: " << _p ; QString aux = QString(); int indexC = getSatIndex(_p); //int indexC = satNameComboBox->findText(_p, Qt::MatchContains); //qDebug() << "MainWindowsatTab::setSatelliteCombo: N=" << QString::number(indexC); 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; } } } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setOtherSatName(const QString &_t) { //qDebug() << Q_FUNC_INFO << " - Start: " << _t ; satNameLineEdit->setText(_t); } int MainWindowSatTab::getSatIndex(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": - " << QString::number(satNameComboBox->findText(_p, Qt::MatchContains)) ; return satNameComboBox->findText(_p, Qt::MatchContains); } void MainWindowSatTab::addBands(QStringList _bands) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_bands.length()); 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() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setDefaultBands() {//Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist in the selected bands //qDebug() << Q_FUNC_INFO << " - Start" ; QStringList _b; _b.clear(); _b << "10M" << "2M" << "70CM" << "23CM"; satBandRXComboBox->addItems(_b); satBandTXComboBox->addItems(_b); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatBandRXComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start" ; if (updatingBands || modifying) { //qDebug() << Q_FUNC_INFO << " - return 1"; return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(freqRX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << " changing to: Band: " << satBandTXComboBox->currentText() ; //qDebug() << Q_FUNC_INFO << " changing to: " << QString::number(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())) ; setNoSat (); updateRXFreq(dataProxy->getLowLimitBandFromBandName(satBandRXComboBox->currentText())); } autofillSatMode(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatBandTXComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - " << satBandTXComboBox->currentText(); if (updatingBands || modifying || (satBandTXComboBox->currentText().length()<2)) { //qDebug() << Q_FUNC_INFO << " - return"; return; } //qDebug() << Q_FUNC_INFO << " - Freq: " << QString::number(freqTX); QString tmpBand = satBandTXComboBox->currentText(); bool freqInBand = dataProxy->isThisFreqInBand(tmpBand, QString::number(freqTX)); 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() ; //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged changing to: " << QString::number(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())) ; Frequency tmpFreq = dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(satBandTXComboBox->currentText())); //qDebug() << ": Normal" << dataProxy->getSatelliteUplink(getSatName()); //qDebug() << ": Normal1" << dataProxy->getSatelliteUplink(getSatName(), 1); //qDebug() << ": Normal2" << dataProxy->getSatelliteUplink(getSatName(), 2); //qDebug() << ": Full" << dataProxy->getSatelliteFullUplink(getSatName()); double upLink = tmpFreq.toDouble(); double downLink; if (dataProxy->isThisFreqInBand(tmpBand,dataProxy->getSatelliteUplink(getSatName(),1)) ) { upLink = (dataProxy->getSatelliteUplink(getSatName(),1)).toDouble(); downLink = (dataProxy->getSatelliteDownlink(getSatName(),1)).toDouble(); updateRXFreq(downLink); } else if (dataProxy->isThisFreqInBand(tmpBand,dataProxy->getSatelliteUplink(getSatName(),0)) ) { upLink = (dataProxy->getSatelliteUplink(getSatName(),0)).toDouble(); downLink = (dataProxy->getSatelliteDownlink(getSatName(),1)).toDouble(); updateRXFreq(downLink); } else { //qDebug() << Q_FUNC_INFO << " - Selected satelite does not work in the selected band. NO sat should be selected"; setNoSat (); } updateTXFreq(upLink); } autofillSatMode(); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindowSatTab::setUpLink(const QString &_t) { //qDebug() << Q_FUNC_INFO << "Start: " << _t ; if (satBandTXComboBox->currentText () == _t) { //qDebug() << Q_FUNC_INFO << "END-1"; return; } int index = satBandTXComboBox->findText(_t, Qt::MatchCaseSensitive); //qDebug() << "MainWindowsatTab::setUpLink: new index: " << QString::number(index); //qDebug() << "MainWindowsatTab::setUpLink: current index: " << QString::number(satBandTXComboBox->currentIndex()); //int indexRX; if (index>=0) { satBandTXComboBox->setCurrentIndex(index); } /* if (index>=0) { satBandTXComboBox->setCurrentIndex(index); if ( dataProxy->getIdFromBandName("2M") == dataProxy->getIdFromBandName(_t) ) { //qDebug() << satNameComboBox->currentText() ; 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); } } */ //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setUpLinkFreq(const double _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_t); if ((!updatingSat) && (!qsoToEditInProcess)) { //qDebug() << Q_FUNC_INFO << ": Calling setNoSat"; //setNoSat (); } updateTXFreq(_t); setUpLink(dataProxy->getBandNameFromFreq(_t)); //qDebug() << Q_FUNC_INFO << "END"; } double MainWindowSatTab::getRXFreq() { //qDebug() << Q_FUNC_INFO << " - Start" ; return freqRX; } void MainWindowSatTab::setDownLinkFreq(const double _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_t); if (util->isSameFreq (freqRX, _t)) { //qDebug() << Q_FUNC_INFO << " - Is same freq"; return; } updateRXFreq(_t); QString downLinkBand = dataProxy->getBandNameFromFreq(freqRX); int index = satBandRXComboBox->findText(downLinkBand, Qt::MatchCaseSensitive); //qDebug() << Q_FUNC_INFO << ": " << downLinkBand; if (index>=0) { satBandRXComboBox->setCurrentIndex(index); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::updateRXFreq(const double _f) { //qDebug() << Q_FUNC_INFO << QString::number(_f); if (util->isSameFreq (freqRX, _f)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } freqRX = _f; if (modifying) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } int bandId = dataProxy->getBandIdFromFreq(freqRX); if (bandId>=1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << Q_FUNC_INFO << " - Freq IS in ham band"; bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(freqRX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << " - Freq in current band"; QString aux; aux = dataProxy->getBandNameFromFreq(freqRX); if (satBandRXComboBox->findText(aux, Qt::MatchCaseSensitive)<0) { addNewBand(aux); } //addNewBand(const QString &_p) satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(aux, Qt::MatchCaseSensitive)); } } emit satRxFreqChanged(freqRX); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::updateTXFreq(const double _f) { //qDebug() << Q_FUNC_INFO << QString::number(_f); // 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)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } freqTX = _f; if (modifying) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } int bandId = dataProxy->getBandIdFromFreq(freqTX); if (bandId>=1) { //This prevent that a non-hamradio frequency is used on TX bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(freqTX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << ": If the freq does not belong to the current band, we need to update the band"; //qDebug() << Q_FUNC_INFO << ": We define UpLink to: " << dataProxy->getBandNameFromFreq(txFreqSpinBox->value()); QString aux = dataProxy->getBandNameFromFreq(freqTX); //qDebug() << Q_FUNC_INFO << QString("FreqTx = %1 / Band = %2").arg(freqTX).arg(aux); if (satBandTXComboBox->findText(aux, Qt::MatchCaseSensitive)<0) { addNewBand(aux); } satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(aux, Qt::MatchCaseSensitive)); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } //autofillSatMode(); } //qDebug() << Q_FUNC_INFO << QString::number(freqTX); emit satTxFreqChanged(freqTX); //qDebug() << Q_FUNC_INFO << " - END"; } 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 function: // - identifies the freqs & bands that the sat is using //qDebug() << Q_FUNC_INFO << ": " << _p << " - Short: " << _p.section(' ', 0, 0); //"AO-7 - AMSAT-OSCAT 7" //2M/10M << 2M/70CM if (modifying) { //qDebug() << Q_FUNC_INFO << ": modifying return"; return; } double upLink = (dataProxy->getSatelliteUplink(_p.section(' ', 0, 0))).toDouble(); double downLink = (dataProxy->getSatelliteDownlink(_p.section(' ', 0, 0))).toDouble(); //qDebug() << Q_FUNC_INFO << ": upLink: " << QString::number(upLink)<< QT_ENDL; //qDebug() << Q_FUNC_INFO << ": 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; updateTXFreq(0.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; updateRXFreq(0.0); //satBandRXComboBox->setCurrentIndex(0); } //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emiting: " << QString::number(downLink)<< QT_ENDL; //emit satRxFreqChanged(downLink); //qDebug() << Q_FUNC_INFO << ": " << _p << " - END " ; } void MainWindowSatTab::addNewBand(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; if (dataProxy->getIdFromBandName(_p)<0) { //qDebug() << "MainWindowSatTab::addNewBand: Id: " << QString::number(dataProxy->getIdFromBandName(_p)); return; } QStringList bands; bands.clear(); int indexRX = satBandRXComboBox->currentIndex(); int indexTX = satBandTXComboBox->currentIndex(); //qDebug() << "MainWindowSatTab::addNewBand: RX Id: " << QString::number(satBandRXComboBox->count()); //qDebug() << "MainWindowSatTab::addNewBand: TX Id: " << QString::number(satBandTXComboBox->count()); 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); satBandRXComboBox->setCurrentIndex(indexRX); satBandTXComboBox->setCurrentIndex(indexTX); //addBands(bands); //qDebug() << Q_FUNC_INFO << ": 2 RX Id: " << QString::number(satBandRXComboBox->count()); //qDebug() << Q_FUNC_INFO << ": 2 TX Id: " << QString::number(satBandTXComboBox->count()); } void MainWindowSatTab::setModifying (const bool _m) { //qDebug() << Q_FUNC_INFO << util->boolToQString(_m); modifying = _m; } void MainWindowSatTab::setFillingToEdit(const bool _m) { // Some functions should know that data is arriving to the UI from qsoToEdit to // prevent some auto settings, like band setting when a satellite is selected. //qDebug() << Q_FUNC_INFO << util->boolToQString(_m); qsoToEditInProcess = _m; } void MainWindowSatTab::slotReturnPressed() { //qDebug() << Q_FUNC_INFO << " - Start"; emit returnPressed(); } void MainWindowSatTab::slotSatKeepThisDataClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; if (keepThisDataForNextQSOQcheckbox->isChecked()) { //qDebug() << Q_FUNC_INFO << ": True"; } else { //qDebug() << Q_FUNC_INFO << ": False"; } slotSatNameComboBoxChanged(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::autofillSatMode() { //qDebug() << Q_FUNC_INFO << " - Start"; QString downLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(freqRX)); QString upLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(freqTX)); satModeLineEdit->setText(upLinkBand + "/" + downLinkBand); //qDebug() << Q_FUNC_INFO << " - END"; } QString MainWindowSatTab::bandToLetter(const QString &_band) { //qDebug() << Q_FUNC_INFO << " - Start: " << _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) { //qDebug() << Q_FUNC_INFO << " - Start"; keepThisDataForNextQSOQcheckbox->setChecked (_b); } // Commented as it was duplicated code //void MainWindowSatTab::setRepeatThis(const bool _t) //{ // //qDebug() << Q_FUNC_INFO << " - Start" ; // keepThisDataForNextQSOQcheckbox->setChecked(_t); //} bool MainWindowSatTab::getKeep() { //qDebug() << Q_FUNC_INFO << " - Start"; return keepThisDataForNextQSOQcheckbox->isChecked (); } // Commented as it was duplicated code //bool MainWindowSatTab::getRepeatThis() //{ // //qDebug() << Q_FUNC_INFO << " - Start" ; // return keepThisDataForNextQSOQcheckbox->isChecked(); //} bool MainWindowSatTab::getDarkMode() { //qDebug() << Q_FUNC_INFO << " - Start"; if (satNameLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } klog-2.4.1/inputwidgets/mainwindowsattab.h0000644000175000017500000001256615003153303017707 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWSATTAB_H #define KLOG_INPUTWIDGETS_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" #include "../qso.h" class MainWindowSatTab : public QWidget { Q_OBJECT friend class tst_MainWindowSatTab; friend class tst_Main; public: explicit MainWindowSatTab(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowSatTab(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); QString getSatName(); void setSatName(const QString &_t); void setOtherSatName(const QString &_t); void setNoSat(); QString getSatMode(); double getRXFreq(); //double getTXFreq(); 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 updateTXFreq(const double _f); //void updateRXFreq(const double _f); //void setLocator(const QString &_t); void refreshData(); void setModifying (const bool _m); void setFillingToEdit(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 updateTXFreq(const double _f); void updateRXFreq(const double _f); void autofillSatMode(); QLineEdit *satNameLineEdit; QLineEdit *satModeLineEdit; //QLineEdit *satDXLocatorLineEdit; QLabel *satOtherLabel; QCheckBox *keepThisDataForNextQSOQcheckbox; QComboBox *satNameComboBox; QComboBox *satBandTXComboBox, *satBandRXComboBox; QStringList satNames, satModes; QStringList satellitesList; bool updatingBands, updatingSat; bool qsoToEditInProcess; // True just when MainWindow::qsoToEdit is being executed QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) //QDoubleSpinBox *txFreqSpinBox, *rxFreqSpinBox; DataProxy_SQLite *dataProxy; Utilities *util; double freqTX, freqRX; int downLinkBandId, upLinkBandId; QString downLinkBand, upLinkBand; bool modifying; bool getDarkMode(); }; #endif // MAINWINDOWSATTAB_H klog-2.4.1/inputwidgets/mainwindowinputqso.cpp0000644000175000017500000006544515003153303020652 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() << Q_FUNC_INFO << " - Start"; 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" ; } MainWindowInputQSO::~MainWindowInputQSO() { //delete(dataProxy); } void MainWindowInputQSO::setModifying(const bool _m) { //qDebug() << Q_FUNC_INFO << " - Start"; modify = _m; } void MainWindowInputQSO::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; 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(6); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); txFreqSpinBox->setKeyboardTracking(false); txFreqSpinBox->setSingleStep(0.001); rxFreqSpinBox->setDecimals(6); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox->setKeyboardTracking(false); rxFreqSpinBox->setSingleStep(0.001); 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 *rstLabelN = new QLabel(this); rstLabelN->setText(tr("RST")); rstLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstTxLabelN = new QLabel(this); rstTxLabelN->setText(tr("TX")); rstTxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstRxLabelN = new QLabel(this); rstRxLabelN->setText(tr("RX")); rstRxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QHBoxLayout *RSTLabelsLayout = new QHBoxLayout; RSTLabelsLayout->addWidget (rstTxLabelN); RSTLabelsLayout->addWidget (rstLabelN); RSTLabelsLayout->addWidget (rstRxLabelN); QHBoxLayout *RSTValuesLayout = new QHBoxLayout; RSTValuesLayout->addWidget (rstTXLineEdit); RSTValuesLayout->addWidget (rstRXLineEdit); QVBoxLayout *RSTLayout = new QVBoxLayout; RSTLayout->addLayout (RSTLabelsLayout); RSTLayout->addLayout (RSTValuesLayout); /* * 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 *freqLabelsN = new QLabel(this); freqLabelsN->setText(tr("Frequency")); freqLabelsN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //freqLabelsN->setAlignment(Qt::AlignCenter); QLabel *txfreqLabelN = new QLabel(this); txfreqLabelN->setText(tr("TX")); txfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //txfreqLabelN->setAlignment(Qt::AlignLeft); QLabel *rxfreqLabelN = new QLabel(this); rxfreqLabelN->setText(tr("RX")); rxfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //rxfreqLabelN->setAlignment(Qt::AlignRight); QHBoxLayout *freqTXLayout = new QHBoxLayout; freqTXLayout->addWidget (txfreqLabelN); freqTXLayout->addWidget (splitCheckBox); QHBoxLayout *freqTitleLayout = new QHBoxLayout; freqTitleLayout->addLayout(freqTXLayout); freqTitleLayout->addWidget(freqLabelsN); freqTitleLayout->addWidget(rxfreqLabelN); QHBoxLayout *freqDataLayout = new QHBoxLayout; freqDataLayout->addWidget(txFreqSpinBox); 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(nameLineEdit, SIGNAL(paletteChanged(QPalette)), this, SLOT(slotPaletteChanged(QPalette)) ); 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); } QSO MainWindowInputQSO::getQSOData(QSO _qso) { QSO qso = _qso; qso.setGridSquare(getDXLocator()); qso.setName(getName()); qso.setQTH(getQTH()); qso.setRSTRX(getRSTRX()); qso.setRSTTX(getRSTTX()); qso.setFreq(getTXFreq()); qso.setFreqRX(getRXFreq()); qso.setRXPwr(getRXPwr()); setRSTToMode(qso.getSubmode(), true); qso.setBandRX (dataProxy->getBandNameFromFreq (getRXFreq())); qso.setBand(dataProxy->getBandNameFromFreq (getTXFreq())); return qso; } void MainWindowInputQSO::setQSOData(const QSO &_qso) { QSO qso(_qso); setDXLocator(qso.getGridSquare()); setName(qso.getName()); setQTH(qso.getQTH()); setRSTRX(qso.getRSTRX()); setRSTTX(qso.getRSTTX()); setTXFreq(qso.getFreqTX()); setRXFreq(qso.getFreqRX()); setRXPwr(qso.getRXPwr()); } void MainWindowInputQSO::setDefaultData() { //qDebug() << Q_FUNC_INFO << " - Start"; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); completedWithPreviousName = false; completedWithPreviousQTH = false; completedWithPreviousLocator = false; rxFreqBeingAutoChanged = false; txFreqBeingAutoChanged = false; isSATPropagation = false; propMode = QString(); freqTX = 0.0; freqRX = 0.0; modify = false; readDarkMode(); } void MainWindowInputQSO::readDarkMode() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setDarkMode(settings.value("DarkMode", false).toBool ()); settings.endGroup (); } void MainWindowInputQSO::clear() { //qDebug() << Q_FUNC_INFO << " - Start"; qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); rxPowerSpinBox->setValue(0); modify = false; } void MainWindowInputQSO::cleanQRZCOM(const bool _dataFromQRZCOM) { //qDebug() << Q_FUNC_INFO << " - Start"; if (_dataFromQRZCOM) { qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); } } void MainWindowInputQSO::clearName() { //qDebug() << Q_FUNC_INFO << " - Start"; nameLineEdit->clear(); completedWithPreviousName = false; } void MainWindowInputQSO::clearQTH() { //qDebug() << Q_FUNC_INFO << " - Start"; qthLineEdit->clear(); completedWithPreviousQTH = false; } void MainWindowInputQSO::clearDXLocator() { //qDebug() << Q_FUNC_INFO << " - Start"; locatorLineEdit->clear (); completedWithPreviousLocator = false; } void MainWindowInputQSO::slotReturnPressed() { //qDebug() << Q_FUNC_INFO << " - Start"; emit returnPressed(); } void MainWindowInputQSO::slotLocatorTextChanged() {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << Q_FUNC_INFO << " - Start"; int cursorP = locatorLineEdit->cursorPosition(); locatorLineEdit->setText((util->getClearSQLi(locatorLineEdit->text())).toUpper()); if ( util->isValidGrid((locatorLineEdit->text()).toUpper()) || locatorLineEdit->text ().isEmpty ()) { //qDebug() << Q_FUNC_INFO << ": VALID: " << locatorLineEdit->text(); 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()); //qDebug() << Q_FUNC_INFO << ": LON: " << locator->getLon(locatorLineEdit->text()); } else { //qDebug() << Q_FUNC_INFO << ": NOT VALID: " << locatorLineEdit->text(); 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 << " - Start"; return locatorLineEdit->text(); } void MainWindowInputQSO::setDXLocator(const QString &_loc, bool _completing) { //qDebug() << Q_FUNC_INFO << " - Start"; if (!util->isValidGrid(_loc)) return; if (_completing) { locatorLineEdit->setText (_loc.toUpper ()); } if ((_loc.length()>=0) && ((getDXLocator()).length()<=0) ) { setPaletteRightDXLocator (true); locatorLineEdit->setText (_loc.toUpper ()); completedWithPreviousLocator=true; } else if (completedWithPreviousLocator && (_loc != getDXLocator())) { completedWithPreviousLocator = false; setPaletteRightDXLocator(false); } } QString MainWindowInputQSO::getName() { //qDebug() << Q_FUNC_INFO << " - Start"; return nameLineEdit->text (); } void MainWindowInputQSO::setName(const QString &_st, bool _completing) { //qDebug() << Q_FUNC_INFO << " - Start"; if (!_completing) { nameLineEdit->setText (_st); completedWithPreviousName = false; return; } if ((_st.length()>=0) && (getName().length()<=0) ) { //qDebug() << Q_FUNC_INFO << ": name: 1" ; nameLineEdit->setText (_st); setPaletteRightName (true); completedWithPreviousName = true; } else if (completedWithPreviousName && (_st != getName())) { //qDebug() << Q_FUNC_INFO << ": name: 2" ; completedWithPreviousName = false; setPaletteRightName (false); } } double MainWindowInputQSO::getTXFreq() { //qDebug() << Q_FUNC_INFO << " - Start"; return txFreqSpinBox->value(); } void MainWindowInputQSO::setTXFreq(const double _ft) { //qDebug() << Q_FUNC_INFO << " - Start"; if ( (_ft >= double(0)) && (_ft <= txFreqSpinBox->maximum())) { //qDebug() << Q_FUNC_INFO << ": defining FR: " << QString::number(_ft); txFreqSpinBox->setValue(_ft); } else { //qDebug() << Q_FUNC_INFO << ": defining FR: 0" ; txFreqSpinBox->setValue(0); } //qDebug() << Q_FUNC_INFO; } double MainWindowInputQSO::getRXFreq() { //qDebug() << Q_FUNC_INFO << " - Start"; return rxFreqSpinBox->value(); } void MainWindowInputQSO::setRXFreq(const double _ft) { //qDebug() << Q_FUNC_INFO << " - Start"; 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) { //qDebug() << Q_FUNC_INFO << " - Start: " << _pw; if (_pw>=0) { rxPowerSpinBox->setValue(_pw); } } QString MainWindowInputQSO::getQTH() { //qDebug() << Q_FUNC_INFO << " - Start"; return qthLineEdit->text(); } void MainWindowInputQSO::setQTH(const QString &_st, bool _completing) {// if _completing, I a completing from a previous QSO //qDebug() << Q_FUNC_INFO << " - Start"; if (!_completing) { qthLineEdit->setText(_st); return; } if ((_st.length()>=0) && (getQTH().length()<=0) ) { setPaletteRightQTH (true); completedWithPreviousQTH = true; qthLineEdit->setText(_st); } else if (completedWithPreviousQTH && (_st != getQTH())) { completedWithPreviousQTH = false; setPaletteRightQTH (false); } } QString MainWindowInputQSO::getRSTTX() { //qDebug() << Q_FUNC_INFO << " - Start"; return rstTXLineEdit->text(); } void MainWindowInputQSO::setRSTTX(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; rstTXLineEdit->setText (_st); } QString MainWindowInputQSO::getRSTRX() { //qDebug() << Q_FUNC_INFO << " - Start"; return rstRXLineEdit->text(); } void MainWindowInputQSO::setRSTRX(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; rstRXLineEdit->setText (_st); } void MainWindowInputQSO::setRSTToMode(const QString &_m, const bool _reading) { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << ": " << _m ; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") || (_m == "FM") || (_m == "AM") ) { //qDebug() << Q_FUNC_INFO << ": Detected SSB/LSB/USB" ; 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"; rstTXLineEdit->setText(util->getDefaultRST(_m)); rstRXLineEdit->setText(util->getDefaultRST(_m)); } } //void MainWindowInputQSO::slotPaletteChanged(QPalette _p) //{ //qDebug() << Q_FUNC_INFO << " - " << nameLineEdit->palette().color(QPalette::Base); //} //bool MainWindowInputQSO::getdarkMode //{ //qDebug() << Q_FUNC_INFO << " - Start: " << nameLineEdit->palette().color(QPalette::Base).name(QColor::HexRgb); //New faf9f8 //FOrmer color #646464 //qDebug() << Q_FUNC_INFO << " - Start: " << util->boolToQString((nameLineEdit->palette().color(QPalette::Base).name(QColor::HexRgb) == "#646464")); // return darkMode; //return (nameLineEdit->palette().color(QPalette::Base).name(QColor::HexRgb) == "#faf9f8"); //} void MainWindowInputQSO::setPaletteRightName(const bool _ok) { //qDebug() << Q_FUNC_INFO << " - Start"; if (_ok) { if (darkMode) { nameLineEdit->setPalette (palWhite); } else { nameLineEdit->setPalette (palBlack); } } else { nameLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightQTH(const bool _ok) { //qDebug() << Q_FUNC_INFO << " - Start"; if (_ok) { if (darkMode) { qthLineEdit->setPalette (palWhite); } else { qthLineEdit->setPalette (palBlack); } } else { qthLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightDXLocator(const bool _ok) { //qDebug() << Q_FUNC_INFO << " - Start"; if (_ok) { if (darkMode) { locatorLineEdit->setPalette (palWhite); } else { locatorLineEdit->setPalette (palBlack); } } else { locatorLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setDarkMode (const bool _dm) { darkMode = _dm; if (darkMode) { txFreqSpinBox->setPalette(palWhite); rxFreqSpinBox->setPalette(palWhite); //qDebug() << Q_FUNC_INFO << " - DarkMode: ON"; } else { //qDebug() << Q_FUNC_INFO << " - DarkMode: OFF"; txFreqSpinBox->setPalette(palBlack); rxFreqSpinBox->setPalette(palBlack); } } void MainWindowInputQSO::setPropModeFromSat(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; propMode = _p; if (propMode == "SAT") { splitCheckBox->setChecked (true); } else { splitCheckBox->setChecked (false); } } void MainWindowInputQSO::slotFreqTXChanged (double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); if (util->isSameFreq (_f, freqTX)) { //qDebug() << Q_FUNC_INFO << ": Same Freq return" ; 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 (darkMode) { //qDebug() << Q_FUNC_INFO << " - We are in darkmode"; txFreqSpinBox->setPalette(palWhite); } else { //qDebug() << Q_FUNC_INFO << " - We are NOT in darkmode"; txFreqSpinBox->setPalette(palBlack); } //qDebug() << Q_FUNC_INFO << ": emitting: " << QString::number(_f); 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 " ; } if ((!splitCheckBox->isChecked()) && !modify) { rxFreqSpinBox->setValue (_f); //qDebug() << Q_FUNC_INFO << ": copying to RX Freq " ; } //qDebug() << Q_FUNC_INFO << " - END" ; setSplitCheckBox(); } void MainWindowInputQSO::slotSplitClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; if (!splitCheckBox->isChecked()) { rxFreqSpinBox->setValue(txFreqSpinBox->value()); } } void MainWindowInputQSO::slotFreqRXChanged(double _f) { //qDebug() << Q_FUNC_INFO << " - Start"; 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 (darkMode) { //qDebug() << Q_FUNC_INFO << " - We are in darkmode"; rxFreqSpinBox->setPalette(palWhite); } else { //qDebug() << Q_FUNC_INFO << " - We are NOT in darkmode"; 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"; } 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"; } if (!rxFreqBeingAutoChanged) { //qDebug() << "MainWindow::slotFreqTXChanged: Updating SAT Downlink"; emit rxFreqChangedForSat(rxFreqSpinBox->value()); } */ //qDebug() << "MainWindow::slotFreqRXChanged: END"; setSplitCheckBox(); } void MainWindowInputQSO::setSplitCheckBox() { //qDebug() << Q_FUNC_INFO << " - Start"; if (util->isSameFreq(txFreqSpinBox->value(), rxFreqSpinBox->value())) { splitCheckBox->setChecked(false); } else { splitCheckBox->setChecked(true); } } void MainWindowInputQSO::receiveFocus() { //qDebug() << Q_FUNC_INFO << " - Start"; rstTXLineEdit->setFocus (); } bool MainWindowInputQSO::eventFilter (QObject *object, QEvent *event) { Q_UNUSED(object); //qDebug() << Q_FUNC_INFO << " - Start"; if (!(event->type() == QEvent::Paint )) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(event->type ()); } //qDebug() << Q_FUNC_INFO << ": " << object->objectName(); 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-2.4.1/inputwidgets/mainwindowinputcomment.cpp0000644000175000017500000001017715003153303021502 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" ; commentLineEdit = new QLineEdit(); keepThisDataForNextQSOQCheckbox = new QCheckBox; comment.clear(); createUI(); //qDebug() << "MainWindowInputComment::MainWindowInputComment - END" ; } 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 (); } QSO MainWindowInputComment::getQSOData(QSO _qso) { QSO qso = _qso; qso.setComment(getComment()); return qso; } void MainWindowInputComment::setQSOData(const QSO &_qso) { QSO qso(_qso); //qDebug() << Q_FUNC_INFO << qso.getCall(); setData(qso.getComment()); } klog-2.4.1/inputwidgets/mainwindowinputcomment.h0000644000175000017500000000510415003153303021141 0ustar develdevel#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTCOMMENT_H #define KLOG_INPUTWIDGETS_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 #include "../qso.h" 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(); QSO getQSOData(QSO _qso); void setQSOData(const QSO &_qso); private: QString comment; QLineEdit *commentLineEdit; QCheckBox *keepThisDataForNextQSOQCheckbox; }; #endif // MAINWINDOWINPUTCOMMENT_H klog-2.4.1/inputwidgets/mainwindowinputothers.cpp0000644000175000017500000011257115003153303021345 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" #include "../adif.h" #include "../callsign.h" MainWindowInputOthers::MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; logLevel = None; dataProxy = dp; world = new World(dataProxy,Q_FUNC_INFO); util = new Utilities(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); //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(); showAllCheckBox = 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(entityNameComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotEntityNameComboBoxChanged() ) ) ; connect(propModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPropModeComboBoxChanged() ) ) ; connect(userDefinedADIFComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUSerDefinedADIFComboBoxChanged() ) ) ; connect(userDefinedADIFValueLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentUserData() ) ); connect(entityPrimDivComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPrimarySubdivisionsComboBoxChanged()) ) ; connect(showAllCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotShowAllCheckBoxChanged() ) ) ; createUI(); setInitialADIFValues (); //qDebug() << Q_FUNC_INFO << ": "- END"; } MainWindowInputOthers::~MainWindowInputOthers() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); } QSO MainWindowInputOthers::getQSOData(QSO _qso) { QSO qso = _qso; qso.setDXCC(getEntity()); qso.setState(getState()); //qso.setCounty() //TODO: Related to entitySecDivComboBox when implemented qso.setIOTA(getIOTA()); qso.setPropMode(getPropModeFromComboBox()); qso.setSOTA_REF(getSOTA()); qso.setAge(getAge()); qso.setDistance(getDistance()); qso.setSIG(getSIG()); qso.setSIG_INFO(getSIG_INFO()); qso.setVUCCGrids(getVUCCGrids()); qso.setWWFF_Ref(getWWFF_Ref()); qso.setPOTA_Ref(getPOTA_REF()); return qso; } void MainWindowInputOthers::setQSOData(const QSO &_qso) { QSO qso(_qso); setEntity(qso.getDXCC()); setPropMode(qso.getPropMode(), false); setSOTA(qso.getSOTA_REF()); setAge(qso.getAge()); setDistance(qso.getDistance()); setVUCCGrids(qso.getVUCCGrids()); setPOTA_REF(qso.getPOTA_Ref()); setSIG(qso.getSIG()); setSIG_INFO(qso.getSIG_INFO()); setWWFF_Ref(qso.getWWFF_Ref()); setIOTA(qso.getIOTA()); setState(qso.getState()); } void MainWindowInputOthers::createUI() { //qDebug() << Q_FUNC_INFO ; logEvent (Q_FUNC_INFO, "Start", Debug); entitiesList.clear(); propModeList.clear(); adifValidTypes.clear(); autoUpdating = false; sota_ref = QString(); distance = 0; age = 0; currentInt = 0; currentPref = QString(); pota_ref = QString(); sig = QString(); sig_info = QString(); wwff_ref = QString(); darkMode = false; 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")); showAllCheckBox->setText(tr("Show All")); 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.")); showAllCheckBox->setToolTip(tr("Show all subdivisions for the current DXCC Entity.")); userDefinedADIFComboBox->setToolTip(tr("Select the appropriate ADIF field for this QSO.")); userDefinedADIFValueLineEdit->setToolTip (tr("Value for the selected ADIF field.")); entityPrimDivComboBox->setEnabled(true); entitySecDivComboBox->setEnabled(false); entityNameComboBox->setEnabled(true); propModeComboBox->setEnabled(true); keepPropCheckBox->setEnabled(true); showAllCheckBox->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(showAllCheckBox, 1, 3); 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->addWidget(propModeComboBox, 4, 1, 1, 2); tabLayout->addLayout(keepLayout, 4, 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); entitiesList.clear(); entitiesList.append( dataProxy->getEntitiesNames()); if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); entityNameComboBox->addItems(entitiesList); } //qDebug() << Q_FUNC_INFO << ": Trying to add PropModes"; propModeList = dataProxy->getPropModeList(); if (propModeList.size()>1) { //qDebug() << Q_FUNC_INFO << ": Adding PropModes"; propModeList.prepend("00 - " + tr("Not - Not Identified")); propModeComboBox->addItems(propModeList); } iotaContinentComboBox->addItems(dataProxy->getContinentShortNames()); iotaNumberLineEdit->setInputMask("000"); iotaNumberLineEdit->setText("000"); readDarkMode(); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } void MainWindowInputOthers::clear(bool _full) { //qDebug() << Q_FUNC_INFO << ": Full = " << util->boolToQString(_full); logEvent (Q_FUNC_INFO, "Start", Debug); entityNameComboBox->setCurrentIndex(0); userDefinedADIFComboBox->setCurrentIndex (0); entityPrimDivComboBox->clear(); entityPrimDivComboBox->addItem("00-" + tr("None Identified") + " (000)"); userDefinedADIFValueLineEdit->clear (); sota_ref = QString(); currentPref = QString(); currentInt = 0; distance = 0.0; age = 0; vucc_grids = QString(); pota_ref = QString(); sig = QString(); sig_info = QString(); wwff_ref = QString(); clearIOTA(); //iotaContinentComboBox->setCurrentIndex(0); //iotaNumberLineEdit->setText("000"); if ((!keepPropCheckBox->isChecked()) || _full) { //qDebug() << Q_FUNC_INFO << ": Clear the proModeComboBox"; propModeComboBox->setCurrentIndex(0); } if (_full) { //qDebug() << Q_FUNC_INFO << ": Clear the keepPropCheckBox"; keepPropCheckBox->setChecked (false); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setEntitiesList(const QStringList _qs) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_qs.length()); logEvent (Q_FUNC_INFO, "Start", Debug); entitiesList.clear(); entitiesList << _qs; if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); //entitiesList.prepend("00-Not Identified (000)"); entityNameComboBox->addItems(entitiesList); } logEvent (Q_FUNC_INFO, "END", Debug); } int MainWindowInputOthers::getEntity() { logEvent (Q_FUNC_INFO, "Start", Debug); QString aux = entityNameComboBox->currentText(); if (!aux.contains ('(')) { logEvent (Q_FUNC_INFO, "END-1", Debug); 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; logEvent (Q_FUNC_INFO, "END", Debug); return a.toInt (); } QString MainWindowInputOthers::getEntityPrefix() { //qDebug() << Q_FUNC_INFO << ": " << (entityNameComboBox->currentText()).split('-').at(0); logEvent (Q_FUNC_INFO, "Start-END", Debug); return (entityNameComboBox->currentText()).split('-').at(0); //return world->getQRZARRLId(pref); } void MainWindowInputOthers::setPropMode(const QString &_qs, bool _keep) { //qDebug() << Q_FUNC_INFO << ": " << _qs << "/ Keep: " << util->boolToQString(_keep); logEvent (Q_FUNC_INFO, "Start", Debug); autoUpdating = true; if(( propModeComboBox->findText(_qs+" -", Qt::MatchContains))>0) { //qDebug() << Q_FUNC_INFO << " PropMode found" ; propModeComboBox->setCurrentIndex( propModeComboBox->findText(_qs+" -", Qt::MatchContains)); keepPropCheckBox->setChecked(_keep); } else { //qDebug() << Q_FUNC_INFO << " PropMode NOT found" ; propModeComboBox->setCurrentIndex(0); keepPropCheckBox->setChecked(false); } autoUpdating = false; logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowInputOthers::getPropModeFromComboBox() { //logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << propModeComboBox->currentText(); QString _pm = (((propModeComboBox->currentText()).split('-')).at(1)).simplified(); //qDebug() << Q_FUNC_INFO << ": - 10" ; QString _n = (((propModeComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << ": - 11: " << _n ; if (_n == "00") { //qDebug() << Q_FUNC_INFO << ": - 12" ; logEvent (Q_FUNC_INFO, "END-1", Debug); return QString(); } //qDebug() << Q_FUNC_INFO << ": - 14" ; logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": " << _pm ; return _pm; } bool MainWindowInputOthers::isSATPropagation() { logEvent (Q_FUNC_INFO, "Start", Debug); if (getPropModeFromComboBox() == "SAT") { logEvent (Q_FUNC_INFO, "END-True", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-False", Debug); return false; } } void MainWindowInputOthers::setPaletteIOTA(const bool _ok) { //qDebug() << Q_FUNC_INFO << " - Start"; if (_ok) { if (darkMode) { iotaNumberLineEdit->setPalette (palWhite); } else { iotaNumberLineEdit->setPalette (palBlack); } } else { iotaNumberLineEdit->setPalette (palRed); } } void MainWindowInputOthers::clearIOTA() { logEvent (Q_FUNC_INFO, "Start", Debug); iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); logEvent (Q_FUNC_INFO, "END", Debug); setPaletteIOTA(true); //To avoid that 000 is considered wrong } void MainWindowInputOthers::setDarkMode (const bool _dm) { darkMode = _dm; if (darkMode) { //qDebug() << Q_FUNC_INFO << " - True"; iotaNumberLineEdit->setPalette(palWhite); userDefinedADIFValueLineEdit->setPalette(palWhite); iotaNumberLineEdit->setPalette(palWhite); } else { //qDebug() << Q_FUNC_INFO << " - False"; iotaNumberLineEdit->setPalette(palBlack); userDefinedADIFValueLineEdit->setPalette(palBlack); iotaNumberLineEdit->setPalette(palBlack); } } bool MainWindowInputOthers::isIOTAModified() { logEvent (Q_FUNC_INFO, "Start", Debug); return ((iotaContinentComboBox->currentIndex()>0) || (iotaNumberLineEdit->text()).toInt()>0); } 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; logEvent (Q_FUNC_INFO, "Start", Debug); if ( (checkIfValidIOTA(_qs)).length() !=6 ) { if (iotaNumberLineEdit->text() != "000") iotaNumberLineEdit->setPalette(palRed); logEvent (Q_FUNC_INFO, "END-1", Debug); return; } else { QStringList values = _qs.split("-", QT_SKIP); //qDebug() << Q_FUNC_INFO << ": IOTA " << _qs; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); iotaNumberLineEdit->setText(values.at(1)); if (darkMode) { iotaNumberLineEdit->setPalette(palWhite); } else { iotaNumberLineEdit->setPalette(palBlack); } } logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowInputOthers::getIOTA() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return (checkIfValidIOTA(iotaContinentComboBox->currentText() + "-" + iotaNumberLineEdit->text())); } void MainWindowInputOthers::setIOTAContinent(const QString &_qs) { logEvent (Q_FUNC_INFO, "Start", Debug); if(( iotaContinentComboBox->findText(_qs, Qt::MatchContains))>0) { //qDebug() << Q_FUNC_INFO << ": setting to index: " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)); iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(_qs, Qt::MatchContains)); } else { //qDebug() << Q_FUNC_INFO << ": setting to index: 00"; iotaContinentComboBox->setCurrentIndex(0); } logEvent (Q_FUNC_INFO, "END", Debug); } 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() << Q_FUNC_INFO << ": " << _tiota; logEvent (Q_FUNC_INFO, "Start-END", Debug); if (_tiota.count("-") != 1) { logEvent (Q_FUNC_INFO, "END - Wrong format", Debug); return ""; } QStringList values = _tiota.split("-", QT_SKIP); QString continent = values.at(0); QString number = values.at(1); if (!dataProxy->isValidContinentShortName(continent)) { logEvent (Q_FUNC_INFO, "END - Wrong continent", Debug); return ""; } bool isNumberValid; int numberInt = number.toInt(&isNumberValid); if (!isNumberValid || numberInt <= 0 || numberInt >= 1000) { logEvent (Q_FUNC_INFO, "END - Wrong number", Debug); return ""; } logEvent (Q_FUNC_INFO, "END", Debug); return QString("%1-%2").arg(continent).arg(numberInt, 3, 10, QChar('0')); } void MainWindowInputOthers::slotPropModeComboBoxChanged() { logEvent (Q_FUNC_INFO, "Start", Debug); if (autoUpdating) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } emit setPropMode(getPropModeFromComboBox()); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setKeep(const bool _b) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString(_b); keepPropCheckBox->setChecked (_b); logEvent (Q_FUNC_INFO, "END", Debug); } bool MainWindowInputOthers::getKeep() { logEvent (Q_FUNC_INFO, "Start-END", Debug); //qDebug() << Q_FUNC_INFO; return keepPropCheckBox->isChecked (); } bool MainWindowInputOthers::setPOTA_REF(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); Adif adif(Q_FUNC_INFO); if (!adif.isValidPOTA(_op)) return false; pota_ref = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getPOTA_REF() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return pota_ref; } bool MainWindowInputOthers::setSIG(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); Adif adif(Q_FUNC_INFO); if (_op.length()<=0) return false; sig = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getSIG() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return sig; } bool MainWindowInputOthers::setSIG_INFO(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); Adif adif(Q_FUNC_INFO); if (_op.length()<=0) return false; sig_info = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getSIG_INFO() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return sig_info; } bool MainWindowInputOthers::setWWFF_Ref(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); Adif adif(Q_FUNC_INFO); if (!adif.isValidWWFF_Ref(_op)) return false; wwff_ref = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getWWFF_Ref() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return wwff_ref; } bool MainWindowInputOthers::setUserADIFTypeComboBox(const QString &_value) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_value == "SOTA_REF") { userDefinedADIFComboBox->setCurrentIndex (0); } else if (_value == "AGE") { userDefinedADIFComboBox->setCurrentIndex (1); } else if (_value == "DISTANCE") { userDefinedADIFComboBox->setCurrentIndex (2); } else if (_value == "POTA_REF") { userDefinedADIFComboBox->setCurrentIndex (3); } else if (_value == "SIG") { userDefinedADIFComboBox->setCurrentIndex (4); } else if (_value == "SIG_INFO") { userDefinedADIFComboBox->setCurrentIndex (5); } else if (_value == "VUCC_GRIDS") { userDefinedADIFComboBox->setCurrentIndex (6); } else if (_value == "WWFF_REF") { userDefinedADIFComboBox->setCurrentIndex (7); } else { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getUserADIFTypeComboBox() { logEvent (Q_FUNC_INFO, "Start", Debug); 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: logEvent (Q_FUNC_INFO, "END-1", Debug); return "SOTA_REF"; case 2: logEvent (Q_FUNC_INFO, "END-2", Debug); return "AGE"; case 3: logEvent (Q_FUNC_INFO, "END-3", Debug); return "DISTANCE"; case 4: logEvent (Q_FUNC_INFO, "END-4", Debug); return "POTA_REF"; case 5: logEvent (Q_FUNC_INFO, "END-5", Debug); return "SIG"; case 6: logEvent (Q_FUNC_INFO, "END-6", Debug); return "SIG_INFO"; case 7: logEvent (Q_FUNC_INFO, "END-7", Debug); return "VUCC_GRIDS"; case 8: logEvent (Q_FUNC_INFO, "END-8", Debug); return "WWFF_REF"; default: logEvent (Q_FUNC_INFO, "END", Debug); return QString(); } } bool MainWindowInputOthers::setUserADIFValue(const QString &_adifValue) { logEvent (Q_FUNC_INFO, "Start-END", Debug); userDefinedADIFValueLineEdit->setText (_adifValue); return true; } QString MainWindowInputOthers::getUserADIFValue() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return userDefinedADIFValueLineEdit->text(); } bool MainWindowInputOthers::setInitialADIFValues() { logEvent (Q_FUNC_INFO, "END-", Debug); adifValidTypes << "01-" + tr("SOTA Ref") << "02-" + tr ("Age") << "03-" + tr("Distance") << "04-" + tr("POTA Ref") << "05-" + tr("SIG") << "06-" + tr("SIG Info") << "07-" + tr ("VUCC grids") << "08-" + tr("WWFF Ref"); userDefinedADIFComboBox->clear (); userDefinedADIFComboBox->addItems (adifValidTypes); logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainWindowInputOthers::setState(const QString &_op) { // Sets a subdivision/State //qDebug() << Q_FUNC_INFO << ": " << _op; if (_op.length()<1) return false; int indexC = entityPrimDivComboBox->findText(QString("%1-").arg(_op), Qt::MatchStartsWith); //qDebug() << Q_FUNC_INFO << _op << "/" << QString::number(indexC) << " / (6): " << entityPrimDivComboBox->itemText(6); if (indexC<0) return false; entityPrimDivComboBox->setCurrentIndex(indexC); return true; } QString MainWindowInputOthers::getState() {// Reads the subdivision. It return just the shortname/code for the subdivision/State //qDebug() << Q_FUNC_INFO << ": " << ((entityPrimDivComboBox->currentText()).split("-")).at(0); QString aux = entityPrimDivComboBox->currentText(); if ((aux.startsWith("00-")) && (aux.endsWith("(000)")) ) return QString(); return ((entityPrimDivComboBox->currentText()).split("-")).at(0); } void MainWindowInputOthers::updatePrimarySubdivisionsComboBox(QList _subdivisions) { //qDebug() << Q_FUNC_INFO << " - count: " << QString::number(_subdivisions.count()); entityPrimDivComboBox->clear(); if (_subdivisions.isEmpty()) return; QStringList listOfSubdivisions; listOfSubdivisions.clear(); QStringList names; names.clear(); foreach (PrimarySubdivision ps, _subdivisions) { QString subdivision = ps.shortName + "-" + ps.name; if (!listOfSubdivisions.contains(subdivision)) listOfSubdivisions.append(subdivision); //qDebug() << Q_FUNC_INFO << ": Subdivision added: " << subdivision; } if (listOfSubdivisions.isEmpty()) return; listOfSubdivisions.sort(); listOfSubdivisions.removeDuplicates(); listOfSubdivisions.prepend("00-" + tr("Not selected") + " (000)"); entityPrimDivComboBox->addItems(listOfSubdivisions); if (listOfSubdivisions.length() == 2) entityPrimDivComboBox->setCurrentIndex(1); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowInputOthers::setEntity(const int _entity) {// Select the appropriate entity in the ComboBox //qDebug() << Q_FUNC_INFO << ": " << QString::number(_entity); logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - 10" ; if (_entity<=0) { //qDebug() << Q_FUNC_INFO << " - 11" ; entityNameComboBox->setCurrentIndex(0); logEvent (Q_FUNC_INFO, "END-1", Debug); return; } //qDebug() << Q_FUNC_INFO << " - 20" ; currentInt = _entity; QString aux = QString::number(_entity); if (_entity > 1000) { //qDebug() << Q_FUNC_INFO << " - 30" ; aux = (QString::number(_entity)).right(3); } //qDebug() << Q_FUNC_INFO << " - 40" ; int indexC = entityNameComboBox->findText("(" + aux + ")", Qt::MatchEndsWith); if (indexC != -1) { entityNameComboBox->setCurrentIndex(indexC); } else { //qDebug() << Q_FUNC_INFO << " - Unable to find entity in the ComboBox"; } setIOTAContinent(dataProxy->getContinentShortNameFromEntity(_entity)) ; //qDebug() << Q_FUNC_INFO << " - 100" ; logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setEntityAndPrefix(const int _entity, const QString &_qrz) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_entity) << "/" << _qrz; if (_entity<=0) { //qDebug() << Q_FUNC_INFO << " - 10"; entityNameComboBox->setCurrentIndex(0); logEvent (Q_FUNC_INFO, "END-1", Debug); return; } //qDebug() << Q_FUNC_INFO << " - 15"; setEntity(_entity); Callsign callsign(_qrz); if (callsign.isValid() || callsign.isValidPrefix()) currentPref = callsign.getHostFullPrefix(); QString prefixFromEntityNumber = world->getEntityMainPrefix(_entity); // The main prefix of the entity. QString hostFullPrefix = callsign.getHostFullPrefix(); // The default is that showAll is not checked. Main prefix+ the area QString hostPrefix = callsign.getHostPrefix(); // The default is that showAll is not checked Callsign entityCall(prefixFromEntityNumber); // To check if the prefixFromEntity is the main or not (EA->main, AM-> nor main, it should be EA) QString prefixForSubdivision = prefixFromEntityNumber; // Construct hostFullPrefix if hostPrefix is not the main prefix. if (hostPrefix != prefixFromEntityNumber) { hostFullPrefix = prefixFromEntityNumber + QString::number(callsign.getHostAreaNumber()); } //qDebug() << Q_FUNC_INFO << " - 20"; //qDebug() << Q_FUNC_INFO << "hostFullPrefix: " << hostFullPrefix; //qDebug() << Q_FUNC_INFO << "hostPrefix: " << hostPrefix; //qDebug() << Q_FUNC_INFO << "prefixFromEntityNumber: " << prefixFromEntityNumber; if ((hostFullPrefix.isEmpty()) && (hostPrefix.isEmpty())) return; //qDebug() << Q_FUNC_INFO << " - 40"; QList primarySubdivisions; primarySubdivisions.clear(); if (showAllCheckBox->isChecked()) { primarySubdivisions.append(dataProxy->getPrimarySubDivisions(currentInt, QString())); } else { primarySubdivisions.append(dataProxy->getPrimarySubDivisions(currentInt, hostFullPrefix)); currentPref = hostFullPrefix; if (primarySubdivisions.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - 50"; //qDebug() << Q_FUNC_INFO << " - primarySubdivisions is empty with hostPrefix, running for the main prefix"; primarySubdivisions.append(dataProxy->getPrimarySubDivisions(currentInt, hostPrefix)); currentPref = hostPrefix; if (primarySubdivisions.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - 55"; //qDebug() << Q_FUNC_INFO << " - primarySubdivisions is empty with mainprefix, running just with the entity"; primarySubdivisions.append(dataProxy->getPrimarySubDivisions(currentInt, QString())); currentPref = QString(); } //qDebug() << Q_FUNC_INFO << " - 59"; } } //qDebug() << Q_FUNC_INFO << " - 60"; //qDebug() << Q_FUNC_INFO << " - count: " << QString::number(primarySubdivisions.count()); if (primarySubdivisions.isEmpty()) { entityPrimDivComboBox->clear(); return; } //qDebug() << Q_FUNC_INFO << " - 70 "; updatePrimarySubdivisionsComboBox(primarySubdivisions); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowInputOthers::slotUSerDefinedADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); logEvent (Q_FUNC_INFO, "Start", Debug); 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); } else if (currentTag == "DISTANCE") { userDefinedADIFValueLineEdit->setText (QString::number(distance)); } else if (currentTag == "POTA_REF") { userDefinedADIFValueLineEdit->setText (pota_ref); } else if (currentTag == "SIG") { userDefinedADIFValueLineEdit->setText (sig); } else if (currentTag == "SIG_INFO") { userDefinedADIFValueLineEdit->setText (sig_info); } else if (currentTag == "WWFF_REF") { userDefinedADIFValueLineEdit->setText (wwff_ref); } } bool MainWindowInputOthers::setVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); if (checkVUCC_GRIDS(_op)) { vucc_grids = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainWindowInputOthers::checkVUCC_GRIDS(const QString &_string) { //qDebug() << Q_FUNC_INFO << ": " << _string; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidVUCCGrids (_string)) { setColorsForUserDefinedADIFValueLineEdit(); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { userDefinedADIFValueLineEdit->setPalette (palRed); logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } QString MainWindowInputOthers::getVUCCGrids() { logEvent (Q_FUNC_INFO, "Start", Debug); if (checkVUCC_GRIDS (vucc_grids)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return vucc_grids; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } void MainWindowInputOthers::setColorsForUserDefinedADIFValueLineEdit() { logEvent (Q_FUNC_INFO, "Start", Debug); if (darkMode) { userDefinedADIFValueLineEdit->setPalette(palWhite); } else { userDefinedADIFValueLineEdit->setPalette(palBlack); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainWindowInputOthers::setSOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); sota_ref = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getSOTA() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return sota_ref; } bool MainWindowInputOthers::setAge(const double _op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start-END", Debug); age = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } double MainWindowInputOthers::getAge() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return age; } bool MainWindowInputOthers::setDistance(const double _op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start-END", Debug); distance = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } double MainWindowInputOthers::getDistance() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return distance; } void MainWindowInputOthers::slotSetCurrentUserData() { logEvent (Q_FUNC_INFO, "Start", Debug); QString currentTag = getUserADIFTypeComboBox (); if (currentTag == "SOTA_REF") { sota_ref = userDefinedADIFValueLineEdit->text(); } else if (currentTag == "AGE") { age = userDefinedADIFValueLineEdit->text().toDouble(); } else if (currentTag == "VUCC_GRIDS") { vucc_grids = userDefinedADIFValueLineEdit->text().toUpper(); userDefinedADIFValueLineEdit->setText (vucc_grids); } else if (currentTag == "DISTANCE") { distance = userDefinedADIFValueLineEdit->text().toDouble(); } if (currentTag == "POTA_REF") { pota_ref = userDefinedADIFValueLineEdit->text(); } if (currentTag == "SIG") { sig = userDefinedADIFValueLineEdit->text(); //setSIG(userDefinedADIFValueLineEdit->text()); //sig = userDefinedADIFValueLineEdit->text(); } if (currentTag == "SIG_INFO") { sig_info = userDefinedADIFValueLineEdit->text(); } if (currentTag == "WWFF_REF") { //wwff_ref = userDefinedADIFValueLineEdit->text(); wwff_ref = userDefinedADIFValueLineEdit->text(); //setWWFF_Ref(userDefinedADIFValueLineEdit->text()); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::slotPrimarySubdivisionsComboBoxChanged() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << entityPrimDivComboBox->currentText(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::slotShowAllCheckBoxChanged() { setEntityAndPrefix(currentInt, currentPref); } void MainWindowInputOthers::slotEntityNameComboBoxChanged() { //qDebug() << Q_FUNC_INFO << entityNameComboBox->currentText(); QString prefix = ((entityNameComboBox->currentText()).split("-")).at(0); //qDebug() << Q_FUNC_INFO << " - " << prefix; int entity = world->getQRZARRLId(prefix); setEntityAndPrefix(entity, prefix); //entityPrimDivComboBox->clear(); entityPrimDivComboBox->addItem("00-" + tr("None Identified") + " (000)"); } void MainWindowInputOthers::readDarkMode() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setDarkMode(settings.value("DarkMode", false).toBool ()); settings.endGroup (); } void MainWindowInputOthers::setLogLevel (const DebugLogLevel _l) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _l; logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.4.1/inputwidgets/mainwindowmydatatab.cpp0000644000175000017500000007003615003153303020726 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" #include "../callsign.h" MainWindowMyDataTab::MainWindowMyDataTab(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab" ; logLevel = None; dataProxy = dp; 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(Q_FUNC_INFO); modify = false; darkMode = false; createUI(); setInitialADIFValues(); myPower = 0; lastPower = 0; //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab - END" ; } MainWindowMyDataTab::~MainWindowMyDataTab() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(locator); delete(util); //delete(dataProxy); } void MainWindowMyDataTab::readDarkMode() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setDarkMode(settings.value("DarkMode", false).toBool ()); settings.endGroup (); } QSO MainWindowMyDataTab::getQSOData(QSO _qso) { QSO qso = _qso; qso.setOperatorCallsign(getOperator()); qso.setTXPwr(getMyPower()); qso.setStationCallsign(getStationCallsign()); qso.setMyGridSquare(getMyLocator()); qso.setMyRig(getMyRig()); qso.setMyAntenna(getMyAntenna()); qso.setMyPOTA_Ref(getMyPota_ref()); qso.setMySig(getMySig()); qso.setMySigInfo(getMySig_info()); qso.setMySOTA_REF(getMySOTA()); qso.setMyWWFF_Ref(getMyWWFF_Ref()); qso.setMyVUCCGrids(getMyVUCCGrids()); return qso; } void MainWindowMyDataTab::setQSOData(const QSO &_qso) { QSO qso(_qso); setOperator(qso.getOperatorCallsign()); setMyPower(qso.getTXPwr()); setStationCallsign(qso.getStationCallsign()); setMyLocator(qso.getMyGridSquare()); setMyRig(qso.getMyRig()); setMyAntenna(qso.getMyAntenna()); setMyPota_ref(qso.getMyPOTA_Ref()); setMySig(qso.getMySig()); setMySig_info(qso.getMySigInfo()); setMySOTA(qso.getMySOTA_REF()); setMyWWFF_Ref(qso.getMyWWFF_Ref()); setMyVUCCGrids(qso.getMyVUCCGrids()); } void MainWindowMyDataTab::createUI() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); 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(currentTextChanged(QString)), this, SLOT(slotMyUserADIFComboBoxChanged() ) ) ; connect(myUserADIFLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentMyUSerData() ) ); readDarkMode(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::clear(bool _full) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); modify = false; if (!keepThisDataForNextQSOQCheckbox->isChecked()) { //qDebug() << "MainWindowMyDataTab::clear: NOT checked" ; myPowerSpinBox->setValue(myPower); Callsign callsign(operatorQRZ); if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << ": " << operatorQRZ; operatorLineEdit->setText(operatorQRZ); } else { operatorLineEdit->clear(); } callsign(stationCallsign); if (callsign.isValid()) { 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->setValue(myPower); myPowerSpinBox->clear(); my_rig = QString(); my_sota = QString(); my_antenna = QString(); my_pota_ref = QString(); my_sig = QString(); my_sig_info = QString(); my_wwff_ref = QString(); my_vucc_grids = QString(); myUserADIFComboBox->setCurrentIndex(0); myUserADIFLineEdit->clear(); keepThisDataForNextQSOQCheckbox->setChecked (false); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::show() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::show: " << QString::number(myPower) << "/" << operatorQRZ << "/" << stationCallsign << "/" << myLocator; myPowerSpinBox->setValue(myPower); operatorLineEdit->setText(operatorQRZ); stationCallSignLineEdit->setText(stationCallsign); //qDebug() << "MainWindowMyDataTab::show: setMyLocator: " << myLocator ; myLocatorLineEdit->setText(myLocator); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::slotMyLocatorTextChanged() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::slotMyLocatorTextChanged: " << myLocatorLineEdit->text(); //logEvent(Q_FUNC_INFO, "Start", logLevel); int cursorP = myLocatorLineEdit->cursorPosition(); myLocatorLineEdit->setText(util->getClearSQLi(myLocatorLineEdit->text()).toUpper()); //qDebug() << "MainWindowMyDataTab::clear: setMyLocator: " << myLocatorLineEdit->text() ; if ( locator->isValidLocator(myLocatorLineEdit->text())) { if (!modify) { myLocator = (myLocatorLineEdit->text()).toUpper(); } if (darkMode) { 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; //slotLocatorTextChanged(); } else { //logEvent(Q_FUNC_INFO, "END-2", logLevel); 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", logLevel); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::slotReturnPressed() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); emit returnPressed(); } void MainWindowMyDataTab::setSetupMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if (!locator->isValidLocator (_op)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } myLocator = _op.toUpper(); myLocatorLineEdit->setText (myLocator); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::setMyPower(const double _power) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_power); //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); myPowerSpinBox->setValue(_power); } double MainWindowMyDataTab::getMyPower() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); 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; logEvent (Q_FUNC_INFO, "Start", Debug); operatorLineEdit->setText(_op); logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowMyDataTab::getOperator() { //qDebug() << Q_FUNC_INFO << ": " << (operatorLineEdit->text()).toUpper(); logEvent (Q_FUNC_INFO, "Start", Debug); lastOperatorQRZ = (operatorLineEdit->text()).toUpper(); return lastOperatorQRZ; } void MainWindowMyDataTab::setStationCallsign(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); Callsign callsign(_op); if (callsign.isValid()) { stationCallSignLineEdit->setText(_op); } else { stationCallsign.clear (); } logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowMyDataTab::getStationCallsign() { //qDebug() << Q_FUNC_INFO << ": " << (stationCallSignLineEdit->text()).toUpper(); logEvent (Q_FUNC_INFO, QString("Start: %1").arg((stationCallSignLineEdit->text()).toUpper()), Debug); return (stationCallSignLineEdit->text()).toUpper(); //return lastStationQRZ; } void MainWindowMyDataTab::setMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); myLocatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getMyLocator() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); lastMyLocator = (myLocatorLineEdit->text()).toUpper(); return lastMyLocator.toUpper(); } void MainWindowMyDataTab::setData(const QString &_stationCallsign, const QString &_operator, const QString &_myLocator) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); Callsign callsign(_stationCallsign); if (callsign.isValid()) { stationCallsign = _stationCallsign; } else { stationCallsign = QString(); } //qDebug() << Q_FUNC_INFO << ": Setting station Callsign: " << stationCallsign; setStationCallsign (stationCallsign); callsign(_operator); 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(); logEvent (Q_FUNC_INFO, "Start", Debug); int cursorP = operatorLineEdit->cursorPosition(); operatorLineEdit->setText(util->getClearSQLi(operatorLineEdit->text()).toUpper()); Callsign callsign(operatorLineEdit->text()); if (callsign.isValid()) { if (darkMode) { 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::setDarkMode (const bool _dm) { darkMode = _dm; if (darkMode) { myLocatorLineEdit->setPalette(palWhite); operatorLineEdit->setPalette(palWhite); stationCallSignLineEdit->setPalette(palWhite); myUserADIFLineEdit->setPalette(palWhite); } else { myLocatorLineEdit->setPalette(palBlack); operatorLineEdit->setPalette(palBlack); stationCallSignLineEdit->setPalette(palBlack); myUserADIFLineEdit->setPalette(palBlack); } } void MainWindowMyDataTab::slotStationCallSignTextChanged() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); int cursorP = stationCallSignLineEdit->cursorPosition(); stationCallSignLineEdit->setText(util->getClearSQLi(stationCallSignLineEdit->text()).toUpper()); Callsign callsign(stationCallSignLineEdit->text()); if (callsign.isValid()) { if (darkMode) { stationCallSignLineEdit->setPalette(palWhite); } else { stationCallSignLineEdit->setPalette(palBlack); } } else { stationCallSignLineEdit->setPalette(palRed); } stationCallSignLineEdit->setCursorPosition(cursorP); } void MainWindowMyDataTab::setKeep(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); keepThisDataForNextQSOQCheckbox->setChecked (_b); } bool MainWindowMyDataTab::getKeep() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return keepThisDataForNextQSOQCheckbox->isChecked (); } bool MainWindowMyDataTab::setInitialADIFValues() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); adifValidTypes.clear (); adifValidTypes << "01-" + tr("My Rig") << "02-" + tr("My Antenna") << "03-" + tr("My POTA Ref") << "04-" + tr("My SIG") << "05-" + tr("My SIG Info") << "06-" + tr("My SOTA Ref") << "07-" + tr("My VUCC_GRIDS") << "08-" + tr("My WWFF Ref"); myUserADIFComboBox->clear (); myUserADIFComboBox->addItems (adifValidTypes); return true; } bool MainWindowMyDataTab::setUserADIFTypeComboBox(const QString &_value) { //qDebug() << Q_FUNC_INFO << ": " << _value; logEvent (Q_FUNC_INFO, "Start", Debug); if (_value == "MY_RIG") { myUserADIFComboBox->setCurrentIndex (0); } else if (_value == "MY_ANTENNA") { myUserADIFComboBox->setCurrentIndex (1); } else if (_value == "MY_POTA_REF") { myUserADIFComboBox->setCurrentIndex (2); } else if (_value == "MY_SIG") { myUserADIFComboBox->setCurrentIndex (3); } else if (_value == "MY_SIG_INFO") { myUserADIFComboBox->setCurrentIndex (4); } else if (_value == "MY_SOTA_REF") { myUserADIFComboBox->setCurrentIndex (5); } else if (_value == "MY_VUCC_GRIDS") { myUserADIFComboBox->setCurrentIndex (6); } else if (_value == "MY_WWFF_REF") { myUserADIFComboBox->setCurrentIndex (7); } else { myUserADIFComboBox->setCurrentIndex (0); return false; } return true; } QString MainWindowMyDataTab::getUserADIFTypeComboBox() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); int value = (((myUserADIFComboBox->currentText ()).split('-')).at(0)).toInt (); switch (value) { case 1: return "MY_RIG"; case 2: return "MY_ANTENNA"; case 3: return "MY_POTA_REF"; case 4: return "MY_SIG"; case 5: return "MY_SIG_INFO"; case 6: return "MY_SOTA_REF"; case 7: return "MY_VUCC_GRIDS"; case 8: return "MY_WWFF_REF"; default: return QString(); } } bool MainWindowMyDataTab::setUserADIFValue(const QString &_adifValue) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); myUserADIFLineEdit->setText (_adifValue); return true; } QString MainWindowMyDataTab::getUserADIFValue() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return myUserADIFLineEdit->text(); } bool MainWindowMyDataTab::setMyRig(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_rig = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyRig() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_rig; } bool MainWindowMyDataTab::setMyAntenna(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_antenna = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyAntenna() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_antenna; } bool MainWindowMyDataTab::setMySOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_sota = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMySOTA() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_sota; } bool MainWindowMyDataTab::setMyVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); 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; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidVUCCGrids (_string)) { setColorsForMyUserADIFLineEdit(); return true; } else { myUserADIFLineEdit->setPalette (palRed); return false; } } QString MainWindowMyDataTab::getMyVUCCGrids() { logEvent (Q_FUNC_INFO, "Start", Debug); if (checkMyVUCC_GRIDS (my_vucc_grids)) { return my_vucc_grids; } else { return QString(); } } bool MainWindowMyDataTab::setMyPota_ref(const QString &_op) { Adif adif(Q_FUNC_INFO); if (!adif.isValidPOTA(_op)) return false; my_pota_ref = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyPota_ref() { return my_pota_ref; } bool MainWindowMyDataTab::setMySig(const QString &_op) { if (_op.length()<=0) return false; my_sig = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMySig() { return my_sig; } bool MainWindowMyDataTab::setMySig_info(const QString &_op) { if (_op.length()<=0) return false; my_sig_info = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMySig_info() { return my_sig_info; } bool MainWindowMyDataTab::setMyWWFF_Ref(const QString &_op) { Adif adif(Q_FUNC_INFO); if (!adif.isValidWWFF_Ref(_op)) return false; my_wwff_ref = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyWWFF_Ref() { return my_wwff_ref; } void MainWindowMyDataTab::setColorsForMyUserADIFLineEdit() { logEvent (Q_FUNC_INFO, "Start", Debug); if (darkMode) { myUserADIFLineEdit->setPalette(palWhite); } else { myUserADIFLineEdit->setPalette(palBlack); } } void MainWindowMyDataTab::slotMyUserADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); logEvent (Q_FUNC_INFO, "Start", Debug); 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_POTA_REF") { myUserADIFLineEdit->setText (my_pota_ref); } else if (currentTag == "MY_SIG") { myUserADIFLineEdit->setText (my_sig); } else if (currentTag == "MY_SIG_INFO") { myUserADIFLineEdit->setText (my_sig_info); } else if (currentTag == "MY_SOTA_REF") { myUserADIFLineEdit->setText (my_sota); } else if (currentTag == "MY_VUCC_GRIDS") { myUserADIFLineEdit->setText (my_vucc_grids); } else if (currentTag == "MY_WWFF_REF") { myUserADIFLineEdit->setText (my_wwff_ref); } } void MainWindowMyDataTab::slotSetCurrentMyUSerData() { logEvent (Q_FUNC_INFO, "Start", Debug); 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_POTA_REF") { my_pota_ref = myUserADIFLineEdit->text(); //setMyPota_ref(myUserADIFLineEdit->text()); } else if (currentTag == "MY_SIG") { my_sig = myUserADIFLineEdit->text(); } else if (currentTag == "MY_SIG_INFO") { my_sig_info = myUserADIFLineEdit->text(); } else if (currentTag == "MY_SOTA_REF") { my_sota = myUserADIFLineEdit->text(); } else if (currentTag == "MY_VUCC_GRIDS") { my_vucc_grids = myUserADIFLineEdit->text().toUpper(); myUserADIFLineEdit->setText (my_vucc_grids); } else if (currentTag == "MY_WWFF_REF") { my_wwff_ref = myUserADIFLineEdit->text(); //setMyWWFF_Ref(myUserADIFLineEdit->text()); } myUserADIFLineEdit->setCursorPosition (currentPos); } void MainWindowMyDataTab::setModify(const bool _modify) { //emit debugLog(Q_FUNC_INFO, "Start", Debug); logEvent (Q_FUNC_INFO, "Start", Debug); modify = _modify; //emit debugLog(Q_FUNC_INFO, "END", Debug); } //bool MainWindowMyDataTab::getDarkMode() //{ // logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - color: " << operatorLineEdit->palette().color (QPalette::Base); // return (operatorLineEdit->palette().color (QPalette::Base) == "#646464"); //} void MainWindowMyDataTab::setLogLevel (const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO; if (logLevel<=_level) { //qDebug() << Q_FUNC_INFO << "Emitting..."; emit debugLog (_func, _msg, _level); } } void MainWindowMyDataTab::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); myPower = settings.value("Power").toDouble (); myPowerSpinBox->setValue(myPower); //qDebug() << Q_FUNC_INFO << " - 10 " << QString::number(myPower); QString aux = settings.value("Operators").toString(); if (aux.contains(',')) { aux = ((aux.split (',')).at(0)).simplified (); } //qDebug() << Q_FUNC_INFO << " - 11"; Callsign callsign(aux); // Only the first operator is selected. TODO: To save this in a QStringList so the user can select. if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - 12"; operatorQRZ = aux.toUpper(); //qDebug() << Q_FUNC_INFO << " - 13"; operatorLineEdit->setText (operatorQRZ); //qDebug() << Q_FUNC_INFO << " - 14"; } settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } klog-2.4.1/searchwindow.h0000644000175000017500000001367015003153303014300 0ustar develdevel#ifndef KLOG_SEARCHWINDOW_H #define KLOG_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 SearchWidget(Awards *awards, QWidget *parent = nullptr); explicit SearchWindow(Awards *awards, 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 QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_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; std::unique_ptr searchModel; // Defined like this to send the same award instance Awards *awards; // Reference to the Awards instance //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-2.4.1/softwareupdate.h0000644000175000017500000000671215003153303014637 0ustar develdevel#ifndef KLOG_SOFTWAREUPDATE_H #define KLOG_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 "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-2.4.1/gpl-3.0-standalone.html0000644000175000017500000011022115003153303015514 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-2.4.1/frequency.h0000644000175000017500000000644215003153303013603 0ustar develdevel#ifndef FREQUENCY_H #define FREQUENCY_H /*************************************************************************** frequency.h - description ------------------- begin : Apr 2024 copyright : (C) 2024 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 Frequency. */ #include #include "klogdefinitions.h" class Frequency: public QObject { Q_OBJECT friend class tst_Frequency; public: //Frequency() : freq(0.0), bandInMHz(""), tolerance(0.0) {}; Frequency(); //Frequency(const Frequency &f); Frequency(const Frequency &f) : QObject(), freq(f.freq) {} Frequency(const double _f, FreqUnits _u = MHz); //Frequency(const QString &_parentName); //Frequency(const QString &_parentName, const Frequency &_f); ~Frequency(); void clear(); bool fromDouble(const double _f, FreqUnits _u = MHz); bool fromQString(const QString &_f, FreqUnits _u = MHz); //bool fromBand(const QString &_bandName); double toDouble(FreqUnits _u = MHz); // Returns in MHz QString toQString(FreqUnits _u = MHz); // Returns in MHz with decimals void setTolerance(const double _t, FreqUnits _u = Hz); // Defines the tolerance //QString band(); // Returns the band //int bandId(); // Returns the bandId bool isValid(); void operator=(Frequency const &_f2); // Redefinition of = private: double normalize(const double _f, const FreqUnits _u = MHz); double deNormalize(const double _f, const FreqUnits _u = MHz); int getDecimals(const FreqUnits _u = MHz); double freq; // This must be in MHz QString bandInMHz; // double tolerance; // This must be in Hz }; #endif // FREQUENCY_H klog-2.4.1/mainwindow.h0000644000175000017500000006172715003153303013765 0ustar develdevel#ifndef KLOG_MAINWINDOW_H #define KLOG_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 "setupdialog.h" #include "aboutdialog.h" #include "tipsdialog.h" #include "world.h" #include "filemanager.h" //#include "fileawardmanager.h" #include "dataproxy_sqlite.h" //#include "locator.h" #include "dxcluster/dxcluster.h" #include "dxcluster/dxspot.h" //#include "dxcluster/dxclusterassistant.h" #include "frequency.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 "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 "lotwutilities.h" #include "eqslutilities.h" #include "widgets/adiflotwexportwidget.h" #include "widgets/showadifimportwidget.h" #include "widgets/map/mapwindowwidget.h" #include "widgets/showkloglogwidget.h" #include "qso.h" #include "klogdefinitions.h" #include #include 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 friend class tst_MainWindow; public: MainWindow(DataProxy_SQLite *dp); ~MainWindow(); void checkIfNewVersion(); void recommendBackupIfNeeded(); void init(); //void showNotWar(); 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); KLOG_DEPRECATED void slotLocatorTextChanged(const QString &_loc); //void slotMyLocatorTextChanged(); void slotFreqTXChanged(const double _fr); void slotFreqRXChanged(const double _fr); void slotFreqTXChangedFromSat(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(const QString &_func); 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 &_call, QList _qsos, ExportMode _eM); void slotADIFExportClose(); 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 slotManualMode(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 DXSpot &_spot); void slotDXClusterSpotArrived(const DXSpot &_spot); // 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 slotShowMap(); //DXCCWIDGET //void slotShowQSOFromDXCCWidget(const int _q); void slotShowQSOsFromDXCCWidget(QList _qsos); // DXCLUSTER ASSISTANT //void slotShowDXClusterAssistant(); //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 slotQSOReceived(const QSO &_qso); void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level); //void slotTakeOverFocus(int _id); void slotTakeOverFocusToQSOTabWidget(); void slotTakeOverFocusToMainQSOInput(); void slotNewLogLevel(DebugLogLevel l); void slotQSO_SetMode(const QString _submode); void slotDarkModeChanged(const bool _dm); private: //void setWidgetsOrder(); void setDarkMode(const bool _dm); void init_variables(); // Refactored from init() void checkDebugFile(); // Refactored from init() void checkExistingData(); // Refactored from init() void readSettingsFile(); // Refactored from init() void checkVersions(); // Refactored from init() void checkHomeDir(); // Refactored from init() bool showWSJTXDuplicatedMSG(const QSO &_qso); //Shows an error if the QSO received from WSJTX is dupe. 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); bool askToAddQSOReceived(const QSO &_qso); // Shows a message with the data of the QSO void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); void setLogLevel(const DebugLogLevel _sev); //void fileExportLoTW(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate); void fileExportLoTW2(const QString &_call, QList _qsos); //void fileExportClubLog(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportClubLog2(const QString &_call, QList _qsos); //void fileExportEQSL(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportEQSL2(const QString &_call, QList _qsos); //void fileExportADIF(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate); void fileExportADIF2(const QString &_call, QList _qsos); void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default); 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; // QSO that is being managed in one specific moment QSO *backupQSO; // QSO that has been backed up to send another QSO to the UI QSO qsoInUI; // The QSO tat is shown in the UI for a given time //QSO *modifyingQSO; bool hamlibActive; bool hamlibChangingMode; bool hamlibModeNotADIFSupported; bool sendQSLByDefault; bool deleteAlwaysAdiFile; MapWindowWidget *mapWindow; // PST Rotator //PSTRotatorSupport *pstRotator; //bool usePSTRotator; //RotatorWidget *rotatorWidget; // void createStatusBar(); void createUI(); void createUIDX(); void reconfigureDXMarathonUI(const bool _dxM); //void createDXClusterUI(); void clearBandLabels(); void createMenusCommon(); void createActionsCommon(); bool readQSOFromUI(); // Adds the data in the UI to the qso instance (calling getQSODataFromUI) void getQSODataFromUI(); // Calls to the different widgets for QSO data and fills qso instance void sendQSOToUI(const QSO &_qso); // Shows the content of a QSO in the UI //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 checkIfWorkedB4(const QString &_qrz); //bool checkContest(); void showStatusOfDXCC(EntityStatus _entityStatus); void showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log); bool createConnection(); void openSetup(const int _page=0); //void readConfigData(); //void saveSettings(); bool loadSettings(); bool applySettings(); void selectTheLog(const int _i); // Receives a log number from loadSettings and setups all about the logN void defineStationCallsign(); QString findStationCallsignToUse(); // Used to select the station Callsign used 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 clearIfNotCompleted(); // Refactored from completeWithPreviousQSO void completeWithPreviousQSO(const QString &_call); bool checkValidCallBeforeAddingToLog(const QString &_call); // Asks the user if call is not valid int checkDXCCBeforeAddingToLog(const int dxcc_Call, const int dxcc_qso); // Asks the user if DXCC if unsure //void showAwards(); //void showDXMarathon(const int _year); void updateQSLRecAndSent(); //double checkFreqRanges(double _f); //void setRSTToMode(const QString &_m); // CLUSTER void clusterSpotToLog(const QString &_call, Frequency _fr); QStringList dxclusterServersList; //QString dxclusterServerToConnect; //int dxclusterServerPort; bool dxclusterSendSpotsToMap; // 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; StatisticsWidget *statsWidget; std::unique_ptr dxccStatusWidget; // Defined like this to send the same award instance std::unique_ptr dxClusterWidget; // Defined like this to send the same award instance std::unique_ptr searchWidget; // Defined like this to send the same award instance std::unique_ptr logWindow; // Defined like this to send the same award instance //DXClusterWidget *dxClusterWidget; //DXCCStatusWidget *dxccStatusWidget; QLabel *logLabel; //LogModel *logModel; //LogWindow *logWindow; UDPServer *UDPLogServer; ShowErrorDialog *showErrorDialog; // QFrame *dxUpLeftInputFrame;//, *dxUpRightOutputFrame; 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 *showMapAct; //QAction *dxClusterAssistantAct; QStringList bands; QStringList modes; QStringList entitiesList, propModeList; // UI DX //QLabel *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; //entityPrimLabel QLabel *infoLabel1, *infoLabel2, *dxMarathonLabelN, *dxMarathonTopScoreLabelN; 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 DebugLogLevel logLevel; // 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 bool manualMode; // If true, hamlib and WSJTX are not updatind the interface 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; // bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; // // DXClusterAssistant *dxClusterAssistant; // int infoTimeout; // timeout that temporary info will stay in the infobars QTimer *timer, *timerInfoBars; std::unique_ptr dateTime; bool yearChangedDuringModification; QString infoLabel1T, infoLabel2T; QString ctyDatFile, defaultADIFLogFile; 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 remove the data coming from QRZ.com only when data is coming. QString mainQRZ, stationCallsign, operatorQRZ, dxLocator; int my_CQz, my_ITUz; int 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 modifyingQSOid; // 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; //clublogUseStationCallSign, eLogClubLog *elogClublog; int clublogAnswer; QStringList clublogPrevQSO; // // QRZ.com bool qrzcomActive; bool qrzcomSubscriber; eLogQrzLog *elogQRZcom; // QRz.com - END // Contest //int points, qsoPoints, multipliers, qsoMultiplier; //QString contestMode; //Contest *contest; // Contest DataProxy_SQLite *dataProxy; 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-2.4.1/mainqsoentrywidget.cpp0000644000175000017500000011612515003153303016072 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" #include "callsign.h" MainQSOEntryWidget::MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug()<< Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); modifyingBands = false; 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; QRZButton = new QPushButton("QRZ"); OKButton = new QPushButton(tr("&Add"), this); clearButton = new QPushButton(tr("&Clear"), this); timer = new QTimer(this); util = new Utilities(Q_FUNC_INFO); realTime = true; duplicatedQSOSlotInSecs = 15; delayInputTimer = new QTimer; logLevel = None; createUI(); setInitialData(); //installEventFilter (this); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << " - END"; } MainQSOEntryWidget::~MainQSOEntryWidget() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); logEvent (Q_FUNC_INFO, "END", Debug); } /* void MainQSOEntryWidget::slotRealTimeButtonResize() { int heigh = qrzLineEdit->sizeHint ().height (); realtimeButton->setFixedSize(QSize(heigh, heigh)); //realtimeButton->setSizePolicy (QSizePolicy::Fixed); } */ void MainQSOEntryWidget::createUI() { //qDebug()<< Q_FUNC_INFO; logEvent (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.")); QRZButton->setToolTip(tr("Look up info about the current callsign on qrz.com")); 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(QRZButton); buttonsLayout->addWidget(OKButton); buttonsLayout->addWidget(clearButton); dateEdit->setCalendarPopup (true);; 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(util, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); connect(qrzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotOKButtonClicked() ) ); connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStartDelayInputTimer() ) ); connect(delayInputTimer, SIGNAL(timeout()), this, SLOT(slotDelayInputTimedOut() ) ); connect(bandComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotBandComboBoxChanged(QString) ) ) ; connect(modeComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotModeComboBoxChanged(QString) ) ) ; connect(OKButton, SIGNAL(clicked()), this, SLOT(slotOKButtonClicked())); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClearButtonClicked())); connect(QRZButton, SIGNAL(clicked()), this, SLOT(slotQRZButtonClicked())); 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())); QWidget::setTabOrder (qrzLineEdit, dateEdit); QWidget::setTabOrder (dateEdit, timeEdit); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } void MainQSOEntryWidget::setShowSeconds(const bool &t) { if (t) { timeEdit->setDisplayFormat("HH:mm:ss"); } else { timeEdit->setDisplayFormat("HH:mm"); } } void MainQSOEntryWidget::setLogLevel (const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotCheckBoxClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); 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); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotManualModeCheckBoxClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if (manualModeCheckBox->isChecked()) { slotClearButtonClicked(); emit manualModeSignal(true); //stop hamlib and wsjt-x communication; } else { emit manualModeSignal(false); //start hamlib and wsjt-x communication; } logEvent (Q_FUNC_INFO, "END", Debug); } /* void MainQSOEntryWidget::slotRealtimeButtonClicked() { logEvent (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); } logEvent (Q_FUNC_INFO, "END", Debug); } */ void MainQSOEntryWidget::setCleaning (const bool _c) { logEvent (Q_FUNC_INFO, "Start", Debug); cleaning = _c; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotQRZTextChanged() { logEvent (Q_FUNC_INFO, "Start: " + qrzLineEdit->text(), Debug); //qDebug()<< Q_FUNC_INFO << qrzLineEdit->text() << " / Length: " << QString::number((qrzLineEdit->text()).size()) << "###### START ######"; logEvent (Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { //qDebug() << Q_FUNC_INFO << ": qrz length <1"; slotClearButtonClicked(); logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug()<< Q_FUNC_INFO << ": QRZ <1 - END"; return; } int cursorP = qrzLineEdit->cursorPosition(); //qDebug()<< Q_FUNC_INFO << ": cursor position: " << QString::number(cursorP); qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); if (cleaning) { //qDebug() << Q_FUNC_INFO << ": Cleaning - END"; logEvent (Q_FUNC_INFO, "END-2", Debug); return; } if (qrzAutoChanging) { //qDebug()<< Q_FUNC_INFO << ": qrzAutoChanging - END"; qrzAutoChanging = false; logEvent (Q_FUNC_INFO, "END-3", Debug); return; } qrzAutoChanging = true; //qDebug()<< Q_FUNC_INFO << ": cursor position.1: " << QString::number(cursorP); 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"; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Simplifiying & Capitalizing"; qrzLineEdit->setText(((qrzLineEdit->text())).simplified()); qrzLineEdit->setText((qrzLineEdit->text()).remove(" ")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars"; //TODO: This validCharactersInCall may be removed? InValidCharsInPrevCall = validCharactersInCall(qrzLineEdit->text()); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars 00 "; Callsign callsign(qrzLineEdit->text()); if (!callsign.isValid()) { qrzLineEdit->setPalette(palRed); //emit showInfoLabel(tr("Callsign not valid")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ not valid - Red"; //logEvent (Q_FUNC_INFO, "END-4", Debug); } else { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ is valid - Black"; if (getDarkMode()) { qrzLineEdit->setPalette(palWhite); } else { qrzLineEdit->setPalette(palBlack); } currentQrz = qrzLineEdit->text(); //emit showInfoLabel(tr("")); } /* //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for length"; if (((qrzLineEdit->text()).length() < 1)) { // If QRZ box is blank, Information labels should be cleared. slotClearButtonClicked(); logEvent (Q_FUNC_INFO, "END-5", Debug); return; } */ //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for modify or length<1"; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: qrzSmallModDontCalculate < 1"; qrzSmallModDontCalculate=false; logEvent (Q_FUNC_INFO, "END-6", Debug); return; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: running..."; 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 /"; currentQrz.replace(QChar('\\'), QChar('/')); qrzLineEdit->setText(currentQrz); } currentQrz = qrzLineEdit->text(); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.3: " << QString::number(cursorP); if (cursorP>currentQrz.length()) {// A Space that has been removed without updating the cursor //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursorP > currentQRZ.length"; } else { //qDebug() << Q_FUNC_INFO << " cursorP0) { if ((currentQrz.at(cursorP-1)).isSpace()) { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.5: " << QString::number(cursorP); previousQRZ = currentQrz.remove(cursorP-1, 1); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.6: " << QString::number(cursorP); cursorP--; //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.7: " << QString::number(cursorP); qrzLineEdit->setText(previousQRZ); } } } currentQrz = qrzLineEdit->text(); //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: Emitting: " << currentQrz; 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); qrzLineEdit->setCursorPosition(cursorP); checkIfDupe(Q_FUNC_INFO); qrzAutoChanging = false; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setCurrentQRZ(const QString &_qrz) { logEvent (Q_FUNC_INFO, "Start", Debug); currentQrz = _qrz; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotBandComboBoxChanged(const QString &_b){ //qDebug() << Q_FUNC_INFO << ": << _b; logEvent (Q_FUNC_INFO, "Start", Debug); if (modifyingBands){ //qDebug() << Q_FUNC_INFO << ": Modifying bands - END" ; return; } bottomBandLimit = dataProxy->getLowLimitBandFromBandName (_b); upperBandLimit = dataProxy->getUpperLimitBandFromBandName (_b); emit bandChanged(_b); //qDebug() << Q_FUNC_INFO << " - 99"; checkIfDupe(Q_FUNC_INFO); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::slotModeComboBoxChanged(const QString &_m) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - 00"; emit modeChanged(_m); //qDebug() << Q_FUNC_INFO << " - 99"; checkIfDupe(Q_FUNC_INFO); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotQRZButtonClicked() { if ((qrzLineEdit->text()).length()<1) { return; } util->openQrzcom(currentQrz); } void MainQSOEntryWidget::slotOKButtonClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { return; } emit OKClicked(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotClearButtonClicked() { //qDebug() << "MainQSOEntryWidget::slotClearButtonClicked: " ; logEvent (Q_FUNC_INFO, "Start", Debug); setCleaning (true); clear(); emit clearForNextQSOSignal(Q_FUNC_INFO); //setModify(false); checkIfDupe(Q_FUNC_INFO); setCleaning (false); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::clear() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; setModify(false); //OKButton->setText(tr("&Add")); qrzLineEdit->clear(); qrzLineEdit->setFocus(Qt::OtherFocusReason); //cleaning = false; //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } QSO MainQSOEntryWidget::getQSOData(QSO & _qso) { //qDebug() << Q_FUNC_INFO << " - Call-01 : " << _qso.getCall(); QSO tQSO(_qso); //qDebug() << Q_FUNC_INFO << " - Call-02 : " << tQSO.getCall(); tQSO.setCall(getQrz()); //qDebug() << Q_FUNC_INFO << " - Call-03 : " << tQSO.getCall(); tQSO.setBand(getBand()); tQSO.setMode(dataProxy->getNameFromSubMode (getMode())); tQSO.setSubmode(getMode()); tQSO.setDateTimeOn(getDateTime()); return tQSO; } void MainQSOEntryWidget::setQSOData(QSO _qso) { //qDebug()<< Q_FUNC_INFO << "Call: " << _qso.getCall(); QSO qso(_qso); //qDebug() << "Setting QSO Data - Call:" << qso.getCall(); //qDebug() << "Setting QSO Data - Band:" << qso.getBand(); //qDebug() << "Setting QSO Data - Mode:" << qso.getSubmode(); //qDebug() << "Setting QSO Data - DateTime:" << qso.getDateTimeOn().toString(); //qDebug()<< Q_FUNC_INFO << "Call2: " << qso.getCall(); //if (qso.isValid()) //{ // //qDebug()<< Q_FUNC_INFO << "QSO is NOT Valid..."; // return; //} //qDebug()<< Q_FUNC_INFO << "QSO is Valid..."; setQRZ(qso.getCall()); setBand(qso.getBand()); setMode(qso.getSubmode()); setDateTime(qso.getDateTimeOn()); //qDebug()<< Q_FUNC_INFO << "Call: " << getQrz(); } void MainQSOEntryWidget::setInitialData() { //qDebug()<< Q_FUNC_INFO; logEvent (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"; setBands(bands); setModes(modes); selectDefaultBand(true); selectDefaultMode(true); dateEdit->setDate(QDate::currentDate()); timeEdit->setTime(QTime::currentTime()); UTCTime = true; // //qDebug()ime = true; timer->start(1000); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< "MainQSOEntryWidget::setInitialData-END"; } bool MainQSOEntryWidget::updateBandComboBox(const QString &_band) { logEvent (Q_FUNC_INFO, "Start: " + _band, Debug); //qDebug() << Q_FUNC_INFO << ": << _band; //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; 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; QStringList qsTemp; qsTemp.clear(); qsTemp << bands; qsTemp << _band; qsTemp.removeDuplicates(); QString aux; foreach(aux, bands) { //qDebug() << " bands Band: " << aux; } foreach(aux, qsTemp) { //qDebug() << " qsTemp Band: " << aux; } bands.clear(); bands = dataProxy->sortBandNamesBottonUp(qsTemp); foreach(aux, bands) { //qDebug() << " bands2 Band: " << aux; } //qDebug() << Q_FUNC_INFO << ": Before setBands"; setBands(bands); bandComboBox->setCurrentIndex(bandComboBox->findText(_currentBand, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << ": Band has been added : " << _band; } else { //qDebug() << Q_FUNC_INFO << ": (END) Band is NOT valid: " <<_band; logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } //qDebug() << Q_FUNC_INFO << ": Band already existing, no need to add" ; logEvent (Q_FUNC_INFO, "END", Debug); return true; } void MainQSOEntryWidget::setBands(const QStringList &_bands) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_bands.length ()), Debug); //qDebug()<< Q_FUNC_INFO << " - Start: " << QString::number(_bands.length ()); modifyingBands = true; //bands.clear(); bands = _bands; bands.removeDuplicates(); bands = dataProxy->sortBandNamesBottonUp(bands); bandComboBox->clear(); bandComboBox->addItems(bands); emit validBands(_bands); //selectDefaultBand(true); modifyingBands = false; logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::setModes(const QStringList &_modes) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; modes.clear(); modes = _modes; modes.removeDuplicates(); modes.sort(); modeComboBox->clear(); modeComboBox->addItems(modes); selectDefaultMode(true); logEvent (Q_FUNC_INFO, "END", Debug); } QStringList MainQSOEntryWidget::getModes() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return modes; } bool MainQSOEntryWidget::setFreq(const double _f, bool isRX) { //qDebug() << Q_FUNC_INFO << ": << QString::number(_f); logEvent (Q_FUNC_INFO, "Start", Debug); if (isRX) { if (util->isSameFreq (freqRX, _f)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } freqRX = _f; } if (util->isSameFreq (freqTX, _f)) { logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } freqTX = _f; if (newBandNeededForFreq (_f)) { //qDebug() << Q_FUNC_INFO << ": New band needed"; if ((bottomBandLimit<=freqTX) && (freqTX<= upperBandLimit)) { logEvent (Q_FUNC_INFO, "END-3", Debug); return true; } //qDebug() << Q_FUNC_INFO << ": Freq is not in the current band"; QString _newBand = dataProxy->getBandNameFromFreq(_f); //qDebug() << Q_FUNC_INFO << ": before setting band: " << _newBand ; if (isRX) { //qDebug() << Q_FUNC_INFO << ": RX Freq no more actions " ; logEvent (Q_FUNC_INFO, "END-4", Debug); return true; } logEvent (Q_FUNC_INFO, "END-5", Debug); return setBand(_newBand); } else { //qDebug() << Q_FUNC_INFO << ": NO New band needed - REMOVE THIS else"; } logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainQSOEntryWidget::newBandNeededForFreq(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); logEvent (Q_FUNC_INFO, "Start: " + QString::number(_f), Debug); QString _newBand = dataProxy->getBandNameFromFreq(_f); if (!updateBandComboBox (_newBand)) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END false"; return false; } //qDebug() << Q_FUNC_INFO << " - END true "; logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::setBand(const QString &_band) { //qDebug() << Q_FUNC_INFO << ": " << _band; logEvent (Q_FUNC_INFO, "Start: " + _band, Debug); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) { //qDebug() << Q_FUNC_INFO << ": Band not found " << _band; if (!updateBandComboBox(_band)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } //qDebug() << "MainQSOEntryWidget::setBand-1: Band found " << _band; bandComboBox->setCurrentIndex(bandComboBox->findText(_band, Qt::MatchCaseSensitive)); logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::setMode(const QString &_mode) { //TODO: If the mode is not already selected, add the mode automatically. logEvent (Q_FUNC_INFO, "Start" + _mode, Debug); //qDebug() << Q_FUNC_INFO << ": " << _mode; if (modeComboBox->findText(_mode, Qt::MatchCaseSensitive) < 0) { //qDebug() << Q_FUNC_INFO << " - NOT found"; logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } else { //qDebug() << Q_FUNC_INFO << " - Updated"; modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } } bool MainQSOEntryWidget::setQRZ(const QString &_qrz) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _qrz; //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()); logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainQSOEntryWidget::setDateTime(const QDateTime _date) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_date.isValid()) { dateEdit->setDate(_date.date()); timeEdit->setTime(_date.time()); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { //qDebug() << Q_FUNC_INFO << ": - NO VALID DATE"; logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } bool MainQSOEntryWidget::setTime(const QTime _time) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_time.isValid()) { timeEdit->setTime(_time); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } QString MainQSOEntryWidget::getQrz() { logEvent (Q_FUNC_INFO, "Start", Debug); QString aux; aux = qrzLineEdit->text(); if(aux.length()<1) { logEvent(Q_FUNC_INFO, "END - Not valid", Debug); return QString(); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - " << aux.toUpper(); return aux.toUpper(); } QString MainQSOEntryWidget::getBand(const int _b) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_b), Debug); if (_b<0) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " (1): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } else { if (bandComboBox->count()>=_b) { logEvent (Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " (2): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->itemText(_b); } else { logEvent (Q_FUNC_INFO, "END-3", Debug); //qDebug() << Q_FUNC_INFO << " (3): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } } } QString MainQSOEntryWidget::getMode(int _m) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_m), Debug); if (_m<0) { logEvent (Q_FUNC_INFO, "END-1", Debug); return modeComboBox->currentText(); } else { if (modeComboBox->count()>=_m) { logEvent (Q_FUNC_INFO, "END-2", Debug); return modeComboBox->itemText(_m); } else { logEvent (Q_FUNC_INFO, "END-3", Debug); return modeComboBox->currentText(); } } } QDate MainQSOEntryWidget::getDate() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return dateEdit->date(); } QDateTime MainQSOEntryWidget::getDateTime() { logEvent (Q_FUNC_INFO, "Start", Debug); //logEvent (Q_FUNC_INFO, "END", Debug); QDateTime dateTime; dateTime.setDate(dateEdit->date()); dateTime.setTime(timeEdit->time()); logEvent (Q_FUNC_INFO, "END", Debug); return dateTime; } QTime MainQSOEntryWidget::getTime() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return timeEdit->time(); } void MainQSOEntryWidget::toggleRealTime() { logEvent (Q_FUNC_INFO, "Start", Debug); if ( realtimeCheckBox->isChecked ()) { setRealTime (false); } else { setRealTime (true); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getRealTime() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return realtimeCheckBox->isChecked (); } void MainQSOEntryWidget::setRealTime(const bool _realTime) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug << Q_FUNC_INFO << ": " << util->boolToQString (_realTime); realTime = _realTime; realtimeCheckBox->setChecked(realTime); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setManualMode(const bool _manualMode) { logEvent (Q_FUNC_INFO, "Start", Debug); manualModeCheckBox->setChecked (_manualMode); logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getManualMode() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return manualModeCheckBox->isChecked (); //logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setUTC(const bool _utc) { logEvent (Q_FUNC_INFO, "Start", Debug); UTCTime = _utc; setDateAndTimeInternally(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setModify(const bool _modify) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString(_modify); modify = _modify; if (modify) { OKButton->setText(tr("&Save")); clearButton->setText(tr("&Cancel")); realtimeCheckBox->setChecked (false); } else { OKButton->setText(tr("&Add")); clearButton->setText(tr("&Clear")); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getModifying() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return modify; } void MainQSOEntryWidget::slotUpdateTime() { //logEvent (Q_FUNC_INFO, "Start", Debug); if ( (!modify) && (realtimeCheckBox->isChecked()) ) { //qDebug()<< Q_FUNC_INFO << ": Real Time & update"; setDateAndTimeInternally(); } //logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setDateAndTimeInternally() { //logEvent (Q_FUNC_INFO, "Start", Debug); 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()); } //logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::validCharactersInCall(const QString &_qrz) { //qDebug()<< Q_FUNC_INFO << ": " << _qrz; logEvent (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)=='/') )) { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::isModeExisting(const QString &_m) { logEvent (Q_FUNC_INFO, "Start", Debug); if (modeComboBox->findText(_m, Qt::MatchCaseSensitive) >= 0) { logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } bool MainQSOEntryWidget::isBandExisting(const QString &_b) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _b; if (bandComboBox->findText(_b, Qt::MatchCaseSensitive) >= 0) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END true"; return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - END false"; return false; } } void MainQSOEntryWidget::setUpAndRunning(const bool _u) { logEvent (Q_FUNC_INFO, "Start", Debug); upAndRunning = _u; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::selectDefaultBand(bool _init) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END-1"; return; } QString aux; aux = QString(); int defaultBand = dataProxy->getMostUsedBand(-1); //TODO: The log could be defined here //qDebug() << Q_FUNC_INFO << ": " << 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; setBand(aux); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::selectDefaultMode(bool _init) { logEvent (Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } int defaultMode = dataProxy->getMostUsedMode(-1); //TODO: The log could be defined here //qDebug() << Q_FUNC_INFO << ": " << QString::number(defaultMode); if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(getBand(0)); } setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << Q_FUNC_INFO << ": " << QString::number(defaultMode); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::setDuplicatedQSOSlot (const int _secs) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_secs >= 0) { duplicatedQSOSlotInSecs = _secs; } logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::checkIfDupe(const QString &_func) { Q_UNUSED(_func); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << "(" << _func << ")"; #else #endif logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - " << _func; //qDebug() << Q_FUNC_INFO << " - " << qrzLineEdit->text(); Callsign call(qrzLineEdit->text()); if (!call.isValid()) return; //qDebug() << Q_FUNC_INFO << " - 20"; QDateTime _dateTime; _dateTime.setDate(dateEdit->date()); _dateTime.setTime(timeEdit->time()); //qDebug() << Q_FUNC_INFO << " - 30"; QSO q; q.setCall(qrzLineEdit->text()); q.setDateTimeOn(_dateTime); q.setBand(bandComboBox->currentText()); q.setMode(modeComboBox->currentText()); //qDebug() << Q_FUNC_INFO << " - 35"; if (!q.isValid()) { //qDebug() << Q_FUNC_INFO << " - QSO not valid!"; return; } //qDebug() << Q_FUNC_INFO << " - 40"; if ((dataProxy->isThisQSODuplicated(q, duplicatedQSOSlotInSecs).length()<2) || modify) { //qDebug() << Q_FUNC_INFO << " - 41"; //qDebug() << Q_FUNC_INFO << " - DUPE "; //qDebug() << Q_FUNC_INFO << " - Modify: " << util->boolToQString(modify); qrzgroupBox->setTitle(tr("Callsign")); } else { //qDebug() << Q_FUNC_INFO << " - 42"; //qDebug() << Q_FUNC_INFO << " - NOT DUPE "; qrzgroupBox->setTitle(tr("DUPE", "Translator: DUPE is a common world for hams. Do not translate of not sure")); } //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotStartDelayInputTimer() { logEvent (Q_FUNC_INFO, "Start", Debug); if (cleaning) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } if (qrzLineEdit->text ().length ()<1) { //qDebug() << Q_FUNC_INFO; slotClearButtonClicked (); logEvent (Q_FUNC_INFO, "END-2", Debug); return; } int cursor = qrzLineEdit->cursorPosition (); QString aux = util->getClearSQLi (qrzLineEdit->text ()); qrzLineEdit->setText (aux.toUpper()); qrzLineEdit->setCursorPosition (cursor); delayInputTimer->start(300); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotDelayInputTimedOut() { logEvent (Q_FUNC_INFO, "Start", Debug); delayInputTimer->stop(); QString text = qrzLineEdit->text(); if( text != lastQrz) { //qDebug() << Q_FUNC_INFO << ": going for slotQRZTextChanged"; text = lastQrz; slotQRZTextChanged(); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getDarkMode() { logEvent (Q_FUNC_INFO, "Start-End", Debug); 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) { logEvent (Q_FUNC_INFO, "Start", Debug); Q_UNUSED(object); 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 logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } } logEvent (Q_FUNC_INFO, "END", Debug); return QWidget::event(event); } void MainQSOEntryWidget::setFocusToOK() { logEvent (Q_FUNC_INFO, "Start", Debug); OKButton->setFocus (); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO << _func << "/" << _msg << "/" << QString::number(_level); logEvent(_func, _msg, _level); } void MainQSOEntryWidget::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO; if (logLevel<=_level) { //qDebug() << Q_FUNC_INFO << "Emitting..."; emit debugLog (_func, _msg, _level); } } klog-2.4.1/utilities.h0000644000175000017500000002307315003153303013614 0ustar develdevel#ifndef KLOG_UTILITIES_H #define KLOG_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. This class should not need to query the DB neither the DataProxy Class */ #include #include #include #include #include #include #include #include "global.h" // Remove when all deprecated functions are removed #include "locator.h" #include "klogdefinitions.h" #include "adif.h" //#include "dataproxy_sqlite.h" class Utilities : public QObject { Q_OBJECT friend class tst_Utilities; public: Utilities(const QString &_parentName); ~Utilities(); //void setDarkMode(const QString &_dm); //bool isDarkMode(); //void setSpecialCalls (const QStringList &_p); 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(); bool QStringToBool(const QString &_s); //QString getKLogDatabaseFile(const QString &_file); bool fileExists(const QString &_fileName); 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(); QString getDefaultModeForFreq(const double _f); int getNormalizedDXCCValue(const int _dxcc); // Validations bool isValidDate(const QDate _d); bool isValidDateTime(const QString &_d); //bool isValidCall(const QString &_c, bool _force=false); // To be replaced by Callsign::isValid 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 isValidGrid_ext(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 isValidFISTS(const QString &c); bool isValidTimeFromString(const QString &_s); bool isValidDateFromString(const QString &_s); bool isValidDateTimeFromString(const QString &_s); bool isValidDXCC(const int _d); bool isValidAntPath(const QString &_s); bool isValidARRLSect(const QString &_s); bool isValidContinent(const QString &_s); bool isValidPropMode(const QString &_s); bool isValidEmail(const QString &_s); QStringList getValidADIFFieldAndData(const QString &_b); bool areThoseListsTheSame(const QStringList &_list1, const QStringList &_list2); //QString getADIFField(const QString &_fieldName, const QString &_data); KLOG_DEPRECATED QString getMainCallFromComplexCall(const QString &_complexCall); //TODO: To be replaced by QString Callsign::getHostFullPrefix(bool getHomeIfEmpty=true); QString getAValidCall (const QString &_wrongCall); QString getPrefixFromCall(const QString &_c, bool withAreaNumber = false); int getAreaNumberFromCall(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); QString getLogColumnDBName(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" QString getADIFTimeFromQTime(const QTime &_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" // Parse QSO_COMPLETE from ADIF QString getQSO_CompleteFromADIF(const QString &_s); // Expect a string and returns 1char string for DB QString getADIFQSO_CompleteFromDB(const QString &_s); // Returns the ADIF QSO_COMPLETE QString getOnlineServiceName(OnLineProvider _service); //bool isValidDistance(const double _d); bool isValidSponsor(const QString &_s); QString debugLevelToString(DebugLogLevel _l); DebugLogLevel stringToDebugLevel(const QString &_s); bool isValidLogLevel(const QString &_s); QStringList getDebugLevels(); void setLogLevel(DebugLogLevel _l); void openQrzcom(const QString _call); void printCommandHelp(); //QPalette getPalete(bool _ok); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); private: void init(); void InitializeHash(); void setLogColumnNames(); // Creates the map of column Names (should be called from init() ) QString getKLogDefaultDatabaseFile(); //bool isCountrySuffix (const QString &_c); //bool isAKnownCall(const QString &_c); //QStringList getPrefixRunningTheCall(const QString &_c, bool withAreaNumber = false); //Goes char by char identifying the prefix and area Number //QPair getCallParts(const QString &_c); void setARRLSect(); void setContinent(); void setSponsorsList(); //QString getCheckedComplexCall(const QString &_c); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); //bool darkMode; QString getDBPath(); //QString dbPath; QString softwareVersion; QString parentName; // The class that instanciated this object. QStringList ARRL_sects, continent, sponsorsList, logLevels; DebugLogLevel logLevel; //KLOG_DEPRECATED QStringList specialCalls; // To be moved to World class QMap columnNames; bool validateCalls; QHash ADIFHash; // Name, type }; #endif // UTILITIES_H klog-2.4.1/awarddxmarathon.cpp0000644000175000017500000000574415003153303015325 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" ; dataProxy = dp; //qDebug() << "DXMarathon::DXMarathon - END" ; } int DXMarathon::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonQSO: " << QString::number(_year); return dataProxy->getQSOonYear(_year, _logNumber); } int DXMarathon::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonDXCC: " << QString::number(_year); return dataProxy->getDXCConYear(_year, _logNumber); } int DXMarathon::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonCQ: " << QString::number(_year); return dataProxy->getCQzonYear(_year, _logNumber); } int DXMarathon::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonScore: " << QString::number(_year); 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-2.4.1/eqslutilities.h0000644000175000017500000000753115003153303014502 0ustar develdevel#ifndef KLOG_EQSLUTILITIES_H #define KLOG_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-2.4.1/world.h0000644000175000017500000001503215003153303012724 0ustar develdevel#ifndef KLOG_WORLD_H #define KLOG_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 "utilities.h" //#include "klogdefinitions.h" //#include "awards.h" //class QStringList; enum { Entity_Name = 1, Entity_Continent = 2 }; class World : public QObject { //friend class Awards; Q_OBJECT friend class tst_World; public: World(DataProxy_SQLite *dp, const QString &_parentFunction); //World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_parentFunction); //World(DataProxy_SQLite *dp, const QString &_klogVer, const QString &_parentFunction); ~World(); bool create(const QString &_worldFile); bool recreate(const QString &_worldFile); bool readWorld(); QString getQRZEntityName(const QString &_qrz); QString getEntityName(const int _entityN); QString getQRZEntityMainPrefix(const QString &_qrz); QString getEntityMainPrefix(int _dxcc); EntityData getEntityDataFromDXCC(const int _dxcc); // Returns the data of one DXCC entity 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 getLongitude(const int _enti); // Returns the longitude 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 getEntityPrefixes(const int _enti); bool isAKnownCall(const QString &_callsign); bool isAKnownPrefix(const QString &_prefix); //QStringList getEntitiesNames(); int getHowManyEntities(); bool hasSpecialEntities(); bool fillEmptyDXCCInTheLog(); // Adds the DXCC to the QSOs in the log that don't have it private slots: private: //void identifyOS(); bool insertSpecialEntities(); bool readEntities(); // Read all the entities and fill entities QMap int getHowManyEmptyDXCCorCont(); bool updateDXCCAndContinent(const int _id, const int _dxcc, const QString &_cont); //bool readCTYDAT(); bool readCTYCSV(const QString &_worldFile); bool addEntity(const QString &_name, const int _cq, const int _itu, const int _contId, const double _lat, const double _lon, const double _utc, const int _dxcc, const QString &_mainpref); bool addPrefix(const QString &_pref, const int _dxcc, const int _cqz, const int _ituz); //void createWorldModel(); QStringList readZones(const QString &pref, const int _cq, const int _itu); bool addPrefixes(const QString &prefixes, int entityNumber, int cqz, int ituz); bool insertPrefixes(const QList>>> &pairPrefixes); int extractEntityNumber(const QStringList &stringList); void emitQueryError(const QSqlQuery &query) const; bool executeQuery(QSqlQuery &query, const QString &queryString) const; //int progressBarPosition; bool created, read; //QString 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; Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; QHash worldPrefixes; QStringList specialCalls, longPrefixes; QMap entities; // Static data to speed up queries 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 queryError(const char *funcInfo, const QString &databaseText, const QString &text, const QString &query) const; }; #endif // WORLD_H klog-2.4.1/qso.h0000644000175000017500000004746215003153303012413 0ustar develdevel#ifndef KLOG_QSO_H #define KLOG_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 #include "utilities.h" #include "klogdefinitions.h" #include "adif.h" class QSO : public QObject { Q_OBJECT friend class tst_QSO; public: QSO(QObject *parent = nullptr); QSO(const QSO& other); ~QSO(); void operator=(QSO const &_other); bool copy(const QSO& other); void setLogLevel (const DebugLogLevel _b); void setRealTime(const bool _rt); // Not QSO info but KLog status bool getRealTime() const; void setManualMode(const bool _rt); // Not QSO info but KLog status bool getManualMode() const; void setBackup(const bool _rt); bool getBackup() const; void setModifying(const bool _mod); bool getModifying() const; bool setData(const QString &_adifPair); void clear(); bool isValid(); void setLoTWUpdating(bool _lotw); bool setCall(const QString &_c); QString getCall() const; bool setBand(const QString &_c); QString getBand() const; bool setMode(const QString &_c); QString getMode() const; bool setDateTimeOn(const QDateTime &_c); QDateTime getDateTimeOn() const; bool setDate(const QDate &_c); QDate getDate() const; bool setTimeOn(const QTime &_c); QTime getTimeOn() const; bool setQSOid(const int _i); int getQSOid() const; bool setLogId(const int _i); int getLogId() const; bool setBandRX(const QString &_c); QString getBandRX() const; bool setRSTTX(const QString &_c); QString getRSTTX() const; bool setRSTRX(const QString &_c); QString getRSTRX(); bool setFreq(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 setGridSquare_ext(const QString &_c); QString getGridSquare_ext(); bool setName(const QString &_c); QString getName(); bool setRXPwr(const double _f); double getRXPwr() const; // QSL TAB bool setQSL_SENT(const QString &_c); QString getQSL_SENT() const; bool setQSLSDate(const QDate &_c); QDate getQSLSDate() const; bool setQSLSenVia(const QString &_qs); QString getQSLSentVia() const; bool setQSL_RCVD(const QString &_c); QString getQSL_RCVD() const; bool setQSLRDate(const QDate &_c); QDate getQSLRDate() const; bool setQSLRecVia(const QString &_qs); QString getQSLRecVia() const; bool setQSLVia(const QString &_qs); QString getQSLVia() const; bool setQSLMsg(const QString &_qs); QString getQSLMsg() const; // eQSL tab bool setClubLogStatus(const QString &_c); QString getClubLogStatus() const; bool setClubLogDate(const QDate &_c); bool setClubLogDate(const QString& data); QDate getClubLogDate() const; bool setEQSLQSL_RCVD(const QString &_c); QString getEQSLQSL_RCVD() const; bool setEQSLQSL_SENT(const QString &_c); QString getEQSLQSL_SENT() const; bool setEQSLQSLRDate(const QDate &_c); QDate getEQSLQSLRDate() const; bool setEQSLQSLSDate(const QDate &_c); QDate getEQSLQSLSDate() const; bool setLoTWQSL_RCVD(const QString &_c); QString getLoTWQSL_RCVD() const; bool setLoTWQSL_SENT(const QString &_c); QString getLoTWQSL_SENT() const; bool setLoTWQSLRDate(const QDate &_c); QDate getLoTWQSLRDate() const; bool setLoTWQSLSDate(const QDate &_c); QDate getLoTWQSLSDate() const; bool setQRZCOMStatus(const QString &_c); QString getQRZCOMStatus() const; bool setQRZCOMDate(const QDate &_c); QDate getQRZCOMDate() const; void setDefaultEQSLSentServices(const bool _send); // Comment Tab bool setComment(const QString &_c); QString getComment() const; bool setKeepComment(bool _k); bool getKeepComment() const; // Others Tab bool setDXCC(const int _i); int getDXCC() const; bool setPropMode(const QString &_c); QString getPropMode() const; bool setSOTA_REF(const QString &_c); QString getSOTA_REF() const; bool setAge(const double _c); double getAge() const; bool setIOTA(const QString &_c); QString getIOTA(); bool setKeepOthers(bool _k); bool getKeepOthers(); bool setVUCCGrids(const QString &_c); QString getVUCCGrids(); bool setPOTA_Ref(const QString &_c); QString getPOTA_Ref(); bool setWWFF_Ref(const QString &_c); QString getWWFF_Ref() const; bool setSIG(const QString &_c); QString getSIG() const; bool setSIG_INFO(const QString &_c); QString getSIG_INFO() const; // My data Tab bool setTXPwr(double _f); double getTXPwr() const; bool setOperatorCallsign(const QString &_c); QString getOperatorCallsign() const; bool setStationCallsign(const QString &_c); QString getStationCallsign() const; bool setMyGridSquare(const QString &_c); QString getMyGridSquare() const; bool setMyGridSquare_ext(const QString &_c); QString getMyGridSquare_ext() const; bool setKeepMyData(bool _k); bool getKeepMyData() const; bool setMySOTA_REF(const QString &_c); QString getMySOTA_REF() const; bool setMyRig(const QString &_c); QString getMyRig() const; bool setMyAntenna(const QString &_c); QString getMyAntenna() const; bool setMyVUCCGrids(const QString &_c); QString getMyVUCCGrids() const; bool setMyPOTA_Ref(const QString &_c); QString getMyPOTA_Ref() const; bool setMyWWFF_Ref(const QString &_c); QString getMyWWFF_Ref() const; // Satellite Tab bool setSatName(const QString &_c); QString getSatName() const; bool setSatMode(const QString &_c); QString getSatMode() const; bool setKeepSatTab(bool _k); bool getKeepSatTab() const; bool setAddress(const QString &_c); QString getAddress() const; bool setAltitude(const double _c); double getAltitude() const; bool setA_Index(const int _i); int getA_Index() const; bool setAnt_az(const double _c); double getAnt_az() const; bool setAnt_el(const double _c); double getAnt_el() const; bool setAnt_Path(const QString &_c); QString getAnt_Path() const; bool setARRL_Sect(const QString &_c); QString getARRL_Sect() const; bool setCheck(const QString &_c); QString getCheck() const; bool setClass(const QString &_c); QString getClass() const; bool setContinent(const QString &_c); QString getContinent() const; bool setDistance(const double _i); double getDistance() const; bool setOwnerCallsign(const QString &_c); QString getOwnerCallsign() const; bool setEQ_Call(const QString &_c); // Contacted station owner QString getEQ_Call() const; // Contacted station owner bool setHRDUpdateDate(const QDate &_c); QDate getHRDUpdateDate() const; bool setHRDLogStatus(const QString &_c); QString getHRDLogStatus() const; bool setHamLogEUStatus(const QString &_c); QString getHamLogEUStatus() const; bool setHamLogEUUpdateDate(const QDate &_c); QDate getHamLogEUUpdateDate() const; bool setHamQTHStatus(const QString &_c); QString getHamQTHStatus() const; bool setHamQTHUpdateDate(const QDate &_c); QDate getHamQTHUpdateDate() const; bool setK_Index(const int _i); int getK_Index() const; bool setDateOff(const QDate &_c); QDate getDateOff() const; bool setTimeOff(const QTime &_c); QTime getTimeOff() const; bool setRig(const QString &_c); QString getRig() const; bool setCountry(const QString &_c); QString getCountry() const; bool setAwardGranted(const QString &_c); QString getAwardGranted() const; bool setAwardSubmitted(const QString &_c); QString getAwardSubmitted() const; bool setCounty(const QString &_c); QString getCounty() const; bool setContactedOperator(const QString &_c); QString getContactedOperator() const; bool setContestID(const QString &_c); QString getContestID() const; bool setCQZone(const int _i); int getCQZone() const; bool setCreditGranted(const QString &_c); QString getCreditGranted() const; bool setCreditSubmitted(const QString &_c); QString getCreditSubmitted() const; bool setDarcDok(const QString &_c); QString getDarcDok() const; bool setEmail(const QString &_c); QString getEmail() const; bool setFists(const int _i); int getFists() const; bool setFistsCC(const int _i); int getFistsCC() const; bool setForceInit(bool _k); bool getForceInit() const; bool setIotaID(const int _i); int getIotaID() const; bool setItuZone(const int _i); int getItuZone() const; bool setLatitude(const QString &_c); QString getLatitude() const; bool setLongitude(const QString &_c); QString getLongitude() const; bool setQSOComplete(const QString &_c); // Receives valid ADIF data (Y/N/NIL/?) QString getQSOComplete() const; bool setNrBursts(const int _i); int getNrBursts() const; bool setMaxBursts(const int _i); int getMaxBursts() const; bool setNrPings(const int _i); int getNrPings() const; bool setMsShower(const QString &_c); QString getMsShower() const; bool setQSORandom(bool _k); bool getQSORandom() const; bool setMyAltitude(const double _c); double getMyAltitude() const; bool setMyARRL_Sect(const QString &_c); QString getMyARRL_Sect() const; bool setMyCity(const QString &_c); QString getMyCity() const; bool setMyCounty(const QString &_c); QString getMyCounty() const; bool setMyCountry(const QString &_c); QString getMyCountry() const; bool setMyCQZone(const int _i); int getMyCQZone() const; bool setMyDXCC(const int _i); int getMyDXCC() const; bool setMyFists(const int _c); int getMyFists() const; bool setMyIOTA(const QString &_c); QString getMyIOTA() const; bool setMyIotaID(const int _i); int getMyIotaID() const; bool setMyITUZone(const int _i); int getMyITUZone() const; bool setMyLatitude(const QString &_c); QString getMyLatitude() const; bool setMyLongitude(const QString &_c); QString getMyLongitude() const; bool setMyName(const QString &_c); QString getMyName() const; bool setMyPostalCode(const QString &_c); QString getMyPostalCode() const; bool setMySig(const QString &_c); QString getMySig() const; bool setMySigInfo(const QString &_c); QString getMySigInfo(); bool setMyState(const QString &_c); QString getMyState() const; bool setMyStreet(const QString &_c); QString getMyStreet() const; bool setMyUsacaCounties(const QString &_c); QString getMyUsacaCounties() const; bool setNotes(const QString &_c); QString getNotes() const; bool setPrefix(const QString &_c); // ADIF - PFX - WPX Prefix QString getPrefix() const; bool setPrecedence(const QString &_c); QString getPrecedence() const; bool setPublicKey(const QString &_c); QString getPublicKey() const; bool setRegion(const QString &_c); QString getRegion() const; bool setTenTen(const int _i); int getTenTen() const; bool setSFI(const int _i); int getSFI() const; bool setSilentKey(bool _k); bool getSilentKey() const; bool setSkcc(const QString &_c); QString getSkcc() const; bool setSrx(const int _i); int getSrx() const; bool setSrxString(const QString &_c); QString getSrxString() const; bool setState(const QString &_c); // ADIF - STATE - Primary subdivision QString getState() const; bool setStx(const int _i); int getStx() const; bool setStxString(const QString &_c); QString getStxString() const; //bool setSubmode(const QString &_c, bool requestMode = false); bool setSubmode(const QString &_c); QString getSubmode() const; bool setSwl(bool _k); bool getSwl() const; bool setUksmg(const int _i); int getUksmg() const; bool setUsacaCounties(const QString &_c); QString getUsacaCounties() const; bool setVeProv(const QString &_c); QString getVeProv() const; bool setWeb(const QString &_c); QString getWeb() const; int toDB(int _qsoId = 0); bool fromDB(int _qsoId); //bool add(); //bool modify(const int _qsoId); bool isComplete() const; QString getADIF(); QString getBandNameFromFreq(const double _n); // Should be push out of this class signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void getModeSignal (QString submode); // Request the mode to be filled for a given submode void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: //QTime startT; bool isValidCall() const; bool isValidBand() const; bool isValidMode() const; bool isValidDateTime() const; void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QString getAddQueryString(); QString getModifyQueryString(); QSqlQuery getPreparedQuery(const QString &_s); int getBandIdFromBandName(bool _rxBand=false); // if rxBand = true, it will chec the bandRX QString getBandNameFromBandId(int bandId); int getModeIdFromModeName(); // It really returns submode QString getModeNameFromModeId(int _modeId, bool _submode=true); void setBandFromFreq(const double _fr, bool TX = true); //enum QSOStatus {unknown, ATNO, needed, worked, confirmed, dupe}; //DataBase *db; int qsoId, logId, dxcc, a_index, k_index, cqz, fists, fists_cc, my_fists, iota_ID, itu_zone, nr_bursts, max_bursts, nr_pings, my_cqz, my_itu_zone, my_dxcc, my_iota_ID, srx, stx, uksmg; int ten_ten, sfi; double freq_tx, freq_rx, pwr_rx, pwr_tx, age, ant_el, ant_az, distance, altitude, my_altitude; QString satName, satMode, callsign, stationCallsign, operatorCall, propMode, band, band_rx, mode, gridsquare, my_gridsquare, gridsquare_ext, my_gridsquare_ext, qth, name, RST_tx, RST_rx; QString qsl_rcvd, qsl_sent, qslSenVia, qslRecVia, qslVia, check, clase; QString lotw_qsl_sent, lotw_qsl_rcvd, sota_ref, my_sota_ref, my_rig, my_antenna, my_arrl_sect, vucc_grids, my_vucc_grids; QString pota_ref, my_pota_ref; QString clublog_status, hrdlog_status, QRZCom_status; QString hamlogeu_status, hamqth_status; QString eqsl_qsl_sent, eqsl_qsl_rcvd; QString comment, address, ant_path, arrl_sect, continent, rig, country, award_granted, award_submitted, county, contacted_op, contacted_owner, contest_id; QString credit_granted, credit_submitted,darc_dok, email, qso_complete, usaca_counties, ve_prov, web, wwff_ref; QString iota, ownerCall, latitude, longitude, ms_shower, notes, prefix, precedence, public_key, qslmsg, region, sig, sig_info, skcc, srx_string, stx_string, state, submode; QString my_city, my_county, my_country, my_iota, my_latitude, my_longitude, my_name, my_postal_code, my_sig, my_sig_info, my_state, my_street, my_usaca_counties, my_wwff_ref; QTime qso_time_off; QDateTime qso_dateTime; QDate QSLRDate, QSLSDate, QSLLoTWRDate, QSLLoTWSDate, qso_date_off; QDate eQSLRDate, eQSLSDate, clublogQSOUpdateDate, hrdlogUploadDate; QDate hamlogeuUpdateDate, hamqthUpdateDate; QDate QRZComDate; bool backup, lotwUpdating, realTime, manualMode, silent_key; bool keepComment, keepOther, keepMyData, keepSat, modifying, isValidDistance, forceInit, qso_random, swl; bool haveBand, haveMode, haveSubMode, haveDateTime, haveCall; Utilities *util; Adif *adif; DebugLogLevel logLevel; // DataProxy_SQLite *dataProxy; bool decltype_function(const QString& _c); //empty function to find correct typenames for mem_fn, DO NOT RENAME static QHash SetDataHash; void InitializeHash(); //Overloaded helper functions to accept string data for nonstring functions bool setAge(const QString &data); bool setAltitude(const QString &data); bool setA_Index(const QString &data); bool setAnt_az(const QString &data); bool setAnt_el(const QString &data); bool setCQZone(const QString &data); bool setDistance(const QString &data); bool setDXCC(const QString &data); bool setFists(const QString &data); bool setFistsCC(const QString &data); bool setMyFists(const QString &data); bool setIotaID(const QString &data); bool setItuZone(const QString &data); bool setK_Index(const QString &data); bool setMaxBursts(const QString &data); bool setMyAltitude(const QString &data); bool setMyCQZone(const QString &data); bool setMyDXCC(const QString &data); bool setMyIotaID(const QString &data); bool setMyITUZone(const QString &data); bool setNrBursts(const QString &data); bool setNrPings(const QString &data); bool setSFI(const QString &data); bool setSrx(const QString &data); bool setStx(const QString &data); bool setTenTen(const QString &data); bool setUksmg(const QString &data); bool setFreq(const QString& data); bool setFreqRX(const QString& data); bool setRXPwr(const QString& data); bool setTXPwr(const QString& data); bool setEQSLQSLRDate(const QString& data); bool setEQSLQSLSDate(const QString& data); bool setForceInit(const QString& data); bool setHRDUpdateDate(const QString& data); bool setHamLogEUUpdateDate(const QString& data); bool setHamQTHUpdateDate(const QString& data); bool setLoTWQSLRDate(const QString& data); bool setLoTWQSLSDate(const QString& data); bool setQRZCOMDate(const QString& data); bool setQSLRDate(const QString& data); bool setQSLSDate(const QString& data); bool setDate(const QString& data); bool setDateOff(const QString& data); bool setQSORandom(const QString& data); bool setSilentKey(const QString& data); bool setSwl(const QString& data); bool setTimeOff(const QString& data); bool setTimeOn(const QString& data); bool setLoTWQSLRDate2(const QString& data); bool setLoTWQSLSDate1(const QString& data); bool setLoTWQSLSDate2(const QString& data); int getLastInsertedQSO(); // just a query to get the latest inserted QSO }; #endif // QSO_H klog-2.4.1/TODO0000644000175000017500000004605615003153303012126 0ustar develdevel/*========== START Qt6 migration: ** void tst_MainWindow::test_focusOrder() Test: //QApplication::setActiveWindow(mainWindow); I had to replace previews line. ** void DataBase::compress() qsqldatabase::exec is deprecated ** void eLogQrzLog::parseXMLAnswer(QXmlStreamReader &xml) { // Next line was commented out as it returns q QStringView instead of a QString //showDebugLog (Q_FUNC_INFO, QString("Start: " + xml.text())); =============== END of Qt6 migration BUG: 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(modifyingQSOid)) 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: 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: 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-2.4.1/COPYING0000644000175000017500000010451615003153303012465 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-2.4.1/widgets/0000755000175000017500000000000015003153303013071 5ustar develdevelklog-2.4.1/widgets/showkloglogwidget.h0000644000175000017500000000534715003153303017016 0ustar develdevel#ifndef KLOG_WIDGETS_SHOWKLOGLOGWIDGET_H #define KLOG_WIDGETS_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); ~ShowKLogLogWidget(); void add(QString const &_func, QString const &_log, const DebugLogLevel _l); void setLogLevel(const DebugLogLevel _l); signals: void newLogLevel(DebugLogLevel level); private slots: void slotLevelComboBoxChanged(const QString &_l); private: void createUI(); QString debugLevelToString(DebugLogLevel _l); QStringList list; QListView *logsView; QStringListModel *model; QComboBox *levelComboBox; DebugLogLevel logLevel; QFile *debugFile; Utilities *util; }; #endif // SHOWKLOGLOGWIDGET_H klog-2.4.1/widgets/onlinemessagewidget.h0000644000175000017500000000450015003153303017276 0ustar develdevel#ifndef KLOG_WIDGETS_ONLINEMESSAGEWIDGET_H #define KLOG_WIDGETS_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-2.4.1/widgets/showadifimportwidget.cpp0000644000175000017500000001662215003153303020047 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" #include "../callsign.h" #include "../utilities.h" ShowAdifImportWidget::ShowAdifImportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { Q_UNUSED(_parentFunction); dataProxy = dp; //util = new Utilities(Q_FUNC_INFO); okButton = new QPushButton; //cancelButton = new QPushButton; tableWidget = new QTableWidget; qsosList.clear(); setWindowTitle("ShowAdif"); createUI(); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); } ShowAdifImportWidget::~ShowAdifImportWidget() { //delete(dataProxy); } 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 "; //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()); //QString aux, prefix; //qDebug() << "ShowAdifImportWidget::fillTable: -3" ; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << "ShowAdifImportWidget::fillTable pre FOR"; for (int i=0; icolumnCount()); //qDebug() << "ShowAdifImportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()); 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" ; } void ShowAdifImportWidget::slotOKPushButtonClicked() { this->hide(); //emit selection(stationCallsignComboBox->currentText(), startDate->date(), endDate->date()); close(); } void ShowAdifImportWidget::closeEvent(QCloseEvent *event) { //qDebug() << "ShowAdifImportWidget::closeEvent"; event->accept(); } void ShowAdifImportWidget::showEvent(QShowEvent *event) { //qDebug() << "ShowAdifImportWidget::showEvent"; fillTable(); event->accept(); } void ShowAdifImportWidget::addQSOToTheList(const QStringList _qso) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - Start"; // QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qso.length()!=4) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid qso list received"; return; } Callsign callsign(_qso.at(0)); if (!callsign.isValid()) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid QRZ received"; return; } if (dataProxy->getIdFromBandName(_qso.at(2))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid BAND received"; return; } if (dataProxy->getIdFromModeName(_qso.at(3))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid Mode received"; return; } Utilities util(Q_FUNC_INFO); QDateTime _dateTime = util.getDateTimeFromSQLiteString(_qso.at(1)); if (!_dateTime.isValid()) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid DateTime received"; 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"; } klog-2.4.1/widgets/showadifimportwidget.h0000644000175000017500000000531515003153303017511 0ustar develdevel#ifndef KLOG_WIDGETS_SHOWADIFIMPORTPORTWIDGET_H #define KLOG_WIDGETS_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-2.4.1/widgets/adiflotwexportwidget.h0000644000175000017500000000733115003153303017525 0ustar develdevel#ifndef KLOG_WIDGETS_ADIFLOTWEXPORTWIDGET_H #define KLOG_WIDGETS_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); void setDefaultMyGrid(const QString &_st); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotOKPushButtonClicked(); void slotCancelPushButtonClicked(); void slotStationCallsignChanged(); void slotDateChanged(); void slotMyGridChanged(); signals: void selection(QString _st, QString _grid, QDate _startD, QDate _endD, ExportMode _exportMode); void qsosToSend(QString _call, QList _qsos, ExportMode _exportMode); void askingToClose(); private: void createUI(); QList fillTable(); void setTopLabel(const QString &_t); void addQSO(const int _qsoID); bool fillStationCallsignComboBox(); void fillStationMyGridComboBox(); void fillDates(); void setDefaultStationComboBox(); void setDefaultMyGridComboBox(); void updateIfNeeded(); void blockAllSignals(const bool _b); DataProxy_SQLite *dataProxy; Utilities *util; QComboBox *stationCallsignComboBox, *myGridSquareComboBox; QDateEdit *startDate, *endDate; QLabel *topLabel, *numberLabel; QLineEdit *searchLineEdit; QPushButton *okButton, *cancelButton; ExportMode selectedEMode; QTableWidget *tableWidget; QHeaderView *hv, *hh; ExportMode currentExportMode; int logNumber, numOfQSOsInThisLog; QString defaultStationCallsign, defaultMyGrid; QString currentCall, currentGrid; QDate currentStart, currentEnd; bool starting; QList qsos; }; #endif klog-2.4.1/widgets/showkloglogwidget.cpp0000644000175000017500000001036215003153303017342 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) { util = new Utilities(Q_FUNC_INFO); levelComboBox = new QComboBox; model = new QStringListModel(); //QStringList list; list.clear(); model->setStringList(list); logsView = new QListView; logsView->setModel(model); createUI(); } ShowKLogLogWidget::~ShowKLogLogWidget() { delete(util); } void ShowKLogLogWidget::createUI() { levelComboBox->clear(); levelComboBox->addItems(util->getDebugLevels()); levelComboBox->setCurrentIndex(0); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(levelComboBox); layout->addWidget(logsView); setLayout(layout); connect(levelComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotLevelComboBoxChanged(QString) ) ) ; } void ShowKLogLogWidget::add(const QString &_func, QString const &_log, const DebugLogLevel _l) { //qDebug() << "Debugging0: " << _func << "/" << _log << "/" << util->debugLevelToString(logLevel) << "/" << util->debugLevelToString(_l); if (logLevel >_l) { return; } QString msg; msg = QString("%1 %2 - %3 - %4").arg(QDateTime::currentDateTime().toString("yyyy-MM-ddThh:mm:ss")).arg(util->debugLevelToString (_l)).arg(_func).arg(_log); //qDebug() << "Debugging1: " << msg; if(model->insertRow(0)) { QModelIndex index = model->index(0, 0); model->setData(index, msg); } return; // FILE debugFile = new QFile(util->getDebugLogFile()); if (!debugFile->open(QIODevice::Append | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " Can't open the file to log - EXITING"; return; } QTextStream out(debugFile); out << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmsszzz") << " - " << _func << " - " << msg; //qDebug() << "Debugging2: " << out.string(); debugFile->close(); } void ShowKLogLogWidget::setLogLevel(const DebugLogLevel _l) { //qDebug() << Q_FUNC_INFO << " - New log Level: " << util->debugLevelToString(_l); QString logString = util->debugLevelToString(_l); if (util->isValidLogLevel(logString)) levelComboBox->setCurrentIndex(levelComboBox->findText(logString, Qt::MatchCaseSensitive)); else { levelComboBox->setCurrentIndex(0); logLevel = util->stringToDebugLevel("None"); return; } logLevel = _l; } void ShowKLogLogWidget::slotLevelComboBoxChanged(const QString &_l) { emit newLogLevel(util->stringToDebugLevel(_l)); } klog-2.4.1/widgets/adiflotwexportwidget.cpp0000644000175000017500000006223015003153303020057 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 #include "adiflotwexportwidget.h" #include "../callsign.h" #include "../locator.h" AdifLoTWExportWidget::AdifLoTWExportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { #ifdef QT_DEBUG //qDebug() << ": " << _parentFunction; #else #endif (void)_parentFunction; //qDebug() << Q_FUNC_INFO << " - Start: " + _parentFunction; dataProxy = dp; starting = true; //util = new Utilities(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); stationCallsignComboBox = new QComboBox; myGridSquareComboBox = 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(); defaultMyGrid = QString(); numOfQSOsInThisLog = 0; createUI(); starting = false; qsos.clear (); //qDebug() << Q_FUNC_INFO << " - END"; } AdifLoTWExportWidget::~AdifLoTWExportWidget() { //delete(util) ; } void AdifLoTWExportWidget::setDefaultStationCallsign(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; Callsign callsign(_st); if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - Call not valid!"; defaultStationCallsign = _st; } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultMyGrid(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; Locator locator; if (locator.isValidLocator(_st)) { defaultMyGrid = _st; } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; tableWidget->setSortingEnabled (true); stationCallsignComboBox->setToolTip(tr("Select the Station Callsign that you want to use to upload the log.")); startDate->setCalendarPopup (true); endDate->setCalendarPopup (true); 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 *myGridLabel = new QLabel; myGridLabel->setText(tr("My Locator")); 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("My Locator") << 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(myGridLabel, 1, 1); mainLayout->addWidget(myGridSquareComboBox, 2, 1); mainLayout->addWidget(startLabel, 1, 2); mainLayout->addWidget(startDate, 2, 2); mainLayout->addWidget(endLabel, 1, 3); mainLayout->addWidget(endDate, 2, 3); 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(myGridSquareComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotMyGridChanged() ) ) ; connect(okButton, SIGNAL(clicked()), this, SLOT(slotOKPushButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultStationComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; //stationCallsignComboBox->blockSignals(true); Callsign callsign(defaultStationCallsign); if (!callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - END-1 (call not valid)"; //stationCallsignComboBox->blockSignals(false); return; } if (stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive) >= 0) { stationCallsignComboBox->setCurrentIndex(stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive)); } //stationCallsignComboBox->blockSignals(false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultMyGridComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; Locator locator; if (!locator.isValidLocator(defaultMyGrid)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } if (myGridSquareComboBox->findText(defaultMyGrid, Qt::MatchCaseSensitive) >= 0) { myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(defaultMyGrid, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << ": 1: " << myGridSquareComboBox->currentText(); } else if (myGridSquareComboBox->count()>=3) { myGridSquareComboBox->findText(myGridSquareComboBox->itemText(2), Qt::MatchCaseSensitive); //qDebug() << Q_FUNC_INFO << ": 2: " << myGridSquareComboBox->currentText(); } else { //qDebug() << Q_FUNC_INFO << ": 3"; } //qDebug() << Q_FUNC_INFO << " - END"; } bool AdifLoTWExportWidget::fillStationCallsignComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; //stationCallsignComboBox->blockSignals(true); stationCallsignComboBox->clear(); //qDebug() << Q_FUNC_INFO << " -1" ; stationCallsignComboBox->addItem(tr("Not defined")); //qDebug() << Q_FUNC_INFO << " -2" ; if (currentExportMode == ModeADIF) { //qDebug() << Q_FUNC_INFO << " -3"; stationCallsignComboBox->addItem(tr("ALL")); //qDebug() << Q_FUNC_INFO << " -4"; } QStringList stationCallsigns; stationCallsigns.clear(); if (currentExportMode == ModeLotW) { stationCallsigns.append(dataProxy->getStationCallSignsFromLogWithLoTWPendingToSend(logNumber)); //qDebug() << Q_FUNC_INFO << " -3"; //stationCallsignComboBox->addItems(); //qDebug() << Q_FUNC_INFO << " -4"; } else { //qDebug() << Q_FUNC_INFO << " -5"; stationCallsigns.append(dataProxy->getStationCallSignsFromLog(logNumber)); //qDebug() << Q_FUNC_INFO << " -6"; } if (stationCallsigns.count()<1) { return false; } stationCallsignComboBox->addItems(stationCallsigns); return true; //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::fillStationMyGridComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; // Keep the grid that is shown now // clean and fill the combo. // If the saved locator is in the list, it is selected. //myGridSquareComboBox->blockSignals(true); QString tempGrid = myGridSquareComboBox->currentText (); myGridSquareComboBox->clear(); QStringList grids; grids.clear (); Callsign callsign(stationCallsignComboBox->currentText()); if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - ValidCall: " << stationCallsignComboBox->currentText(); grids.append (dataProxy->getGridsToBeSent (stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), currentExportMode, true, logNumber)); } else if (stationCallsignComboBox->currentIndex() == 0) { // Not defined call //qDebug() << Q_FUNC_INFO << " - Not Defined" ; grids.append (dataProxy->getGridsToBeSent ("NOT", startDate->date(), endDate->date(), currentExportMode, true, logNumber)); } else { //ALL calls //qDebug() << Q_FUNC_INFO << " - ALL Calls" ; //myGridSquareComboBox->addItem(tr("ALL")); grids.append (dataProxy->getGridsToBeSent ("ALL", startDate->date(), endDate->date(), currentExportMode, false, logNumber)); } myGridSquareComboBox->addItem(tr("Not defined")); myGridSquareComboBox->addItem(tr("ALL")); myGridSquareComboBox->addItems(grids); if (myGridSquareComboBox->findText(tempGrid, Qt::MatchCaseSensitive) >= 0) { myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(tempGrid, Qt::MatchCaseSensitive)); } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setTopLabel(const QString &_t) { //qDebug() << Q_FUNC_INFO << " - Start"; topLabel->setText(_t); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::fillDates() { // Shows the first and last QSO done with one specific callsign. //qDebug() << Q_FUNC_INFO << " - Start"; //startDate->blockSignals(true); //endDate->blockSignals(true); Callsign callsign(stationCallsignComboBox->currentText()); if (callsign.isValid()) { //qDebug() << Q_FUNC_INFO << " - Not valid Call"; startDate->setDate(dataProxy->getFirstQSODateFromCall(stationCallsignComboBox->currentText())); endDate->setDate(dataProxy->getLastQSODateFromCall(stationCallsignComboBox->currentText())); } else if ((stationCallsignComboBox->currentIndex() == 0) && (stationCallsignComboBox->currentText().length()>3)) {//Not defined //qDebug() << Q_FUNC_INFO << " - Not defined"; startDate->setDate(dataProxy->getFirstQSODateFromCall("NOT")); endDate->setDate(dataProxy->getLastQSODateFromCall("NOT")); } else {//ALL //qDebug() << Q_FUNC_INFO << " - ALL"; startDate->setDate(dataProxy->getFirstQSODateFromCall("ALL")); endDate->setDate(dataProxy->getLastQSODateFromCall("ALL")); } //startDate->blockSignals(false); //endDate->blockSignals(false); //qDebug() << Q_FUNC_INFO << " - END"; } QList AdifLoTWExportWidget::fillTable() { //qDebug() << Q_FUNC_INFO << " - Start"; QList _qsos; _qsos.clear(); //bool justQueued = true; QString _myGrid; if (myGridSquareComboBox->currentIndex () == 0) { _myGrid = "NOT"; } else if (myGridSquareComboBox->currentIndex () == 1) { _myGrid = "ALL"; } else { _myGrid = myGridSquareComboBox->currentText(); } QString _myCall; if (stationCallsignComboBox->currentIndex () == 0) { //qDebug() << ": NOT"; _myCall = "NOT"; } else if ((stationCallsignComboBox->currentIndex () == 1) && (currentExportMode != ModeLotW)) { //qDebug() << ": all"; _myCall = "ALL"; } else { _myCall = stationCallsignComboBox->currentText(); //qDebug() << ": Call: " <<_myCall; } //qsos.clear (); switch (currentExportMode) { case ModeADIF: //justQueued = false; //_qsos.append(dataProxy->getQSOsListLoTWToSend(_myCall, startDate->date(), endDate->date(), justQueued, logNumber)); _qsos.append(dataProxy->getQSOsListToBeExported(_myCall, _myGrid, startDate->date(), endDate->date(), logNumber)); //qsos.append(dataProxy->getQSOsListToBeExported(_myCall, _myGrid, startDate->date(), endDate->date())); //qDebug() << Q_FUNC_INFO << " ADIF"; break; case ModeLotW: //qDebug() << Q_FUNC_INFO << " LoTW"; //justQueued = true; _qsos.append(dataProxy->getQSOsListLoTWToSend (_myCall, _myGrid, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListLoTWToSend (_myCall, _myGrid, startDate->date(), endDate->date(), true, logNumber)); break; case ModeClubLog: //qDebug() << Q_FUNC_INFO << " ClubLog"; _qsos.append(dataProxy->getQSOsListClubLogToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListClubLogToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); break; case ModeEQSL: //qDebug() << Q_FUNC_INFO << " EQSL"; //justQueued = true; _qsos.append(dataProxy->getQSOsListEQSLToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListEQSLToSent(_myCall, startDate->date(), endDate->date(), true)); break; case ModeQRZ: //qDebug() << Q_FUNC_INFO << " QRZ"; //justQueued = true; _qsos.append(dataProxy->getQSOsListQRZCOMToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListQRZCOMToSent(_myCall, startDate->date(), endDate->date(), true)); break; } //qDebug() << Q_FUNC_INFO << " -3" ; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << Q_FUNC_INFO << " pre FOR"; for (int i=0; i<_qsos.length(); i++) { //qDebug() << Q_FUNC_INFO << " in FOR " << QString::number(i); addQSO(_qsos.at(i)); } } //numberLabel->setText(tr("QSOs: ") + QString::number(_qsos.count()) + ); numberLabel->setText(QString(tr("QSOs: %1/%2")).arg(_qsos.count()).arg(numOfQSOsInThisLog) ); numberLabel->setToolTip (QString("The current number has %1 QSOs and your selection in this widget shows %2 QSOs").arg(numOfQSOsInThisLog).arg(_qsos.count ())); if (_qsos.count()>0) { //qDebug() << Q_FUNC_INFO << " Enable OKButton"; okButton->setEnabled(true); } else { //qDebug() << Q_FUNC_INFO << " Disable OKButton"; okButton->setEnabled(false); } return _qsos; //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::addQSO(const int _qsoID) { //qDebug() << "AdifLoTWExportWidget::addQSO: " << QString::number(_qsoID); //qDebug() << Q_FUNC_INFO << " - Start"; QStringList qsoToAdd; qsoToAdd.clear(); qsoToAdd << dataProxy->getQSODetailsForLoTWDownload(_qsoID); //qDebug() << "AdifLoTWExportWidget::addQSO: Columns: " << QString::number(tableWidget->columnCount()); //qDebug() << "AdifLoTWExportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()); 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() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotStationCallsignChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QString tmpCall = stationCallsignComboBox->currentText (); if (stationCallsignComboBox->count()<1) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } //qDebug() << Q_FUNC_INFO << " - 01" ; fillDates(); //qDebug() << Q_FUNC_INFO << " - 03" ; fillStationMyGridComboBox(); updateIfNeeded(); stationCallsignComboBox->setCurrentIndex(stationCallsignComboBox->findText(tmpCall, Qt::MatchCaseSensitive)); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::blockAllSignals(const bool _b) { //qDebug() << Q_FUNC_INFO << " - Start"; stationCallsignComboBox->blockSignals (_b); myGridSquareComboBox->blockSignals (_b); startDate->blockSignals (_b); endDate->blockSignals (_b); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::updateIfNeeded() { //qDebug() << Q_FUNC_INFO << " - Start"; if (currentCall != stationCallsignComboBox->currentText()) { //qDebug() << Q_FUNC_INFO << " - 1"; currentCall = stationCallsignComboBox->currentText(); qsos = fillTable(); } else if (currentGrid != myGridSquareComboBox->currentText()) { //qDebug() << Q_FUNC_INFO << " - 2"; currentGrid = myGridSquareComboBox->currentText(); qsos = fillTable(); } else if (currentStart != startDate->date()) { //qDebug() << Q_FUNC_INFO << " - 3"; currentStart = startDate->date(); qsos = fillTable(); } else if (currentEnd != endDate->date()) { //qDebug() << Q_FUNC_INFO << " - 3"; currentEnd = endDate->date(); qsos = fillTable(); } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotMyGridChanged() { //qDebug() << Q_FUNC_INFO << " - Start: " << myGridSquareComboBox->currentText(); if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QString tmpGrid = myGridSquareComboBox->currentText (); //TODO: Add StationCallsigns that has been worked from that grid? //TODO: Update the startDate when that grid was activated? //TODO: Update the endDate when that grid was activated? qsos = fillTable(); myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(tmpGrid, Qt::MatchCaseSensitive)); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotDateChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QDate tmpStartDate = startDate->date(); QDate tmpEndDate = endDate->date(); updateIfNeeded(); startDate->setDate (tmpStartDate); endDate->setDate(tmpEndDate); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotOKPushButtonClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; this->hide(); emit qsosToSend (stationCallsignComboBox->currentText(), qsos, currentExportMode); return; QString myGrid = myGridSquareComboBox->currentText(); if (myGridSquareComboBox->currentIndex () == 0) { myGrid = "NOT"; } if (stationCallsignComboBox->currentIndex() == 0) { //qDebug() << Q_FUNC_INFO << " - emit NOT"; emit selection("NOT", myGrid, startDate->date(), endDate->date(), currentExportMode); } else if (stationCallsignComboBox->currentIndex() == 1) { if ((currentExportMode == ModeLotW) || (currentExportMode == ModeClubLog) || (currentExportMode == ModeQRZ)|| (currentExportMode == ModeEQSL)) { //qDebug() << Q_FUNC_INFO << " - emit 1"; emit selection(stationCallsignComboBox->currentText(), myGrid, startDate->date(), endDate->date(), currentExportMode); } else { //qDebug() << Q_FUNC_INFO << " - emit ALL"; emit selection("ALL", myGrid, startDate->date(), endDate->date(), currentExportMode); } } else { //qDebug() << Q_FUNC_INFO << " - emit stationcall"; emit selection(stationCallsignComboBox->currentText(), myGrid, startDate->date(), endDate->date(), currentExportMode); } //qDebug() << "AdifLoTWExportWidget::slotOKPushButtonClicked - END"; close(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotCancelPushButtonClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; close(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::closeEvent(QCloseEvent *event) { //qDebug() << Q_FUNC_INFO << " - Start"; event->accept(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO << " - Start"; starting = true; event->accept(); numOfQSOsInThisLog = dataProxy->getHowManyQSOInLog(logNumber); if (!fillStationCallsignComboBox()) { // Show the warning message and wait for the user to acknowledge it QMessageBox::warning(this, tr("KLog Warning"), tr("There are no queued QSOs.")); // Close the widget after the user acknowledges the warning starting = false; QTimer::singleShot(0, this, &AdifLoTWExportWidget::close); // Schedule the widget to close return; //emit askingToClose(); //return; // Exit the function to stop further execution } //qDebug() << Q_FUNC_INFO << ": 1 - " << stationCallsignComboBox->currentText(); setDefaultStationComboBox(); //qDebug() << Q_FUNC_INFO << ": 2 - " << stationCallsignComboBox->currentText(); fillDates(); //qDebug() << Q_FUNC_INFO << ": 3 - " << stationCallsignComboBox->currentText(); fillStationMyGridComboBox(); setDefaultMyGridComboBox(); //qDebug() << Q_FUNC_INFO << ": 4 - " << stationCallsignComboBox->currentText(); starting = false; updateIfNeeded(); //qDebug() << Q_FUNC_INFO << ": 5 - " << stationCallsignComboBox->currentText(); //event->accept(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setExportMode(const ExportMode _EMode) { //qDebug() << Q_FUNC_INFO << " - Start"; 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.")); } //slotStationCallsignChanged(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setLogNumber(const int _logN) { //qDebug() << Q_FUNC_INFO << " - Start"; if (dataProxy->doesThisLogExist (_logN)) { logNumber = _logN; } else { logNumber = -1; } numOfQSOsInThisLog = dataProxy->getHowManyQSOInLog(logNumber); //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/widgets/onlinemessagewidget.cpp0000644000175000017500000001317715003153303017643 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) { Q_UNUSED(_prov); Q_UNUSED(_onlineError); Q_UNUSED(_onlineReason); Q_UNUSED(_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-2.4.1/widgets/map/0000755000175000017500000000000015003153303013646 5ustar develdevelklog-2.4.1/widgets/map/mapwindowwidget.cpp0000644000175000017500000003166215003153303017573 0ustar develdevel/*************************************************************************** mapwidget.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 . * * * *****************************************************************************/ #include "mapwindowwidget.h" MapWindowWidget::MapWindowWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); //qDebug() << Q_FUNC_INFO; dataProxy = dp; //qDebug() << Q_FUNC_INFO << "1"; mapWidget = new MapWidget(this); //qDebug() << Q_FUNC_INFO << "2"; propComboBox = new QComboBox; bandComboBox = new QComboBox; modeComboBox = new QComboBox; satNameComboBox = new QComboBox; confirmedCheckBox = new QCheckBox; //locatorsCheckBox = new QCheckBox; //qDebug() << Q_FUNC_INFO << " - END"; } MapWindowWidget::~MapWindowWidget() { //qDebug() << Q_FUNC_INFO << " - Start"; //delete(dataProxy); delete(mapWidget); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::init() { //qDebug() << Q_FUNC_INFO << " - Start"; workedColor = Qt::black; confirmedColor = Qt::black; defaultColor = Qt::black; createUI(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addMarker(const Coordinate _coord, const QString _loc) { Q_UNUSED(_loc); //qDebug() << Q_FUNC_INFO << QString(" %1 = %2/%3(lat/lon)").arg(_loc).arg(_coord.lat).arg(_coord.lon); mapWidget->addMarker(_coord); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; bandComboBox->setToolTip(tr("Select QSOs in this band.")); modeComboBox->setToolTip(tr("Select QSOs in this mode.")); propComboBox->setToolTip(tr("Select QSOs in this propagation mode.")); satNameComboBox->setToolTip(tr("Select QSOs using this Satellite.")); confirmedCheckBox->setText(tr("Only confirmed")); confirmedCheckBox->setToolTip(tr("Select only confirmed QSOs.")); //locatorsCheckBox->setText(tr("Show Locators")); //locatorsCheckBox->setToolTip(tr("Show Locators or QSO positons.")); QGridLayout *buttonsLayout = new QGridLayout; buttonsLayout->addWidget(bandComboBox, 0, 0); buttonsLayout->addWidget(modeComboBox, 0, 1); buttonsLayout->addWidget(propComboBox, 1, 0); buttonsLayout->addWidget(satNameComboBox, 1, 1); //buttonsLayout->addWidget(okButton, 1, 2); buttonsLayout->addWidget(confirmedCheckBox, 0, 2); //buttonsLayout->addWidget(locatorsCheckBox, 1, 2); QVBoxLayout *layout = new QVBoxLayout(this); layout->addLayout(buttonsLayout); layout->addWidget(mapWidget); setLayout (layout); setPropModes(); setSatNames(); //qDebug() << Q_FUNC_INFO << "3"; mapWidget->init(); //qDebug() << Q_FUNC_INFO << "4"; connect(bandComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotBandsComboBoxChanged())); connect(modeComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotModesComboBoxChanged())); connect(propComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotPropComboBoxChanged())); connect(satNameComboBox, SIGNAL(currentTextChanged (QString)), this, SLOT(slotSatsComboBoxChanged())); connect(confirmedCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedCheckBoxChanged())); //connect(locatorsCheckBox, SIGNAL(clicked()), this, SLOT(slotLocatorsCheckBoxChanged())); satNameComboBox->setEnabled(false); // Starts disable until propagation = SAT //qDebug() << Q_FUNC_INFO << "-END"; } void MapWindowWidget::setCenter(const Coordinate &_c) { //qDebug() << Q_FUNC_INFO << " - Start"; mapWidget->setCenter(_c); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setBands(const QStringList _bands) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList bands; bands.clear(); bands = _bands; bands.removeDuplicates(); //bands = dataProxy->sortBandNamesBottonUp(bands); bandComboBox->clear(); bands.prepend("All - " + tr("All bands")); bands.prepend("None - " + tr("Show nothing")); bandComboBox->addItems(bands); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setModes(const QStringList _modes) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList modes; modes.clear(); modes = _modes; modes.removeDuplicates(); modes.sort(); modes.prepend("All - " + tr("All modes")); modeComboBox->clear(); modeComboBox->addItems(modes); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setPropModes() { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList propModeList; propModeList.clear(); propModeList = dataProxy->getPropModeList(); if (propModeList.size()>1) { propModeList.prepend("All - " + tr("All propagation modes")); //propModeList.prepend("01 - " + tr("Not - Not Identified")); propComboBox->addItems(propModeList); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setSatNames() { //qDebug() << Q_FUNC_INFO << " - Start"; QString nosat = tr("All satellites"); //QString othersat = tr("Other - Sat not in the list"); QStringList satellitesList; satellitesList.clear(); satellitesList = dataProxy->getSatellitesList(); //satellitesList.prepend(othersat); satellitesList.prepend("All - " + 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); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::showFiltered() { //qDebug() << Q_FUNC_INFO << " - Start"; if (bandComboBox->currentIndex () == 0) { mapWidget->clearMap(); //qDebug() << Q_FUNC_INFO << " - END1"; return; } QStringList confirmedLocators; QStringList shortLocators, confirmedShortLocators; shortLocators.clear(); confirmedShortLocators.clear (); QString satName = satNameComboBox->currentText(); // Get Confirmed Locators // Print Confirmed // !only confirmed // Get worked locators // Remove confirmed from worked // Print Worked //locators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), confirmedCheckBox->isChecked()); confirmedLocators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), true); QColor color; Locator locator; confirmedShortLocators << locator.getShortLocators (confirmedLocators); confirmedShortLocators << confirmedLocators; confirmedShortLocators.removeDuplicates(); confirmedShortLocators.sort(); color = confirmedColor; color.setAlpha (127); addLocators(confirmedShortLocators, color);// The alpha gives some transparency if (!confirmedCheckBox->isChecked ()) { QStringList wLocators; wLocators.clear (); wLocators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), false); QStringList workedLocators; workedLocators.clear (); foreach (QString loc, wLocators) { if (!confirmedShortLocators.contains (loc)) { workedLocators.append (loc); } } shortLocators.clear(); shortLocators << locator.getShortLocators (workedLocators); shortLocators << workedLocators; shortLocators.removeDuplicates(); workedLocators.clear (); foreach (QString loc, shortLocators) { if (!confirmedShortLocators.contains (loc)) { workedLocators.append (loc); } } workedLocators.sort(); color = workedColor; color.setAlpha (127);// The alpha gives some transparency appendLocators(workedLocators, color); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotBandsComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); bandComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotModesComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); modeComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotPropComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (getPropModeFromComboBox() == "SAT") { //qDebug() << Q_FUNC_INFO << ": SAT"; satNameComboBox->setCurrentIndex(0); satNameComboBox->setEnabled(true); } else { //qDebug() << Q_FUNC_INFO << ": NO SAT"; satNameComboBox->setCurrentIndex(0); satNameComboBox->setEnabled(false); } showFiltered(); propComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotSatsComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); satNameComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotConfirmedCheckBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addQSO(const QString &_loc) { Q_UNUSED(_loc); //qDebug() << Q_FUNC_INFO << ": " << _loc; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addLocator(const QString &_loc, const QColor &_color) { //qDebug() << Q_FUNC_INFO << ": " << _loc; //if (!locator.isValidLocator(_loc)) //{ // return; //} mapWidget->addLocator(_loc, _color); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addLocators(const QStringList &_locators, const QColor &_color) { //qDebug() << Q_FUNC_INFO << " - Start"; mapWidget->clearMap(); foreach(QString i, _locators) { if (i.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << i; } mapWidget->addLocator(i, _color); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::appendLocators(const QStringList &_locators, const QColor &_color) { //qDebug() << Q_FUNC_INFO << " - Start"; foreach(QString i, _locators) { //mapWidget->addLocator(i, confirmedColor); mapWidget->addLocator(i, _color); } //qDebug() << Q_FUNC_INFO << " - END"; } QString MapWindowWidget::getPropModeFromComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; QString _pm = QString(); //qDebug() << Q_FUNC_INFO << ": " << propComboBox->currentText(); _pm = (((propComboBox->currentText()).split('-')).at(1)).simplified(); QString _n = (((propComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << ": " << _pm; if (_n == "00") { //qDebug() << Q_FUNC_INFO << " - END1"; return QString(); } //qDebug() << Q_FUNC_INFO << " - END"; return _pm; } void MapWindowWidget::paintGlobalGrid() { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setColors (const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << " - Start"; defaultColor = _default; workedColor = _worked; confirmedColor = _confirmed; //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/widgets/map/mapwidget.cpp0000644000175000017500000001407115003153303016336 0ustar develdevel/*************************************************************************** mapwidget.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 . * * * *****************************************************************************/ #include #include #include #include #include #include "mapwidget.h" MapWidget::MapWidget(QWidget *parent) { Q_UNUSED(parent); //qDebug() << Q_FUNC_INFO; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::init() { createUI(); } void MapWidget::createUI() { //qDebug() << Q_FUNC_INFO << "Start"; QWidget *container = QWidget::createWindowContainer(&qmlView, this); circleRoles[CoordinateRole] = QByteArray("coordinate"); rectangleRoles[NorthRole] = QByteArray("north"); rectangleRoles[SouthRole] = QByteArray("south"); rectangleRoles[ColorRole] = QByteArray("color"); modelCircle.setItemRoleNames(circleRoles); modelRectangle.setItemRoleNames(rectangleRoles); qmlView.rootContext()->setContextProperty("rectangle_model", &modelRectangle); qmlView.rootContext()->setContextProperty("circle_model", &modelCircle); //qDebug() << Q_FUNC_INFO << "13"; //qmlView.setSource(QUrl(QStringLiteral("qrc:qml/mapqmlfile.qml"))); //qmlView.setSource(QUrl::fromLocalFile("qrc:qml/mapqmlfile.qml")); qmlView.setSource(QUrl("qrc:qml/mapqmlfile.qml")); //qDebug() << Q_FUNC_INFO << "14"; qmlView.setResizeMode(QQuickView::SizeRootObjectToView); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(container); setLayout (layout); //addMarker(latitude, longitude) //setMinimumSize (200, 200); //This minimum size may be relative to another widget... (maybe the mainwindow?) //connect(okButton, SIGNAL(clicked()), this, SLOT(slotButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << "-END"; } void MapWidget::clearMap() { modelRectangle.clear(); } void MapWidget::setCenter(const Coordinate &_c) { QObject *object = qmlView.rootObject (); object->setProperty ("zoom", 8.0); object->setProperty ("lat", _c.lat); object->setProperty ("lon", _c.lon); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::addLocator(const double lat1, const double lon1, const double lat2, const double lon2) { QObject *object = qmlView.rootObject (); //MapRectangle object->setProperty ("locLat1", lat1); object->setProperty ("locLon1", lon1); object->setProperty ("locLat2", lat2); object->setProperty ("locLon2", lon2); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::addMarker(const Coordinate _coord) { //qDebug() << Q_FUNC_INFO << QString("Lat/Lon = %1/%2").arg(_coord.lat).arg(_coord.lon); QObject *object = qmlView.rootObject (); QMetaObject::invokeMethod(object, "addMarker", Q_ARG(double, _coord.lat), Q_ARG(double, _coord.lon)); // QMetaObject::invokeMethod(object, "addMarker", // Q_RETURN_ARG(QString, returnedValue), // Q_ARG(double, 40.5), Q_ARG(double, -3.5)); } void MapWidget::addQSO(const QString &_loc) { //qDebug() << Q_FUNC_INFO << ": " << _loc; if (!locator.isValidLocator(_loc)) { return; } qmlView.rootContext()->setContextProperty("circle_model", &modelCircle); //qmlView.setSource(QUrl(QStringLiteral("qrc:qml/mapqmlfile.qml"))); QStandardItem *item = new QStandardItem; item->setData(QVariant::fromValue(QGeoCoordinate(locator.getLat(_loc), locator.getLon(_loc))), CoordinateRole); modelCircle.appendRow(item); } void MapWidget::addLocator(const QString &_loc, const QColor &_color) { if (_loc.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << _loc; } //qDebug() << Q_FUNC_INFO << ": " << _loc; if (!locator.isValidLocator(_loc)) { return; } qmlView.rootContext()->setContextProperty("rectangle_model", &modelRectangle); Coordinate _north, _south; _north = locator.getLocatorCorner(_loc, true); _south = locator.getLocatorCorner(_loc, false); QGeoRectangle rect; rect.setTopLeft (QGeoCoordinate(_north.lat, _north.lon)); rect.setBottomRight (QGeoCoordinate(_south.lat, _south.lon) ); if (rect.isValid ()) { QStandardItem *item = new QStandardItem; item->setData(QVariant::fromValue(QGeoCoordinate(_north.lat, _north.lon)), NorthRole); item->setData(QVariant::fromValue(QGeoCoordinate(_south.lat, _south.lon)), SouthRole); item->setData(QVariant::fromValue(_color), ColorRole); modelRectangle.appendRow(item); //qDebug() << Q_FUNC_INFO << " Rectangle OK"; } } klog-2.4.1/widgets/map/mapwidget.h0000644000175000017500000000553215003153303016005 0ustar develdevel#ifndef KLOG_WIDGETS_MAP_MAPWIDGET_H #define KLOG_WIDGETS_MAP_MAPWIDGET_H /*************************************************************************** mapwidget.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 . * * * *****************************************************************************/ #include #include #include #include #include "../../locator.h" class MapWidget : public QWidget { Q_OBJECT public: MapWidget(QWidget *parent = nullptr); void init(); void setCenter(const Coordinate &_c); void addLocator(const double lat1, const double lon1, const double lat2, const double lon2); void addQSO(const QString &_loc); void addMarker(const Coordinate _coord); void addLocator(const QString &_loc, const QColor &_color); void clearMap(); //void setLocale (const QString _locale); signals: void doAddMarker(double latitude, double longitude); private slots: private: void createUI(); QQuickView qmlView; QStandardItemModel modelCircle, modelRectangle; QHash circleRoles; QHash rectangleRoles; int CoordinateRole = Qt::UserRole + 1000; int NorthRole = Qt::UserRole + 1000; int SouthRole = Qt::UserRole + 1001; int ColorRole = Qt::UserRole + 1002; Locator locator; //double lat, lon; }; #endif // MAPWIDGET_H klog-2.4.1/widgets/map/mapwindowwidget.h0000644000175000017500000000664515003153303017243 0ustar develdevel#ifndef KLOG_WIDGETS_MAP_MAPWINDOWWIDGET_H #define KLOG_WIDGETS_MAP_MAPWINDOWWIDGET_H /*************************************************************************** mapwindowwidget.h - description ------------------- begin : Feb 2022 copyright : (C) 2022 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 "mapwidget.h" #include "../../klogdefinitions.h" #include "../../dataproxy_sqlite.h" #include "../../locator.h" class MapWindowWidget : public QWidget { Q_OBJECT public: explicit MapWindowWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MapWindowWidget(); void init(); void setBands(QStringList _bands); void setModes(QStringList _modes); void setCenter(const Coordinate &_c); void addQSO(const QString &_loc); void addLocator(const QString &_loc, const QColor &_color); void addLocators(const QStringList &_locators, const QColor &_color); void appendLocators(const QStringList &_locators, const QColor &_color); void setColors (const QColor &_worked, const QColor &_confirmed, const QColor &_default); void addMarker(const Coordinate _coord, const QString _loc); private slots: void slotBandsComboBoxChanged(); void slotModesComboBoxChanged(); void slotPropComboBoxChanged(); void slotSatsComboBoxChanged(); void slotConfirmedCheckBoxChanged(); //void slotLocatorsCheckBoxChanged(); private: void createUI(); void paintGlobalGrid(); void setPropModes(); void setSatNames(); void showFiltered(); QString getShortLocators (const int _length); QString getPropModeFromComboBox(); DataProxy_SQLite *dataProxy; MapWidget *mapWidget; QComboBox *propComboBox, *bandComboBox, *modeComboBox, *satNameComboBox; QCheckBox *confirmedCheckBox;//, *locatorsCheckBox; QColor workedColor; QColor confirmedColor; QColor defaultColor; }; #endif // MAPWINDOWWIDGET_H klog-2.4.1/updatesettings.cpp0000644000175000017500000005632715003153303015207 0ustar develdevel/*************************************************************************** updatesettings.h - description ------------------- begin : mar 2023 copyright : (C) 2023 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 "updatesettings.h" UpdateSettings::UpdateSettings() { } UpdateSettings::~UpdateSettings() { } bool UpdateSettings::findInFile() { //qDebug() << Q_FUNC_INFO; Utilities util(Q_FUNC_INFO); QString searchString("[UserData]"); QString _fileName = util.getCfgFile (); //qDebug() << Q_FUNC_INFO << " File: " << _fileName; if (!QFile::exists(_fileName)) { //qDebug() << Q_FUNC_INFO << " - File does not exist"; return false; } //qDebug() << Q_FUNC_INFO << " - File exists"; QFile file(_fileName); QTextStream in (&file); QString line; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - Can't open the file"; return false; } do { line = in.readLine(); //qDebug() << Q_FUNC_INFO << " - Line: " << line; if (line.contains(searchString, Qt::CaseSensitive)) { //qDebug() << Q_FUNC_INFO << " - String founded!"; file.close(); return true; } } while (!line.isNull()); file.close(); //qDebug() << Q_FUNC_INFO << " - String NOT found!!"; return false; } bool UpdateSettings::renameFile(const QString &_oldName, const QString &_newName) { if (QFile::exists(_newName)) { if (!QFile::remove (_newName)) { return false; } } QFile file(_oldName); if (!file.copy(_newName)) { return false; } return file.remove (); } bool UpdateSettings::updateFile() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); // 3 steps: // Find if update is needed // Crete a backup file // Generate the new from backup if (findInFile ()) // Do we need to update the file? { //qDebug() << Q_FUNC_INFO << " - No need to update"; return true; } //qDebug() << Q_FUNC_INFO << " - Updating setting file..."; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Settings update")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The settings system has been changed and KLog will update your settings file.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); QString _oldFile = util.getCfgFile (); QString _backupFile = util.getCfgFile () + "-back"; //qDebug() << Q_FUNC_INFO << " - Renaming file"; if (!renameFile (util.getCfgFile (), _backupFile)) { //qDebug() << Q_FUNC_INFO << " - Renaming file FAILED"; return false; } //qDebug() << Q_FUNC_INFO << " - Opening backup file"; QFile file(_backupFile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - Opening backup file FAILED"; return false; } while (!file.atEnd()){ QByteArray line = file.readLine(); processConfigLine(line); } //qDebug() << Q_FUNC_INFO << " - Settings migrated"; return true; } bool UpdateSettings::processConfigLine(const QString &_line) { //qDebug() << Q_FUNC_INFO << _line; Utilities util(Q_FUNC_INFO); QString line = _line.simplified(); QStringList values = line.split("=", QT_SKIP); if (line.startsWith('#')) { return true; } if (!( (line.contains('=')) && (line.contains(';')))){ return false; } QString value = values.at(1); QString tab = (values.at(0)).toUpper(); int endValue = value.indexOf(';'); if (endValue>-1) { value = value.left(value.length() - (value.length() - endValue)); } //QSettings settings(util.getCfgFile(), QSettings::IniFormat); QSettings settings(util.getCfgFile(), QSettings::IniFormat); if (tab == "CALLSIGN") { settings.beginGroup ("UserData"); settings.setValue ("Callsign", value); settings.endGroup (); }else if(tab =="SELECTEDLOG"){ settings.setValue ("SelectedLog", value.toInt ()); }else if(tab =="VERSION"){ settings.setValue ("Version", value); }else if (tab == "OPERATORS"){ settings.beginGroup ("UserData"); settings.setValue ("Operators", value); settings.endGroup (); }else if (tab=="CQZ"){ settings.beginGroup ("UserData"); settings.setValue ("CQz", (value).toInt()); settings.endGroup (); }else if (tab=="ITUZ"){ settings.beginGroup ("UserData"); settings.setValue ("ITUz", (value).toInt()); settings.endGroup (); }else if (tab=="MODES"){ settings.beginGroup ("BandMode"); settings.setValue ("Modes", value.split (", ", QT_SKIP)); settings.endGroup (); }else if (tab=="BANDS"){ //qDebug() << Q_FUNC_INFO << ": " << value; settings.beginGroup ("BandMode"); settings.setValue ("Bands", value.split (", ", QT_SKIP)); settings.endGroup (); }else if (tab=="LOGVIEWFIELDS"){ settings.setValue ("LogViewFields", value.split (", ", QT_SKIP)); //settings.setValue ("LogViewFields", value); }else if (tab=="REALTIME"){ settings.beginGroup ("Misc"); settings.setValue ("RealTime", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="SHOWSECONDS"){ settings.beginGroup ("Misc"); settings.setValue ("ShowSeconds", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UTCTIME"){ settings.beginGroup ("Misc"); settings.setValue ("UTCTime", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="ALWAYSADIF"){ settings.beginGroup ("Misc"); settings.setValue ("AlwaysADIF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="USEDEFAULTNAME"){ settings.beginGroup ("Misc"); settings.setValue ("UseDefaultName", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DBPATH"){ settings.beginGroup ("Misc"); settings.setValue ("DBPath", value); settings.endGroup (); }else if (tab=="DEFAULTADIFFILE"){ settings.beginGroup ("Misc"); settings.setValue ("DefaultADIFFile", value); settings.endGroup (); }else if (tab=="IMPERIALSYSTEM"){ settings.beginGroup ("Misc"); settings.setValue ("ImperialSystem", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="COMPLETEWITHPREVIOUS"){ settings.beginGroup ("Misc"); settings.setValue ("CompleteWithPrevious", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="SENDQSLWHENREC"){ settings.beginGroup ("Misc"); settings.setValue ("SendQSLWhenRec", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="MANAGEDXMARATHON"){ settings.beginGroup ("Misc"); settings.setValue ("ManageDXMarathon", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DEBUGLOG"){ settings.beginGroup ("Misc"); settings.setValue ("DebugLog", value); settings.endGroup (); }else if (tab=="SHOWCALLSIGNINSEARCH"){ settings.beginGroup ("Misc"); settings.setValue ("ShowCallsignInSearch", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="CHECKNEWVERSIONS"){ settings.beginGroup ("Misc"); settings.setValue ("CheckNewVersions", util.trueOrFalse (value)); settings.endGroup (); //}else if (tab=="PROVIDEINFO"){ //settings.setValue ("ProvideInfo", util.trueOrFalse (value)); }else if (tab=="SENDEQSLBYDEFAULT"){ settings.beginGroup ("Misc"); settings.setValue ("SendEQSLByDefault", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DUPLICATEDQSOSLOT"){ if (value.toInt()>=0) { settings.beginGroup ("Misc"); settings.setValue ("DuplicatedQSOSlot", value.toInt()); settings.endGroup (); } }else if (tab == "CHECKVALIDCALLS"){ settings.beginGroup ("Misc"); settings.setValue ("CheckValidCalls", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UDPSERVER"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPServer", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UDPNETWORKINTERFACE"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPNetworkInterface", value); settings.endGroup (); }else if (tab=="UDPSERVERPORT"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPServerPort", value.toInt()); settings.endGroup (); }else if (tab=="LOGFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("LogFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="LOGAUTOFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("LogAutoFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="REALTIMEFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("RealTimeFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="INFOTIMEOUT"){ settings.beginGroup ("UDPServer"); settings.setValue ("InfoTimeOut", value.toInt ()); settings.endGroup (); }else if (tab =="NAME"){ settings.beginGroup ("UserData"); settings.setValue ("Name", value); settings.endGroup (); }else if (tab =="ADDRESS1"){ settings.beginGroup ("UserData"); settings.setValue ("Address1", value); settings.endGroup (); }else if (tab =="ADDRESS2"){ settings.beginGroup ("UserData"); settings.setValue ("Address2", value); settings.endGroup (); }else if (tab =="ADDRESS3"){ settings.beginGroup ("UserData"); settings.setValue ("Address3", value); settings.endGroup (); }else if (tab =="ADDRESS4"){ settings.beginGroup ("UserData"); settings.setValue ("Address4", value); settings.endGroup (); }else if (tab =="CITY"){ settings.beginGroup ("UserData"); settings.setValue ("City", value); settings.endGroup (); }else if (tab =="ZIPCODE"){ settings.beginGroup ("UserData"); settings.setValue ("ZipCode", value); settings.endGroup (); }else if (tab =="PROVINCESTATE"){ settings.beginGroup ("UserData"); settings.setValue ("ProvinceState", value); settings.endGroup (); }else if (tab =="COUNTRY"){ settings.beginGroup ("UserData"); settings.setValue ("Country", value); settings.endGroup (); }else if (tab =="POWER"){ settings.beginGroup ("UserData"); settings.setValue ("Power", value.toInt ()); settings.endGroup (); }else if (tab =="RIG1"){ settings.beginGroup ("UserData"); settings.setValue ("Rig1", value); settings.endGroup (); }else if (tab =="RIG2"){ settings.beginGroup ("UserData"); settings.setValue ("Rig2", value); settings.endGroup (); }else if (tab =="RIG3"){ settings.beginGroup ("UserData"); settings.setValue ("Rig3", value); settings.endGroup (); }else if (tab =="ANTENNA1"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna1", value); settings.endGroup (); }else if (tab =="ANTENNA2"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna2", value); settings.endGroup (); }else if (tab =="ANTENNA3"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna3", value); settings.endGroup (); }else if (tab =="STATIONLOCATOR"){ Locator locator; if ( locator.isValidLocator(value) ) { settings.beginGroup ("UserData"); settings.setValue ("StationLocator", value); settings.endGroup (); } }else if (tab =="DXCLUSTERSHOWHF"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowHF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWVHF"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowVHF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWARC"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWARC", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWORKED"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWorked", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWCONFIRMED"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowConfirmed", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWANN"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowANN", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWWV"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWWV", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWCY"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWCY", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSERVERTOUSE"){ settings.beginGroup ("DXCluster"); //qDebug() << Q_FUNC_INFO << "DXClusterServerToUse: " << value; settings.setValue ("DXClusterServerToUse", value); settings.endGroup (); }else if (tab =="DXCLUSTERSERVERPORT"){ QList clusters; clusters.clear (); settings.beginGroup ("DXCluster"); int size = settings.beginReadArray("DXClusterServers"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); clusters.append (settings.value("Server").toString()); //qDebug() << Q_FUNC_INFO << " - Reading Servers: " << settings.value("Server").toString(); } settings.endArray(); settings.endGroup (); clusters.append (value); //qDebug() << Q_FUNC_INFO << " - AddedServer: " << value; settings.beginGroup ("DXCluster"); settings.beginWriteArray("DXClusterServers"); for (int i = 0; i < clusters.size(); ++i) { settings.setArrayIndex(i); settings.setValue("Server", clusters.at(i)); //qDebug() << Q_FUNC_INFO << " - Writting Servers: " << clusters.at(i); } settings.endArray(); settings.endGroup (); }else if (tab =="DXCLUSTERSAVE"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterSave", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSENDTOMAP"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterSendToMap", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="NEWONECOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("NewOneColor", value); settings.endGroup (); }else if(tab =="NEEDEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("NeededColor", value); settings.endGroup (); }else if(tab =="WORKEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("WorkedColor", value); settings.endGroup (); }else if(tab =="CONFIRMEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("ConfirmedColor", value); settings.endGroup (); }else if(tab =="DEFAULTCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("DefaultColor", value); settings.endGroup (); }else if(tab =="DARKMODE"){ settings.beginGroup ("Colors"); settings.setValue ("DarkMode", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="HAMLIBRIGTYPE"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibRigType", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIBSERIALPORT"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibSerialPort", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALBAUDS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibSerialBauds", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIB"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab=="HAMLIBREADONLY"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibReadOnly", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="HAMLIBSERIALDATABITS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialDataBits", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIBSERIALSTOPBITS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialStopBit", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALFLOWCONTROL"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialFlowControl", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALPARITY"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialParity", value); settings.endGroup (); }else if (tab == "HAMLIBRIGPOLLRATE"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibRigPollRate", value.toInt ()); settings.endGroup (); }else if (tab == "HAMLIBNETADDRESS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibNetAddress", value); settings.endGroup (); }else if (tab == "HAMLIBNETPORT"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibNetPort", value.toInt ()); settings.endGroup (); }else if(tab =="CLUBLOGACTIVE"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="CLUBLOGREALTIME"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogRealTime", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="CLUBLOGPASS"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogPass", value); settings.endGroup (); }else if(tab =="CLUBLOGEMAIL"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogEmail", value); settings.endGroup (); }else if(tab =="EQSLACTIVE"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="EQSLCALL"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLCall", value); settings.endGroup (); }else if(tab =="EQSLPASS"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLPass", value); settings.endGroup (); }else if(tab =="QRZCOMACTIVE"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMSUBSCRIBER"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomSubscriber", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMUSER"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomUser", value); settings.endGroup (); }else if(tab =="QRZCOMAUTO"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomAuto", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMPASS"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomPass", value); settings.endGroup (); }else if(tab =="QRZCOMLOGBOOKKEY"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomLogBookKey", value); settings.endGroup (); }else if(tab =="LOTWACTIVE"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="LOTWPATH"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWPath", value); settings.endGroup (); }else if(tab =="LOTWUSER"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWUser", value); settings.endGroup (); }else if(tab =="LOTWPASS"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWPass", value); settings.endGroup (); }else if(tab =="LATESTBACKUP"){ QDateTime dtime = QDateTime::fromString(value, "yyyyMMdd-hhmmss"); settings.setValue ("LatestBackup", dtime.toString(Qt::ISODate)); }else if(tab =="MAINWINDOWSIZE"){ QSize windowSize; 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()); } settings.setValue ("MainWindowSize", windowSize); }else if(tab =="DELETEALWAYSADIFILE"){ settings.beginGroup ("Misc"); settings.setValue ("DeleteAlwaysAdiFile", util.trueOrFalse (value)); settings.endGroup (); }else if (tab == "LATESTBACKUP"){ settings.setValue ("LatestBackup", value); } return true; } klog-2.4.1/updatesettings.h0000644000175000017500000000432715003153303014645 0ustar develdevel#ifndef KLOG_UPDATESETTINGS_H #define KLOG_UPDATESETTINGS_H /*************************************************************************** updatesettings.h - description ------------------- begin : mar 2023 copyright : (C) 2023 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" #include "locator.h" class UpdateSettings : public QObject { Q_OBJECT public: UpdateSettings(); ~UpdateSettings(); bool updateFile(); private: bool processConfigLine(const QString &_line); bool findInFile(); bool renameFile(const QString &_oldName, const QString &_newName); }; #endif // UPDATESETTINGS_H klog-2.4.1/src.pro0000644000175000017500000003067615003153303012750 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 . * # * * # *****************************************************************************/ QT += core gui QT += qml quick CONFIG += c++11 CONFIG += app_bundle CONFIG += static #CONFIG += console CONFIG -=depend_includepath #CONFIG += release TEMPLATE = app PKGVERSION = 2.4.1 VERSION = 2.4.1 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 \ quickwidgets \ positioning \ widgets QT += location greaterThan(QT_MAJOR_VERSION, 4):greaterThan(QT_MINOR_VERSION, 4) { macx:QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks } DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x050F00 HEADERS += setupdialog.h \ aboutdialog.h \ adif.h \ awarddxmarathon.h \ awards.h \ awardswidget.h \ callsign.h \ charts/statsfieldperbandwidget.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 \ database/db_adif_primary_subdvisions_data.h \ database/queryexecutor.h \ dataproxy_sqlite.h \ downloadcty.h \ frequency.h \ dxccstatuswidget.h \ dxcluster/dxspot.h \ dxcluster/dxcluster.h \ dxcluster/dxclusterassistant.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/hamlibnetworkconfigwidget.h \ setuppages/hamlibserialconfigwidget.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/map/mapwidget.h \ widgets/map/mapwindowwidget.h \ widgets/adiflotwexportwidget.h \ widgets/showkloglogwidget.h \ widgets/onlinemessagewidget.h \ widgets/showadifimportwidget.h \ updatesettings.h \ world.h message(Sources) SOURCES += main.cpp \ aboutdialog.cpp \ adif.cpp \ awardswidget.cpp \ callsign.cpp \ charts/statsfieldperbandwidget.cpp \ database/db_adif_primary_subdvisions_data.cpp \ database/queryexecutor.cpp \ dxcluster/dxspot.cpp \ dxcluster/dxcluster.cpp \ dxcluster/dxclusterassistant.cpp \ elogqrzlog.cpp \ eqslutilities.cpp \ frequency.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\ 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/map/mapwidget.cpp \ widgets/map/mapwindowwidget.cpp \ widgets/onlinemessagewidget.cpp \ widgets/showadifimportwidget.cpp \ widgets/showkloglogwidget.cpp \ logwindow.cpp \ filemanager.cpp \ fileawardmanager.cpp \ database.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ locator.cpp \ qso.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 \ 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 \ updatesettings.cpp \ world.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 = . #OBJECTS_DIR = . #MOC_DIR = . #RCC_DIR = . 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_lv.ts \ translations/klog_nl.ts \ translations/klog_pl.ts \ translations/klog_ru.ts \ translations/klog_uk.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 \ qml/mapqmlfile.qml \ qml/marker.qml unix:!mac { message(unix:!mac) DEFINES += APP_LINUX #CONFIG += c++11 CONFIG += c++20 QMAKE_CXXFLAGS += -fmessage-length=0 #QMAKE_CXXFLAGS += --coverage #QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage -O0 #LIBS += -lgcov # Translations should be copied in /usr/share/klog/translations # https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard # QT += dbus #CXXFLAGS += -Wall -Werror -Wno-error=template-id-cdtor #CXXFLAGS += -Wtemplate-id-cdtor 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 QMAKE_CXXFLAGS += -std=c++20 contains(QT_ARCH, i386) { message("32-bit") LIBS += -L"$$PWD/../../libs/win32/hamlib/lib/gcc" -lhamlib LIBS += -L"$$PWD/../../libs/win32/hamlib/bin" INCLUDEPATH += "$$PWD/../../libs/win32/hamlib/include/" } else { message("64-bit") LIBS += -L"$$PWD/../../libs/win64/hamlib/lib/gcc" -lhamlib LIBS += -L"$$PWD/../../libs/win64/hamlib/bin" INCLUDEPATH += "$$PWD/../../libs/win64/hamlib/include/" } } klog-2.4.1/database.h0000644000175000017500000002364115003153303013346 0ustar develdevel#ifndef KLOG_DATABASE_H #define KLOG_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 "database/db_adif_primary_subdvisions_data.h" #include "utilities.h" #include "frequency.h" #include "global.h" class QSqlRelationalTableModel; const float DBVersionf = 0.026f; // This is the latest version of the DB. class DataBase : public QObject { Q_OBJECT friend class tst_DataBase; public: DataBase(const QString &_parentClass, const QString &_DBName); DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName); //virtual ~DataBase(); ~DataBase(); QString getSoftVersion(); float 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 getBandIdFromFreq(const QString &fr); //Freq should be in MHz bool isThisFreqInBand(const QString &b, const QString &fr); //Freq should be in MHz Frequency 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 updateAwardWAZTable(); int getNumberOfQsos(int _logNumber = -1); int getLastInsertedQSO(); void setLogLevel (const DebugLogLevel _b); bool populateTablePrimarySubdivisions(); //private slots: // void slotPrintErrors(QString _func, QString _msg, int _level); private: bool execQuery(const QString &function, const QString &stringQuery); bool updateEntity (const QString &_codeString, const int _code); bool doesEntityTablehaveData(); bool createDataBase(); bool setPragma(); // Defines the PRAGMA for the DB 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 updateTo024(); // Fixes the entity table fixinf the DL id bool updateTo025(); // Adds modes from ADIF 3.1.3 bool updateTo026(); // KLog-2.4: Recreates entity to make UTC a real & add new ADIF fields bool updateTableLog(const int _version); 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 recreateTableEntity(); bool createTableClubLogStatus(); bool populateTableClubLogStatus(); bool createTableMode(const bool NoTmp); bool populateTableMode(const bool NoTmp); bool populateTableModePSK(bool NoTmp); //Refactored from populateTableMode 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 createTablePrimarySubdivisions(const bool NoTmp); bool recreateTablePrimarySubdivisions(); 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 createAndPopulateQSLSentRecStatus(); bool createAndPopulateContinents(); bool createAndPopulateAnt_path_enumeration(); bool createAndPopulateQSO_CompleteEnumeration(); bool createAndPopulateAwardEnumeration(); bool createAndPopulateARRLSectEnumeration(); bool createTableQSL_Via_enumeration(); bool populateTableQSL_Via_enumeration(); bool howManyQSOsInLog(const int i); //void showError(); //bool moveFromModeIdToSubmodeId(); bool updateModeIdFromSubModeId(); bool updateBandIdTableLogToNewOnes(); void queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); DebugLogLevel logLevel; 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; QHash ffreqBandIdHash; QMap bandQMap; QMap modeQMap; Utilities *util; QueryExecutor *exe; 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 _func, QString _msg, DebugLogLevel _level); }; #endif // DATABASE_H klog-2.4.1/awardswidget.cpp0000644000175000017500000004622515003153303014625 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" ; manageDXMarathon = false; logLevel = 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(Q_FUNC_INFO); clear(); createUI(); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::AwardsWidget - END" ; } AwardsWidget::~AwardsWidget() { delete(awards); } void AwardsWidget::clear() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "AwardsWidget::clear" ; /* searchBoxLineEdit->clear(); searchResultsTreeWidget->clear(); qslingNeeded = false; searchSelectAllClicked = false; */ emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::clear-END" ; } void AwardsWidget::createUI() { //searchBoxClearButton->setToolTip(tr("Clear the searches.")); //qDebug() << "AwardsWidget::createUI" ; 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!" ; 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!" ; //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" ; //reconfigureyearlyUI(manageyearly); yearlyScoreLabelN->setText(tr("Score")); yearlyLabelN->setText(tr("Annual")); //qDebug() << "AwardsWidget::createUI-135" ; 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" ; QVBoxLayout *yearlyTLayout = new QVBoxLayout; yearlyTLayout->addWidget(yearlyLabelN); yearlyTLayout->addWidget(operatingYearsComboBox); //qDebug() << "AwardsWidget::createUI-150" ; QGridLayout *dxUpRightAwardsTabLayout = new QGridLayout; //qDebug() << "AwardsWidget::createUI-151" ; dxUpRightAwardsTabLayout->addWidget(awardLabelN, 0, 0); //qDebug() << "AwardsWidget::createUI-152" ; dxUpRightAwardsTabLayout->addWidget(workedLabelN, 0, 1); //qDebug() << "AwardsWidget::createUI-153" ; dxUpRightAwardsTabLayout->addWidget(confirmedLabelN, 0, 2); //qDebug() << "AwardsWidget::createUI-154" ; dxUpRightAwardsTabLayout->addWidget(dxccLabelN, 1, 0); //qDebug() << "AwardsWidget::createUI-155" ; dxUpRightAwardsTabLayout->addWidget(dxccWorkedQLCDNumber, 1, 1); //qDebug() << "AwardsWidget::createUI-156" ; dxUpRightAwardsTabLayout->addWidget(dxccConfirmedQLCDNumber, 1, 2); //qDebug() << "AwardsWidget::createUI-157" ; dxUpRightAwardsTabLayout->addWidget(wazLabelN, 2, 0); //qDebug() << "AwardsWidget::createUI-158" ; dxUpRightAwardsTabLayout->addWidget(wazWorkedQLCDNumber, 2, 1); //qDebug() << "AwardsWidget::createUI-159" ; dxUpRightAwardsTabLayout->addWidget(wazConfirmedQLCDNumber, 2, 2); //qDebug() << "AwardsWidget::createUI-160" ; //dxUpRightAwardsTabLayout->addWidget(localLabelN, 3, 0); //qDebug() << "AwardsWidget::createUI-161" ; //dxUpRightAwardsTabLayout->addWidget(localWorkedQLCDNumber, 3, 1); //qDebug() << "AwardsWidget::createUI-162" ; //dxUpRightAwardsTabLayout->addWidget(localConfirmedQLCDNumber, 3, 2); //qDebug() << "AwardsWidget::createUI-163" ; dxUpRightAwardsTabLayout->addWidget(qsoNLabelN, 4, 0); //qDebug() << "AwardsWidget::createUI-164" ; dxUpRightAwardsTabLayout->addWidget(qsoWorkedQLCDNumber, 4, 1); //qDebug() << "AwardsWidget::createUI-165" ; dxUpRightAwardsTabLayout->addWidget(qsoConfirmedQLCDNumber, 4, 2); //qDebug() << "AwardsWidget::createUI-166" ; dxUpRightAwardsTabLayout->addLayout(yearlyTLayout, 5, 0); //qDebug() << "AwardsWidget::createUI-167" ; dxUpRightAwardsTabLayout->addLayout(yearlyDLayout, 5, 1, 1, -1); //qDebug() << "AwardsWidget::createUI-168" ; dxUpRightAwardsTabLayout->addWidget(recalculateAwardsButton, 6, 1); //qDebug() << "AwardsWidget::createUI-200" ; 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" ; } void AwardsWidget::setManageDXMarathon(const bool _dx) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); manageDXMarathon = _dx; reconfigureDXMarathonUI(manageDXMarathon); emit debugLog(Q_FUNC_INFO, "End", logLevel); } /* void AwardsWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: "; 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() << Q_FUNC_INFO << " - Start"; /* WAZ Local */ emit debugLog(Q_FUNC_INFO, "Start", logLevel); 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", logLevel); //qDebug() << Q_FUNC_INFO << " - END"; } void AwardsWidget::showDXMarathon(const int _year) { //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Year: " << QString::number(_year); emit debugLog(Q_FUNC_INFO, "Start", logLevel); int i = 0; i = awards->getDXMarathonQSO(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: QSO: " << QString::number(i); yearlyQSOLCDNumber->display(i); i = awards->getDXMarathonDXCC(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: DXCC: " << QString::number(i); yearlyDXCCQLCDNumber->display(i); i = awards->getDXMarathonCQ(_year, currentLog); yearlyCQQLCDNumber->display(i); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: CQ: " << QString::number(i); if (manageDXMarathon) { i = awards->getDXMarathonScore(_year, currentLog); } else { i = 0; } yearlyScoreQLCDNumber->display(i); emit debugLog(Q_FUNC_INFO, "End", logLevel); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Score: " << QString::number(i); } void AwardsWidget::reconfigureDXMarathonUI(const bool _dxM) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); //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", logLevel); } void AwardsWidget::checkIfValidLog() { emit debugLog(Q_FUNC_INFO, "Start", logLevel); if (currentLog < 1) { emit requireCurrentLogSignal(); } emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::setLog(const int _log) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); if (_log >= 1) { currentLog = _log; } //TODO: Define an action when the log received is NOK emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::setYear(const int _year) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); 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", logLevel); } void AwardsWidget::fillOperatingYears() { emit debugLog(Q_FUNC_INFO, "Start", logLevel); emit requireCurrentLogSignal(); emit requireCurrentYearSignal(); operatingYearsComboBox->clear(); if (dataProxy->getLastQSOid()<=1) { //qDebug() << "AwardsWidget::AwardsWidget: 18.4"; operatingYearsComboBox->addItem(QString::number(selectedYear)); } else { //qDebug() << "AwardsWidget::AwardsWidget: 18.5 - currentLog: " << QString::number(currentLog); operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1 - currentLog: " << QString::number(currentLog); QStringList a; a.clear(); a << dataProxy->getOperatingYears(currentLog); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.1 - currentLog: " << QString::number(currentLog); if (!a.isEmpty()) { //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.2 - currentLog: " << QString::number(currentLog); operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(a.last(), Qt::MatchCaseSensitive)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.3 - currentLog: " << QString::number(currentLog); } //qDebug() << "AwardsWidget::AwardsWidget: 18.5.2"; } emit debugLog(Q_FUNC_INFO, "End", logLevel); } klog-2.4.1/logmodel.h0000644000175000017500000000546015003153303013403 0ustar develdevel#ifndef KLOG_LOGMODEL_H #define KLOG_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); bool createlogModel(const int _i); bool 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-2.4.1/dataproxy_sqlite.h0000644000175000017500000004420515003153303015175 0ustar develdevel#ifndef KLOG_DATAPROXY_SQLITE_H #define KLOG_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 #include "global.h" #include "database.h" #include "qso.h" #include "utilities.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(); void setLogLevel (const DebugLogLevel _l); 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(); //KLOG_DEPRECATED QStringList getBands(); QStringList getModes(); // Returns the list of submodes 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); Frequency 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 addQSO(QSO &_qso); //int addQSOQuery(const QSqlQuery &_q); 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); QList isThisQSODuplicated (const QSO &_qso, 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); QStringList getFilteredLocators(const QString &_band, const QString &_mode, const QString &_prop, const QString &_sat, bool _confirmed = false); //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 QString &_myGrid, 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, int _logN = -1); QList getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true, int _logN = -1); QList getQSOsListToBeExported(const QString &_stationCallsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, int _logN = -1); QList getQSOsAll(); QStringList getGridsToBeSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, const ExportMode _em, bool _justModified=true, int _logN = -1); 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); QMap getAllEntiNameISOAndPrefix(); int getEntityIdFromMainPrefix(const QString &_e); bool isNewCQz(int _c); bool isNewEntity(int _e); double getLongitudeFromEntity(const int _e); double getLatitudeFromEntity(const int _e); //KLOG_DEPRECATED int getDXCCFromPrefix(const QString &_p); // TODO: Replace by int World::getPrefixId(const QString &_prefix) QString getEntityPrefixes(const int _enti); QStringList getLongPrefixes(); QStringList getSpecialCallsigns(); QHash getWorldData(); 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) QList getListOfDXCCIds(); // Returns the list of valid DXCC id 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); int getDXCCInBand(const int _bandid, const bool _confirmed, 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 isValidPropMode(const QString &_prop); 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, int _pair=0); QString getSatelliteDownlink(const QString &_sat, int _pair=0); 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); QStringList getStationCallSignsFromLogWithLoTWPendingToSend(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 addPrimarySubdivisions(); // Add the primary subdivisions to the BD //bool setDXCCAwardStatus(const int _qsoId); KLOG_DEPRECATED 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); QList getPrimarySubDivisions(const int _entity, const QString &_pref); // Get the Primary subdivisions for an entity //void getFoundInLog(const QString &_txt, const int _log=-1); //KLOG_DEPRECATED QString getADIFQSO(const int _qsoId, ExportMode _em = ModeADIF); QString getADIFValueFromRec(QSqlRecord _rec, const QString &_fieldName); // To refactor the getADIFFromQSOQuery function QString getADIFFromQSOQuery(QSqlRecord _rec, ExportMode _em = ModeADIF, bool _justMarked = false, bool _onlyRequested = false, int _logN = -1); //QString getADIFFromQSOQuery2(QSqlRecord _rec, ExportMode _em = ModeADIF, bool _justMarked = false, bool _onlyRequested = false, int _logN = -1); 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, int _pair = 0); //May even receive: 145.900-146.00 and should return the mid in the range (145.950) QStringList getColumnNamesFromTable(const QString &_tableName); QString getStringQueryStationCallSign (const QString &_a); // Creates part of a query regarding the station_call field QString getStringQueryMyGrid (const QString &_a); // Creates part of a query regarding the my_gridsquare field QString getStringQueryLogNumber (const int _a); // Creates part of a query regarding the lognumber field //KLOG_DEPRECATED int getPrefixId(const QString &_qrz); // TODO: Replace by int World::getPrefixId(const QString &_prefix) // Refactored from fillEmptyDXCCInTheLog //bool updateDXCCAndContinent(const int _id, const int _dxcc, const QString &_cont); // Refactored from fillEmptyDXCCInTheLog //QString changeSlashAndFindPrefix(const QString &_qrz); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QSO *qso; bool searching; int executionN; Utilities *util; DebugLogLevel logLevel; //QSqlQuery preparedQuery; //QSqlRelationalTableModel *logModel; private slots: void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _l); 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 _func, QString _msg, DebugLogLevel _level); }; #endif //DATAPROXY_SQLITE_H klog-2.4.1/udpserver.h0000644000175000017500000000744515003153303013625 0ustar develdevel#ifndef KLOG_UDPSERVER_H #define KLOG_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 "qso.h" //#include "frequency.h" #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); ~UDPServer(); bool start(); bool stop(); bool isStarted(); //void setAddress(const QString &_address); void setPort(const int _port); void setNetworkInterface(const QString &_t); void loadSettings(); 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(const QSO &qso); void clearSignal(QString _func); private slots: void slotReadPendingDatagrams(); }; #endif // UDPSERVER_H klog-2.4.1/logmodel.cpp0000644000175000017500000001302615003153303013733 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(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns.clear(); columns.append(dataProxy->filterValidFields(util->getDefaultLogFields())); setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); //qDebug() << Q_FUNC_INFO << " - END"; } bool 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); if (!setColumns(columns)) { //qDebug() << Q_FUNC_INFO << " - ERROR on setColumns"; return false; } if (!select()) { //qDebug() << Q_FUNC_INFO << " - ERROR on select()"; return false; } //qDebug() << Q_FUNC_INFO << " - END"; return true; } bool 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 << " - calling filterValidFields"; columns << dataProxy->filterValidFields(_columns); QSqlQuery q; QString stringQuery = QString("SELECT * from log LIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; if (!q.exec(stringQuery)) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().nativeErrorCode(), q.lastQuery()); //qDebug() << Q_FUNC_INFO << " - END - 1"; return false; } //if (!q.next()) //{ // //qDebug() << Q_FUNC_INFO << " - END - 2"; // return false; //} rec = q.record(); // Number of columns //qDebug() <getLogColumnName(aux))) { //qDebug() << Q_FUNC_INFO << ": - ERROR when adding the following column to the log view model: " << aux; return false; } //qDebug() << Q_FUNC_INFO << ": - " << aux; } //qDebug() << Q_FUNC_INFO << " - END"; return true; } klog-2.4.1/tips-for-devel.txt0000644000175000017500000000224215003153303015024 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 PROCESS to add a new ADIF field: 1.- Add it to: bool DataBase::createTableLog(bool temp) 2.- Ensure the bool DataBase::updateIfNeeded() runs to update the log table 3.- class QSO (.h) - Add the variable: altitude - Add the set & get: bool setAltitude(const double _c); double getAltitude();setAltitude / getAltitude - Add the helper: bool setAltitude(const QString &data); 3.- class QSO (.cpp) - Implement the setters/getter - clear() (add the variable) - Add it to: - void QSO::InitializeHash() - QString QSO::getAddQueryString() - QString QSO::getModifyQueryString() - QSqlQuery QSO::getPreparedQuery(const QString &_s) - QString QSO::getADIF() - bool QSO::fromDB(int _qsoId) 4.- class ADIF (.cpp) Add it to: - void Adif::InitializeHash() klog-2.4.1/README-DEVEL0000644000175000017500000002171415003153303013145 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_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 If you can't run KLog due to missing libTIFF/LibJPEG/libPNG/libGIF chec this URL: https://stackoverflow.com/questions/35509731/dyld-symbol-not-found-cg-jpeg-resync-to-restart Try this in the shell: $ cd /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources $ sudo ln -sf libJPEG.dylib /usr/local/lib/libJPEG.dylib $ sudo ln -sf libPng.dylib /usr/local/lib/libPng.dylib $ sudo ln -sf libTIFF.dylib /usr/local/lib/libTIFF.dylib $ sudo ln -sf libGIF.dylib /usr/local/lib/libGIF.dylib 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-2.4.1/hamlibclass.cpp0000644000175000017500000006706115003153303014423 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; timer = new QTimer(this); //my_rig = rig_init (RIG_DUMMY); rig_set_debug(RIG_DEBUG_NONE); my_rig = rig_init (RIG_MODEL_DUMMY); retcode = -1; bauds = 9600; //qDebug() << Q_FUNC_INFO << " - END"; } HamLibClass::~HamLibClass() { //qDebug() << Q_FUNC_INFO; if (rigLaunched) { rig_close(my_rig); rig_cleanup(my_rig); rigLaunched = false; } //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::initClass() { //qDebug() << Q_FUNC_INFO ; //showDebugLog(Q_FUNC_INFO, "Start"); strings.clear(); fillRigsList(); retcode = -1; rigLaunched = false; pollInterval = 300; errorCount = 0; readOnlyMode = false; justEmitted = false; reading = false; freq_old = 0.0; bauds = 9600; // default 9600 dataBits = 8; // default 8 stopBits = 1; // default 1 connect(timer, SIGNAL(timeout()), this, SLOT(slotTimer()) ); clean(); //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::clean() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO ; 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" ; } 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; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running"; return 0.0; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... "; return 0.0; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... "; //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); 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; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running"; return false; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... "; return false; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... "; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Freq"; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Freq: " << QString::number(freq); if ((freq_old > freq) || (freq_old < freq) || (_forceRead == true)) { emit freqChanged(freq/1000000); freq_old = freq; //qDebug() << Q_FUNC_INFO << ": EMITING; " << QString::number(freq); } //qDebug() << Q_FUNC_INFO << ": read: " << QString::number(freq); } 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"; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Mode: " << hamlibMode2Mode(rmode); if ((mode_old != rmode) || (_forceRead == true)) { if (justEmitted) { justEmitted = false; reading = false; //qDebug() << Q_FUNC_INFO << " - justEmitted END"; return true; } mode_old = rmode; //qDebug() << Q_FUNC_INFO << " - Emmiting mode: " << hamlibMode2Mode(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; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": Isn't running..."; return; } readRadioInternal(false); // We don't force the radio reading. //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::setMode(const QString &_m) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setMode: " << _m ; if ((!isRunning()) || (readOnlyMode)) { //qDebug() << Q_FUNC_INFO << ": Not running or RO"; 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: "; errorManage(Q_FUNC_INFO, retcode); } QString currentMode = hamlibMode2Mode(rmode); if (_m == currentMode) { //qDebug() << "HamLibClass::setMode: ERROR: Same mode"; return; } retcode = rig_set_mode(my_rig, RIG_VFO_CURR, mode2HamlibMode (_m), rig_passband_normal(my_rig, rig_parse_mode(_m.toLocal8Bit()))); //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; errorManage(Q_FUNC_INFO, retcode); return; } errorCount = 0; //qDebug() << "HamLibClass::setMode - END true "; return; } 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(); } } rmode_t HamLibClass::mode2HamlibMode (const QString &_mode) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _mode; if (_mode == "USB") { return RIG_MODE_USB; } else if (_mode == "LSB") { return RIG_MODE_LSB; } else if (_mode == "CW") { return RIG_MODE_CW; } else if (_mode == "AM") { return RIG_MODE_AM; } else if (_mode == "FM") { return RIG_MODE_FM; } else if (_mode == "SSB") { if (freq_old < 10.0) { return RIG_MODE_LSB; } else { return RIG_MODE_USB; } } else { return RIG_MODE_NONE; } } bool HamLibClass::stop() { //qDebug() << Q_FUNC_INFO; timer->stop(); if (!isRunning()) { //qDebug() << Q_FUNC_INFO << " - ALready stopped - END"; return true; } int errorCode = rig_close(my_rig); //qDebug() << Q_FUNC_INFO << " - 10"; if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_close OK"; errorCode = rig_cleanup(my_rig); if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_cleanUp OK"; rigLaunched = false; //qDebug() << Q_FUNC_INFO << " - END true"; return true; } else { //return errorManage(Q_FUNC_INFO, retcode); errorCount++; //qDebug() << Q_FUNC_INFO << " rig_cleanup NOK: " << QString::number(errorCode); } } else { errorCount++; //qDebug() << Q_FUNC_INFO << " rig_close NOK: " << QString::number(errorCode); } //qDebug() << Q_FUNC_INFO << " - END false"; return false; } bool HamLibClass::init(bool _active) { //qDebug()<< Q_FUNC_INFO << ": " << getNameFromModelId(myrig_model); if (!_active) { //qDebug()<< Q_FUNC_INFO << ": not active, exiting"; rigLaunched = false; stop(); return false; } if ((getNameFromModelId(myrig_model)).length ()<1) { //qDebug()<< Q_FUNC_INFO << ": no rig model!"; rigLaunched = false; return false; } if (rigLaunched) { //qDebug()<< Q_FUNC_INFO << ": Already init" ; return true; } my_rig = rig_init(myrig_model); //qDebug()<< Q_FUNC_INFO << ": set after init" ; //if (my_rig == nullptr) if (!my_rig) { //qDebug()<< Q_FUNC_INFO << ": Init failed, hamlib returned fail!"; return false; } else { //qDebug()<< Q_FUNC_INFO << ": rig_init went OK!"; } // Code of DG1VS (Thank you!) if (myrig_model == RIG_MODEL_NETRIGCTL) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_NETWORK"; // 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"; 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; qstrncpy (my_rig->state.rigport.pathname, netAddPort.toLocal8Bit().constData(), FILPATHLEN); } else if ((myrig_model == RIG_MODEL_DUMMY) || (myrig_model == RIG_MODEL_DUMMY_NOVFO)) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_DUMMY"; } else { //qDebug()<< Q_FUNC_INFO << ": !RIG_PORT_NETWORK"; //qDebug()<< Q_FUNC_INFO << ": serialport2: " << serialPort.toLocal8Bit(); my_rig->state.rigport.type.rig = RIG_PORT_SERIAL; //qstrncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); QVariant aux = QVariant(serialPort); QByteArray portStr = aux.toByteArray(); const char* port = portStr.constData(); strncpy(my_rig->state.rigport.pathname, port, FILPATHLEN - 1); //qDebug()<< Q_FUNC_INFO << ": rigport: " << my_rig->state.rigport.pathname ; my_rig->state.rigport.parm.serial.rate = bauds; //qDebug()<< Q_FUNC_INFO << ": serial rate: " << QString::number(my_rig->state.rigport.parm.serial.rate) ; 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) ; 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); my_rig->state.rigport.parm.serial.parity = sparity; //qDebug()<< Q_FUNC_INFO << ": handshake before" ; my_rig->state.rigport.parm.serial.handshake = shandshake; //qDebug()<< Q_FUNC_INFO << ": after handshake " ; // Config done } //qDebug()<< Q_FUNC_INFO << ": Rig model config " ; // Config done retcode = rig_open(my_rig); //qDebug()<< Q_FUNC_INFO << ": retcode: " << QString::number(retcode) ; if (retcode != RIG_OK) { //qDebug()<< Q_FUNC_INFO << ": Can't open: " << rigerror(retcode); rig_cleanup(my_rig); return errorManage(Q_FUNC_INFO, retcode); } //qDebug()<< Q_FUNC_INFO << ": Rig open!" ; errorCount = 0; rigLaunched = true; freq_old = 0.0; timer->start(pollInterval); //qDebug()<< Q_FUNC_INFO << ": END TRUE"; return true; } bool HamLibClass::isRunning() { //showDebugLog(Q_FUNC_INFO, "Start"); return rigLaunched; } void HamLibClass::fillRigsList() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::getRigList: StringsList before filling it: "; // 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"; // and continue... strings.clear(); //qDebug()<< "HamLibClass::getRigList: StringsList after cleaning it: "; //qDebug() << "HamLibClass::getRigList-02"; rig_load_all_backends(); //qDebug() << "HamLibClass::getRigList-10"; rig_list_foreach (addRigToList, this); //qDebug() << "HamLibClass::getRigList-11"; strings.sort(); } QStringList HamLibClass::getRigList () { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::getRigList: StringsList before filling it: "; //fillRigsList (); //strings.sort(); //qDebug()<< "HamLibClass::getRigList-12 - Strings length: " << QString::number(strings.length()); return strings; } int HamLibClass::addRigToList (const struct rig_caps *caps, void *data) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::addRigToList" << caps->model_name; QString name; //qDebug()<< "HamLibClass::addRigToList-10" ; //HamLibClass *r = (HamLibClass *) data; HamLibClass *r = static_cast (data); //qDebug()<< "HamLibClass::addRigToList-11" ; name = caps->model_name; //qDebug()<< "HamLibClass::addRigToList-12" ; r->rigName2RigId[name] = caps->rig_model; // We fill the equivalences between name & Id //qDebug()<< "HamLibClass::addRigToList-13: " << caps->rig_model; r->rigId2RigName[caps->rig_model] = name; //qDebug()<< "HamLibClass::addRigToList-14: " << name; r->strings << name; //qDebug()<< "HamLibClass::addRigToList-END" ; 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]; //qDebug() << Q_FUNC_INFO << "Name: " << _name << " = " << QString::number(i); return i; } QString HamLibClass::getNameFromModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::getNameFromModelId: " << QString::number(_id) << "/" << rigId2RigName.value(_id) ; return rigId2RigName.value(_id); } void HamLibClass::setModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setModelId: " << QString::number(_id); rigLaunched = false; myrig_model = _id; } void HamLibClass::setPort(const QString &_port) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setPort: " << _port; 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"); //TODO: Check that it is a valid speed 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 QString &_stop) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _stop; if (_stop == "OneStop") { stopBits = 1; } else if (_stop == "OneAndHalfStop") { stopBits = 3; } else if (_stop == "TwoStop") { stopBits = 2; } else { stopBits = -1; } 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); 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); retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::setFreq read: " << QString::number(freq); } 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); Q_UNUSED(_func); 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); return false; } else { //qDebug() << Q_FUNC_INFO << ": RIG NOK for Mode"; //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 } */ bool HamLibClass::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); setModelId(settings.value ("HamLibRigType").toInt()); setPort(settings.value ("HamlibSerialPort").toString()); setSpeed(settings.value ("HamlibSerialBauds", 9600).toInt ()); setDataBits(settings.value ("HamLibSerialDataBits", 8).toInt ()); setStop(settings.value ("HamLibSerialStopBit", "OneStop").toString()); setFlow(settings.value ("HamLibSerialFlowControl", "None").toString()); setParity(settings.value ("HamLibSerialParity", "Even").toString()); setPoll(settings.value ("HamlibRigPollRate", 2000).toInt ()); setReadOnly(settings.value ("HamlibReadOnly", false).toBool ()); setNetworkAddress (settings.value ("HamlibNetAddress").toString()); setNetworkPort (settings.value ("HamlibNetPort", 4532).toInt ()); settings.endGroup (); return true; } klog-2.4.1/downloadcty.cpp0000644000175000017500000001633615003153303014467 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; util = new Utilities(Q_FUNC_INFO); 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"); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "DownLoadCTY::DownLoadCTY(): - END" ; } DownLoadCTY::~DownLoadCTY() { delete(util); delete(request); delete(manager); delete(url); //qDebug() << "DownLoadCTY::~DownLoadCTY" ; } void DownLoadCTY::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "DownLoadCTY::slotDownloadFinished" ; emit downloadStopped(); QUrl url = reply->url(); //qDebug() << "DownLoadCTY::slotDownloadFinished - URL: " << url.toString() ; 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().text(); 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..."; manager->get(*request); return 1; } void DownLoadCTY::slotDownloadProgress(qint64 received, qint64 total) { //qDebug() << "DownLoadCTY::slotDownloadProgress: "; //qDebug() << "DownLoadCTY::downloadProgress: " << QString::number(received) << "/" << QString::number(total); //qDebug() << received << total; emit actionShowProgres(received, total); } void DownLoadCTY::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug() << "DownLoadCTY::slotErrorManagement: " << QString::number(networkError); result = networkError; if (result == QNetworkReply::NoError) { //qDebug() << "DownLoadCTY::downloadFinished: No error"; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "DownLoadCTY::downloadFinished: Host not found"; } else { //qDebug() << "DownLoadCTY::downloadFinished: ERROR: " << QString::number(result); } emit actionError(result); } QString DownLoadCTY::saveFileName(const QUrl &url) { //qDebug() << "DownLoadCTY::saveFileName"; 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; 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-2.4.1/infowidget.h0000644000175000017500000000731015003153303013734 0ustar develdevel#ifndef KLOG_INFOWIDGET_H #define KLOG_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 friend class tst_MainWindow; public: InfoWidget(DataProxy_SQLite *dp, QWidget *parent = 0); ~InfoWidget(); void createUI(); void clear(); void setCurrentLog(const int _log); void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_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 int getDistance(bool shortPath=true); // Returns the distance in KM int getCQ(); // Returns CQ zone int getITU(); // Returns ITU zone private: void clearBandLabels(); void clearInfoFromLocators(); QString getStyleColorToLabelFromBand(const int _bandId, const int _entityId); 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-2.4.1/TROUBLESHOUTING0000644000175000017500000000031215003153303013637 0ustar develdevelLinux - Raspbian Error message in the console when KLog start: qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in "" Solution: install qt6-wayland package sudo apt install qt6-waylandklog-2.4.1/dxccstatuswidget.h0000644000175000017500000001154315003153303015171 0ustar develdevel#ifndef KLOG_DXCCSTATUSWIDGET_H #define KLOG_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(Awards *awards, QWidget *parent = nullptr); //explicit DXCCStatusWidget(DataProxy_SQLite *dp, const QString &_parentFunction, Awards &awards, QWidget *parent = nullptr); ~DXCCStatusWidget(); void update(); //void awardsUpdated(); void setBands(const QString &_callingFunc, const QStringList &_listOfNewBands, const bool _creating = false); // Receives the list of bandIDs void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default); 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 updateDXCCViewHeaders(); // Updaqtes the header, just for readability QStringList filterValidBands(const QStringList &sortedBands); // Removes a string if not a valid band void fillData(); // Calls all the functions to clean the table & fill the data void resetDXCCView(); // deletes the entities and bands from the table void handleDXCCStatusUpdateFailure(); // Shows a message when there is a problem in update() void processEntities(); // Processes the Entities in update(); QList getBandIds(); // Return the list of bands QIcon getFlagIcon(const QString _isoName); // Returns the flag icon void setDefaultBands(); void addEntity(const QList &_ent); // DXCC id, bandid, bandid, ... // void showMenuRightButtonFromLogCreateActions(); // void righButtonFromLogMenu(const int trow); QTableWidget *dxccView; Awards *awards; // Reference to the Awards instance 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-2.4.1/filemanager.h0000644000175000017500000001675115003153303014060 0ustar develdevel#ifndef KLOG_FILEMANAGER_H #define KLOG_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); //FileManager(DataProxy_SQLite *dp, const QString &_softVersion); ~FileManager(); void init(); //bool readAdif(const QString& tfileName, const int logN); //bool adifReadLog(const QString& tfileName, const int logN); int adifReadLog2(const QString& tfileName, QString _stationCallsign = QString(), int logN = -1); int adifLoTWReadLog2(const QString& fileName, 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); bool adifQSOsExport2(const QString& _fileName, const QString& _fields, QList _qsos, ExportMode _em); QList adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em); QList adifLogExportReturnList2(const QString& _fileName, const QString &_callsign, QList _qsos, const ExportMode _em, const int _logN); 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); void setSendQSLByDefault (const bool _send); 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); int howManyQSOsInFile (QFile & _f); qint64 passHeader(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); //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 void writeQuery(QSqlRecord &rec, 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; bool sendEQSLByDefault; // When importing a log, if the QSO does not bring info about eQSL // KLog sets or not a default value 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 //Hash for simplifying if-else chain in processQsoReadingADIF to switch statement static QHash SwitchHash; void initializeSwitchHash(); 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-2.4.1/charts/0000755000175000017500000000000015003153303012707 5ustar develdevelklog-2.4.1/charts/statsqsospermonthbarchartwidget.cpp0000644000175000017500000001141015003153303022144 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 "statsqsospermonthbarchartwidget.h" StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerMonthBarChartWidget::~StatsQSOsPerMonthBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerMonthBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerMonthBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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++ ) { *set0 << dataProxy->getQSOsOnMonth(i+1, _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //*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); } 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); chartView->setChart (chart); } klog-2.4.1/charts/statsqsospercontinentbarchartwidget.h0000644000175000017500000000472015003153303022473 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERCONTINENTBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsqsospermonthbarchartwidget.h0000644000175000017500000000467115003153303021624 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERMONTHBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsqsospermodebarchartwidget.h0000644000175000017500000000466215003153303021423 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERMODEBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsqsosperhourbarchartwidget.cpp0000644000175000017500000001147115003153303022003 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 "statsqsosperhourbarchartwidget.h" StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerHourBarChartWidget::~StatsQSOsPerHourBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerHourBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerHourBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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++ ) { *set0 << dataProxy->getQSOsAtHour((categories.at(i)).toInt(), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //*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); } 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); chartView->setChart (chart); } klog-2.4.1/charts/statsgeneralchartwidget.cpp0000644000175000017500000000433315003153303020340 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 "statsgeneralchartwidget.h" StatsGeneralChartWidget::StatsGeneralChartWidget() { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" ; } StatsGeneralChartWidget::StatsGeneralChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); Q_UNUSED(dp); //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" ; } void StatsGeneralChartWidget::prepareChart(const int _log) { (void)_log; // prevent warning } void StatsGeneralChartWidget::createUI(){} klog-2.4.1/charts/statsqsosperhourbarchartwidget.h0000644000175000017500000000466215003153303021454 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERHOURBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsworkedconfirmedpiechartwidget.h0000644000175000017500000000471215003153303022251 0ustar develdevel#ifndef KLOG_CHARTS_STATSWORKEDCONFIRMEDPIECHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statscqzperyearbarchartwidget.h0000644000175000017500000000464515003153303021250 0ustar develdevel#ifndef KLOG_CHARTS_STATSCQZSPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_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 "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-2.4.1/charts/statsentitiesperyearbarchartwidget.cpp0000644000175000017500000001133415003153303022623 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 "statsentitiesperyearbarchartwidget.h" StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsEntitiesPerYearBarChartWidget::~StatsEntitiesPerYearBarChartWidget() { //delete(dataProxy); } void StatsEntitiesPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsEntitiesPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = tr("DXCC Entities"); categoriesElem = tr("DXCC Entities"); 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 "; //qDebug() << "BarChartStats::prepareChart: SelectedGrapth-2: DXCC "; categories.append(dataProxy->getOperatingYears(_log)); //categoriesElem = tr("DXCC Entities"); //categoriesTitle = tr("DXCC Entities"); aux.clear(); //int numberPerX; for (int i = 0; i < categories.count();i++ ) { *set0 << 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); } 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); chartView->setChart (chart); } klog-2.4.1/charts/statsfieldperbandwidget.h0000644000175000017500000000527115003153303017767 0ustar develdevel#ifndef KLOG_CHARTS_STATSFIELDPERBANDWIDGET_H #define KLOG_CHARTS_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(DataProxy_SQLite *dp, ValidFieldsForStats _field, QWidget *parent = nullptr); ~StatsFieldPerBandWidget(); 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-2.4.1/charts/statssentconfirmedpiechartwidget.cpp0000644000175000017500000000714615003153303022266 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 "statssentconfirmedpiechartwidget.h" StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsSentConfirmedPieChartWidget::~StatsSentConfirmedPieChartWidget() { //delete(dataProxy); } void StatsSentConfirmedPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsSentConfirmedPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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); 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); chartView->setChart (chart); } klog-2.4.1/charts/statsworkedsentpiechartwidget.h0000644000175000017500000000465415003153303021261 0ustar develdevel#ifndef KLOG_CHARTS_STATSWORKEDSENTPIECHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsdxccsonsatswidget.cpp0000644000175000017500000001700315003153303020233 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) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget"; #else #endif dataProxy = dp; util = new Utilities(Q_FUNC_INFO); 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); 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()); 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()) ; 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-2.4.1/charts/statsfieldperbandwidget.cpp0000644000175000017500000001431715003153303020323 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"; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); selectedField = _field; modeComboBox = new QComboBox; createUI(); //prepareChart(); } StatsFieldPerBandWidget::~StatsFieldPerBandWidget() { delete(util); //delete(dataProxy); } 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(currentTextChanged(QString)), this, SLOT(slotModeComboBoxChanged() ) ) ; } void StatsFieldPerBandWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log); 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-2.4.1/charts/statscqzperyearbarchartwidget.cpp0000644000175000017500000001114015003153303021567 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 "statscqzperyearbarchartwidget.h" StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } void StatsCQZPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } StatsCQZPerYearBarChartWidget::~StatsCQZPerYearBarChartWidget() { //delete(dataProxy); } void StatsCQZPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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 "; 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++ ) { *set0 << dataProxy->getCQzonYear((categories.at(i)).toInt(), _log); //numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), -1); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); 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); chartView->setChart (chart); } klog-2.4.1/charts/statsgeneralchartwidget.h0000644000175000017500000000430115003153303020000 0ustar develdevel#ifndef KLOG_CHARTS_STATSGENERALCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statssentconfirmedpiechartwidget.h0000644000175000017500000000467615003153303021740 0ustar develdevel#ifndef KLOG_CHARTS_STATSSENTCONFIRMEDPIECHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsqsosperyearbarchartwidget.cpp0000644000175000017500000001067215003153303021770 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 "statsqsosperyearbarchartwidget.h" StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerYearBarChartWidget::~StatsQSOsPerYearBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesElem = tr("QSOs"); QString categoriesTitle = tr("QSOs per year"); QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux = QString(); //int numberPerX= 0; //chart->removeAllSeries(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs")); //*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)); for (int i = 0; i < categories.count();i++ ) { int numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); *set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); 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); chartView->setChart (chart); //chart->setAxisX(axis, series); } klog-2.4.1/charts/statsgridsonsatswidget.cpp0000644000175000017500000001645215003153303020246 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) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsGridsOnSatsWidget::StatsGridsOnSatsWidget: "; #else #endif dataProxy = dp; util = new Utilities(Q_FUNC_INFO); confirmedOnlyCheckBox = new QCheckBox; onlyLEOSatCheckBox = new QCheckBox; numberLabel = new QLabel; log = -1; createUI(); //prepareChart(); } StatsGridsOnSatsWidget::~StatsGridsOnSatsWidget() { delete(util); //delete(dataProxy); } 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(4, Qt::AscendingOrder); //void QTableWidget::sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder) tableWidget->horizontalHeader()->setStretchLastSection(true); 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); 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()); 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)); } tableWidget->sortItems(4, Qt::AscendingOrder); } void StatsGridsOnSatsWidget::slotConfirmedClicked() { prepareChart(log); } klog-2.4.1/charts/statsentitiesperyearbarchartwidget.h0000644000175000017500000000471115003153303022271 0ustar develdevel#ifndef KLOG_CHARTS_STATSENTITIESPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsworkedsentpiechartwidget.cpp0000644000175000017500000000727115003153303021612 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 "statsworkedsentpiechartwidget.h" StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsWorkedSentPieChartWidget::~StatsWorkedSentPieChartWidget() { //delete(dataProxy); } void StatsWorkedSentPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedSentPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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); //qDebug() << "Confirmed: " << QString::number(confirmed); //qDebug() << "Worked: " << QString::number(qsos - confirmed); 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); chartView->setChart (chart); } klog-2.4.1/charts/statsgridsonsatswidget.h0000644000175000017500000000511115003153303017701 0ustar develdevel#ifndef KLOG_CHARTS_STATSGRIDSONSATSWIDGET_H #define KLOG_CHARTS_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(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsGridsOnSatsWidget(); 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-2.4.1/charts/statsworkedconfirmedpiechartwidget.cpp0000644000175000017500000000747415003153303022614 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 "statsworkedconfirmedpiechartwidget.h" StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsWorkedConfirmedPieChartWidget::~StatsWorkedConfirmedPieChartWidget() { //delete(dataProxy); } void StatsWorkedConfirmedPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedConfirmedPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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); //qDebug() << "Confirmed: " << QString::number(confirmed); //qDebug() << "Worked: " << QString::number(qsos - confirmed); 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); chartView->setChart (chart); } klog-2.4.1/charts/statsqsosperdxccbarchartwidget.cpp0000644000175000017500000001573115003153303021752 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 "statsqsosperdxccbarchartwidget.h" StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); // prepareChart(); } StatsQSOsPerDXCCBarChartWidget::~StatsQSOsPerDXCCBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerDXCCBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerDXCCBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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 "; 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()); foreach(QList pair, data) { map.insert(pair.at(0), pair.at(1)); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(0): " << QString::number(pair.at(0)); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(1): " << QString::number(pair.at(1)); 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()); //qDebug() << "Replacing by: " << entities.at(i) << " / " << QString::number(qsos) << " - " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()); 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"; } */ /* QMapIterator it(map); while (it.hasNext()) { it.next(); categories.append(dataProxy->getEntityMainPrefix(it.value())); //qDebug() << "While iteration: " << dataProxy->getEntityMainPrefix(it.value()); numberPerX = it.key(); *set0 << numberPerX; numberPerX = 0; //qDebug() << "End of while iteration"; } //qDebug() << "Out of while"; */ 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); chartView->setChart (chart); } klog-2.4.1/charts/statsqsosperbandbarchartwidget.h0000644000175000017500000000466215003153303021403 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERBANDBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsdxccsonsatswidget.h0000644000175000017500000000512715003153303017704 0ustar develdevel#ifndef KLOG_CHARTS_STATSDXCCSONSATSWIDGET_H #define KLOG_CHARTS_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(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-2.4.1/charts/statsqsospermodebarchartwidget.cpp0000644000175000017500000001141415003153303021747 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 "statsqsospermodebarchartwidget.h" StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerModeBarChartWidget::~StatsQSOsPerModeBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerModeBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerModeBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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 "; categories.append(dataProxy->getModesInLog(_log)); categoriesElem = tr("Modes"); categoriesTitle = tr("QSOs per mode distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getQSOsInMode((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); 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); chartView->setChart (chart); } klog-2.4.1/charts/statsqsosperdxccbarchartwidget.h0000644000175000017500000000465015003153303021415 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERDXCCBARCHARTWIDGET_H #define KLOG_CHARTS_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 "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-2.4.1/charts/statsqsospercontinentbarchartwidget.cpp0000644000175000017500000001127215003153303023026 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 "statsqsospercontinentbarchartwidget.h" StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerContinentBarChartWidget::~StatsQSOsPerContinentBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerContinentBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerContinentBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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++ ) { *set0 << dataProxy->getQSOsWithContinent(categories.at(i), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //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); } 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); chartView->setChart (chart); } klog-2.4.1/charts/statsqsosperyearbarchartwidget.h0000644000175000017500000000466215003153303021437 0ustar develdevel#ifndef KLOG_CHARTS_STATSQSOSPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_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-2.4.1/charts/statsqsosperbandbarchartwidget.cpp0000644000175000017500000001132615003153303021731 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 "statsqsosperbandbarchartwidget.h" StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerBandBarChartWidget::~StatsQSOsPerBandBarChartWidget() { //delete(dataProxy); } void StatsQSOsPerBandBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerBandBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); 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 "; categories.append(dataProxy->getBandsInLog(_log)); categoriesElem = tr("Bands"); categoriesTitle = tr("QSOs per band distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getQSOsInBand((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); 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); chartView->setChart (chart); } klog-2.4.1/qso.cpp0000644000175000017500000041337615003153303012747 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" #include "QtSql/qsqlerror.h" #include "qsqlrecord.h" #include "callsign.h" QSO::QSO(QObject *parent) : QObject(parent) { //startT = QTime::currentTime(); //qDebug() << Q_FUNC_INFO << " - " << startT.msec(); logLevel = None; qsoId = -1; util = new Utilities(Q_FUNC_INFO); //db = new DataBase(Q_FUNC_INFO, "1", util->getKLogDBFile()); //db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); } QSO::QSO(const QSO &other) : QObject(other.parent()) { //startT = QTime::currentTime(); //qDebug() << Q_FUNC_INFO << " - " << startT.msec(); //qDebug() << Q_FUNC_INFO << " (2): " << other.callsign; util = new Utilities(Q_FUNC_INFO); logLevel = other.logLevel; haveBand = other.haveBand; haveMode = other.haveMode; haveSubMode = other.haveSubMode; haveDateTime = other.haveDateTime; haveCall = other.haveCall; qsoId = other.qsoId; logId = other.logId; backup = other.backup; stationCallsign = other.stationCallsign; lotwUpdating = other.lotwUpdating; realTime = other.realTime; manualMode = other.manualMode; keepComment = other.keepComment; keepMyData = other.keepMyData; keepOther = other.keepOther; keepSat = other.keepSat; modifying = other.modifying; // VARIABLES for ADIF ////////// address = other.address; age = other.age; altitude = other.altitude; a_index = other.a_index; ant_az = other.ant_az; ant_el = other.ant_el; ant_path = other.ant_path; arrl_sect = other.arrl_sect; award_submitted = other.award_submitted; award_granted = other.award_granted; band = other.band; band_rx = other.band_rx; callsign = other.callsign; check = other.check; clase = other.clase; clublogQSOUpdateDate = other.clublogQSOUpdateDate; clublog_status = other.clublog_status; county = other.county; comment = other.comment; continent = other.continent; contacted_op = other.contacted_op; contest_id = other.contest_id; country = other.country; cqz = other.cqz; credit_granted = other.credit_granted; credit_submitted = other.credit_submitted; darc_dok = other.darc_dok; distance = other.distance; dxcc = other.dxcc; email = other.email; ownerCall = other.ownerCall; contacted_owner = other.contacted_owner; eQSLRDate = other.eQSLRDate; eQSLSDate = other.eQSLSDate; eqsl_qsl_rcvd = other.eqsl_qsl_rcvd; eqsl_qsl_sent = other.eqsl_qsl_sent; fists = other.fists; fists_cc = other.fists_cc; forceInit = other.forceInit; freq_tx = other.freq_tx; freq_rx = other.freq_rx; gridsquare = other.gridsquare; gridsquare_ext = other.gridsquare_ext; operatorCall = other.operatorCall; hrdlogUploadDate = other.hrdlogUploadDate; hrdlog_status = other.hrdlog_status; hamlogeu_status = other.hamlogeu_status; hamlogeuUpdateDate = other.hamlogeuUpdateDate; hamqth_status = other.hamqth_status; hamqthUpdateDate = other.hamqthUpdateDate; iota = other.iota; iota_ID = other.iota_ID; itu_zone = other.itu_zone; k_index = other.k_index; latitude = other.latitude; longitude = other.longitude; QSLLoTWRDate = other.QSLLoTWRDate; QSLLoTWSDate = other.QSLLoTWSDate; lotw_qsl_rcvd = other.lotw_qsl_rcvd; lotw_qsl_sent = other.lotw_qsl_sent; max_bursts = other.max_bursts; mode = other.mode; ms_shower = other.ms_shower; my_altitude = other.my_altitude; my_antenna = other.my_antenna; my_arrl_sect = other.my_arrl_sect; my_city = other.my_city; my_county = other.my_county; my_country = other.my_country; my_cqz = other.my_cqz; my_dxcc = other.my_dxcc; my_fists = other.my_fists; my_gridsquare = other.my_gridsquare; my_gridsquare_ext = other.my_gridsquare_ext; my_iota = other.my_iota; my_iota_ID = other.my_iota_ID; my_itu_zone = other.my_itu_zone; my_latitude = other.my_latitude; my_longitude = other.my_longitude; my_name = other.my_name; my_pota_ref = other.my_pota_ref; my_postal_code = other.my_postal_code; my_rig = other.my_rig; my_sig = other.my_sig; my_sig_info = other.my_sig_info; my_sota_ref = other.my_sota_ref; my_state = other.my_state; my_street = other.my_street; my_usaca_counties = other.my_usaca_counties; my_vucc_grids= other.my_vucc_grids; my_wwff_ref = other.my_wwff_ref; name = other.name; notes = other.notes; nr_bursts = other.nr_bursts; nr_pings = other.nr_pings; operatorCall = other.operatorCall; ownerCall = other.ownerCall; contacted_owner = other.contacted_owner; prefix = other.prefix; pota_ref = other.pota_ref; precedence = other.precedence; propMode = other.propMode; public_key = other.public_key; QRZComDate = other.QRZComDate; QRZCom_status = other.QRZCom_status; qslmsg = other.qslmsg; QSLRDate = other.QSLRDate; QSLSDate = other.QSLSDate; qsl_rcvd = other.qsl_rcvd; qsl_sent = other.qsl_sent; qslSenVia = other.qslSenVia; qslRecVia = other.qslRecVia; qslVia = other.qslVia; qso_complete = other.qso_complete; qso_dateTime = other.qso_dateTime; qso_date_off = other.qso_date_off; qso_random = other.qso_random; qth = other.qth; region = other.region; rig = other.rig; RST_rx = other.RST_rx; RST_tx = other.RST_tx; pwr_rx = other.pwr_rx; satMode = other.satMode; satName = other.satName; sfi =other.sfi; sig = other.sig; sig_info = other.sig_info; silent_key = other.silent_key; skcc = other.skcc; sota_ref = other.sota_ref; srx = other.srx; srx_string = other.srx_string; state = other.state; stx = other.stx; stx_string = other.stx_string; submode = other.submode; swl = other.swl; ten_ten = other.ten_ten; qso_time_off = other.qso_time_off; pwr_tx = other.pwr_tx; uksmg = other.uksmg; usaca_counties = other.usaca_counties; ve_prov = other.ve_prov; vucc_grids = other.vucc_grids; web = other.web; wwff_ref = other.wwff_ref; } QSO::~QSO() { //qDebug() << Q_FUNC_INFO; delete(util); } void QSO::operator=(QSO const &_other) { //qDebug() << Q_FUNC_INFO; //qDebug() << Q_FUNC_INFO << " - " << startT.msec(); callsign = _other.callsign; qsoId = _other.qsoId; logId = _other.logId; dxcc = _other.dxcc; a_index = _other.a_index; k_index = _other.k_index; cqz = _other.cqz; fists = _other.fists; fists_cc = _other.fists_cc; my_fists = _other.my_fists; iota_ID = _other.iota_ID; itu_zone = _other.itu_zone; nr_bursts = _other.nr_bursts; max_bursts = _other.max_bursts; nr_pings = _other.nr_pings; my_cqz = _other.my_cqz; my_itu_zone = _other.my_itu_zone; my_dxcc = _other.my_dxcc; my_iota_ID = _other.my_iota_ID; srx = _other.srx; stx = _other.stx; uksmg = _other.uksmg; ten_ten = _other.ten_ten; sfi = _other.sfi; freq_tx = _other.freq_tx; freq_rx = _other.freq_rx; pwr_rx = _other.pwr_rx; pwr_tx = _other.pwr_tx; age = _other.age; ant_el = _other.ant_el; ant_az = _other.ant_az; distance = _other.distance; altitude = _other.altitude; my_altitude = _other.my_altitude; satName = _other.satName; satMode = _other.satMode; stationCallsign = _other.stationCallsign; operatorCall = _other.operatorCall; propMode = _other.propMode; band = _other.band; band_rx = _other.band_rx; mode = _other.mode; gridsquare = _other.gridsquare; my_gridsquare = _other.my_gridsquare; gridsquare_ext = _other.gridsquare_ext; my_gridsquare_ext = _other.my_gridsquare_ext; qth = _other.qth; name = _other.name; RST_tx = _other.RST_tx; RST_rx = _other.RST_rx; qsl_rcvd = _other.qsl_rcvd; qsl_sent = _other.qsl_sent; qslSenVia = _other.qslSenVia; qslRecVia = _other.qslRecVia; qslVia = _other.qslVia; check = _other.check; clase = _other.clase; lotw_qsl_sent = _other.lotw_qsl_sent; lotw_qsl_rcvd = _other.lotw_qsl_rcvd; sota_ref = _other.sota_ref; my_sota_ref = _other.my_sota_ref; my_rig = _other.my_rig; my_antenna = _other.my_antenna; my_arrl_sect = _other.my_arrl_sect; vucc_grids = _other.vucc_grids; my_vucc_grids = _other.my_vucc_grids; pota_ref = _other.pota_ref; my_pota_ref = _other.my_pota_ref; clublog_status = _other.clublog_status; hrdlog_status = _other.hrdlog_status; QRZCom_status = _other.QRZCom_status; hamlogeu_status = _other.hamlogeu_status; hamqth_status = _other.hamqth_status; eqsl_qsl_sent = _other.eqsl_qsl_sent; eqsl_qsl_rcvd = _other.eqsl_qsl_sent; comment = _other.comment; address = _other.address; ant_path = _other.ant_path; arrl_sect = _other.arrl_sect; continent = _other.continent; rig = _other.rig; country = _other.country; award_granted = _other.award_granted; award_submitted = _other.award_submitted; county = _other.county; contacted_op = _other.contacted_op; contacted_owner = _other.contacted_owner; contest_id = _other.contest_id; credit_granted = _other.credit_granted; credit_submitted = _other.credit_submitted; darc_dok = _other.darc_dok; email = _other.email; qso_complete = _other.qso_complete; usaca_counties = _other.usaca_counties; ve_prov = _other.ve_prov; web = _other.web; wwff_ref = _other.wwff_ref; iota = _other.iota; ownerCall = _other.ownerCall; latitude = _other.latitude; longitude = _other.longitude; ms_shower = _other.ms_shower; notes = _other.notes; prefix = _other.prefix; precedence = _other.precedence; public_key = _other.public_key; qslmsg = _other.qslmsg; region = _other.region; sig = _other.sig; sig_info = _other.sig_info; skcc = _other.skcc; srx_string = _other.srx_string; stx_string = _other.stx_string; state = _other.state; submode = _other.submode; my_city = _other.my_city; my_county = _other.my_county; my_country = _other.my_country ; my_iota = _other.my_iota ; my_latitude = _other.my_latitude; my_longitude = _other.my_longitude; my_name = _other.my_name; my_postal_code = _other.my_postal_code;; my_sig = _other.my_sig; my_sig_info = _other.my_sig_info; my_state = _other.my_state; my_street = _other.my_street; my_usaca_counties = _other.my_usaca_counties; my_wwff_ref = _other.my_wwff_ref; qso_time_off = _other.qso_time_off; qso_dateTime = _other.qso_dateTime; QSLRDate = _other.QSLRDate; QSLSDate = _other.QSLSDate; QSLLoTWRDate = _other.QSLLoTWRDate; QSLLoTWSDate = _other.QSLLoTWSDate; qso_date_off = _other.qso_date_off; eQSLRDate = _other.eQSLRDate; eQSLSDate = _other.eQSLSDate; clublogQSOUpdateDate = _other.clublogQSOUpdateDate; hrdlogUploadDate = _other.hrdlogUploadDate; hamlogeuUpdateDate = _other.hamlogeuUpdateDate; hamqthUpdateDate = _other.hamqthUpdateDate; QRZComDate = _other.QRZComDate; forceInit = _other.forceInit; qso_random = _other.qso_random; swl = _other.swl; // The following variables are not part of ADIF backup = _other.backup; lotwUpdating = _other.lotwUpdating; realTime = _other.realTime; manualMode = _other.manualMode; silent_key = _other.silent_key; keepComment = _other.keepComment; keepOther = _other.keepOther; keepMyData = _other.keepMyData; keepSat = _other.keepSat; modifying = _other.modifying; isValidDistance = _other.isValidDistance; haveBand = _other.haveBand; haveMode = _other.haveMode; haveSubMode = _other.haveSubMode; haveDateTime = _other.haveDateTime; haveCall = _other.haveCall; } bool QSO::copy(const QSO& other) { //Copies the data of another QSO into this one //qDebug() << Q_FUNC_INFO; clear(); setLogId(other.logId); setStationCallsign(other.stationCallsign); // VARIABLES for ADIF ////////// setAddress(other.address); setAge(other.age); setAltitude(other.altitude); setA_Index(other.a_index); setAnt_az(other.ant_az); setAnt_el(other.ant_el); setAnt_Path(other.ant_path); setARRL_Sect(other.arrl_sect); setAwardSubmitted(other.award_submitted); setAwardGranted(other.award_granted); setBand(other.band); setBandRX(other.band_rx); setCall(other.callsign); setCheck(other.check); setClass(other.clase); setClubLogDate(other.clublogQSOUpdateDate); setClubLogStatus(other.clublog_status); setCounty(other.county); setComment(other.comment); setContinent(other.continent); setContactedOperator(other.contacted_op); setContestID(other.contest_id); setCountry(other.country); setCQZone(other.cqz); setCreditGranted(other.credit_granted); setCreditSubmitted(other.credit_submitted); setDarcDok(other.darc_dok); setDistance(other.distance); setDXCC(other.dxcc); setEmail(other.email); setOwnerCallsign(other.ownerCall); setContactedOperator(other.contacted_op); setEQSLQSLRDate(other.eQSLRDate); setEQSLQSLSDate(other.eQSLSDate); setEQSLQSL_RCVD(other.eqsl_qsl_rcvd); setEQSLQSL_SENT(other.eqsl_qsl_sent); setFists(other.fists); setFistsCC(other.fists_cc); setForceInit(other.forceInit); setFreq(other.freq_tx); setFreqRX(other.freq_rx); setGridSquare(other.gridsquare); setGridSquare_ext(other.gridsquare_ext); setOperatorCallsign(other.operatorCall); setHRDUpdateDate(other.hrdlogUploadDate); setHRDLogStatus(other.hrdlog_status); setHamLogEUUpdateDate(other.hamlogeuUpdateDate); setHamLogEUStatus(other.hrdlog_status); setHamQTHUpdateDate(other.hamqthUpdateDate); setHamQTHStatus(other.hamqth_status); setIOTA(other.iota); setIotaID(other.iota_ID); setItuZone(other.itu_zone); setK_Index(other.k_index); setLatitude(other.latitude); setLongitude(other.longitude); setLoTWQSLRDate(other.QSLLoTWRDate); setLoTWQSLSDate(other.QSLLoTWSDate); setLoTWQSL_RCVD(other.lotw_qsl_rcvd); setLoTWQSL_SENT(other.lotw_qsl_sent); setMaxBursts(other.max_bursts); //qDebug() <getQSO_CompleteFromADIF("Y"); qso_dateTime = QDateTime(); qso_date_off = QDate(); qso_random = true; qth = QString(); region = QString(); rig = QString(); RST_rx = QString(); RST_tx = QString(); pwr_rx = 0.0; satMode = QString(); satName = QString(); sfi = -1; sig = QString(); sig_info = QString(); silent_key = false; skcc = QString(); sota_ref = QString(); srx = -1; srx_string = QString(); state = QString(); stx = -1; stx_string = QString(); submode = QString(); swl = false; ten_ten = 0; qso_time_off = QTime(); pwr_tx = 0.0; uksmg = 0; usaca_counties = QString(); ve_prov = QString(); vucc_grids = QString(); web = QString(); wwff_ref = QString(); logEvent (Q_FUNC_INFO, "END", Debug); } void QSO::setBackup(const bool _rt) { backup = _rt; } bool QSO::getBackup() const { return backup; } void QSO::setModifying(const bool _mod) { modifying = _mod; } bool QSO::getModifying() const { return modifying; } bool QSO::setQSOid(const int _i) { if (_i >0) { qsoId = _i; return true; } else { return false; } } int QSO::getQSOid() const { if (qsoId>0) return qsoId; return -1; } bool QSO::setLogId(const int _i) { if (_i >0) { logId = _i; return true; } else { return false; } } int QSO::getLogId() const { if (logId>0) return logId; return -1; } bool QSO::setFreq(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); if (_f>0) { freq_tx = _f; //qDebug() << Q_FUNC_INFO << ":-2 " << QString::number(freq_tx); setBandFromFreq(freq_tx); if (freq_rx<=0) setFreqRX(freq_tx); return true; } else { return false; } } bool QSO::setFreqRX(const double _f) { if (_f>0) { freq_rx = _f; setBandFromFreq(_f, false); return true; } else { return false; } } double QSO::getFreqTX() { if (freq_tx>=0) return freq_tx; return -1.0; } double QSO::getFreqRX() { if (freq_rx>=0) return freq_rx; return -1.0; } bool QSO::isValid() {// Add more controls: Call, Date, Time, Band, Mode? logEvent (Q_FUNC_INFO, "Start", Debug); return isComplete(); //if ( (callsign.length()>0)) //{ // logEvent (Q_FUNC_INFO, "END-true", Debug); // return true; //} //else //{ // logEvent (Q_FUNC_INFO, "END-false", Debug); // return false; //} } bool QSO::setCall(const QString &_c) { logEvent (Q_FUNC_INFO, QString("Start: %1").arg(_c), Debug); Callsign call(_c); //qDebug() << Q_FUNC_INFO << ": " << _c; if (call.isValid()) { //qDebug() << Q_FUNC_INFO << ": valid Call"; logEvent (Q_FUNC_INFO, QString("END - true"), Debug); callsign = _c; haveCall = true; return true; } else { logEvent (Q_FUNC_INFO, QString("END - false-2"), Debug); //qDebug() << Q_FUNC_INFO << ": NOT valid Call"; return false; } } QString QSO::getCall() const { //qDebug() << Q_FUNC_INFO << ": " << callsign; //qDebug() << Q_FUNC_INFO << " - " << startT.msec(); if (callsign.length()>2) return callsign; return QString(); } void QSO::setBandFromFreq(const double _fr, bool TX) { if (TX) { setBand (getBandNameFromFreq (_fr)); } else { setBandRX (getBandNameFromFreq (_fr)); } } bool QSO::setBand(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { band = _c; haveBand = true; if (band_rx.isNull()) band_rx = band; return true; } else { band = QString(); return false; } } QString QSO::getBand() const { return band; } bool QSO::setBandRX(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { band_rx = _c; return true; } else { band_rx = QString(); return false; } } QString QSO::getBandRX() const { return band_rx; } bool QSO::setMode(const QString &_c) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _c; QString aux = _c; if (aux.isNull()) { //qDebug() << Q_FUNC_INFO << ": NULL"; mode = QString(); haveMode = false; logEvent (Q_FUNC_INFO, "END - False 1", Debug); return false; } if (aux.length()>0) { //qDebug() << Q_FUNC_INFO << ": mode = " << _c; mode = aux; if (!haveSubMode) setSubmode(mode); logEvent (Q_FUNC_INFO, "END - True", Debug); haveMode = true; return true; } else { //qDebug() << Q_FUNC_INFO << ": FALSE 2"; mode = QString(); haveMode = false; logEvent (Q_FUNC_INFO, "END - False 2", Debug); return false; } } QString QSO::getMode() const { return mode; } bool QSO::setDate(const QDate &_c) { if (_c.isValid()) { qso_dateTime.setDate(_c); if(qso_dateTime.time().isValid ()) haveDateTime = true; return true; } else { return false; } } QDate QSO::getDate() const { return qso_dateTime.date(); } bool QSO::setDateOff(const QDate &_c) { if (_c.isValid()) { qso_date_off = _c; return true; } else { qso_date_off = QDate(); return false; } } QDate QSO::getDateOff() const { return qso_date_off; } bool QSO::setTimeOff(const QTime &_c) { if (_c.isValid()) { qso_time_off = _c; return true; } else { qso_time_off = QTime(); return false; } } QTime QSO::getTimeOff() const { return qso_time_off; } bool QSO::setTimeOn(const QTime &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c.toString("mmhhss"); if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << ": VALID"; qso_dateTime.setTime(_c); if (qso_dateTime.date().isValid ()) haveDateTime = true; return true; } else { return false; } } QTime QSO::getTimeOn() const { return qso_dateTime.time(); } bool QSO::setDateTimeOn(const QDateTime &_c) { if (_c.isValid()) { qso_dateTime = _c; haveDateTime = true; return true; } else { return false; } } QDateTime QSO::getDateTimeOn() const { return qso_dateTime; } void QSO::setRealTime(const bool _rt) { realTime = _rt; } bool QSO::getRealTime() const { return realTime; } void QSO::setManualMode(const bool _rt) { manualMode = _rt; } bool QSO::getManualMode() const { return manualMode; } // eQSL Tab bool QSO::setClubLogStatus(const QString &_c) { //qDebug() << Q_FUNC_INFO << " - " << _c; if (util->isValidUpload_Status (_c)) { //qDebug() << Q_FUNC_INFO << " - Valid"; clublog_status = _c; return true; } else { //qDebug() << Q_FUNC_INFO << " - NOT Valid"; return false; } } QString QSO::getClubLogStatus() const { return clublog_status; } bool QSO::setClubLogDate(const QDate &_c) { //qDebug() << Q_FUNC_INFO << " - " << _c.toString("yyyy-MM-dd"); if (_c.isValid()) { clublogQSOUpdateDate = _c; return true; } else { clublogQSOUpdateDate = QDate(); return false; } } QDate QSO::getClubLogDate() const { return clublogQSOUpdateDate; } bool QSO::setQRZCOMStatus(const QString &_c) { //qDebug() << Q_FUNC_INFO << " - " << _c; if (util->isValidUpload_Status (_c)) { //qDebug() << Q_FUNC_INFO << " - VALID"; QRZCom_status = _c; return true; } else { //qDebug() << Q_FUNC_INFO << " - NOT VALID"; return false; } } QString QSO::getQRZCOMStatus() const { return QRZCom_status; } bool QSO::setQRZCOMDate(const QDate &_c) { if (_c.isValid()) { QRZComDate = _c; return true; } else { QRZComDate = QDate(); return false; } } QDate QSO::getQRZCOMDate() const { 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() const { return eqsl_qsl_rcvd; } bool QSO::setEQSLQSL_SENT(const QString &_c) { //qDebug() << Q_FUNC_INFO << " : " << _c; if (util->isValidQSL_Sent(_c)) { eqsl_qsl_sent = _c; return true; } else { return false; } } QString QSO::getEQSLQSL_SENT() const { 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() const { return eQSLRDate; } bool QSO::setEQSLQSLSDate(const QDate &_c) { if (_c.isValid()) { eQSLSDate = _c; return true; } else { eQSLSDate = QDate(); return false; } } QDate QSO::getEQSLQSLSDate() const { 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() const { 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() const { return QSLLoTWSDate; } bool QSO::setLoTWQSL_RCVD(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (util->isValidQSL_Rcvd(_c)) { //qDebug() << Q_FUNC_INFO << ": VALID "; lotw_qsl_rcvd = _c; return true; } else { //qDebug() << Q_FUNC_INFO << ": NOT valid "; return false; } } QString QSO::getLoTWQSL_RCVD() const { return lotw_qsl_rcvd; } bool QSO::setLoTWQSLRDate(const QDate &_c) { //qDebug() << Q_FUNC_INFO << ": << _c.toString("yyyy-MM-dd"); if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << ": TRUE"; QSLLoTWRDate = _c; return true; } else { //qDebug() << Q_FUNC_INFO << ": FALSE"; QSLLoTWRDate = QDate(); return false; } } QDate QSO::getLoTWQSLRDate() const { 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() const { return qsl_sent; } bool QSO::setQSLSDate(const QDate &_c) { if (_c.isValid()) { QSLSDate = _c; return true; } else { QSLSDate = QDate(); return false; } } QDate QSO::getQSLSDate() const { 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() const { return qsl_rcvd; } bool QSO::setQSLSenVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslSenVia = _qs; return true; } else { return false; } } QString QSO::getQSLSentVia() const { return qslSenVia; } bool QSO::setQSLRecVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslRecVia = _qs; return true; } else { return false; } } QString QSO::getQSLRecVia() const { return qslRecVia; } bool QSO::setQSLVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslVia = _qs; return true; } else { return false; } } QString QSO::getQSLVia() const { return qslVia; } bool QSO::setQSLRDate(const QDate &_c) { if (_c.isValid()) { QSLRDate = _c; return true; } else { QSLRDate = QDate(); return false; } } QDate QSO::getQSLRDate() const { return QSLRDate; } bool QSO::setQSLMsg(const QString &_qs) { if (!_qs.isEmpty ()) { qslmsg = _qs; return true; } else { return false; } } QString QSO::getQSLMsg() const { return qslmsg; } void QSO::setLoTWUpdating(bool _lotw) { lotwUpdating = _lotw; } void QSO::setDefaultEQSLSentServices(const bool _send) { if (_send) { if ((getLoTWQSL_SENT()).isEmpty()) { setLoTWQSL_SENT ("Q"); } if ((getClubLogStatus ()).isEmpty()) { setClubLogStatus ("M"); } //if (((getEQSLQSL_SENT ()).isEmpty()) || (getEQSLQSL_SENT ().isNull ())) if ((getEQSLQSL_SENT ()).isEmpty()) { setEQSLQSL_SENT ("Q"); } if ((getQRZCOMStatus ()).isEmpty()) { setQRZCOMStatus ("M"); } } } 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::setGridSquare_ext(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (util->isValidGrid_ext(_c)) { gridsquare_ext = _c; return true; } else { return false; } } QString QSO::getGridSquare_ext() { //qDebug() << Q_FUNC_INFO << ": " << gridsquare; return gridsquare_ext; } 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 { RST_rx = util->getDefaultRST(getMode()); return false; } } QString QSO::getRSTRX() { return RST_rx; } bool QSO::setRSTTX(const QString &_c) { if (!_c.isEmpty ()) { RST_tx = _c; return true; } else { RST_tx = util->getDefaultRST(getMode()); return false; } } QString QSO::getRSTTX() const { return RST_tx; } bool QSO::setRXPwr(const double _f) { if (_f>0) { pwr_rx = _f; return true; } else { return false; } } double QSO::getRXPwr() const { return pwr_rx; } // Comment Tab bool QSO::setComment(const QString &_c) { if (_c.isNull ()) return false; comment = _c; return true; } QString QSO::getComment() const { return comment; } bool QSO::setKeepComment(bool _k) { keepComment = _k; return true; } bool QSO::getKeepComment() const { return keepComment; } // Other Tab bool QSO::setDXCC(const int _i) { if (!util->isValidDXCC(_i)) return false; dxcc = _i; return true; } int QSO::getDXCC() const { return dxcc; } bool QSO::setPropMode(const QString &_c) { //qDebug() << Q_FUNC_INFO << _c; if (!util->isValidPropMode (_c)) { //qDebug() << Q_FUNC_INFO << " - Not valid!"; propMode = QString(); return false; } //qDebug() << Q_FUNC_INFO << " - OK END"; propMode = _c; return true; } QString QSO::getPropMode() const { //qDebug() << Q_FUNC_INFO << ": " << propMode; return propMode; } bool QSO::setSOTA_REF(const QString &_c) {// TODO: Check if the SOTA REF is Valid if (_c.length ()<=1) return false; sota_ref = _c; return true; } QString QSO::getSOTA_REF() const { return sota_ref; } bool QSO::setMySOTA_REF(const QString &_c) { if (_c.length ()<=1) return false; my_sota_ref = _c; return true; } QString QSO::getMySOTA_REF() const { return my_sota_ref; } bool QSO::setMyRig(const QString &_c) { if (_c.length ()isValidVUCCGrids (_c)) return false; vucc_grids = _c; return true; } QString QSO::getVUCCGrids() { return vucc_grids; } bool QSO::setMyVUCCGrids(const QString &_c) { if (!util->isValidVUCCGrids (_c)) return false; my_vucc_grids = _c; return true; } QString QSO::getMyVUCCGrids() const { return my_vucc_grids; } QString QSO::getMyRig() const { return my_rig; } bool QSO::setMyAntenna(const QString &_c) { if (_c.length ()<1) return false; my_antenna = _c; return true; } QString QSO::getMyAntenna() const { return my_antenna; } bool QSO::setMyARRL_Sect(const QString &_c) { if (!util->isValidARRLSect (_c)) { return false; } else { my_arrl_sect = _c; return true; } } QString QSO::getMyARRL_Sect() const { return my_arrl_sect; } bool QSO::setPOTA_Ref(const QString &_c) { if (!adif->isValidPOTA(_c)) return false; pota_ref = _c; return true; } QString QSO::getPOTA_Ref() { return pota_ref; } bool QSO::setAge(const double _c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if ((0 >= _c) && (_c <= 120)) { age = _c; return true; } age = -1; return false; } double QSO::getAge() const { return age; } bool QSO::setAltitude(const double _c) { if (_c>=0) { altitude = _c; return true; } altitude = 0.0; return false; } double QSO::getAltitude() const { return altitude; } 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(double _f) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_f>0) { pwr_tx = _f; logEvent (Q_FUNC_INFO, "END - True", Debug); return true; } else { pwr_tx = 0.0; logEvent (Q_FUNC_INFO, "END - False", Debug); return false; } } double QSO::getTXPwr() const { return pwr_tx; } bool QSO::setOperatorCallsign(const QString &_c) { //qDebug() << Q_FUNC_INFO << "Start: " << _c; //logEvent(Q_FUNC_INFO, "Start", Debug); Callsign call(_c); if (call.isValid()) { operatorCall = _c; //qDebug() << Q_FUNC_INFO << "END - true"; logEvent(Q_FUNC_INFO, "END-true", Debug); return true; } else { //qDebug() << Q_FUNC_INFO << "End - false"; operatorCall = QString(); logEvent(Q_FUNC_INFO, "END-false", Debug); return false; } } QString QSO::getOperatorCallsign() const { return operatorCall; } bool QSO::setStationCallsign(const QString &_c) { //qDebug() << Q_FUNC_INFO << "Start: " << _c; Callsign call(_c); if (call.isValid()) //qDebug() << Q_FUNC_INFO << " - 010"; { //qDebug() << Q_FUNC_INFO << " - True"; stationCallsign = _c; return true; } else { //qDebug() << Q_FUNC_INFO << " - False"; stationCallsign = QString(); return false; } } QString QSO::getStationCallsign() const { return stationCallsign; } bool QSO::setMyGridSquare(const QString &_c) { if (util->isValidGrid(_c)) { my_gridsquare = _c; return true; } else { my_gridsquare = QString(); return false; } } QString QSO::getMyGridSquare() const { return my_gridsquare; } bool QSO::setMyGridSquare_ext(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (util->isValidGrid_ext(_c)) { my_gridsquare_ext = _c; return true; } else { my_gridsquare_ext = QString(); return false; } } QString QSO::getMyGridSquare_ext() const { //qDebug() << Q_FUNC_INFO << ": " << gridsquare; return my_gridsquare_ext; } bool QSO::setKeepMyData(bool _k) { keepMyData = _k; return true; } bool QSO::getKeepMyData() const { return keepMyData; } // Satellite Tab bool QSO::setKeepSatTab(bool _k){keepSat = _k; return true;} bool QSO::getKeepSatTab() const{return keepSat;} bool QSO::setSatName(const QString &_c) { if (_c.length()>0) { satName = _c; return setPropMode("SAT"); } else { satName = QString(); return false; } } QString QSO::getSatName() const { return satName; } bool QSO::setSatMode(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { satMode = _c; return true; } else { satMode = QString(); return false; } } QString QSO::getSatMode() const { return satMode; } bool QSO::setAddress(const QString &_c) { if (_c.length()>0) { address = _c; return true; } address = QString(); return false; } QString QSO::getAddress() const { return address; } bool QSO::setA_Index(const int _i) { if ((_i>=0) && (_i<=400)) { a_index = _i; return true; } a_index = 0; return false; } int QSO::getA_Index() const { return a_index; } bool QSO::setAnt_az(const double _c) { //TODO: Adjust number: http://www.adif.org/312/ADIF_312.htm#QSO_Field_ANT_AZ ant_az = fmod(_c, 360.0); if (ant_az>0.0) return true; ant_az = 0.0; return false; } double QSO::getAnt_az() const { return ant_az; } bool QSO::setAnt_el(const double _c) { //TODO: Adjust number: http://www.adif.org/312/ADIF_312.htm#QSO_Field_ANT_EL if ((-90 <= _c) && (_c <= 90)) { ant_el = _c; return true; } ant_el = 0.0; return false; } double QSO::getAnt_el() const { return ant_el; } bool QSO::setAnt_Path(const QString &_c) { if (!adif->isValidAntPath (_c)) { ant_path = QString(); return false; } ant_path = _c; return true; } QString QSO::getAnt_Path() const { return ant_path; } bool QSO::setARRL_Sect(const QString &_c) { if (!util->isValidARRLSect (_c)) return false; arrl_sect = _c; return true; } QString QSO::getARRL_Sect() const { return arrl_sect; } bool QSO::setCheck(const QString &_c) { check = _c; return true; } QString QSO::getCheck() const { return check; } bool QSO::setClass(const QString &_c) { clase = _c; return true; } QString QSO::getClass() const { return clase; } bool QSO::setContinent(const QString &_c) { if (!util->isValidContinent (_c)) return false; continent = _c; return true; } QString QSO::getContinent() const { return continent; } bool QSO::setDistance(const double _i) { if (adif->isValidDistance(QString::number(_i))) { distance = _i; return true; } distance = 0.0; return false; } double QSO::getDistance() const { return distance; } bool QSO::setOwnerCallsign(const QString &_c) { Callsign call(_c); if (call.isValid()) { ownerCall = _c; return true; } else { return false; } } QString QSO::getOwnerCallsign() const { return ownerCall; } bool QSO::setEQ_Call(const QString &_c) { Callsign call(_c); if (call.isValid()) { contacted_owner = _c; return true; } else { return false; } } QString QSO::getEQ_Call() const { return contacted_owner; } // Contacted station owner bool QSO::setHRDUpdateDate(const QDate &_c) { if (_c.isValid()) { hrdlogUploadDate = _c; return true; } else { hrdlogUploadDate = QDate(); return false; } } QDate QSO::getHRDUpdateDate() const { return hrdlogUploadDate; } bool QSO::setHRDLogStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { hrdlog_status = _c; return true; } else { return false; } } QString QSO::getHRDLogStatus() const { return hrdlog_status; } bool QSO::setHamLogEUStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { hamlogeu_status = _c; return true; } else { return false; } } QString QSO::getHamLogEUStatus() const { return hamlogeu_status; } bool QSO::setHamLogEUUpdateDate(const QDate &_c) { if (_c.isValid()) { hamlogeuUpdateDate = _c; return true; } else { hamlogeuUpdateDate = QDate(); return false; } } QDate QSO::getHamLogEUUpdateDate() const { return hamlogeuUpdateDate; } bool QSO::setHamQTHStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { hamqth_status = _c; return true; } else { return false; } } QString QSO::getHamQTHStatus() const { return hamqth_status; } bool QSO::setHamQTHUpdateDate(const QDate &_c) { if (_c.isValid()) { hamqthUpdateDate = _c; return true; } else { hamqthUpdateDate = QDate(); return false; } } QDate QSO::getHamQTHUpdateDate() const { return hamqthUpdateDate; } bool QSO::setK_Index(const int _i) { if ((_i>=0) && (_i<=400)) { k_index = _i; return true; } return false; } int QSO::getK_Index() const { return k_index; } bool QSO::setRig(const QString &_c) { rig = _c; return true; } QString QSO::getRig() const { return rig; } bool QSO::setCountry(const QString &_c) { country = _c; return true; } QString QSO::getCountry() const { return country; } bool QSO::setAwardGranted(const QString &_c) { award_granted = _c; return true; } QString QSO::getAwardGranted() const { return award_granted; } bool QSO::setAwardSubmitted(const QString &_c) { award_submitted = _c; return true; } QString QSO::getAwardSubmitted() const { return award_submitted; } bool QSO::setCounty(const QString &_c) { county = _c; return true; } QString QSO::getCounty() const { return county; } bool QSO::setContactedOperator(const QString &_c) { Callsign call(_c); if (call.isValid()) { contacted_op = _c; return true; } else { return false; } } QString QSO::getContactedOperator() const { return contacted_op; } bool QSO::setContestID(const QString &_c) { contest_id = _c; return true; } QString QSO::getContestID() const { return contest_id; } bool QSO::setCQZone(const int _i) { if ((_i>0) && (_i<=40)) { cqz = _i; return true; } else { cqz = 0; return false; } } int QSO::getCQZone() const { return cqz; } bool QSO::setCreditGranted(const QString &_c) { credit_granted = _c; return true; } QString QSO::getCreditGranted() const { return credit_granted; } bool QSO::setCreditSubmitted(const QString &_c) { credit_submitted = _c; return true; } QString QSO::getCreditSubmitted() const { return credit_submitted; } bool QSO::setDarcDok(const QString &_c) { darc_dok = _c; return true; } QString QSO::getDarcDok() const { return darc_dok; } bool QSO::setEmail(const QString &_c) { if (util->isValidEmail(_c)) { email = _c; return true; } return false; } QString QSO::getEmail() const { return email; } bool QSO::setFists(const int _i) { if (adif->isValidFISTS(QString::number(_i))) { fists = _i; return true; } else { return false; } } int QSO::getFists() const { return fists; } bool QSO::setFistsCC(const int _i) { if (_i>=0) { fists_cc = _i; return true; } else { return false; } } int QSO::getFistsCC() const { return fists_cc; } bool QSO::setForceInit(bool _k) { forceInit = _k; return true; } bool QSO::getForceInit() const { return forceInit; } bool QSO::setIotaID(const int _i) { if (_i>=0) { iota_ID = _i; return true; } else { return false; } } int QSO::getIotaID() const { return iota_ID; } bool QSO::setItuZone(const int _i) { if (_i>0 && (_i<=90)) { itu_zone = _i; return true; } else { itu_zone = 0; return false; } } int QSO::getItuZone() const { return itu_zone; } bool QSO::setLatitude(const QString &_c) { latitude = _c; return true; } QString QSO::getLatitude() const { return latitude; } bool QSO::setLongitude(const QString &_c) { longitude = _c; return true; } QString QSO::getLongitude() const { return longitude; } bool QSO::setNrBursts(const int _i) { if (_i>=0) { nr_bursts = _i; return true; } else { return false; } } int QSO::getNrBursts() const { return nr_bursts; } bool QSO::setMaxBursts(const int _i) { if (_i>=0) { max_bursts = _i; return true; } else { return false; } } int QSO::getMaxBursts() const { return max_bursts; } bool QSO::setNrPings(const int _i) { if (_i>=0) { nr_pings = _i; return true; } else { return false; } } int QSO::getNrPings() const { return nr_pings; } bool QSO::setMsShower(const QString &_c) { ms_shower = _c; return true; } QString QSO::getMsShower() const { return ms_shower; } bool QSO::setQSOComplete(const QString &_c) { // Y, N, I, ? are the valid chars. // Here we store the short version just for the DB // If we need to export it to ADIF, we need to call util->getADIFQSO_CompleteFromDB() Adif adif(Q_FUNC_INFO); qso_complete = adif.getQSO_COMPLETEFromDB(_c); //qso_complete = util->getQSO_CompleteFromADIF(_c); //qDebug() << Q_FUNC_INFO << ": " << qso_complete; return true; } QString QSO::getQSOComplete() const { return qso_complete; } bool QSO::setQSORandom(bool _k) { qso_random = _k; return true; } bool QSO::getQSORandom() const { return qso_random; } bool QSO::setMyAltitude(const double _c) { my_altitude = _c; return true; } double QSO::getMyAltitude() const { return my_altitude; } bool QSO::setMyCity(const QString &_c) { //qDebug() << Q_FUNC_INFO << " - " << _c; my_city = _c; return true; } QString QSO::getMyCity() const { return my_city; } bool QSO::setMyCounty(const QString &_c) { my_county = _c; return true; } QString QSO::getMyCounty() const { return my_county; } bool QSO::setMyCountry(const QString &_c) { my_country = _c; return true; } QString QSO::getMyCountry() const { return my_country; } bool QSO::setMyCQZone(const int _i) { if ((_i>=0) && (_i<=40)) { my_cqz = _i; return true; } else { my_cqz = 0; return false; } } int QSO::getMyCQZone() const { return my_cqz; } bool QSO::setMyDXCC(const int _i) { if (util->isValidDXCC(_i)) { my_dxcc = _i; return true; } return false; } int QSO::getMyDXCC() const { return my_dxcc; } bool QSO::setMyFists(const int _i) { if (_i>0) { my_fists = _i; return true; } return false; } int QSO::getMyFists() const { return my_fists; } bool QSO::setMyIOTA(const QString &_c) { if (_c.length()>0) { my_iota = _c; return true; } else { my_iota = QString(); return false; } } QString QSO::getMyIOTA() const { return my_iota; } bool QSO::setMyIotaID(const int _i) { if (_i>=0) { my_iota_ID = _i; return true; } else { return false; } } int QSO::getMyIotaID() const { return my_iota_ID; } bool QSO::setMyITUZone(const int _i) { if (_i>=0 && (_i<=90)) { my_itu_zone = _i; return true; } else { my_itu_zone = 0; return false; } } int QSO::getMyITUZone() const { return my_itu_zone; } bool QSO::setMyLatitude(const QString &_c) { my_latitude = _c; return true; } QString QSO::getMyLatitude() const { return my_latitude; } bool QSO::setMyLongitude(const QString &_c) { my_longitude = _c; return true; } QString QSO::getMyLongitude() const { return my_longitude; } bool QSO::setMyName(const QString &_c) { my_name = _c; return true; } QString QSO::getMyName() const { return my_name; } bool QSO::setMyPOTA_Ref(const QString &_c) { if (!adif->isValidPOTA(_c)) return false; my_pota_ref = _c; return true; } QString QSO::getMyPOTA_Ref() const { return my_pota_ref; } bool QSO::setMyPostalCode(const QString &_c) { my_postal_code = _c; return true; } QString QSO::getMyPostalCode() const { return my_postal_code; } bool QSO::setMySig(const QString &_c) { my_sig = _c; return true; } QString QSO::getMySig() const { return my_sig; } bool QSO::setMySigInfo(const QString &_c) { my_sig_info = _c; return true; } QString QSO::getMySigInfo() { return my_sig_info; } bool QSO::setMyState(const QString &_c) { my_state = _c; return true; } QString QSO::getMyState() const { return my_state; } bool QSO::setMyStreet(const QString &_c) { my_street = _c; return true; } QString QSO::getMyStreet() const { return my_street; } bool QSO::setMyUsacaCounties(const QString &_c) { my_usaca_counties = _c; return true; } QString QSO::getMyUsacaCounties() const { return my_usaca_counties; } bool QSO::setNotes(const QString &_c) { notes = _c; return true; } QString QSO::getNotes() const { return notes; } bool QSO::setPrefix(const QString &_c) { prefix = _c; return true; } QString QSO::getPrefix() const { return prefix; } bool QSO::setPrecedence(const QString &_c) { precedence = _c; return true; } QString QSO::getPrecedence() const { return precedence; } bool QSO::setPublicKey(const QString &_c) { public_key = _c; return true; } QString QSO::getPublicKey() const { return public_key; } bool QSO::setRegion(const QString &_c) { region = _c; return true; } QString QSO::getRegion() const { return region; } bool QSO::setTenTen(const int _i) { if (_i>=0) { ten_ten = _i; return true; } else { return false; } } int QSO::getTenTen() const { return ten_ten; } bool QSO::setSFI(const int _i) { if (_i>=0 && (_i<=300)) { sfi = _i; return true; } else { return false; } } int QSO::getSFI() const { return sfi; } bool QSO::setSIG(const QString &_c) { sig = _c; return true; } QString QSO::getSIG() const { return sig; } bool QSO::setSIG_INFO(const QString &_c) { sig_info = _c; return true; } QString QSO::getSIG_INFO() const { return sig_info; } bool QSO::setSilentKey(bool _k) { silent_key = _k; return true; } bool QSO::getSilentKey() const { return silent_key; } bool QSO::setSkcc(const QString &_c) { skcc = _c; return true; } QString QSO::getSkcc() const { return skcc; } bool QSO::setSrx(const int _i) { if (_i>=0) { srx = _i; return true; } else { return false; } } int QSO::getSrx() const { return srx; } bool QSO::setSrxString(const QString &_c) { srx_string = _c; return true; } QString QSO::getSrxString() const { return srx_string; } bool QSO::setStx(const int _i) { if (_i>=0) { stx = _i; return true; } else { return false; } } int QSO::getStx() const { return stx; } bool QSO::setStxString(const QString &_c) { stx_string = _c; return true; } QString QSO::getStxString() const { return stx_string; } bool QSO::setState(const QString &_c) { state = _c; return true; } QString QSO::getState() const { //qDebug() << Q_FUNC_INFO << ": " << state; return state; } bool QSO::setSubmode(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { //qDebug() << Q_FUNC_INFO << ": submode: " << _c; submode = _c; haveSubMode = true; } else { //qDebug() << Q_FUNC_INFO << ": NULL"; submode = QString(); haveSubMode = false; } //if (requestMode){ // emit getModeSignal(submode); //} return true; } QString QSO::getSubmode() const { return submode; } bool QSO::setSwl(bool _k) { swl = _k; return true; } bool QSO::getSwl() const { return swl; } bool QSO::setUksmg(const int _i) { if (_i>=0) { uksmg = _i; return true; } else { return false; } } int QSO::getUksmg() const { return uksmg; } bool QSO::setUsacaCounties(const QString &_c) { usaca_counties = _c; return true; } QString QSO::getUsacaCounties() const { return usaca_counties; } bool QSO::setVeProv(const QString &_c) { ve_prov = _c; return true; } QString QSO::getVeProv() const { return ve_prov; } bool QSO::setWeb(const QString &_c) { web = _c; return true; } QString QSO::getWeb() const { return web; } bool QSO::setWWFF_Ref(const QString &_c) { if (!adif->isValidWWFF_Ref(_c)) return false; wwff_ref = _c; return true; } QString QSO::getWWFF_Ref() const { return wwff_ref; } bool QSO::setMyWWFF_Ref(const QString &_c) { if (!adif->isValidWWFF_Ref(_c)) return false; my_wwff_ref = _c; return true; } QString QSO::getMyWWFF_Ref() const { return my_wwff_ref; } // helper functions for hash, returns original function but takes string data as imput bool QSO::setAge(const QString &data) { return setAge(data.toDouble()); } bool QSO::setAltitude(const QString &data) { return setAltitude(data.toDouble()); }; bool QSO::setA_Index(const QString& data) { return setA_Index(data.toInt()); } bool QSO::setAnt_az(const QString& data) { return setAnt_az(data.toDouble()); } bool QSO::setAnt_el(const QString& data) { return setAnt_el(data.toDouble()); } bool QSO::setCQZone(const QString& data) { return setCQZone(data.toInt()); } bool QSO::setDistance(const QString& data) { return setDistance(data.toDouble()); } bool QSO::setDXCC(const QString& data) { return setDXCC(data.toInt()); } bool QSO::setFists(const QString& data) { return setFists(data.toInt()); } bool QSO::setFistsCC(const QString& data) { return setFistsCC(data.toInt()); } bool QSO::setMyFists(const QString& data) { return setMyFists(data.toInt()); } bool QSO::setIotaID(const QString& data) { return setIotaID(data.toInt()); } bool QSO::setItuZone(const QString& data) { return setItuZone(data.toInt()); } bool QSO::setK_Index(const QString& data) { return setK_Index(data.toInt()); } bool QSO::setMaxBursts(const QString& data) { return setMaxBursts(data.toInt()); } bool QSO::setMyAltitude(const QString &data) { return setMyAltitude(data.toDouble()); }; bool QSO::setMyCQZone(const QString& data) { return setMyCQZone(data.toInt()); } bool QSO::setMyDXCC(const QString& data) { return setMyDXCC(data.toInt()); } bool QSO::setMyIotaID(const QString& data) { return setMyIotaID(data.toInt()); } bool QSO::setMyITUZone(const QString& data) { return setMyITUZone(data.toInt()); } bool QSO::setNrBursts(const QString& data) { return setNrBursts(data.toInt()); } bool QSO::setNrPings(const QString& data) { return setNrPings(data.toInt()); } bool QSO::setSFI(const QString& data) { return setSFI(data.toInt()); } bool QSO::setSrx(const QString& data) { return setSrx(data.toInt()); } bool QSO::setStx(const QString& data) { return setStx(data.toInt()); } bool QSO::setTenTen(const QString& data) { return setTenTen(data.toInt()); } bool QSO::setUksmg(const QString& data) { return setUksmg(data.toInt()); } bool QSO::setFreq(const QString& data) { return setFreq(data.toDouble()); } bool QSO::setFreqRX(const QString& data) { return setFreqRX(data.toDouble()); } bool QSO::setRXPwr(const QString& data){ return setRXPwr(data.toDouble()); } bool QSO::setTXPwr(const QString& data){ return setTXPwr(data.toDouble()); } bool QSO::setClubLogDate(const QString& data) { return setClubLogDate(util->getDateFromADIFDateString(data)); } bool QSO::setEQSLQSLRDate(const QString& data) { return setEQSLQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setEQSLQSLSDate(const QString& data) { return setEQSLQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setForceInit(const QString& data) { return setForceInit(util->QStringToBool(data)); } bool QSO::setHRDUpdateDate(const QString& data) { return setHRDUpdateDate(util->getDateFromADIFDateString(data)); } bool QSO::setHamLogEUUpdateDate(const QString& data) { return setHamLogEUUpdateDate(util->getDateFromADIFDateString(data)); } bool QSO::setHamQTHUpdateDate(const QString& data) { return setHamQTHUpdateDate(util->getDateFromADIFDateString(data)); } bool QSO::setLoTWQSLRDate(const QString& data) { return setLoTWQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setLoTWQSLSDate(const QString& data) { return setLoTWQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setQRZCOMDate(const QString& data) { return setQRZCOMDate(util->getDateFromADIFDateString(data)); } bool QSO::setQSLRDate(const QString& data) { return setQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setQSLSDate(const QString& data) { return setQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setDate(const QString& data) { return setDate(util->getDateFromADIFDateString(data)); } bool QSO::setDateOff(const QString& data) { return setDateOff(util->getDateFromADIFDateString(data)); } bool QSO::setQSORandom(const QString& data) { return setQSORandom(util->QStringToBool(data)); } bool QSO::setSilentKey(const QString& data) { return setSilentKey(util->QStringToBool(data)); } bool QSO::setSwl(const QString& data) { return setSwl(util->QStringToBool(data)); } bool QSO::setTimeOff(const QString& data) { return setTimeOff(util->getTimeFromADIFTimeString(data)); } bool QSO::setTimeOn(const QString& data) { return setTimeOn(util->getTimeFromADIFTimeString(data)); } bool QSO::setLoTWQSLRDate2(const QString& data) { //setLoTWQSL_RCVD("Y"); return setLoTWQSLRDate(util->getDateFromLoTWQSLDateString(data)); } bool QSO::setLoTWQSLSDate1(const QString& data) { //setLoTWQSL_SENT("Y"); return setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } bool QSO::setLoTWQSLSDate2(const QString& data) { //setLoTWQSL_SENT("Y"); return setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } QHash QSO::SetDataHash; void QSO::InitializeHash() { SetDataHash = { {"ADDRESS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAddress)}, {"AGE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAge)}, {"ALTITUDE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAltitude)}, {"A_INDEX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setA_Index)}, {"ANT_AZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_az)}, {"ANT_EL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_el)}, {"ANT_PATH", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_Path)}, {"ARRL_SECT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setARRL_Sect)}, {"AWARD_SUBMITTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAwardSubmitted)}, {"AWARD_GRANTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAwardGranted)}, {"BAND", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setBand)}, {"BAND_RX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setBandRX)}, {"CALL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCall)}, {"CHECK", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCheck)}, {"CLASS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClass)}, {"CLUBLOG_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClubLogDate)}, {"CLUBLOG_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClubLogStatus)}, {"CNTY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCounty)}, {"COMMENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setComment)}, {"CONT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContinent)}, {"CONTACTED_OP", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContactedOperator)}, {"CONTEST_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContestID)}, {"COUNTRY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCountry)}, {"CQZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCQZone)}, {"CREDIT_SUBMITTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCreditSubmitted)}, {"CREDIT_GRANTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCreditGranted)}, {"DARC_DOK", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDarcDok)}, {"DISTANCE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDistance)}, {"DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDXCC)}, {"EMAIL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEmail)}, {"EQ_CALL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOwnerCallsign)}, {"EQSL_QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSLRDate)}, {"EQSL_QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSLSDate)}, {"EQSL_QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_RCVD)}, {"EQSL_QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_SENT)}, {"FISTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFists)}, {"FISTS_CC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFistsCC)}, {"FORCE_INIT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setForceInit)}, {"FREQ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFreq)}, {"FREQ_RX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFreqRX)}, {"GRIDSQUARE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setGridSquare)}, {"GRIDSQUARE_EXT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setGridSquare_ext)}, {"HRDLOG_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHRDUpdateDate)}, {"HRDLOG_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHRDLogStatus)}, {"HAMLOGEU_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHamLogEUUpdateDate)}, {"HAMQTH_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHamQTHStatus)}, {"HAMLOGEU_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHamLogEUStatus)}, {"IOTA_ISLAND_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setIotaID)}, {"ITUZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setItuZone)}, {"K_INDEX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setK_Index)}, {"LAT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLatitude)}, {"LON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLongitude)}, {"LOTW_QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLRDate)}, {"LOTW_QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate)}, {"LOTW_QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSL_RCVD)}, {"LOTW_QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_SENT)}, {"MAX_BURSTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMaxBursts)}, {"MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMode)}, {"MS_SHOWER", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMsShower)}, {"MY_ALTITUDE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyAltitude)}, {"MY_ANTENNA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyAntenna)}, {"MY_ARRL_SECT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyARRL_Sect)}, {"MY_CITY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCity)}, {"MY_CNTY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCounty)}, {"MY_COUNTRY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCountry)}, {"MY_CQ_ZONE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCQZone)}, {"MY_DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyDXCC)}, {"MY_FISTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyFists)}, {"MY_GRIDSQUARE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyGridSquare)}, {"MY_GRIDSQUARE_EXT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyGridSquare_ext)}, {"MY_IOTA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyIOTA)}, {"MY_IOTA_ISLAND_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyIotaID)}, {"MY_ITU_ZONE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyITUZone)}, {"MY_LAT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyLatitude)}, {"MY_LON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyLongitude)}, {"MY_NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyName)}, {"MY_POSTAL_CODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyPostalCode)}, {"MY_POTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyPOTA_Ref)}, {"MY_RIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyRig)}, {"MY_SIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySig)}, {"MY_SIG_INFO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySigInfo)}, {"MY_SOTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySOTA_REF)}, {"MY_STATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyState)}, {"MY_STREET", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyStreet)}, {"MY_USACA_COUNTIES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyUsacaCounties)}, {"MY_VUCC_GRIDS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyVUCCGrids)}, {"MY_WWFF_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyWWFF_Ref)}, {"NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setName)}, {"NOTES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNotes)}, {"NR_BURSTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNrBursts)}, {"NR_PINGS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNrPings)}, {"OPERATOR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOperatorCallsign)}, {"OWNER_CALLSIGN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOwnerCallsign)}, {"PFX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPrefix)}, {"POTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPOTA_Ref)}, {"PRECEDENCE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPrecedence)}, {"PROP_MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPropMode)}, {"PUBLIC_KEY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPublicKey)}, {"QRZCOM_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQRZCOMDate)}, {"QRZCOM_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQRZCOMStatus)}, {"QSLMSG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLMsg)}, {"QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLRDate)}, {"QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLSDate)}, {"QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSL_RCVD)}, {"QSL_RCVD_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLRecVia)}, {"QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSL_SENT)}, {"QSL_SENT_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLSenVia)}, {"QSL_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLVia)}, {"QSO_COMPLETE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSOComplete)}, {"QSO_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDate)}, {"QSO_DATE_OFF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDateOff)}, {"QSO_RANDOM", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSORandom)}, {"QTH", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQTH)}, {"REGION", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRegion)}, {"RIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRig)}, {"RST_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRSTRX)}, {"RST_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRSTTX)}, {"RX_PWR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRXPwr)}, {"SAT_MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSatMode)}, {"SAT_NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSatName)}, {"SFI", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSFI)}, {"SIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSIG)}, {"SIG_INFO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSIG_INFO)}, {"SILENT_KEY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSilentKey)}, {"SKCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSkcc)}, {"SOTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSOTA_REF)}, {"SRX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSrx)}, {"SRX_STRING", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSrxString)}, {"STATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setState)}, {"STATION_CALLSIGN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStationCallsign)}, {"STX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStx)}, {"STX_STRING", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStxString)}, {"SUBMODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSubmode)}, {"SWL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSwl)}, {"TEN_TEN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTenTen)}, {"TIME_OFF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTimeOff)}, {"TIME_ON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTimeOn)}, {"TX_PWR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTXPwr)}, {"UKSMG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setUksmg)}, {"USACA_COUNTIES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setUsacaCounties)}, {"VE_PROV", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setVeProv)}, {"VUCC_GRIDS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setVUCCGrids)}, {"WEB", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setWeb)}, {"WWFF_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setWWFF_Ref)}, {"APP_LOTW_RXQSL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLRDate2)}, {"APP_LOTW_RXQSO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate1)}, {"APP_LOTW_QSO_TIMESTAMP", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate2)} }; return; } // SET DATA ---------------------------------------------------------------------------------- bool QSO::setData(const QString &_adifPair) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _adifPair; QStringList d; d.clear(); d << util->getValidADIFFieldAndData(_adifPair); if (d.length()!=2) { logEvent (Q_FUNC_INFO, "END - ADIF not valid", Debug); return false; } //qDebug() << Q_FUNC_INFO << ": " << d.at(0) << "/" << d.at(1); QString field = d.at(0).toUpper(); QString data = d.at(1); if (SetDataHash.empty()) { InitializeHash(); } if (SetDataHash.contains(field)) { (*SetDataHash.find(field))(this,data); } logEvent (Q_FUNC_INFO, "END", Debug); return true; } int QSO::toDB(int _qsoId) { // This function will add or modify a QSO in the DB depending on the _qsoID. // if _qsoID is >0 it should be an existing QSO in the DB. //qDebug() << Q_FUNC_INFO << " - Start: qsoId: " << QString::number(_qsoId); if (!isComplete ()) { //qDebug() << Q_FUNC_INFO << " - QSO NOT COMPLETE"; return -1; } //qDebug() << Q_FUNC_INFO << "Mode: " << getMode(); //qDebug() << Q_FUNC_INFO << "Submode: " << getSubmode(); //qDebug() << Q_FUNC_INFO << " - QSO Complete... adding"; QString queryString; queryString.clear(); if (_qsoId<=0) { //qDebug() << Q_FUNC_INFO << " - qsoID <=0"; queryString = getAddQueryString(); } else { //qDebug() << Q_FUNC_INFO << " - qsoID>0"; queryString = getModifyQueryString(); } //qDebug() << Q_FUNC_INFO << " Query: " << queryString;; QSqlQuery query = getPreparedQuery(queryString); //qDebug() << Q_FUNC_INFO << " qsoId: " << QString::number(_qsoId); if (_qsoId>0) { //qDebug() << Q_FUNC_INFO << " - binding ID"; query.bindValue (":id", _qsoId); } //qDebug() << Q_FUNC_INFO << " - executing query"; if (query.exec()) { //qDebug() << Q_FUNC_INFO << QString(": QSO ADDED/Modified: %1 - %2").arg(callsign).arg(getDateTimeOn().toString("yyyyMMdd-hhmm")); //qDebug() << Q_FUNC_INFO << ": QSO ADDED/Modified: " << query.lastQuery (); if (_qsoId>0) return _qsoId; return getLastInsertedQSO(); } else { //qDebug() << Q_FUNC_INFO << QString(": QSO NOT ADDED/Modified: %1 - %2").arg(callsign).arg(_qsoId); //qDebug() << Q_FUNC_INFO << ": QSO NOT ADDED/Modified: " << query.lastQuery (); //qDebug() << Q_FUNC_INFO << ": Error: databaseText: " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << ": Error: text: " << query.lastError().text(); //qDebug() << Q_FUNC_INFO << ": Error: driverText: " << query.lastError().driverText(); //qDebug() << Q_FUNC_INFO << ": Error: nativeErrorCode: " << query.lastError().nativeErrorCode(); //void MainWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed) emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return -2; } query.finish(); //qDebug() << Q_FUNC_INFO << " - END"; return 1; } QString QSO::getAddQueryString() { // submode is not used, keep it empty. // mode field is populated with the submode return QString( "INSERT INTO log (" "qso_date, call, rst_sent, rst_rcvd, bandid, modeid, cqz, ituz, dxcc, address, age, altitude, cnty, comment, a_index, ant_az, ant_el, " "ant_path, arrl_sect, award_submitted, award_granted, band_rx, checkcontest, class, clublog_qso_upload_date, " "clublog_qso_upload_status, cont, contacted_op, contest_id, country, credit_submitted, credit_granted, darc_dok, " "distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, fists, fists_cc, " "force_init, freq, freq_rx, gridsquare, gridsquare_ext, hrdlog_qso_upload_date, hrdlog_qso_upload_status, " "hamlogeu_qso_upload_date, hamlogeu_qso_upload_status, hamqth_qso_upload_date, hamqth_qso_upload_status, " "iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, " "my_antenna, my_altitude, my_arrl_sect, my_city, my_cnty, my_country, my_cq_zone, my_dxcc, my_fists, my_gridsquare, my_gridsquare_ext, my_iota, my_iota_island_id, " "my_itu_zone, my_lat, " "my_lon, my_name, my_pota_ref, my_postal_code, my_rig, my_sig, my_sig_info, my_sota_ref, my_state, my_street, " "my_usaca_counties, my_wwff_ref, my_vucc_grids, name, " "notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, pota_ref, precedence, prop_mode, public_key, qrzcom_qso_upload_date, " "qrzcom_qso_upload_status, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, " "qth, region, rig, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, silent_key, skcc, sota_ref, srx_string, srx, stx_string, stx, state, " "station_callsign, swl, uksmg, usaca_counties, ve_prov, wwff_ref, vucc_grids, ten_ten, tx_pwr, web, qso_date_off, marked, lognumber) " "VALUES (" ":qso_date, :call, :rst_sent, :rst_rcvd, :bandid, :modeid, :cqz, :ituz, :dxcc, :address, :age, :altitude, :cnty, :comment, :a_index, :ant_az, :ant_el, " ":ant_path, :arrl_sect, :award_submitted, :award_granted, :band_rx, :checkcontest, :class, :clublog_qso_upload_date, :clublog_qso_upload_status, :cont, " ":contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :darc_dok, :distance, :email, :eq_call, :eqsl_qslrdate, :eqsl_qslsdate, " ":eqsl_qsl_rcvd, :eqsl_qsl_sent, :fists, :fists_cc, :force_init, :freq_tx, :freq_rx, :gridsquare, :gridsquare_ext, :hrdlog_qso_upload_date, " ":hrdlog_qso_upload_status, :hamlogeu_qso_upload_date, :hamlogeu_qso_upload_status, :hamqth_qso_upload_date, :hamqth_qso_upload_status, " ":iota, :iota_island_id, :k_index, :lat, :lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :max_bursts, :ms_shower, " ":my_antenna, :my_altitude, :my_arrl_sect, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_dxcc, :my_fists, :my_gridsquare, :my_gridsquare_ext, :my_iota, :my_iota_island_id, :my_itu_zone, :my_lat, " ":my_lon, :my_name, :my_pota_ref, :my_postal_code, :my_rig, :my_sig, :my_sig_info, :my_sota_ref, :my_state, :my_street, :my_usaca_counties, :my_wwff_ref, :my_vucc_grids, :name, " ":notes, :nr_bursts, :nr_pings, :operator, :owner_callsign, :pfx, :pota_ref, :precedence, :prop_mode, :public_key, :qrzcom_qso_upload_date, " ":qrzcom_qso_upload_status, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, " ":qth, :region, :rig, :rx_pwr, :sat_mode, :sat_name, :sfi, :sig, :sig_info, :silent_key, :skcc, :sota_ref, :srx_string, :srx, :stx_string, :stx, :state, " ":station_callsign, :swl, :uksmg, :usaca_counties, :ve_prov, :wwff_ref, :vucc_grids, :ten_ten, :tx_pwr, :web, :qso_date_off, " ":marked, :lognumber)" ); } QString QSO::getModifyQueryString() { // submode is not used, keep it empty. // mode field is populated with the submode return QString("UPDATE log SET call = :call, qso_date = :qso_date, rst_sent = :rst_sent, rst_rcvd = :rst_rcvd, " "bandid = :bandid, modeid = :modeid, cqz = :cqz, ituz = :ituz, dxcc = :dxcc, address = :address, " "age = :age, altitude = :altitude, cnty = :cnty, comment = :comment, a_index = :a_index, ant_az = :ant_az, ant_el = :ant_el, " "ant_path = :ant_path, arrl_sect = :arrl_sect, award_submitted = :award_submitted, " "award_granted = :award_granted, band_rx = :band_rx, checkcontest = :checkcontest, class = :class, " "clublog_qso_upload_date = :clublog_qso_upload_date, clublog_qso_upload_status = :clublog_qso_upload_status, " "cont = :cont, contacted_op = :contacted_op, contest_id = :contest_id, country = :country, " "credit_submitted = :credit_submitted, credit_granted = :credit_granted, darc_dok = :darc_dok, " "distance = :distance, email = :email, eq_call = :eq_call, eqsl_qslrdate = :eqsl_qslrdate, " "eqsl_qslsdate = :eqsl_qslsdate, eqsl_qsl_rcvd = :eqsl_qsl_rcvd, eqsl_qsl_sent = :eqsl_qsl_sent, " "fists = :fists, fists_cc = :fists_cc, force_init = :force_init, freq = :freq_tx, freq_rx = :freq_rx, " "gridsquare = :gridsquare, gridsquare_ext = :gridsquare_ext, " "hrdlog_qso_upload_date = :hrdlog_qso_upload_date, hrdlog_qso_upload_status = :hrdlog_qso_upload_status, " "hamlogeu_qso_upload_date = :hamlogeu_qso_upload_date, hamlogeu_qso_upload_status = :hamlogeu_qso_upload_status, " "hamqth_qso_upload_date = :hamqth_qso_upload_date, hamqth_qso_upload_status = :hamqth_qso_upload_status, " "iota = :iota, iota_island_id = :iota_island_id, " "k_index = :k_index, lat = :lat, lon = :lon, lotw_qslrdate = :lotw_qslrdate, lotw_qslsdate = :lotw_qslsdate, " "lotw_qsl_rcvd = :lotw_qsl_rcvd, lotw_qsl_sent = :lotw_qsl_sent, max_bursts = :max_bursts, " "ms_shower = :ms_shower, my_antenna = :my_antenna, my_altitude = :my_altitude, my_arrl_sect = :my_arrl_sect, my_city = :my_city, my_cnty = :my_cnty, " "my_country = :my_country, my_cq_zone = :my_cq_zone, my_dxcc = :my_dxcc, my_fists = :my_fists, " "my_gridsquare = :my_gridsquare, my_gridsquare_ext = :my_gridsquare_ext, my_iota = :my_iota, my_iota_island_id = :my_iota_island_id, " "my_itu_zone = :my_itu_zone, my_lat = :my_lat, my_lon = :my_lon, my_name = :my_name, " "my_pota_ref = :my_pota_ref, my_postal_code = :my_postal_code, my_rig = :my_rig, my_sig = :my_sig, my_sig_info = :my_sig_info, " "my_sota_ref = :my_sota_ref, my_state = :my_state, my_street = :my_street, " "my_usaca_counties = :my_usaca_counties, my_wwff_ref = :my_wwff_ref, my_vucc_grids = :my_vucc_grids, name = :name, notes = :notes, " "nr_bursts = :nr_bursts, nr_pings = :nr_pings, operator = :operator, owner_callsign = :owner_callsign, " "pfx = :pfx, pota_ref = :pota_ref, precedence = :precedence, prop_mode = :prop_mode, " "public_key = :public_key, qrzcom_qso_upload_date = :qrzcom_qso_upload_date, " "qrzcom_qso_upload_status = :qrzcom_qso_upload_status, qslmsg = :qslmsg, qslrdate = :qslrdate, " "qslsdate = :qslsdate, 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_complete, qso_random = :qso_random, " "qth = :qth, region = :region, rig = :rig, rx_pwr = :rx_pwr, sat_mode = :sat_mode, sat_name = :sat_name, " "sfi = :sfi, sig = :sig, sig_info = :sig_info, silent_key = :silent_key, skcc = :skcc, " "sota_ref = :sota_ref, srx_string = :srx_string, srx = :srx, stx_string = :stx_string, stx = :stx, " "state = :state, station_callsign = :station_callsign, swl = :swl, uksmg = :uksmg, " "usaca_counties = :usaca_counties, ve_prov = :ve_prov, wwff_ref = :wwff_ref, vucc_grids = :vucc_grids, ten_ten = :ten_ten, " "tx_pwr = :tx_pwr, web = :web, qso_date_off = :qso_date_off, marked = :marked, lognumber = :lognumber " "WHERE id = :id"); } int QSO::getBandIdFromBandName(bool _rxBand) { QSqlQuery query; //qDebug() << Q_FUNC_INFO << "Band: " << getBand(); bool ok = query.prepare ("SELECT band.id FROM band WHERE band.name= :bandname"); if (!ok) { //qDebug() << Q_FUNC_INFO << " - Query NOT prepared-3122"; } if (_rxBand){ query.bindValue (":bandname", getBandRX()); } else { query.bindValue (":bandname", getBand ()); } if (query.exec ()) { if (query.next()) { if (query.isValid ()) { return query.value (0).toInt (); } else { //qDebug() << Q_FUNC_INFO << " - Query NOT valid"; } } else { //qDebug() << Q_FUNC_INFO << " - Query NO Next"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return -1; } return -1; } QString QSO::getBandNameFromBandId(int bandId) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(bandId); QSqlQuery query; //qDebug() << Q_FUNC_INFO << "Band: " << getBand(); bool ok = query.prepare ("SELECT name FROM band WHERE id= :id"); if (!ok) { return QString(); //qDebug() << Q_FUNC_INFO << " - Query NOT prepared-3167"; } query.bindValue (":id", bandId); if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return QString(); } if (!query.next()) return QString(); if (!query.isValid()) return QString(); //qDebug() << Q_FUNC_INFO << ": " << (query.value(0)).toString(); return (query.value(0)).toString(); } int QSO::getModeIdFromModeName() { // We need to save always the submode id // If submode is no present, then we will store the mode id //qDebug() << Q_FUNC_INFO; QSqlQuery query; // // SELECT mode.id FROM mode WHERE mode.submode="FT4" // SELECT mode.id FROM mode WHERE mode.name="MFSK" bool ok = query.prepare ("SELECT mode.id FROM mode WHERE mode.submode= :submode"); if (!ok) { //qDebug() << Q_FUNC_INFO << " - Failed to prepare"; return -1; } //qDebug() << Q_FUNC_INFO << " - Binding mode" << getMode(); query.bindValue (":submode", getSubmode()); //query.bindValue(":idQSO", _qsoId); //if (haveSubMode) //{ // query.bindValue (":submode", getSubmode ()); //} //else if (haveMode) //{ // query.bindValue (":submode", getMode ()); //} //else //{ // return -1; //} //EA4K: falla al crear un qso que llega desde wsjtx... devuelve 5 if (query.exec ()) { if (query.next()) { if (query.isValid ()) { //qDebug() << Q_FUNC_INFO << ": " << query.value (0).toString(); return query.value (0).toInt (); } else { return -4; } } else { return -5; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return -2; } return -3; } QString QSO::getModeNameFromModeId(int _modeId, bool _submode) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_modeId); QSqlQuery query; bool ok; if (_submode) { ok = query.prepare ("SELECT submode FROM mode WHERE id= :id"); } else { ok = query.prepare ("SELECT name FROM mode WHERE id= :id"); } if (!ok) { //qDebug() << Q_FUNC_INFO << " - Query NOT prepared-3255"; return QString(); } query.bindValue (":id", _modeId); if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return QString(); } if (!query.next()) return QString(); if (!query.isValid()) return QString(); //qDebug() << Q_FUNC_INFO << ": " << (query.value(0)).toString(); return (query.value(0)).toString(); } QSqlQuery QSO::getPreparedQuery(const QString &_s) { QSqlQuery query; //qDebug() << Q_FUNC_INFO << " - Start "; //qDebug() << Q_FUNC_INFO << " - queryString: " << _s; query.clear (); if (!query.prepare (_s)) { //qDebug() << Q_FUNC_INFO << " - Query not prepared-3285"; query.clear (); return query; } //qDebug() << Q_FUNC_INFO << " - Starting to bind values..."; query.bindValue(":qso_date", util->getDateTimeSQLiteStringFromDateTime (getDateTimeOn ())); query.bindValue(":call", getCall()); query.bindValue(":rst_sent", getRSTTX()); query.bindValue(":rst_rcvd", getRSTRX()); query.bindValue(":bandid", getBandIdFromBandName (false)); query.bindValue(":modeid", getModeIdFromModeName ()); query.bindValue(":cqz", getCQZone()); query.bindValue(":ituz", getItuZone()); query.bindValue(":dxcc", getDXCC()); query.bindValue(":address", getAddress()); if (adif->isValidAge(QString::number(getAge()))) query.bindValue(":age", getAge()); if (adif->isValidAltitude(QString::number(getAltitude()))) query.bindValue(":altitude", getAltitude()); if (adif->isValidA_Index(QString::number(getA_Index()))) query.bindValue(":a_index", getA_Index()); if (adif->isValidAnt_AZ(QString::number(getAnt_az()))) query.bindValue(":ant_az", getAnt_az()); if (adif->isValidAnt_EL(QString::number(getAnt_el()))) query.bindValue(":ant_el", getAnt_el()); query.bindValue(":ant_path", getAnt_Path()); query.bindValue(":arrl_sect", getARRL_Sect()); query.bindValue(":award_submitted", getAwardSubmitted ()); query.bindValue(":award_granted", getAwardGranted ()); query.bindValue(":band_rx", getBandIdFromBandName(true)); query.bindValue(":checkcontest", getCheck()); query.bindValue(":class", getClass()); query.bindValue(":clublog_qso_upload_date", util->getDateSQLiteStringFromDate(getClubLogDate())); query.bindValue(":clublog_qso_upload_status", getClubLogStatus()); query.bindValue(":cnty", getCounty()); query.bindValue(":comment", getComment()); query.bindValue(":cont", getContinent ()); query.bindValue(":contacted_op", getContactedOperator()); query.bindValue(":contest_id", getContestID()); query.bindValue(":country", getCountry()); query.bindValue(":credit_submitted", getCreditSubmitted()); query.bindValue(":credit_granted,", getCreditGranted()); query.bindValue(":darc_dok", getDarcDok ()); if (adif->isValidDistance(QString::number(getDistance()))) query.bindValue(":distance", getDistance()); query.bindValue(":email", getEmail()); query.bindValue(":eq_call", getEQ_Call()); query.bindValue(":eqsl_qslrdate", util->getDateSQLiteStringFromDate(getEQSLQSLRDate())); query.bindValue(":eqsl_qslsdate", util->getDateSQLiteStringFromDate(getEQSLQSLSDate())); query.bindValue(":eqsl_qsl_rcvd", getEQSLQSL_RCVD()); query.bindValue(":eqsl_qsl_sent", getEQSLQSL_SENT()); if (adif->isValidFISTS(QString::number(getFists()))) query.bindValue(":fists", getFists ()); if (adif->isValidFISTS(QString::number(getFistsCC()))) query.bindValue(":fists_cc", getFistsCC ()); query.bindValue(":force_init", util->boolToCharToSQLite (getForceInit())); query.bindValue(":freq_tx", getFreqTX()); query.bindValue(":freq_rx", getFreqRX()); query.bindValue(":gridsquare", getGridSquare()); query.bindValue(":gridsquare_ext", getGridSquare_ext()); query.bindValue(":hrdlog_qso_upload_date", getHRDUpdateDate ()); query.bindValue(":hrdlog_qso_upload_status", getHRDLogStatus ()); query.bindValue(":hamlogeu_qso_upload_date", getHamLogEUUpdateDate()); query.bindValue(":hamlogeu_qso_upload_status", getHamLogEUStatus()); query.bindValue(":hamqth_qso_upload_date", getHamQTHUpdateDate()); query.bindValue(":hamqth_qso_upload_status", getHamQTHStatus()); query.bindValue(":iota", getIOTA()); if (adif->isValidIOTA_islandID(QString::number(getIotaID()))) query.bindValue(":iota_island_id", getIotaID()); if (adif->isValidK_Index(QString::number(getK_Index()))) query.bindValue(":k_index", getK_Index()); query.bindValue(":lat", getLatitude()); query.bindValue(":lon", getLongitude()); query.bindValue(":lotw_qslrdate", util->getDateSQLiteStringFromDate(getLoTWQSLRDate())); query.bindValue(":lotw_qslsdate", util->getDateSQLiteStringFromDate(getLoTWQSLSDate())); query.bindValue(":lotw_qsl_rcvd", getLoTWQSL_RCVD()); query.bindValue(":lotw_qsl_sent", getLoTWQSL_SENT()); if (adif->isValidNRBursts(QString::number(getMaxBursts()))) query.bindValue(":max_bursts", getMaxBursts()); query.bindValue(":ms_shower", getMsShower()); if (adif->isValidAltitude(QString::number(getMyAltitude()))) query.bindValue(":my_altitude", getMyAltitude()); query.bindValue(":my_antenna", getMyAntenna()); query.bindValue(":my_arrl_sect", getMyARRL_Sect()); query.bindValue(":my_city", getMyCity()); query.bindValue(":my_cnty", getMyCounty()); query.bindValue(":my_country", getMyCountry()); query.bindValue(":my_cq_zone", getMyCQZone()); query.bindValue(":my_dxcc", getMyDXCC ()); query.bindValue(":my_fists", getMyFists ()); query.bindValue(":my_gridsquare", getMyGridSquare()); query.bindValue(":my_gridsquare_ext", getMyGridSquare_ext()); query.bindValue(":my_iota", getMyIOTA()); if (adif->isValidIOTA_islandID(QString::number(getMyIotaID()))) query.bindValue(":my_iota_island_id", getMyIotaID()); query.bindValue(":my_itu_zone", getMyITUZone ()); query.bindValue(":my_lat", getMyLatitude()); query.bindValue(":my_lon", getMyLongitude()); query.bindValue(":my_name", getMyName()); query.bindValue(":my_pota_ref", getMyPOTA_Ref()); query.bindValue(":my_postal_code", getMyPostalCode ()); query.bindValue(":my_rig", getMyRig()); query.bindValue(":my_sig", getMySig()); query.bindValue(":my_sig_info", getMySigInfo()); query.bindValue(":my_sota_ref", getMySOTA_REF()); query.bindValue(":my_state", getMyState()); query.bindValue(":my_street", getMyStreet()); query.bindValue(":my_usaca_counties", getMyUsacaCounties ()); query.bindValue(":my_wwff_ref", getMyWWFF_Ref()); query.bindValue(":my_vucc_grids", getMyVUCCGrids()); query.bindValue(":name", getName()); query.bindValue(":notes", getNotes()); if (adif->isValidNRBursts(QString::number(getNrBursts()))) query.bindValue(":nr_bursts", getNrBursts()); if (adif->isValidPings(QString::number(getNrPings()))) query.bindValue(":nr_pings", getNrPings()); query.bindValue(":operator", getOperatorCallsign()); query.bindValue(":owner_callsign", getOwnerCallsign()); query.bindValue(":pfx", getPrefix()); query.bindValue(":pota_ref", getPOTA_Ref()); query.bindValue(":precedence", getPrecedence()); query.bindValue(":prop_mode", getPropMode()); query.bindValue(":public_key", getPublicKey()); query.bindValue(":qrzcom_qso_upload_date", util->getDateSQLiteStringFromDate(getQRZCOMDate ())); query.bindValue(":qrzcom_qso_upload_status", getQRZCOMStatus ()); query.bindValue(":qslmsg", getQSLMsg()); query.bindValue(":qslrdate", util->getDateSQLiteStringFromDate(getQSLRDate())); query.bindValue(":qslsdate", util->getDateSQLiteStringFromDate(getQSLSDate())); query.bindValue(":qsl_rcvd", getQSL_RCVD()); query.bindValue(":qsl_sent", getQSL_SENT()); query.bindValue(":qsl_rcvd_via", getQSLRecVia()); query.bindValue(":qsl_sent_via", getQSLSentVia()); query.bindValue(":qsl_via", getQSLVia()); query.bindValue(":qso_complete", getQSOComplete()); query.bindValue(":qso_random", util->boolToCharToSQLite (getQSORandom())); query.bindValue(":qth", getQTH()); query.bindValue(":region", getRegion ()); query.bindValue(":rig", getRig ()); if (adif->isValidPower(QString::number(getRXPwr()))) query.bindValue(":rx_pwr", getRXPwr()); query.bindValue(":sat_mode", getSatMode()); query.bindValue(":sat_name",getSatName()); if (adif->isValidSFI(QString::number(getSFI()))) query.bindValue(":sfi", getSFI()); query.bindValue(":sig", getSIG()); query.bindValue(":sig_info", getSIG_INFO ()); query.bindValue(":silent_key", util->boolToCharToSQLite (getSilentKey ())); query.bindValue(":skcc", getSkcc ()); query.bindValue(":sota_ref", getSOTA_REF()); query.bindValue(":srx_string", getSrxString()); if (adif->isValidSRX(QString::number(getSrx()))) query.bindValue(":srx", getSrx()); query.bindValue(":stx_string", getStxString()); if (adif->isValidSTX(QString::number(getStx()))) query.bindValue(":stx", getStx()); query.bindValue(":state", getState()); query.bindValue(":station_callsign", getStationCallsign()); //query.bindValue(":submode", getModeIdFromModeName ()); query.bindValue(":swl", util->boolToCharToSQLite (getSwl())); if (adif->isValidUKSMG(QString::number(getUksmg()))) query.bindValue(":uksmg", getUksmg ()); query.bindValue(":usaca_counties", getUsacaCounties ()); query.bindValue(":ve_prov", getVeProv ()); query.bindValue(":wwff_ref", getWWFF_Ref()); query.bindValue(":vucc_grids", getVUCCGrids()); if (adif->isValidTenTen(QString::number(getTenTen()))) query.bindValue(":ten_ten", getTenTen()); if (adif->isValidPower(QString::number(getTXPwr()))) query.bindValue(":tx_pwr", getTXPwr()); query.bindValue(":web", getWeb()); query.bindValue(":qso_date_off", util->getDateSQLiteStringFromDate(getDateOff())); query.bindValue(":lognumber", getLogId()); //QVariantList list = query.boundValues(); //for (int i = 0; i < list.size(); ++i) //qDebug() << Q_FUNC_INFO << QString(": %1").arg(i) << "/ " << list.at(i).toString().toUtf8().data() << "\n"; //qDebug() << Q_FUNC_INFO << " - END"; return query; } QString QSO::getADIF() { if (!isComplete()) return QString(); adif = new Adif(Q_FUNC_INFO); QString adifStr = QString(); adifStr.append(adif->getADIFField ("CALL", callsign)); if (!qso_dateTime.isValid()) return QString(); adifStr.append(adif->getADIFField ("QSO_DATE", util->getADIFDateFromQDateTime(qso_dateTime))); adifStr.append(adif->getADIFField ("QSO_DATE_OFF", util->getADIFDateFromQDate(qso_date_off))); adifStr.append(adif->getADIFField ("TIME_ON", util->getADIFTimeFromQDateTime(qso_dateTime))); adifStr.append(adif->getADIFField ("TIME_OFF", util->getADIFTimeFromQTime(qso_time_off))); adifStr.append(adif->getADIFField ("RST_RCVD", RST_rx)); adifStr.append(adif->getADIFField ("RST_SENT", RST_tx)); adifStr.append(adif->getADIFField ("BAND", band)); if (QString::compare(band, band_rx) != 0) adifStr.append(adif->getADIFField ("BAND_RX", band_rx)); adifStr.append(adif->getADIFField ("MODE", mode)); if (QString::compare(mode, submode) != 0) adifStr.append(adif->getADIFField ("SUBMODE", submode )); if (adif->isValidCQz(QString::number(cqz))) adifStr.append(adif->getADIFField ("CQZ", QString::number(cqz) )); if (adif->isValidITUz(QString::number(itu_zone))) adifStr.append(adif->getADIFField ("ITUZ", QString::number(itu_zone) )); if (adif->isValidDXCC(QString::number(dxcc)) && (dxcc>0)) adifStr.append(adif->getADIFField ("DXCC", QString::number(dxcc))); adifStr.append(adif->getADIFField ("ADDRESS", address)); if (age>0.0) //Only relevant if Age >0 adifStr.append(adif->getADIFField ("AGE", QString::number(age))); if (adif->isValidAltitude(QString::number(getAltitude()))) adifStr.append(adif->getADIFField ("ALTITUDE", QString::number(getAltitude()))); adifStr.append(adif->getADIFField ("CNTY", county)); adifStr.append(adif->getADIFField ("COMMENT", comment)); if ((adif->isValidA_Index(QString::number(a_index))) && (a_index>0)) adifStr.append(adif->getADIFField ("A_INDEX", QString::number(a_index))); if ((adif->isValidAnt_AZ(QString::number(ant_az))) && (ant_az!=0)) adifStr.append(adif->getADIFField ("ANT_AZ", QString::number(ant_az))); if ((adif->isValidAnt_EL(QString::number(ant_el))) && (ant_el!=0.0) ) adifStr.append(adif->getADIFField ("ANT_EL", QString::number(ant_el))); adifStr.append(adif->getADIFField ("ANT_PATH", ant_path)); adifStr.append(adif->getADIFField ("ARRL_SECT", arrl_sect )); adifStr.append(adif->getADIFField ("AWARD_SUBMITTED", award_submitted)); adifStr.append(adif->getADIFField ("AWARD_GRANTED", award_granted)); adifStr.append(adif->getADIFField ("checkcontest", check)); adifStr.append(adif->getADIFField ("class", clase)); adifStr.append(adif->getADIFField ("clublog_qso_upload_status", clublog_status )); if ((clublogQSOUpdateDate .isValid()) && ((clublog_status =="Y") || (clublog_status =="N"))) adifStr.append(adif->getADIFField ("clublog_qso_upload_date", util->getADIFDateFromQDate(clublogQSOUpdateDate) )); adifStr.append(adif->getADIFField ("cont", continent)); adifStr.append(adif->getADIFField ("contacted_op", contacted_op)); adifStr.append(adif->getADIFField ("contest_id", contest_id)); adifStr.append(adif->getADIFField ("country", country)); adifStr.append(adif->getADIFField ("credit_submitted", credit_submitted)); adifStr.append(adif->getADIFField ("credit_granted", credit_granted )); adifStr.append(adif->getADIFField ("dark_dok", darc_dok )); if (distance>0) adifStr.append(adif->getADIFField ("distance", QString::number(distance) )); adifStr.append(adif->getADIFField ("email", email)); adifStr.append(adif->getADIFField ("eq_call", getEQ_Call())); adifStr.append(adif->getADIFField ("eqsl_qsl_rcvd", eqsl_qsl_rcvd)); if ((eQSLRDate.isValid()) && (adif->isValidQSLRCVD(eqsl_qsl_rcvd))) adifStr.append(adif->getADIFField ("eqsl_qslrdate", util->getADIFDateFromQDate(eQSLRDate) )); adifStr.append(adif->getADIFField ("eqsl_qsl_sent", eqsl_qsl_sent)); if ((eQSLSDate.isValid()) && (adif->isValidQSLSENT(eqsl_qsl_sent))) adifStr.append(adif->getADIFField ("eqsl_qslsdate", util->getADIFDateFromQDate(eQSLSDate) )); if (fists>0) adifStr.append(adif->getADIFField ("fists", QString::number(fists))); if (fists_cc>0) adifStr.append(adif->getADIFField ("fists_cc", QString::number(fists_cc))); if (forceInit) // Only relevant if true adifStr.append(adif->getADIFField ("force_init", adif->getADIFBoolFromBool(getForceInit()) )); //qDebug() << Q_FUNC_INFO << ": Printing FREQ: " << QString::number(freq_tx); if (adif->isValidFreq(QString::number(freq_tx))) adifStr.append(adif->getADIFField ("freq", QString::number(freq_tx))); //qDebug() << Q_FUNC_INFO << ": Printing FREQ_RX"; if ((adif->isValidFreq(QString::number(freq_rx))) && (freq_tx != freq_rx)) adifStr.append(adif->getADIFField ("freq_rx", QString::number(freq_rx) )); if (util->isValidGrid_ext(gridsquare)) adifStr.append(adif->getADIFField ("gridsquare", gridsquare)); if (util->isValidGrid_ext(gridsquare_ext)) adifStr.append(adif->getADIFField ("gridsquare_ext", gridsquare_ext)); adifStr.append(adif->getADIFField ("hrdlog_qso_upload_date", util->getADIFDateFromQDate(hrdlogUploadDate))); adifStr.append(adif->getADIFField ("hrdlog_qso_upload_status", hrdlog_status )); adifStr.append(adif->getADIFField ("hamlogeu_qso_upload_status", hamlogeu_status )); adifStr.append(adif->getADIFField ("hamlogeu_qso_upload_date", util->getADIFDateFromQDate(hamlogeuUpdateDate))); adifStr.append(adif->getADIFField ("hamqth_qso_upload_status", hamqth_status )); adifStr.append(adif->getADIFField ("hamqth_qso_upload_date", util->getADIFDateFromQDate(hamqthUpdateDate))); adifStr.append(adif->getADIFField ("iota", iota)); if (iota_ID>0) adifStr.append(adif->getADIFField ("iota_island_id", QString::number(iota_ID))); if ((adif->isValidK_Index(QString::number(k_index))) && (k_index>0)) adifStr.append(adif->getADIFField ("k_index", QString::number(k_index))); adifStr.append(adif->getADIFField ("lat", latitude)); adifStr.append(adif->getADIFField ("lon", longitude)); adifStr.append(adif->getADIFField ("lotw_qsl_sent", lotw_qsl_sent)); if ((QSLLoTWSDate.isValid()) && ( adif->isValidQSLSENT(lotw_qsl_sent) )) adifStr.append(adif->getADIFField ("lotw_qslsdate", util->getADIFDateFromQDate(QSLLoTWSDate) )); adifStr.append(adif->getADIFField ("lotw_qsl_rcvd", lotw_qsl_rcvd)); if ((QSLLoTWRDate.isValid()) && ( adif->isValidQSLRCVD(lotw_qsl_rcvd) )) adifStr.append(adif->getADIFField ("lotw_qslrdate", util->getADIFDateFromQDate(QSLLoTWRDate) )); if (adif->isValidNRBursts(QString::number(getMaxBursts()))) adifStr.append(adif->getADIFField ("max_bursts", QString::number(getMaxBursts()) )); adifStr.append(adif->getADIFField ("ms_shower", ms_shower)); if (adif->isValidAltitude(QString::number(getMyAltitude()))) adifStr.append(adif->getADIFField ("my_altitude", QString::number(getMyAltitude()))); adifStr.append(adif->getADIFField ("my_antenna", my_antenna)); adifStr.append(adif->getADIFField ("my_arrl_sect", my_arrl_sect )); adifStr.append(adif->getADIFField ("my_city", my_city)); adifStr.append(adif->getADIFField ("my_cnty", my_county)); adifStr.append(adif->getADIFField ("my_country", my_country)); if (adif->isValidCQz(QString::number(my_cqz))) adifStr.append(adif->getADIFField ("my_cq_zone", QString::number(my_cqz))); if (adif->isValidDXCC(QString::number(my_dxcc)) && (my_dxcc>0)) adifStr.append(adif->getADIFField ("my_dxcc", QString::number(my_dxcc) )); if (adif->isValidFISTS(QString::number(my_fists))) adifStr.append(adif->getADIFField ("my_fists", QString::number(my_fists) )); if (util->isValidGrid_ext(my_gridsquare)) adifStr.append(adif->getADIFField ("my_gridsquare", my_gridsquare )); if (util->isValidGrid_ext(my_gridsquare_ext)) adifStr.append(adif->getADIFField ("my_gridsquare_ext", my_gridsquare_ext)); adifStr.append(adif->getADIFField ("my_iota", my_iota)); if (adif->isValidIOTA_islandID(QString::number(getMyIotaID()))) adifStr.append(adif->getADIFField ("my_iota_island_id", QString::number(getMyIotaID()))); if (adif->isValidITUz(QString::number(my_itu_zone))) adifStr.append(adif->getADIFField ("my_itu_zone", QString::number(my_itu_zone))); adifStr.append(adif->getADIFField ("my_lat", my_latitude)); adifStr.append(adif->getADIFField ("my_lon", my_longitude)); adifStr.append(adif->getADIFField ("my_name", my_name)); adifStr.append(adif->getADIFField ("my_pota_ref", my_pota_ref)); adifStr.append(adif->getADIFField ("my_postal_code", my_postal_code)); adifStr.append(adif->getADIFField ("my_rig", my_rig)); adifStr.append(adif->getADIFField ("my_sig", my_sig)); adifStr.append(adif->getADIFField ("my_sig_info", my_sig_info)); adifStr.append(adif->getADIFField ("my_sota_ref", my_sota_ref)); adifStr.append(adif->getADIFField ("my_state", my_state)); adifStr.append(adif->getADIFField ("my_street", my_street)); adifStr.append(adif->getADIFField ("my_usaca_counties", my_usaca_counties)); adifStr.append(adif->getADIFField ("my_wwff_ref", my_wwff_ref)); adifStr.append(adif->getADIFField ("my_vucc_grids", my_vucc_grids)); adifStr.append(adif->getADIFField ("name", name)); adifStr.append(adif->getADIFField ("notes", notes)); if (adif->isValidNRBursts(QString::number(nr_bursts))) adifStr.append(adif->getADIFField ("nr_bursts", QString::number(nr_bursts))); if (adif->isValidPings(QString::number(nr_pings))) adifStr.append(adif->getADIFField ("nr_pings", QString::number(nr_pings))); adifStr.append(adif->getADIFField ("operator", operatorCall)); adifStr.append(adif->getADIFField ("owner_callsign", ownerCall)); adifStr.append(adif->getADIFField ("pfx", prefix)); adifStr.append(adif->getADIFField ("pota_ref", pota_ref)); adifStr.append(adif->getADIFField ("precedence", precedence)); adifStr.append(adif->getADIFField ("prop_mode", propMode)); adifStr.append(adif->getADIFField ("public_key", public_key)); adifStr.append(adif->getADIFField ("qrzcom_qso_upload_date", util->getADIFDateFromQDate(QRZComDate) )); adifStr.append(adif->getADIFField ("qrzcom_qso_upload_status", QRZCom_status )); adifStr.append(adif->getADIFField ("qslmsg", qslmsg)); adifStr.append(adif->getADIFField ("qsl_rcvd", getQSL_RCVD())); if ((QSLRDate.isValid()) && ( adif->isValidQSLRCVD(qsl_rcvd))) adifStr.append(adif->getADIFField ("qslrdate", util->getADIFDateFromQDate(QSLRDate) )); adifStr.append(adif->getADIFField ("qsl_sent", getQSL_SENT())); if ((QSLSDate.isValid()) && ( adif->isValidQSLSENT(qsl_sent))) adifStr.append(adif->getADIFField ("qslsdate", util->getADIFDateFromQDate(QSLSDate))); if ((getQSL_RCVD()=="Y") or (getQSL_RCVD()=="V")) // Valid cases to use qslrcvdVia adifStr.append(adif->getADIFField ("qsl_rcvd_via", qslRecVia)); if (getQSL_SENT()=="Y") // Valid case to use qslsentVia adifStr.append(adif->getADIFField ("qsl_sent_via", qslSenVia)); adifStr.append(adif->getADIFField ("qsl_via", qslVia)); adifStr.append(adif->getADIFField ("qso_complete", util->getADIFQSO_CompleteFromDB(getQSOComplete()))); //TODO: Check wether it makes sense to use this field for ALL QSOs or just when it is not random. if (getQSORandom()) adifStr.append(adif->getADIFField ("qso_random", adif->getADIFBoolFromBool(getQSORandom()))); adifStr.append(adif->getADIFField ("qth", qth)); adifStr.append(adif->getADIFField ("region", region)); adifStr.append(adif->getADIFField ("rig", rig)); if (adif->isValidPower(QString::number(pwr_rx))) adifStr.append(adif->getADIFField ("rx_pwr", QString::number(pwr_rx))); adifStr.append(adif->getADIFField ("sat_mode", getSatMode())); adifStr.append(adif->getADIFField ("sat_name", getSatName())); if ((adif->isValidSFI(QString::number(sfi))) && (sfi>0)) adifStr.append(adif->getADIFField ("sfi", QString::number(sfi))); adifStr.append(adif->getADIFField ("sig", sig)); adifStr.append(adif->getADIFField ("sig_info", sig_info)); if (silent_key) //We only save if SK adifStr.append(adif->getADIFField ("silent_key", adif->getADIFBoolFromBool(silent_key))); adifStr.append(adif->getADIFField ("skcc", skcc)); adifStr.append(adif->getADIFField ("sota_ref", sota_ref)); adifStr.append(adif->getADIFField ("srx_string", srx_string)); if (adif->isValidSRX(QString::number(srx))) adifStr.append(adif->getADIFField ("srx", QString::number(srx))); adifStr.append(adif->getADIFField ("stx_string", stx_string)); if (adif->isValidSTX(QString::number(stx))) adifStr.append(adif->getADIFField ("stx", QString::number(stx))); adifStr.append(adif->getADIFField ("state", state)); adifStr.append(adif->getADIFField ("station_callsign", stationCallsign)); if (swl) // We only print it if it is a SWL QSO adifStr.append(adif->getADIFField ("swl", adif->getADIFBoolFromBool(swl))); if (adif->isValidUKSMG(QString::number(uksmg))) adifStr.append(adif->getADIFField ("uksmg", QString::number(uksmg))); adifStr.append(adif->getADIFField ("usaca_counties", usaca_counties)); adifStr.append(adif->getADIFField ("ve_prov", ve_prov)); adifStr.append(adif->getADIFField ("wwff_ref", wwff_ref)); adifStr.append(adif->getADIFField ("vucc_grids", vucc_grids)); if (adif->isValidTenTen(QString::number(ten_ten))) adifStr.append(adif->getADIFField ("ten_ten", QString::number(ten_ten))); if (adif->isValidPower(QString::number(pwr_tx))) adifStr.append(adif->getADIFField ("tx_pwr", QString::number(pwr_tx))); adifStr.append(adif->getADIFField ("web", web)); if (adif->isValidLogId(QString::number(getLogId()))) adifStr.append(adif->getADIFField ("APP_KLOG_LOGN", QString::number(getLogId()))); //return qso.getADIF() + "\n"; return adifStr + "\n"; } QString QSO::getBandNameFromFreq(const double _n) { logEvent (Q_FUNC_INFO, "Start", Debug); bool sqlOk = false; QString queryString = QString("SELECT name FROM band WHERE lower <= '%1' and upper >= '%1'").arg(_n); QSqlQuery query(queryString); sqlOk = query.exec(); if (sqlOk) { query.next(); if (query.isValid()) { QString b = (query.value(0)).toString(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return b; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } bool QSO::fromDB(int _qsoId) { logEvent (Q_FUNC_INFO, "Start", Debug); QString queryString = "SELECT * FROM log WHERE id= :idQSO"; QSqlQuery query; query.prepare(queryString); query.bindValue(":idQSO", _qsoId); if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } if (!query.next()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } clear(); QSqlRecord rec = query.record(); //qDebug() << Q_FUNC_INFO << " - 20"; QString data = (query.value(rec.indexOf("qso_date"))).toString(); setDateTimeOn(util->getDateTimeFromSQLiteString(data)); data = (query.value(rec.indexOf("call"))).toString(); setCall(data); data = (query.value(rec.indexOf("rst_sent"))).toString(); setRSTTX(data); data = (query.value(rec.indexOf("rst_rcvd"))).toString(); setRSTRX(data); data = (query.value(rec.indexOf("bandid"))).toString(); data = getBandNameFromBandId(data.toInt()); setBand(data); data = (query.value(rec.indexOf("band_rx"))).toString(); data = getBandNameFromBandId(data.toInt()); setBandRX(data); data = (query.value(rec.indexOf("modeid"))).toString(); setMode(getModeNameFromModeId(data.toInt(), false)); setSubmode(getModeNameFromModeId(data.toInt(), true)); //qDebug() << Q_FUNC_INFO << " - 30"; setCQZone((query.value(rec.indexOf("cqz"))).toInt()); setItuZone((query.value(rec.indexOf("ituz"))).toInt()); setDXCC((query.value(rec.indexOf("dxcc"))).toInt()); setAddress((query.value(rec.indexOf("address"))).toString()); setAge((query.value(rec.indexOf("age"))).toDouble()); setAltitude((query.value(rec.indexOf("altitude"))).toDouble()); setCounty((query.value(rec.indexOf("cnty"))).toString()); setA_Index((query.value(rec.indexOf("a_index"))).toInt()); setAnt_az((query.value(rec.indexOf("ant_az"))).toDouble()); setAnt_el((query.value(rec.indexOf("ant_el"))).toDouble()); setAnt_Path((query.value(rec.indexOf("ant_path"))).toString()); setARRL_Sect((query.value(rec.indexOf("arrl_sect"))).toString()); setAwardSubmitted((query.value(rec.indexOf("award_submitted"))).toString()); setAwardGranted((query.value(rec.indexOf("award_granted"))).toString()); setCheck((query.value(rec.indexOf("checkcontest"))).toString()); setClass((query.value(rec.indexOf("class"))).toString()); //qDebug() << Q_FUNC_INFO << " - 40"; data = (query.value(rec.indexOf("clublog_qso_upload_date"))).toString(); setClubLogDate(util->getDateTimeFromSQLiteString(data).date()); setClubLogStatus((query.value(rec.indexOf("clublog_qso_upload_status"))).toString()); setComment((query.value(rec.indexOf("comment"))).toString()); setContinent((query.value(rec.indexOf("cont"))).toString()); setContactedOperator((query.value(rec.indexOf("contacted_op"))).toString()); setContestID((query.value(rec.indexOf("contest_id"))).toString()); setCountry((query.value(rec.indexOf("country"))).toString()); setCreditSubmitted((query.value(rec.indexOf("credit_submitted"))).toString()); setCreditGranted((query.value(rec.indexOf("credit_granted"))).toString()); setDarcDok((query.value(rec.indexOf("darc_dok"))).toString()); setDistance((query.value(rec.indexOf("distance"))).toDouble()); setEmail((query.value(rec.indexOf("email"))).toString()); setEQ_Call((query.value(rec.indexOf("eq_call"))).toString()); data = (query.value(rec.indexOf("eqsl_qslrdate"))).toString(); setEQSLQSLRDate(util->getDateTimeFromSQLiteString(data).date()); data = (query.value(rec.indexOf("eqsl_qslsdate"))).toString(); setEQSLQSLSDate(util->getDateTimeFromSQLiteString(data).date()); //qDebug() << Q_FUNC_INFO << " - 50"; setEQSLQSL_RCVD((query.value(rec.indexOf("eqsl_qsl_rcvd"))).toString()); setEQSLQSL_SENT((query.value(rec.indexOf("eqsl_qsl_sent"))).toString()); setFists((query.value(rec.indexOf("fists"))).toInt()); setFistsCC((query.value(rec.indexOf("fists_cc"))).toInt()); setForceInit(util->QStringToBool((query.value(rec.indexOf("force_init"))).toString())); setFreq((query.value(rec.indexOf("freq"))).toDouble()); setFreqRX((query.value(rec.indexOf("freq_rx"))).toDouble()); setGridSquare((query.value(rec.indexOf("gridsquare"))).toString()); setGridSquare_ext((query.value(rec.indexOf("gridsquare_ext"))).toString()); data = (query.value(rec.indexOf("hrdlog_qso_upload_date"))).toString(); setHRDUpdateDate(util->getDateTimeFromSQLiteString(data).date()); //qDebug() << Q_FUNC_INFO << " - 60"; setHRDLogStatus((query.value(rec.indexOf("hrdlog_qso_upload_status"))).toString()); data = (query.value(rec.indexOf("hamlogeu_qso_upload_date"))).toString(); setHamLogEUUpdateDate(util->getDateTimeFromSQLiteString(data).date()); setHamLogEUStatus((query.value(rec.indexOf("hamlogeu_qso_upload_status"))).toString()); data = (query.value(rec.indexOf("hamqth_qso_upload_date"))).toString(); setHamQTHUpdateDate(util->getDateTimeFromSQLiteString(data).date()); setHamQTHStatus((query.value(rec.indexOf("hamqth_qso_upload_status"))).toString()); //qDebug() << Q_FUNC_INFO << " - 61"; setIOTA((query.value(rec.indexOf("iota"))).toString()); //qDebug() << Q_FUNC_INFO << " - 62"; setIotaID((query.value(rec.indexOf("iota_island_id"))).toInt()); //qDebug() << Q_FUNC_INFO << " - 63"; setK_Index((query.value(rec.indexOf("k_index"))).toInt()); //qDebug() << Q_FUNC_INFO << " - 64"; setLatitude((query.value(rec.indexOf("lat"))).toString()); setLongitude((query.value(rec.indexOf("lon"))).toString()); data = (query.value(rec.indexOf("lotw_qslrdate"))).toString(); setLoTWQSLRDate(util->getDateTimeFromSQLiteString(data).date()); data = (query.value(rec.indexOf("lotw_qslsdate"))).toString(); setLoTWQSLSDate(util->getDateTimeFromSQLiteString(data).date()); setLoTWQSL_RCVD((query.value(rec.indexOf("lotw_qsl_rcvd"))).toString()); setLoTWQSL_SENT((query.value(rec.indexOf("lotw_qsl_sent"))).toString()); setMaxBursts((query.value(rec.indexOf("max_bursts"))).toInt()); setMsShower((query.value(rec.indexOf("ms_shower"))).toString()); setMyAltitude((query.value(rec.indexOf("my_altitude"))).toDouble()); setMyAntenna((query.value(rec.indexOf("my_antenna"))).toString()); setMyARRL_Sect((query.value(rec.indexOf("my_arrl_sect"))).toString()); setMyCity((query.value(rec.indexOf("my_city"))).toString()); setMyCounty((query.value(rec.indexOf("my_cnty"))).toString()); setMyCountry((query.value(rec.indexOf("my_country"))).toString()); setMyCQZone((query.value(rec.indexOf("my_cq_zone"))).toInt()); setMyITUZone((query.value(rec.indexOf("my_itu_zone"))).toInt()); setMyDXCC((query.value(rec.indexOf("my_dxcc"))).toInt()); setMyFists((query.value(rec.indexOf("my_fists"))).toInt()); setMyGridSquare((query.value(rec.indexOf("my_gridsquare"))).toString()); setMyGridSquare_ext((query.value(rec.indexOf("my_gridsquare_ext"))).toString()); setMyIOTA((query.value(rec.indexOf("my_iota"))).toString()); //qDebug() << Q_FUNC_INFO << " - 80"; setMyLatitude((query.value(rec.indexOf("my_lat"))).toString()); setMyLongitude((query.value(rec.indexOf("my_lon"))).toString()); setMyName((query.value(rec.indexOf("my_name"))).toString()); setMyPOTA_Ref((query.value(rec.indexOf("my_pota_ref"))).toString()); setMyPostalCode((query.value(rec.indexOf("my_postal_code"))).toString()); setMyRig((query.value(rec.indexOf("my_rig"))).toString()); setMySig((query.value(rec.indexOf("my_sig"))).toString()); setMySigInfo((query.value(rec.indexOf("my_sig_info"))).toString()); setMySOTA_REF((query.value(rec.indexOf("my_sota_ref"))).toString()); setMyState((query.value(rec.indexOf("my_state"))).toString()); setMyStreet((query.value(rec.indexOf("my_street"))).toString()); setMyUsacaCounties((query.value(rec.indexOf("my_usaca_counties"))).toString()); setMyWWFF_Ref((query.value(rec.indexOf("my_wwff_ref"))).toString()); setMyVUCCGrids((query.value(rec.indexOf("my_vucc_grids"))).toString()); //qDebug() << Q_FUNC_INFO << " - 90"; setName((query.value(rec.indexOf("name"))).toString()); setNotes((query.value(rec.indexOf("notes"))).toString()); setNrBursts((query.value(rec.indexOf("nr_bursts"))).toInt()); setNrPings((query.value(rec.indexOf("nr_pings"))).toInt()); setOperatorCallsign((query.value(rec.indexOf("operator"))).toString()); setOwnerCallsign((query.value(rec.indexOf("owner_callsign"))).toString()); setPrefix((query.value(rec.indexOf("pfx"))).toString()); setPOTA_Ref((query.value(rec.indexOf("pota_ref"))).toString()); setPrecedence((query.value(rec.indexOf("precedence"))).toString()); setPropMode((query.value(rec.indexOf("prop_mode"))).toString()); setPublicKey((query.value(rec.indexOf("public_key"))).toString()); data = (query.value(rec.indexOf("qrzcom_qso_upload_date"))).toString(); setQRZCOMDate(util->getDateTimeFromSQLiteString(data).date()); setQRZCOMStatus((query.value(rec.indexOf("qrzcom_qso_upload_status"))).toString()); //qDebug() << Q_FUNC_INFO << " - 100"; setQSLMsg((query.value(rec.indexOf("qslmsg"))).toString()); data = (query.value(rec.indexOf("qslrdate"))).toString(); setQSLRDate(util->getDateTimeFromSQLiteString(data).date()); data = (query.value(rec.indexOf("qslsdate"))).toString(); setQSLSDate(util->getDateTimeFromSQLiteString(data).date()); setQSL_RCVD((query.value(rec.indexOf("qsl_rcvd"))).toString()); setQSL_SENT((query.value(rec.indexOf("qsl_sent"))).toString()); setQSLRecVia((query.value(rec.indexOf("qsl_rcvd_via"))).toString()); setQSLSenVia((query.value(rec.indexOf("qsl_sent_via"))).toString()); setQSLVia((query.value(rec.indexOf("qsl_via"))).toString()); setQSOComplete((query.value(rec.indexOf("qso_complete"))).toString()); setQSORandom(util->QStringToBool((query.value(rec.indexOf("qso_random"))).toString())); //qDebug() << Q_FUNC_INFO << " - 120"; setQTH((query.value(rec.indexOf("qth"))).toString()); setRegion((query.value(rec.indexOf("region"))).toString()); setRig((query.value(rec.indexOf("rig"))).toString()); setRXPwr((query.value(rec.indexOf("rig"))).toDouble()); setSatName((query.value(rec.indexOf("sat_name"))).toString()); setSatMode((query.value(rec.indexOf("sat_mode"))).toString()); setSFI((query.value(rec.indexOf("sfi"))).toInt()); setSIG((query.value(rec.indexOf("sig"))).toString()); setSIG_INFO((query.value(rec.indexOf("sig_info"))).toString()); setSilentKey(util->QStringToBool((query.value(rec.indexOf("silent_key"))).toString())); setSkcc((query.value(rec.indexOf("skcc"))).toString()); //qDebug() << Q_FUNC_INFO << " - 130"; setSOTA_REF((query.value(rec.indexOf("sota_ref"))).toString()); setSrxString((query.value(rec.indexOf("srx_string"))).toString()); setSrx((query.value(rec.indexOf("srx"))).toInt()); setStxString((query.value(rec.indexOf("stx_string"))).toString()); setStx((query.value(rec.indexOf("stx"))).toInt()); setState((query.value(rec.indexOf("state"))).toString()); setStationCallsign((query.value(rec.indexOf("station_callsign"))).toString()); setSwl(util->QStringToBool((query.value(rec.indexOf("swl"))).toString())); setUksmg((query.value(rec.indexOf("uksmg"))).toString()); setUsacaCounties((query.value(rec.indexOf("usaca_counties"))).toString()); setVeProv((query.value(rec.indexOf("ve_prov"))).toString()); setVUCCGrids((query.value(rec.indexOf("vucc_grids"))).toString()); setWWFF_Ref((query.value(rec.indexOf("wwff_ref"))).toString()); setTenTen((query.value(rec.indexOf("ten_ten"))).toInt()); setTXPwr((query.value(rec.indexOf("tx_pwr"))).toDouble()); setRXPwr((query.value(rec.indexOf("rx_pwr"))).toDouble()); //qDebug() << Q_FUNC_INFO << " - 140"; setWeb((query.value(rec.indexOf("web"))).toString()); data = (query.value(rec.indexOf("qso_date_off"))).toString(); setDateOff(util->getDateTimeFromSQLiteString(data).date()); setLogId((query.value(rec.indexOf("lognumber"))).toInt()); //qDebug() << Q_FUNC_INFO << " - 150"; logEvent (Q_FUNC_INFO, "END", Debug); return false; } int QSO::getLastInsertedQSO() { //qDebug() << Q_FUNC_INFO << " - Start"; QString stringQuery = QString("SELECT last_insert_rowid()"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); int id = -1; if (sqlOK) { query.next(); id = (query.value(0)).toInt(); } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); return id; //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/README0000644000175000017500000000177315003153303012313 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-2.4.1/klog.rc0000644000175000017500000000007315003153303012705 0ustar develdevelIDI_ICON1 ICON DISCARDABLE "klog.ico" klog-2.4.1/NEWS0000644000175000017500000000017515003153303012125 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-2.4.1/klogdefinitions.h0000644000175000017500000001034715003153303014771 0ustar develdevel#ifndef KLOG_KLOGDEFINITIONS_H #define KLOG_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 {None, Info, Debug, Devel}; enum ValidFieldsForStats {DXCC, GridSquare}; enum FilesToDownload {CTY, Sats}; enum QSOStatus {unknown, ATNO, needed, worked, confirmed}; enum WJTXStatus {NewContinent, NewContinentInBand, NewContinentInMode, NewCQ, NewCQInBand, NewCQInMode, NewITU, NewITUInBand, NewITUInMode, NewDXCC, NewDXCCInBand, NewDXCCInMode, NewGrid, NewGridInBand, NewGridInMode, NewCall, NewCallInBand, NewCallInMode }; enum FreqUnits {Hz, KHz, MHz, GHz, THz}; enum MouseClicks {NoClick, RightClick, SingleClick, DoubleClick}; //struct EntityData { // Used to pass a list of data from World to dxccstatuswidget // int dxcc; // QString mainprefix; // QString name; // QString isoname; //}; struct EntityData { // Used to pass a list of data from World to dxccstatuswidget int dxcc; QString mainprefix; QString name; QString isoname; bool operator<(const EntityData &other) const { return std::tie(dxcc, mainprefix, name, isoname) < std::tie(other.dxcc, other.mainprefix, other.name, other.isoname); } bool operator==(const EntityData &other) const { return std::tie(dxcc, mainprefix, name, isoname) == std::tie(other.dxcc, other.mainprefix, other.name, other.isoname); } }; struct EntityStatus { // Used to pass a list of data from Awards to dxccstatuswidget int dxcc; int bandId; int modeId; QSOStatus status; // status of this Entity in this band int qsoId; // QSOid that provides this status int logId; // Log where we are checking the status (TODO: This may be redundant as the qsoId may be used to get the log) }; struct Coordinate { double lat; double lon; }; struct PrimarySubdivision { // Used to return data to MainWindow for each prefix QString name; QString shortName; QString prefix; int cqz; int ituz; int dxcc; }; #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 #endif // KLOGDEFINITIONS_H klog-2.4.1/INSTALL-macOS.txt0000644000175000017500000000014615003153303014273 0ustar develdevelInstalling KLog on a macOS system is easy. Just click and drop the icon into the Applications folder klog-2.4.1/elogqrzlog.h0000644000175000017500000001172515003153303013767 0ustar develdevel#ifndef KLOG_ELOGQRZLOG_H #define KLOG_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 setUser(const QString &_user); void setPassword(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-2.4.1/searchwidget.h0000644000175000017500000001514615003153303014254 0ustar develdevel#ifndef KLOG_SEARCHWIDGET_H #define KLOG_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(Awards *awards, 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 QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default); void refresh(); 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; std::unique_ptr searchWindow; // Defined like this to send the same award instance 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-2.4.1/dxcluster/0000755000175000017500000000000015003153303013440 5ustar develdevelklog-2.4.1/dxcluster/dxclusterassistant.cpp0000644000175000017500000001073515003153303020121 0ustar develdevel/*************************************************************************** dxclusterassistant.h - description ------------------- begin : mar 2024 copyright : (C) 2024 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 "dxclusterassistant.h" DXClusterAssistant::DXClusterAssistant(const QString &_parentFunction, QWidget *parent) : QWidget{parent} { #ifdef QT_DEBUG //qDebug() << ": " << _parentFunction; #else #endif (void)_parentFunction; //qDebug() << Q_FUNC_INFO << " - Start: " + _parentFunction; tableWidget = new QTableWidget; } DXClusterAssistant::~DXClusterAssistant(){}; bool DXClusterAssistant::init() { list.clear(); return createUI(); } bool DXClusterAssistant::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; tableWidget->setSortingEnabled (true); hv = tableWidget->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = tableWidget->horizontalHeader(); QStringList header; header.clear(); header << tr("DX") << tr("Freq") << tr("Status"); // tr("Mode"); tableWidget->setColumnCount(header.length()); tableWidget->setHorizontalHeaderLabels(header); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(tableWidget, 3, 0, 1, -1); setLayout(mainLayout); return true; //connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << " - END"; } void DXClusterAssistant::newDXClusterSpot(proposedQSOs _q) { list.append(_q); //qDebug() << Q_FUNC_INFO << " - 50"; //qDebug() << Q_FUNC_INFO << " - 60"; //qDebug() << Q_FUNC_INFO << QString("Data received: Call: %1 - Freq: %2 - Status: %3").arg(_call).arg(_freq).arg(getStringFromStatus(_status)); addCall(); } QString DXClusterAssistant::getStringFromStatus(QSOStatus _s) { switch (_s) { case unknown: return "unknown"; break; case ATNO: return "ATNO"; break; case needed: return "needed"; break; case worked: return "worked"; break; case confirmed: return "confirmed"; break; default: return "unknown"; break; } } void DXClusterAssistant::addCall() { //qDebug() << Q_FUNC_INFO << " - Start"; tableWidget->clearContents(); tableWidget->setRowCount(0); proposedQSOs aux; foreach(aux, list) { //qDebug() << Q_FUNC_INFO << "Call: " << aux.call; QTableWidgetItem *newItemCall = new QTableWidgetItem(aux.call, QTableWidgetItem::Type); QTableWidgetItem *newItemFreq = new QTableWidgetItem(aux.freq.toQString(), QTableWidgetItem::Type); QTableWidgetItem *newItemStatus = new QTableWidgetItem(getStringFromStatus(aux.status), QTableWidgetItem::Type); tableWidget->insertRow(tableWidget->rowCount()); int row = tableWidget->rowCount(); tableWidget->setItem(row-1, 0, newItemCall); tableWidget->setItem(row-1, 1, newItemFreq); tableWidget->setItem(row-1, 2, newItemStatus); } //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/dxcluster/dxspot.cpp0000644000175000017500000001020515003153303015463 0ustar develdevel/*************************************************************************** dxspot.cpp - description ------------------- begin : apr 2024 copyright : (C) 2024 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 "dxspot.h" #include "../callsign.h" DXSpot::DXSpot() { clear(); } DXSpot::~DXSpot(){} DXSpot::DXSpot(const DXSpot& other) { dxcall = other.dxcall; freq = other.freq; spotter = other.spotter; comment = other.comment; dateTime = other.dateTime; clickStatus = other.clickStatus; shdx = other.shdx; } void DXSpot::clear() { dxcall.clear(); freq.clear(); spotter.clear(); dateTime.currentDateTimeUtc(); clickStatus = NoClick; shdx = false; } void DXSpot::operator=(DXSpot const &_other) { dxcall = _other.dxcall; freq = _other.freq; // Might need a copy constructor for Frequency as well spotter = _other.spotter; comment = _other.comment; if (_other.dateTime.isValid()) dateTime = _other.dateTime; clickStatus = _other.clickStatus; shdx = _other.shdx; } bool DXSpot::isValid() { //qDebug() << Q_FUNC_INFO << " - 010"; Callsign dxc(dxcall); if (!dxc.isValid()) return false; //qDebug() << Q_FUNC_INFO << " - 020"; Callsign spo(spotter); if (!spo.isValid()) return false; //qDebug() << Q_FUNC_INFO << " - 030"; if (!freq.isValid()) return false; //qDebug() << Q_FUNC_INFO << " - 040"; if (!dateTime.isValid()) return false; //qDebug() << Q_FUNC_INFO << " - 050"; return true; } void DXSpot::setDXCall(const QString &_c) { Callsign callsing(_c); if (callsing.isValid()) dxcall = _c; } QString DXSpot::getDxCall() {return dxcall;} void DXSpot::setSpotter(const QString &_c){ Callsign callsing(_c); if (callsing.isValid()) spotter = _c; } QString DXSpot::getSpotter(){return spotter;} void DXSpot::setComment(const QString &c){comment = c;} QString DXSpot::getComment(){return comment;} void DXSpot::setDateTime(const QDateTime &d){if (d.isValid()) dateTime = d; } QDateTime DXSpot::getDateTime(){ return dateTime;} void DXSpot::setClickStatus(const MouseClicks &_s ){clickStatus = _s;} MouseClicks DXSpot::getClickStatus(){return clickStatus;} void DXSpot::setFrequency(Frequency f) { if (f.isValid()) freq = f; //qDebug() << Q_FUNC_INFO << ": " << freq.toQString(MHz); } Frequency DXSpot::getFrequency() { // Return the frequency stored in the object return freq; } void DXSpot::setSHDX(bool _shdx) { shdx = _shdx; } bool DXSpot::getSHDX(){return shdx;} klog-2.4.1/dxcluster/dxcluster.h0000644000175000017500000001367515003153303015642 0ustar develdevel#ifndef KLOG_CLUSTER_DXCLUSTER_H #define KLOG_CLUSTER_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 "dxspot.h" #include "../world.h" #include "../utilities.h" #include "../dataproxy_sqlite.h" #include "../frequency.h" #include "../klogdefinitions.h" class QWidget; class QTcpSocket; class Frequency; enum TypeOfDXSpot {dxde, shdx, other}; class DXClusterWidget : public QWidget { Q_OBJECT public: //DXClusterWidget(Awards *awards, QWidget *parent ); explicit DXClusterWidget(Awards *awards, QWidget *parent = nullptr); void init(); ~DXClusterWidget(); void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_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 loadSettings(); void setDXClusterServer(const QString &clusterToConnect, const int portToConnect); void rightButtonFromLogMenu(const DXSpot &_spot); //void sendSpotToCluster(const QString &_dx, const QString &_freq); 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(); void slotRightButton (const QPoint& pos); void slotCheckQRZCom(); signals: void dxspotclicked(const DXSpot &_dxSpot); // DXSpotCall, DX-Freq, doubleClicked //void dxspotArrived(const QString &_call, double _f); void dxspotArrived(const QString &_call, const Frequency &_f); void dxspotArrived(const DXSpot &_sp); //void dxspot(const QString &_spot); // The text string to be saved private: Awards *awards; // Reference to the Awards instance //void TESTADDSPOT(); // Just a test spot void addItemToClusterList(const QString &text, const QColor &color); // Adds a message to the list void createActions(); void connectToDXCluster(); void printSpot(const QString _stringSpot); void printSHDX(const QString _stringSpot); void printOther(const QString _stringSpot); //QStringList readItem(QListWidgetItem * _stringSpot); DXSpot readItem(const QString _stringSpot); TypeOfDXSpot parseReceivedData(const QString _stringSpot); // Parses the received data to identify if it is a "DX de" or other line. bool checkIfNeedsToBePrinted(EntityStatus _entityStatus); void saveSpot (const QString &_spot); bool openFile(); QString cleanSpotter(const QString _call); void addData(); //TO BE DELETED, JUST FOR TESTING PURPOSES QTcpSocket *tcpSocket = nullptr; QListWidget *dxClusterListWidget; QLineEdit *inputCommand; QPushButton *sendButton; QPushButton *clearButton; bool dxClusterConnected; bool dxClusterAlreadyConnected; QString server; quint16 port; //quint16 blockSize; QColor dxSpotColor; World *world; 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; QFile *saveSpotsFile; bool saveSpots; // write/save the spots to a file QAction *checkQRZCOMFromLogAct; }; class dxClusterSpotItem : public QListWidgetItem { public: dxClusterSpotItem( QListWidget* parent, const QString& spot, const QColor& color ); ~dxClusterSpotItem(); protected: QColor spotColor; }; #endif // DXCLUSTER_H klog-2.4.1/dxcluster/dxcluster.cpp0000644000175000017500000007207115003153303016170 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" #include "../callsign.h" DXClusterWidget::DXClusterWidget(Awards *awards, QWidget *parent) : QWidget(parent), awards(awards), dataProxy(awards->dataProxy) { //qDebug() << "DXClusterWidget::DXClusterWidget2" << clusterToConnect << QString::number(portToConnect); //dataProxy = awards->dataProxy; saveSpotsFile = new QFile(); util = new Utilities(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); 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); dxClusterListWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(sendButton , SIGNAL(clicked()), this, SLOT(slotClusterSendToServer()) ); connect(inputCommand, SIGNAL(textChanged(QString)), this, SLOT(slotClusterInputTextChanged()) ); connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); //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() ) ); connect(dxClusterListWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButton( const QPoint& ) ) ); connect(tcpSocket, SIGNAL(connected()), SLOT(slotClusterSocketConnected()) ); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(slotClusterDataArrived() )); connect(tcpSocket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(slotClusterDisplayError(QAbstractSocket::SocketError))); connect(tcpSocket, SIGNAL(disconnected()), SLOT(slotClusterSocketConnectionClosed()) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClusterClearLineInput()) ); //TESTADDSPOT(); //qDebug() << "DXClusterWidget::DXClusterWidget2 - END" ; } DXClusterWidget::~DXClusterWidget() { //qDebug() << Q_FUNC_INFO; //delete(dataProxy); delete(tcpSocket); delete(world); delete(util); delete(saveSpotsFile); } void DXClusterWidget::createActions() { //qDebug() << Q_FUNC_INFO; 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() )); } void DXClusterWidget::init() { //qDebug() << Q_FUNC_INFO; #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) dxSpotColor.fromString(QAnyStringView(("slategrey"))); //To be replaced by .fromString in Qt6.6 #else dxSpotColor.setNamedColor("slategrey"); //To be replaced by .fromString in Qt6.6 #endif //dxSpotColor.setNamedColor("slategrey"); 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; server = "dxfun.com"; port = quint16(8000); saveSpotsFile->setFileName(util->getSaveSpotsLogFile()); clearButton->setToolTip(tr("Clears the DXCluster command line.")); dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Click on connect to connect to the DX-Cluster"), awards->getDefaultColor()); Q_UNUSED(item); createActions (); //TODO: Check how to add an item in a different way } void DXClusterWidget::setMyQRZ(const QString &_qrz) { //qDebug() << Q_FUNC_INFO; if (_qrz.length()>2) { myQrz = _qrz; } } void DXClusterWidget::addData() { //qDebug() << Q_FUNC_INFO; /* 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()); Q_UNUSED(item); } void DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ) { //qDebug() << Q_FUNC_INFO << ": " << ((item->data(0)).toString()).simplified(); QStringList ql; ql.clear(); if (!item) return; QString aux = "DOUBLE " + ((item->data(0)).toString()).simplified(); // Mark the string to inform readItem that this // comes from a double click DXSpot spot = readItem(aux); if (!spot.isValid()) return; spot.setClickStatus(DoubleClick); emit dxspotclicked(spot); } void DXClusterWidget::connectToDXCluster() { //qDebug() << Q_FUNC_INFO; if (dxClusterConnected) { //qDebug() << "DXClusterWidget::connectToDXCluster: - Already connected!!"; return; // If we are connected we don't want to start another connection } //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() << Q_FUNC_INFO << ": " << socketError; QString errorMessage; switch (socketError) { case QAbstractSocket::RemoteHostClosedError: errorMessage = tr("The DXCluster server desconnected the session."); break; case QAbstractSocket::HostNotFoundError: errorMessage = 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: errorMessage = 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: errorMessage = tr("The following error occurred: %1.").arg(socketError); } //qDebug() << Q_FUNC_INFO << errorMessage; QMessageBox::warning(this, tr("KLog DXCluster"), errorMessage); } bool DXClusterWidget::checkIfNeedsToBePrinted(EntityStatus _entityStatus) { //qDebug() << Q_FUNC_INFO; if (!showconfirmed && (_entityStatus.status == confirmed)) { return false; } if (!showhf && dataProxy->isHF(_entityStatus.bandId)) { return showwarc && dataProxy->isWARC(_entityStatus.bandId); } if (!showwarc && dataProxy->isWARC(_entityStatus.bandId)) { return false; } if (!showvhf && dataProxy->isVHF(_entityStatus.bandId)) { return false; } return true; } void DXClusterWidget::setCurrentLog(const int _log) { //qDebug() << Q_FUNC_INFO; if (dataProxy->doesThisLogExist(_log)) { currentLog = _log; } else { currentLog = -1; } } void DXClusterWidget::addItemToClusterList(const QString &text, const QColor &color) { QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(color)); item->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); item->setText(text); dxClusterListWidget->insertItem(0, item); } void DXClusterWidget::slotClusterDataArrived() { //qDebug() << Q_FUNC_INFO; QString dxClusterString = tcpSocket->readAll().trimmed().simplified(); //qDebug() << Q_FUNC_INFO << " - 010:" << dxClusterString; if (dxClusterString.endsWith("\x07\x07\r\n")) { //qDebug() << Q_FUNC_INFO << " - 011"; dxClusterString = dxClusterString.remove("\x07\x07\r\n"); } //qDebug() << Q_FUNC_INFO << " Line-2: " << dxClusterString; if (dxClusterString.endsWith("\u0007\u0007\r\n")) { //qDebug() << Q_FUNC_INFO << " - 012"; dxClusterString = dxClusterString.remove("\u0007\u0007\r\n"); } if (dxClusterString.endsWith("\u0007\u0007")) { //qDebug() << Q_FUNC_INFO << " - 013"; dxClusterString = dxClusterString.remove("\u0007\u0007"); } //qDebug() << Q_FUNC_INFO << " - 020:" << dxClusterString; saveSpot(dxClusterString); TypeOfDXSpot typeOfSpot = parseReceivedData(dxClusterString); switch (typeOfSpot) { case dxde: //qDebug() << Q_FUNC_INFO << " - DX de"; printSpot(dxClusterString); break; case shdx: //qDebug() << Q_FUNC_INFO << " - sh/dx"; printSHDX(dxClusterString); break; default: //qDebug() << Q_FUNC_INFO << " - Other..."; printOther(dxClusterString); } } void DXClusterWidget::printSpot(const QString _stringSpot) { //qDebug() << Q_FUNC_INFO; QString stringToPrint = _stringSpot; DXSpot spot = readItem(stringToPrint); EntityStatus _entityStatus; _entityStatus.dxcc = -1; _entityStatus.logId = currentLog; if (spot.isValid()) { //qDebug() << Q_FUNC_INFO << " - spot is Valid"; //qDebug() << Q_FUNC_INFO << " - DX : " << spot.getDxCall(); //qDebug() << Q_FUNC_INFO << " - Spotter : " << spot.getSpotter(); //qDebug() << Q_FUNC_INFO << " - Freq : " << spot.getFrequency().toQString(); //qDebug() << Q_FUNC_INFO << " - Comment : " << spot.getComment(); _entityStatus.dxcc = world->getQRZARRLId(spot.getDxCall()); _entityStatus.bandId = dataProxy->getBandIdFromFreq(spot.getFrequency().toDouble()); dxSpotColor = awards->getQRZDXStatusColor(_entityStatus); if (showDxMarathon && awards->isDXMarathonNeed(_entityStatus.dxcc, world->getQRZCqz(spot.getDxCall()), QDateTime::currentDateTime().date().year(), currentLog)) { stringToPrint += " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } emit dxspotArrived(spot); _entityStatus.modeId = -1; if (!checkIfNeedsToBePrinted(_entityStatus)) { return; } } else { //qDebug() << Q_FUNC_INFO << " - spot is NOT Valid"; dxSpotColor = awards->getDefaultColor(); } int callPad = 15; if (spot.getDxCall().length()>11) callPad = spot.getDxCall().length() + 3; QString paddedDXCall = spot.getDxCall().leftJustified(callPad, ' '); QString paddedFreq = ((spot.getFrequency()).toQString(MHz)).rightJustified(10, ' '); callPad = 10; if (spot.getSpotter().length()>11) callPad = spot.getSpotter().length() + 3; QString paddedSpotter = QString(spot.getSpotter()+ ":").leftJustified(callPad, ' '); QString paddedComments = QString(spot.getComment()).leftJustified(28, ' '); QString dateformat; if (spot.getSHDX()) dateformat = (QDateTime::currentDateTimeUtc()).toString("dd-MMM-yyyy hhmm")+"Z"; else dateformat = (QDateTime::currentDateTimeUtc()).time().toString("HHmm")+"Z"; QString mainaux = "DX de " + paddedSpotter + paddedFreq + " " + paddedDXCall + paddedComments + dateformat; addItemToClusterList(mainaux, dxSpotColor); //addItemToClusterList(stringToPrint, dxSpotColor); } void DXClusterWidget::printSHDX(const QString _stringSpot) { //qDebug() << Q_FUNC_INFO << _stringSpot; //TODO: Check for spots like: //7160.0 GB70RS 19-Feb-2025 1202Z SES <2E0MNG> 50313.0 TZ1CE 19-Feb-2025 1201Z FT8 -12 dB 779 Hz QStringList spots = _stringSpot.split(">"); QString spot; QString tmp; // Stores a string that should be added to the following spot to check // To detect cases like: 50313.0 TZ1CE 19-Feb-2025 1201Z FT8 -12 dB 779 Hz foreach (spot, spots) { tmp = tmp + spot; QStringList intraSpot = tmp.split(" "); QString lastToken = intraSpot.last(); if (lastToken.startsWith("<")) { lastToken.remove(0,1); //lastToken.removeFirst(); Callsign callsign(lastToken); if (callsign.isValid()) { printSpot(tmp.simplified()); tmp.clear(); } } } } void DXClusterWidget::printOther(const QString _stringSpot) { //qDebug() << Q_FUNC_INFO << _stringSpot; dxSpotColor = awards->getDefaultColor(); addItemToClusterList(_stringSpot, dxSpotColor); } QString DXClusterWidget::cleanSpotter(const QString _call) { QString spotter = _call; spotter.chop(1); // Remove the last char '>' spotter.remove(0,1); return spotter; } void DXClusterWidget::slotClusterSocketConnected() { //qDebug() << Q_FUNC_INFO; addItemToClusterList(tr("Connected to server"), awards->getDefaultColor()); dxClusterConnected = true; inputCommand->setFocus(Qt::OtherFocusReason); if (!dxClusterAlreadyConnected) { bool ok; QString callsignText = QInputDialog::getText( this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, myQrz.length() > 2 ? myQrz : "", &ok); if (!ok) { tcpSocket->disconnectFromHost(); dxClusterConnected = false; return; } 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); if (!ok) { tcpSocket->abort(); dxClusterConnected = false; return; } QTextStream os(tcpSocket); if (!callsignText.isEmpty()) { os << callsignText << "\n"; sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); dxClusterAlreadyConnected = true; } else { dxClusterAlreadyConnected = false; } inputCommand->setEnabled(true); inputCommand->setToolTip(tr("Enter here the commands to be sent to the DX-Cluster server.")); } } void DXClusterWidget::slotClusterSocketConnectionClosed() { //qDebug() << Q_FUNC_INFO; addItemToClusterList(tr("Connection closed by the server"), awards->getDefaultColor()); 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() << Q_FUNC_INFO << " - 000"; if (!dxClusterConnected) { //qDebug() << Q_FUNC_INFO << " - 001"; //qDebug() << Q_FUNC_INFO << " - Cluster already connected, END"; connectToDXCluster(); //qDebug() << Q_FUNC_INFO << " - 002 - END"; return; // If we try to connect... } //qDebug() << Q_FUNC_INFO << " - 010"; QString inputText = inputCommand->text(); if (inputText.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - 020"; if (sendButton->text() == tr("Disconnect")) { // Disconnecting { //qDebug() << Q_FUNC_INFO << " - 030"; QTextStream os(tcpSocket); os << "bye\n"; //qDebug() << Q_FUNC_INFO << " - 033 - END"; return; } } // If input is empty and send button is not "Disconnect", do nothing return; } //qDebug() << Q_FUNC_INFO << " - 050"; // Write to the server QTextStream(tcpSocket) << inputText << "\n"; inputCommand->clear(); //qDebug() << Q_FUNC_INFO << " - END"; } void DXClusterWidget::slotClusterClearLineInput() { //qDebug() << Q_FUNC_INFO; inputCommand->clear(); } void DXClusterWidget::slotClusterInputTextChanged() { //qDebug() << Q_FUNC_INFO; QString inputText = inputCommand->text(); if (inputText.isEmpty()) { sendButton->setText(tr("Disconnect")); } else if (dxClusterConnected) { sendButton->setText(tr("Send")); } clearButton->setText(tr("Clear")); } void DXClusterWidget::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << ": " << _newOne.name(QColor::HexRgb) << "/" << _needed.name(QColor::HexRgb) << "/" << _worked.name(QColor::HexRgb) << "/" << _confirmed.name(QColor::HexRgb) << "/" << _default.name(QColor::HexRgb); // 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() << Q_FUNC_INFO; showhf = _showhf; showvhf = _showvhf; showwarc = _showwarc; showworked = _showworked; showconfirmed = _showconfirmed; showann = _showann; showwwv = _showwwv; showwcy = _showwcy; } void DXClusterWidget::slotClusterDXClusterWidgetItemSelected() { //qDebug() << Q_FUNC_INFO; QListWidgetItem * item = dxClusterListWidget->currentItem(); DXSpot spot = readItem(((item->data(0)).toString()).simplified()); if (spot.isValid()) emit dxspotclicked(spot); } void DXClusterWidget::slotClusterDXClusterWidgetItemEntered(QListWidgetItem *item) { //qDebug() << Q_FUNC_INFO; if (!item) return; DXSpot spot = readItem(item->data(0).toString().simplified()); if (spot.isValid()) { item->setToolTip(world->getQRZEntityName(spot.getDxCall())); } } bool DXClusterWidget::isConnected() { //qDebug() << Q_FUNC_INFO; return dxClusterConnected; } TypeOfDXSpot DXClusterWidget::parseReceivedData(const QString _stringSpot) { //qDebug() << Q_FUNC_INFO << ": " << _stringSpot; QStringList fields = _stringSpot.split(" "); if (fields.length() < 2) return other; QString first = fields.at(0); QString second = fields.at(1); QString last = fields.last(); Frequency firstF; firstF.fromQString(first, KHz); if (first == "DX" && second == "de") { //qDebug() << Q_FUNC_INFO << ": Identified DX de"; return dxde; } else if (firstF.isValid() && last.endsWith(">")) { //qDebug() << Q_FUNC_INFO << ": Identified sh/dx"; //qDebug() << firstF.toQString(); return shdx; } //qDebug() << Q_FUNC_INFO << ": Identified other"; return other; } DXSpot DXClusterWidget::readItem(const QString _stringSpot) { //qDebug() << Q_FUNC_INFO << ": " << _stringSpot; DXSpot spot; spot.clear(); spot.setDateTime(QDateTime::currentDateTimeUtc()); QStringList fields = _stringSpot.split(" "); if (fields.size() < 5) return spot; // Check for double click bool doubleClick = (fields.at(0) == "DOUBLE"); if (doubleClick) { fields.removeFirst(); } Frequency freq; if (fields.at(0) == "DX" && fields.at(1) == "de") { //"DX de IC8CUQ: 14250.0 IZ3WUW tnx QSO 73! 1429Z" //qDebug() << Q_FUNC_INFO << ": Identified DX de"; spot.setSHDX(false); QString spotter = fields.at(2); spotter.remove(':'); spot.setSpotter(spotter.trimmed()); if (doubleClick) freq.fromQString(fields.at(3), MHz); else freq.fromQString(fields.at(3), KHz); if (freq.isValid()) { //qDebug() << Q_FUNC_INFO << ": Freq is Valid"; spot.setFrequency(freq); spot.setDXCall(fields.at(4)); QString aux = fields.last(); aux.chop(1); QTime time = QTime::fromString(aux,"HHmm"); QDateTime datetime = QDateTime::currentDateTime(); datetime.setTime(time); spot.setDateTime(datetime); aux.clear(); int i; for (i = 5; i <= fields.count()-2; i++) { aux = aux + fields.at(i) + " "; } spot.setComment(aux.trimmed()); } else return spot; } // Check if the QSO is comming from sh/dx freq.fromQString(fields.at(0), KHz); if (freq.isValid()) { // Coming from SH/DX //qDebug() << Q_FUNC_INFO << ": - Valid Freq"; spot.setSHDX(true); spot.setFrequency(freq); spot.setDXCall(fields.at(1)); QString spotter = fields.last(); spotter.remove("<"); spot.setSpotter(spotter); QString aux = (fields.last()); aux.chop(1); QTime time; time.fromString(aux,"HHmm"); QDateTime datetime; datetime.setTime(time); QDate date; aux = fields.at(fields.count()-2); date.fromString(aux, "DD-MMM-yyyy"); datetime.setDate(date); spot.setDateTime(datetime); aux.clear(); int i; for (i = 4; i <= fields.count()-2; i++) { aux = aux + fields.at(i) + " "; } spot.setComment(aux.trimmed()); return spot; } // Check if the QSO is comming from a double click return spot; } void DXClusterWidget::setDXClusterServer(const QString &clusterToConnect, const int portToConnect) { //qDebug() << Q_FUNC_INFO << clusterToConnect << ":" << portToConnect; server = clusterToConnect; port = quint16(portToConnect); if ((server.length()< 3) || (port <= 0)) { server = "dxfun.com"; port = 8000; } //qDebug() << Q_FUNC_INFO << server << ":" << port; } void DXClusterWidget::setDXMarathon (const bool _enable) { //qDebug() << Q_FUNC_INFO; showDxMarathon = _enable; } void DXClusterWidget::setSaveSpots (const bool _enable) { //qDebug() << Q_FUNC_INFO; saveSpots = _enable; } bool DXClusterWidget::openFile() { //qDebug() << Q_FUNC_INFO; 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; } return true; } void DXClusterWidget::slotRightButton(const QPoint& pos) { //qDebug() << Q_FUNC_INFO; Q_UNUSED(pos); //int row = (dxClusterListWidget->indexAt(pos)).row(); //qDebug() << Q_FUNC_INFO << " row: " << QString::number(row); QListWidgetItem * item = dxClusterListWidget->currentItem(); DXSpot spot = readItem(((item->data(0)).toString()).simplified()); if ((spot.isValid()) && (spot.getClickStatus() == RightClick) ) { rightButtonFromLogMenu(spot); } } void DXClusterWidget::rightButtonFromLogMenu(const DXSpot &_spot) { // This function creates the context menu //qDebug() << Q_FUNC_INFO; DXSpot spot = _spot; checkQRZCOMFromLogAct->setData (spot.getDxCall()); QMenu menu(this); menu.addAction(checkQRZCOMFromLogAct); menu.exec(QCursor::pos()); } void DXClusterWidget::slotCheckQRZCom() { //qDebug() << Q_FUNC_INFO; QString _c = checkQRZCOMFromLogAct->data ().toString (); util->openQrzcom (_c); } /* void DXClusterWidget::rightButtonFromLogMenu(const int trow) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(trow); int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); } */ void DXClusterWidget::saveSpot(const QString &_spot) { //qDebug() << Q_FUNC_INFO << ": " << _spot ; if (!saveSpots) { //qDebug() << "DXClusterWidget::saveSpot: Not saving"; return; } if (!openFile()) return; //qDebug() << "DXClusterWidget::saveSpot: File Open"; QTextStream out(saveSpotsFile); out << util->getDateTimeSQLiteStringFromDateTime(QDateTime::currentDateTime()) << " - " << _spot.simplified().toUtf8(); out << Qt::endl; saveSpotsFile->close(); } void DXClusterWidget::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); QString aux = settings.value("DXClusterServerToUse").toString (); if (aux.contains(':')) { setDXClusterServer((aux.split(':', QT_SKIP)).at(0), ((aux.split(':', QT_SKIP)).at(1)).toInt()); } //qDebug() << Q_FUNC_INFO << " - END"; } /* void DXClusterWidget::TESTADDSPOT() { //qDebug() << "DXClusterWidget::TESTADDSPOT " ; ; // 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() << Q_FUNC_INFO; spotColor = color; setText(spot); // Experimenting with fonts for the cluster QFont f("Helvetica"); f.setFixedPitch(true); setFont(f); } dxClusterSpotItem::~dxClusterSpotItem() { //qDebug() << Q_FUNC_INFO; } klog-2.4.1/dxcluster/dxspot.h0000644000175000017500000000555015003153303015137 0ustar develdevel#ifndef KLOG_CLUSTER_DXSPOT_H #define KLOG_CLUSTER_DXSPOT_H /*************************************************************************** dxspot.h - description ------------------- begin : Apr 2024 copyright : (C) 2024 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 DXSpot. */ #include #include #include "../klogdefinitions.h" #include "../frequency.h" class DXSpot { friend class tst_DXSpot; public: DXSpot(); //DXSpot(DXSpot *_other); DXSpot(const DXSpot& other); ~DXSpot(); void operator=(DXSpot const &_other); void clear(); bool isValid (); void setDXCall(const QString &c); QString getDxCall (); void setSpotter(const QString &c); QString getSpotter(); void setComment(const QString &c); QString getComment(); void setDateTime(const QDateTime &d); QDateTime getDateTime(); void setClickStatus(const MouseClicks &_s ); MouseClicks getClickStatus(); void setFrequency(Frequency f); Frequency getFrequency(); void setSHDX(bool _shdx); // To know if the spot arrived from the dxcluster or was requested with a sh/dx bool getSHDX(); signals: private: QString dxcall; Frequency freq; QString spotter; QString comment; QDateTime dateTime; bool shdx; MouseClicks clickStatus; }; #endif // KLOG_CLUSTER_DXSPOT_H klog-2.4.1/dxcluster/dxclusterassistant.h0000644000175000017500000000560415003153303017565 0ustar develdevel#ifndef KLOG_CLUSTER_DXCLUSTERASSISTANT_H #define KLOG_CLUSTER_DXCLUSTERASSISTANT_H /*************************************************************************** dxclusterassistant.h - description ------------------- begin : mar 2024 copyright : (C) 2024 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 widget will show the DX-Cluster assistant // The class shows an ordered list of available spots that are available now and the // associated freq/mode. // Info is coming from the cluster and ordered taking into account dxcc status: // confirmed/worked/needed/ATNO or even other factors TBD. #include #include "../global.h" #include "../klogdefinitions.h" #include "../utilities.h" #include "../frequency.h" class Frequency; struct proposedQSOs { // Used to pass a list of data from Awards to dxccstatuswidget QString call; Frequency freq; int priority; QSOStatus status; }; class DXClusterAssistant : public QWidget { Q_OBJECT public: explicit DXClusterAssistant(const QString &_parentFunction, QWidget *parent = nullptr); ~DXClusterAssistant(); bool init(); void newDXClusterSpot(proposedQSOs _q); //void newDXClusterSpot(const QString &_call, const QSOStatus _status, double _freq); signals: private: bool createUI(); void addCall(); QString getStringFromStatus(QSOStatus _s); QTableWidget *tableWidget; QHeaderView *hv, *hh; QList list; }; #endif // KLOG_CLUSTER_DXCLUSTERASSISTANT_H klog-2.4.1/searchmodel.cpp0000644000175000017500000001600315003153303014415 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(Awards *awards, QObject *parent): QSqlRelationalTableModel(parent), award(awards) // Correctly initialize 'award' instead of 'awards' { //qDebug() << "SearchModel::SearchModel " ; dataProxy = awards->dataProxy; 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()) ; //qDebug() << "SearchModel::SearchModel - END" ; } SearchModel::~SearchModel() { //delete(dataProxy); //delete(award); } 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); //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" ; 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(); //qDebug() << "SearchModel::createSearchModel - columns: " << QString::number(rec.count()); 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; setFilter(_st); select(); //qDebug() << "SearchModel::setFilterString: SelectStatement: " << selectStatement (); } void SearchModel::update() { select(); } void SearchModel::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // 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 ) { EntityStatus _entityStatus; _entityStatus.dxcc = index.siblingAtColumn(dxcc).data().toInt(); _entityStatus.bandId = index.siblingAtColumn(bandid).data().toInt(); _entityStatus.modeId = index.siblingAtColumn(modeid).data().toInt(); _entityStatus.logId = index.siblingAtColumn(logn).data().toInt(); return QVariant( award->getQRZDXStatusColor(_entityStatus) ); // return QVariant( QColor( Qt::red ) ); } return QVariant( QColor( Qt::black ) ); } return QSqlRelationalTableModel::data( index, role ); } klog-2.4.1/elogclublog.h0000644000175000017500000000737015003153303014101 0ustar develdevel#ifndef KLOG_ELOGCLUBLOG_H #define KLOG_ELOGCLUBLOG_H /*************************************************************************** elogclublog.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 "utilities.h" class eLogClubLog : public QObject { Q_OBJECT public: explicit eLogClubLog(); ~eLogClubLog(); void setDefaultCallsign(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); void loadSettings(); 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, appPass, 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-2.4.1/tipsdialog.h0000644000175000017500000000560115003153303013735 0ustar develdevel#ifndef KLOG_TIPSDIALOG_H #define KLOG_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 setLogLevel(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); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QLabel *tipTextQLabel; //QTextEdit *tipTextEdit; QWidget *tip; DebugLogLevel logLevel; int tipId, tipMax; QString description; }; #endif // TIPSDIALOG_H klog-2.4.1/database.cpp0000644000175000017500000072675315003153303013717 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) { Q_UNUSED(_parentClass); //qDebug() << Q_FUNC_INFO << _parentClass << " / Name = " << _DBName ; logLevel = None; constrid = 1; created = false; //qDebug() << Q_FUNC_INFO << " 001"; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " 003"; softVersion = util->getVersion(); //qDebug() << Q_FUNC_INFO << " 004"; dbName = _DBName; //qDebug() << Q_FUNC_INFO << " dbName: " << dbName ; dbVersion = DBVersionf; //qDebug() << Q_FUNC_INFO << " 005"; exe = new QueryExecutor(Q_FUNC_INFO); if (!createConnection(QString(Q_FUNC_INFO)+"1")) { //qDebug() << Q_FUNC_INFO << " 006:Could not create a connection"; return; } //qDebug() << Q_FUNC_INFO << " 010"; //qDebug() << Q_FUNC_INFO << " - connection Name: " << dbConnectionName ; //qDebug() << Q_FUNC_INFO << " - DB Name: " << db.databaseName() ; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << Q_FUNC_INFO << " - END" ; } DataBase::DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName) { Q_UNUSED(_parentClass); //qDebug() << "DataBase::DataBase2: " << _parentClass << "/" << _softVersion << " / Name = " << _DBName ; //TODO: Sometimes the DB is created without the proper calling (without passing softVersion) logLevel = None; constrid = 2; created = false; dbVersion = DBVersionf; softVersion = _softVersion; //inMemoryOnly = inmemoryonly; latestReaded = 0.0f; util = new Utilities(Q_FUNC_INFO); util->setVersion(softVersion); dbName = _DBName; if (util->getVersionDouble()>0) { if (!createConnection(QString(Q_FUNC_INFO)+"2")) return; } //qDebug() << "DataBase::DataBase: - connection Name: " << dbConnectionName ; //qDebug() << "DataBase::DataBase: - DB Name: " << db.databaseName() ; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase2: END" ; } DataBase::~DataBase() { logEvent(Q_FUNC_INFO, "Start", Debug); delete(util); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "DataBase::~DataBase" ; } QString DataBase::getSoftVersion() { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stringQuery ("SELECT MAX (softversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { logEvent(Q_FUNC_INFO, "END-1", Debug); QString aux = (query.value(0)).toString(); query.finish(); return aux; } else { query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-3", Debug); return QString(); } } float DataBase::getDBVersion() { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stringQuery ("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { logEvent(Q_FUNC_INFO, "END-1", Debug); float version = (query.value(0)).toFloat(&sqlOK); query.finish(); if (sqlOK) return version; return -1.3; } else { query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return -1.1; } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-3", Debug); return -1.0; } } /* bool DataBase::setDir(const QString &_dir) { dbDir = _dir; return true; } */ QString DataBase::getDBName() { logEvent(Q_FUNC_INFO, "Start-EndEND", Debug); return db.databaseName(); } QStringList DataBase::getColumnNamesFromTable(const QString &_tableName) { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString = "PRAGMA table_info(:table)"; query.prepare(queryString); query.bindValue(":table", _tableName); bool sqlOK = query.exec(); QStringList list; if (sqlOK) { while (query.next()) { QString columnName = query.value(1).toString(); if (!columnName.isEmpty() && columnName.toUpper() != "ID") { list << columnName; } } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); logEvent(Q_FUNC_INFO, "END", Debug); return list; } void DataBase::compress() { logEvent(Q_FUNC_INFO, "Start", Debug); //QSqlDatabase db = QSqlDatabase::database(); if (!db.open()) { /* Flawfinder: ignore */ QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text()); } else { QSqlQuery query("VACUUM;"); query.exec("VACUUM;"); } logEvent(Q_FUNC_INFO, "END", Debug); } bool DataBase::reConnect(const QString &_DBName) { logEvent(Q_FUNC_INFO, "Start", Debug); db.close(); dbName = _DBName; //qDebug() << "DataBase::reConnect: DB closed" ; //qDebug() << "DataBase::reConnect: DB: " << dbDir ; bool sqlOK = createConnection(Q_FUNC_INFO); if (!sqlOK) { // emit debugLog(Q_FUNC_INFO, "1", 7); } logEvent(Q_FUNC_INFO, "END", Debug); return sqlOK; } bool DataBase::createConnection(const QString &function, bool newDB) { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " :" << function << "-" << QString::number(dbVersion) << "/" << softVersion ; logEvent(Q_FUNC_INFO, "Start", Debug); Q_UNUSED(function); Q_UNUSED(newDB); QString stringQuery; QSqlQuery query; //qDebug() << Q_FUNC_INFO << ": check if open"; if (!db.isOpen()) { //qDebug() << Q_FUNC_INFO << ": DB NOT Opened" ; if (!db.isValid()) { //qDebug() << Q_FUNC_INFO << ": DB is not valid, let's call addDataBase" ; if (!db.isOpen()) { //qDebug() << Q_FUNC_INFO << ": DB is NOT open, let's open: connection name" << db.connectionName(); QSqlDatabase::removeDatabase("qt_sql_default_connection"); db = QSqlDatabase::addDatabase("QSQLITE"); } //qDebug() << Q_FUNC_INFO << ": Now we call setDatabaseName" ; db.setDatabaseName(dbName); //qDebug() <0); } bool DataBase::recreateTableLog() { logEvent(Q_FUNC_INFO, "Start", Debug); if (!createTableLog(false)) // Create modetemp { //qDebug() << Q_FUNC_INFO << ": CreateTableLog returned false" ; logEvent(Q_FUNC_INFO, "END-1", Debug); 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() << Q_FUNC_INFO ; /* * prefnumber (id autoincrement) * subdivision main entity (arrlid) : dxcc : 281 * subdivision main prefix : prefix : EA4 * subdivision shortname : shortname : M * subdivision name : name : Madrid * subdivision group : regionalgroup : Comunidad de Madrid * subdivisional id : regionalid : -1 (oblast for Russia) * subdivision CQ (if different) : cqz : 14 * subdivision ITU (if different) : ituz : 37 * subdivision deleted : deleted : N * subdivision start_date : start_date : N/A * subdivision end_date : end_date : N/A * */ 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, " // arrlId (281) "name VARCHAR NOT NULL, " // Madrid "shortname VARCHAR NOT NULL, " // M "prefix VARCHAR, " // EA4 "cqz INTEGER NOT NULL, " // 14 "ituz INTEGER NOT NULL, " // 37 "regionalgroup VARCHAR, " // Comunidad de Madrid "regionalid INTEGER, " // Oblast in Russia or any other Id "start_date DATETIME, " "end_date DATETIME, " "deleted VARCHAR, " "UNIQUE (id, shortname, name), " "FOREIGN KEY (cqz) REFERENCES entity (cqz), " "FOREIGN KEY (ituz) REFERENCES entity (ituz), " "FOREIGN KEY (dxcc) REFERENCES entity (dxcc) )"); QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); //qDebug() << Q_FUNC_INFO << " Dropped table: " << table ; return execQuery(Q_FUNC_INFO, stringQuery); //qDebug() << Q_FUNC_INFO << " - END" ; } bool DataBase::populateTablePrimarySubdivisions() { if (!doesEntityTablehaveData()) return false; DB_ADIF_Primary_Subdvisions_data primarySubDivisions(Q_FUNC_INFO); return primarySubDivisions.addData(); } bool DataBase::recreateTablePrimarySubdivisions() { //qDebug() << Q_FUNC_INFO ; QSqlQuery query; if (isTheTableExisting("primary_subdivisions")) { if (execQuery(Q_FUNC_INFO, "DROP TABLE primary_subdivisions")) { if (createTablePrimarySubdivisions(true)) { //qDebug() << Q_FUNC_INFO << ": primary_subdivisions table created" ; return populateTablePrimarySubdivisions(); } else { //qDebug() << Q_FUNC_INFO << ": primary_subdivisions table NOT created" ; } } else { return false;//qDebug() << Q_FUNC_INFO << ": execQuery FAILED" ; } } else { if (createTablePrimarySubdivisions(true)) { //qDebug() << Q_FUNC_INFO << ": primary_subdivisions table created" ; return populateTablePrimarySubdivisions(); } else { //qDebug() << Q_FUNC_INFO << ": primary_subdivisions table NOT created" ; } } //qDebug() << Q_FUNC_INFO << ": END FALSE" ; return false; } int DataBase::getBandIdFromName(const QString &b) { //qDebug() << Q_FUNC_INFO << ": " << b ; QString band = b.toUpper(); QString queryString = QString("SELECT id FROM band WHERE name= :band"); QSqlQuery query; query.prepare(queryString); query.bindValue(":band", b); bool sqlOK = query.exec(); if (!sqlOK) return -1; if (!query.next()) return -2; if (!query.isValid()) return -3; int v = (query.value(0)).toInt(); query.finish(); return v; } int DataBase::getModeIdFromName(const QString &b) { //qDebug() << Q_FUNC_INFO << ": " << b ; //qDebug() << Q_FUNC_INFO << ": " << b ; QString band = b.toUpper(); QString queryString = QString("SELECT id FROM mode WHERE name= :mode"); QSqlQuery query; query.prepare(queryString); query.bindValue(":mode", b); bool sqlOK = query.exec(); if (!sqlOK) return -1; if (!query.next()) return -2; if (!query.isValid()) return -3; int v = (query.value(0)).toInt(); query.finish(); return v; } int DataBase::getModeIdFromSubMode(const QString &b) { //qDebug() << Q_FUNC_INFO << ": " << b ; //qDebug() << Q_FUNC_INFO << ": " << b ; QString band = b.toUpper(); QString queryString = QString("SELECT id FROM mode WHERE submode= :submode"); QSqlQuery query; query.prepare(queryString); query.bindValue(":submode", b); bool sqlOK = query.exec(); if (!sqlOK) return -1; if (!query.next()) return -2; if (!query.isValid()) return -3; int v = (query.value(0)).toInt(); query.finish(); return v; } QString DataBase::getBandNameFromNumber(const int _n) { //qDebug() << "DataBase::getBandNameFromNumber: " << QString::number(_n) ; 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" ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-1" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-2" ; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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) ; 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().text(), query.lastQuery()); query.finish(); } query.next(); //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) <<" - " << isValidMode((query.value(0)).toString(), _tmp) ; if ( query.isValid() ) { //qDebug() << "DataBase::getModeNameFromNumber: ------ END-1" ; 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() ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid Mode: " << (query.value(0)).toString() ; return QString(); } */ } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid record" ; //qDebug() << "DataBase::getModeNameFromNumber: ------ END-2" ; query.finish(); return QString(); } } QString DataBase::getSubModeNameFromNumber(const int _n, bool _tmp) { //qDebug() << "DataBase::getSubModeNameFromNumber: " << QString::number(_n) ; 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() ; if (sqlOk) { if (query.next()) { if ( query.isValid() ) { if ( isValidMode((query.value(0)).toString(), _tmp) ) { //qDebug() << "DataBase::getSubModeNameFromNumber: RETURN: " << (query.value(0)).toString() ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getSubModeNameFromNumber: NO valid mode - END" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not valid - END" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not next - END" ; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << "DataBase::getSubModeNameFromNumber: SQL FALSE - END" ; query.finish(); return QString(); } //qDebug() << "DataBase::getSubModeNameFromNumber: - END-X" ; //query.finish(); //return QString(); } bool DataBase::isValidBand (const QString &b) { //qDebug() << Q_FUNC_INFO << ": " << b ; //qDebug() << Q_FUNC_INFO << ": bandId: " << b ; //qDebug() << "DataBase::isValidBand: " << QString::number(getBandIdFromName(b)); return (getBandIdFromName(b)>0); /* 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().text(), query.lastQuery()); query.finish(); } //emit debugLog(Q_FUNC_INFO, "3", 7); return false; */ } bool DataBase::isValidMode (const QString &b, const bool _tmp) { //qDebug() << Q_FUNC_INFO << ": " << b ; if (b.length()<2) { //qDebug() << Q_FUNC_INFO << ": (length<2) FALSE" ; //emit debugLog(Q_FUNC_INFO, "1", 7); return false; } if (!_tmp) return (getModeIdFromSubMode(b)>0); QString stringQuery = QString("SELECT id FROM modetemp WHERE submode= :submode"); QSqlQuery query; query.bindValue(":submode", b); query.prepare(stringQuery); bool sqlOK = query.exec(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); } query.next(); return query.isValid(); } bool DataBase::isValidBandNumber (const int b) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(b); return isValidBand(getBandNameFromNumber(b)); } bool DataBase::isValidModeNumber (const int b) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(b); return isValidMode(getModeNameFromNumber(b, false), false); } int DataBase::getBandIdFromFreq(const QString &fr) { //qDebug() << Q_FUNC_INFO << ": " << fr ; //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() << Q_FUNC_INFO << ": Query: " << query.lastQuery() ; if (sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query OK" ; query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << ": Query OK - END" ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getBandIdFromFreq: Valid NOK - END" ; query.finish(); return -1; } } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK" ; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() ; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() ; if (query.lastError().isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error VALID" ; } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error NOT-VALID" ; } queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); queryErrorManagement(Q_FUNC_INFO, query.lastError().text(), query.lastError().text(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromFreq: END-X" ; //query.finish(); //return -3; } bool DataBase::isThisFreqInBand(const QString &b, const QString &fr) {//Freq should be in MHz //qDebug() << Q_FUNC_INFO << ": " << b << "/" << fr ; if (b.length()<2) { //qDebug() << Q_FUNC_INFO << ": returning false" ; return false; } int bandNf = getBandIdFromFreq(fr); int bandN = getBandIdFromName(b); //qDebug() << Q_FUNC_INFO << ": (b/f)" << QString::number(bandN) << "/" << QString::number(bandNf) ; if (bandNf == bandN) { //qDebug() << Q_FUNC_INFO << ": OK " << b << "/" << fr ; return true; } else { //qDebug() << Q_FUNC_INFO << ": NOK " << b << "/" << fr ; //emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } bool DataBase::unMarkAllQSO() { //qDebug() << Q_FUNC_INFO; QString stringQuery = QString("UPDATE log SET marked = 'N' WHERE 1"); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateIfNeeded() { //qDebug() <= 1.0 we can continue" ; if (latestReaded >= dbVersion) { // DB is updated, no update is needed //qDebug() << Q_FUNC_INFO << " - DB updated (no need to update anything!) " ; return true; } else { // DB is outdated. We need to update!! //qDebug() << Q_FUNC_INFO << " - DB outdated... upgrade starts now! " ; 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() << Q_FUNC_INFO << " - FALSE - CHECK IF SEEN, shoud not be here! - END " ; //emit debugLog(Q_FUNC_INFO, "2", 7); return false; //break; } } // If the DB needs to be updated... we update it! :-) //qDebug() << Q_FUNC_INFO << " - END!" ; return true; } void DataBase::backupB4Update() { //qDebug() << Q_FUNC_INFO << " - Start" ; 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() << Q_FUNC_INFO << " - END" ; } void DataBase::logBackup() { //qDebug() << Q_FUNC_INFO << " - Start" ; QFile DBFile(util->getKLogDBFile()); QString newFile = util->getKLogDBBackupFile(); bool copied = DBFile.copy(newFile); //qDebug() << Q_FUNC_INFO << " copy: " << newFile ; QMessageBox msgBox; msgBox.setWindowTitle("KLog DB backup"); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); if (copied) { //qDebug() << Q_FUNC_INFO << " - DB backup was OK" ; 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() << Q_FUNC_INFO << " - DB backup was NOK" ; 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(); } //qDebug() << Q_FUNC_INFO << " - END" ; } bool DataBase::createTheBandQuickReference() { /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash QHash freqBandIdHash; */ //qDebug() << "DataBase::createTheBandQuickReference: " ; QString st = "NULL"; int in = 0; QString stringQuery = QString("SELECT id, name, lower FROM band"); QString fr = QString(); Frequency ff; bandIDHash.clear(); IDBandHash.clear(); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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(); ff.fromDouble((query.value(2)).toDouble()); bandIDHash.insert(st, in ); IDBandHash.insert(in, st); freqBandIdHash.insert(in, fr); ffreqBandIdHash.insert(in, ff); //qDebug() << Q_FUNC_INFO << ": " << st <<"/" << QString::number(in); } else { //qDebug() << Q_FUNC_INFO << " Query not valid -'RETURN FALSE - END" ; // 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() << Q_FUNC_INFO << " Go for the next one!" ; } query.finish(); //qDebug() << Q_FUNC_INFO << " - END" ; return true; } bool DataBase::createTheModeQuickReference() { /* KEY Value QHash modeIDHash; QHash IDModeHash */ //qDebug() << Q_FUNC_INFO << ": " ; if (getDBVersion()<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().text(), 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() << Q_FUNC_INFO << ": " << st <<"/" << QString::number(in); } else { //qDebug() << Q_FUNC_INFO << ": Query not valid - END" ; //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() << Q_FUNC_INFO << " - END" ; return true; } bool DataBase::createBandModeMaps() { //qDebug() << Q_FUNC_INFO ; bool b = false; bool m = false; //return (b && m); if (isTheDBCreated()) { b = createTheBandQuickReference(); m = createTheModeQuickReference(); //qDebug() << Q_FUNC_INFO << " - isTheDbCreated TRUE" ; if (!b) { //emit debugLog(Q_FUNC_INFO, "1", 7); } if (!m) { //emit debugLog(Q_FUNC_INFO, "2", 7); } //qDebug() << Q_FUNC_INFO << " END 1" ; return (b && m); } else { //qDebug() << Q_FUNC_INFO << " - isTheDbCreated FALSE" ; //emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //return false; //qDebug() << Q_FUNC_INFO << " - END" ; } Frequency DataBase::getFreqFromBandId(const int _i) { //qDebug() << Q_FUNC_INFO ; if (ffreqBandIdHash.contains(_i)) { //qDebug() << Q_FUNC_INFO << " OK END" ; return ffreqBandIdHash.value(_i); } return Frequency(0); } /* int DataBase::getLogTypeNumber(const QString &_logType) { //qDebug() << "DataBase::getLogTypeNumber: " << _logType ; 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().text(), 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) ; 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().text(), 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() << Q_FUNC_INFO ; if (requiresManualUpgrade()) { //qDebug() << Q_FUNC_INFO << " requires" ; exit(1); //return false; } return updateTo026(); } 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 //qDebug() << "DataBase::requiresManualUpgrade - ver: " << QString::number(ver) ; if (getDBVersion() >= 0.007f) { //qDebug() << "DataBase::requiresManualUpgrade false" ; return false; } else { //qDebug() << "DataBase::requiresManualUpgrade true" ; 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) ; bool IAmIn003 = false; bool IAmIn002 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); 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() ; //qDebug() << "DataBase::updateTo004: latestRead: " << QString::number(latestReaded) ; bool IAmIn004 = false; bool IAmIn003 = false; QString stringQuery = QString(); QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion(); if (latestReaded >= 0.004f) { //qDebug() << "DataBase::updateTo004: - I am in 004" ; return true; } else { //qDebug() << "DataBase::updateTo004: - I am not in 004" ; IAmIn004 = false; } while (!IAmIn004) { //qDebug() << "DataBase::updateTo004: - And I am not in 004 nor ErrorUpdating" ; while (!IAmIn003) { //qDebug() << "DataBase::updateTo004: - And I am not in 003" ; //IAmIn002 = updateTo002(); IAmIn003 = true; } //qDebug() << "DataBase::updateTo004: - And I am in 003" ; sqlOk = updateDBVersion(softVersion, "0.004"); //qDebug() << "DataBase::updateTo004: - Update Version" ; if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo004: - Update OK" ; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE award_enumeration"); } else { // Version not updated //qDebug() << "DataBase::updateTo004: - Update NOK" ; } //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" ; IAmIn004 = true; } if (IAmIn004) { //qDebug() << "DataBase::updateTo004: - Return... TRUE" ; } else { //qDebug() << "DataBase::updateTo004: - Return... FALSE" ; } //qDebug() << "DataBase::updateTo004: UPDATED OK!" ; return IAmIn004; } bool DataBase::updateTo005() {// Updates the DB to 0.0.5 //qDebug() << "DataBase::updateTo005: latestRead: " << getDBVersion() ; 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(); if (latestReaded >= 0.005f) { //qDebug() << "DataBase::updateTo005 - Already in 005" ; return true; } else { //qDebug() << "DataBase::updateTo005 - 005 update false" ; IAmIn005 = false; } while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 005" ; while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 004" ; IAmIn004 = updateTo004(); } //qDebug() << "DataBase::updateTo005 - I am in 004" ; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - 005 update false2" ; // 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" ; sqlOk = execQuery(Q_FUNC_INFO, "DROP table logs"); sqlOk = createTableLogs(true); if (!sqlOk) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << "DataBase::updateTo005 - logs table do not created" ; } 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().text(), query.lastQuery()); //showError(QObject::tr("QSOs not updated to main log")); //qDebug() << "DataBase::updateTo005 - QSOs not updated to main log" ; } 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().text(), query.lastQuery()); //showError(QObject::tr("New Log not created")); //qDebug() << "DataBase::updateTo005 - New Log not created" ; //qDebug() << "DataBase::clearLog: Log deleted FAILED" ; } } IAmIn005 = true; } else { //qDebug() << "DataBase::updateTo005 - recreateContestData FAILED" ; ErrorUpdating = true; } } else { // Version not updated //qDebug() << "DataBase::updateTo005 - 005 update false6" ; ErrorUpdating = true; } } //qDebug() << "DataBase::updateTo005 - 005 updated 3" ; //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!! " ; //qDebug() << "DataBase::updateTo005: UPDATED OK!" ; return IAmIn005; } bool DataBase::recreateSatelliteData() { //qDebug() << "DataBase::recreateSatelliteData" ; QSqlQuery query; if (isTheTableExisting("satellites")) { if (execQuery(Q_FUNC_INFO, "DROP TABLE satellites")) { if (createTableSatellites(true)) { //qDebug() << Q_FUNC_INFO << ": SAT table created" ; return populateTableSatellites(true); } else { //qDebug() << Q_FUNC_INFO << ": SAT table NOT created" ; } } else { //qDebug() << Q_FUNC_INFO << ": execQuery FAILED" ; } } else { if (createTableSatellites(true)) { //qDebug() << Q_FUNC_INFO << ": SAT table created" ; return populateTableSatellites(true); } else { //qDebug() << Q_FUNC_INFO << ": SAT table NOT created" ; } } //qDebug() << Q_FUNC_INFO << ": END FALSE" ; return false; } bool DataBase::recreateContestData() { //qDebug() << "DataBase::recreateContestData" ; 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" ; 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" ; if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" ; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" ; return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } } else { if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" ; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" ; return false; } } //qDebug() << "DataBase::recreateSupportedContest - FALSE end" ; return false; } bool DataBase::recreatePropModes() { //qDebug() << "DataBase::recreatePropModes" ; if (isTheTableExisting("prop_mode_enumeration")) { //qDebug() << "DataBase::recreatePropModes: Table Exist" ; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE prop_mode_enumeration"); if (sqlOk) { //qDebug() << "DataBase::recreatePropModes SQLOK" ; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" ; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" ; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" ; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-1" ; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << "DataBase::recreatePropModes - prop_mode_enumeration table has not been dropped" ; //qDebug() << "DataBase::recreatePropModes : Table creation FAILED" ; } } else { //qDebug() << "DataBase::recreatePropModes: Table does NOT Exist" ; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" ; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" ; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" ; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-2" ; } } //qDebug() << "DataBase::recreatePropModes - FALSE end" ; 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() << Q_FUNC_INFO << " - Start: " << QString::number(real); QString stringQuery = QString(); //QSqlQuery query; if (real) { //qDebug() << Q_FUNC_INFO << " - logs" ; stringQuery = "CREATE TABLE logs" ; } else { //qDebug() << Q_FUNC_INFO << " - logstemp" ; 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() << Q_FUNC_INFO << " - END" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::createTablePropModes() { //qDebug() << "DataBase::createTablePropModes" ; 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" ; 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" ; //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" ; return true; } bool DataBase::populateTableSupportedContest() { //qDebug() << "DataBase::populateTableSupportedContest" ; // 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" ; 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" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableModePSK(bool NoTmp) { QStringList modes = {"8PSK125", "8PSK125F", "8PSK125FL", "8PSK250", "8PSK250F", "8PSK250FL", "8PSK500", "8PSK500F", "8PSK1000", "8PSK1000F", "8PSK1200F", "FSK31", "PSK10", "PSK31", "PSK63", "PSK63F", "PSK63RC4", "PSK63RC5", "PSK63RC10", "PSK63RC20", "PSK63RC32", "PSK125", "PSK125C12", "PSK125R", "PSK125RC10", "PSK125RC12", "PSK125RC16", "PSK125RC4", "PSK125RC5", "PSK250", "PSK250C6", "PSK250R", "PSK250RC2", "PSK250RC3", "PSK250RC5", "PSK250RC6", "PSK250RC7", "PSK500", "PSK500C2", "PSK500C4", "PSK500R", "PSK500RC2", "PSK500RC3", "PSK500RC4", "PSK800C2", "PSK800RC2", "PSK1000", "PSK1000C2", "PSK1000R", "PSK1000RC2", "PSKAM10", "PSKAM31", "PSKAM50", "PSKFEC31", "QPSK31", "QPSK63", "QPSK125", "QPSK250", "QPSK500", "SIM31" }; QString table; if (NoTmp) { table = "mode"; } else { table = "modetemp"; } QString aux; foreach (aux, modes) { if (!execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('%2', 'PSK', 'DG', '1')").arg(table).arg(aux))) return false; } return true; } bool DataBase::populateTableMode(const bool NoTmp) { //qDebug() << "DataBase::populateTableMode" ; //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().text(), query.lastQuery()); //qDebug() << "DataBase::populateTableMode: Mode table population FAILED" ; //errorCode = query.lastError().text(); } else { //qDebug() << "DataBase::populateTableMode: Mode table population OK" ; } if (!populateTableModePSK(NoTmp)) return false; 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 ('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 ('C4FM', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DMR', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FREEDV', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('M17', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA HF', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA SATELLITE', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA FM 1200', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA FM 9600', 'DYNAMIC', '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 ('DOM-M', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM4', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM5', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM8', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM11', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM16', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM22', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM44', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOM88', '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 ('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 ('HELLX5', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELLX9', '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 ('JTMS', 'MFSK', 'DG', '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 ('MFSK64L', '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 ('MFSK128L', '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 ('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 ('SLOWHELL', '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 ('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 ('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 ('THRBX1', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX2', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX4', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THROB1', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THROB2', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THROB4', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR-M', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR4', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR5', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR8', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR11', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR16', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR22', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR25X4', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR50X1', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR50X2', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR100', '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 ('NAVTEX', 'TOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SITORB', '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" ; 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" ; // 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; //qDebug() << Q_FUNC_INFO << " - Dropped table: " << 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" ; //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" ; return true; } bool DataBase::createTableEntity(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << Q_FUNC_INFO << " - Start"; QString table = "entity"; if (!NoTmp) table = "entitytemp"; //TODO: To add some columns in this the table to mark if worked/confirmed/band/Mode QString stringQuery = QStringLiteral( "CREATE TABLE %1 (" "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 REAL 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(id) )").arg(table); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } QStringList indexQueries = { QStringLiteral("CREATE INDEX idx_%1_mainprefix ON %1 (mainprefix)").arg(table), QStringLiteral("CREATE INDEX idx_%1_cqz ON %1 (cqz)").arg(table), QStringLiteral("CREATE INDEX idx_%1_ituz ON %1 (ituz)").arg(table), QStringLiteral("CREATE INDEX idx_%1_continent ON %1 (continent)").arg(table) }; for (const QString &indexQuery : indexQueries) { if (!execQuery(Q_FUNC_INFO, indexQuery)) { return false; } } return true; } bool DataBase::createTableBand(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << Q_FUNC_INFO << " - Start" ; 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() << Q_FUNC_INFO << " - END" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::syncLogQSOsOnBandTableChange() { //qDebug() << Q_FUNC_INFO ; 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().text(), 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 ; if (!query.exec(stringQuery)) { query.finish(); return false; } } } query.finish (); //qDebug() << Q_FUNC_INFO << " - END" ; return true; } bool DataBase::populateTableBand(const bool NoTmp) { // Cabrillo definition: http://wwrof.org/cabrillo/cabrillo-specification-v3/ //qDebug() << "DataBase::populateTableBand" ; 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 ('SUBMM', '300000', '7500000', 'SUBMM')").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" ; return true; } bool DataBase::populatePropagationModes() { //qDebug() << "DataBase::populatePropagationModes" ; //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 ('GWAVE', 'Ground Wave')")); 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 ('LOS', 'Line of Sight')")); 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" ; return true; } bool DataBase::populateContestData() { //qDebug() << "DataBase::populateContestData" ; // 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" ; return true; } bool DataBase::howManyQSOsInLog(const int i) { //qDebug() << "DataBase::howManyQSOsInLog" ; 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" ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::howManyQSOsInLog END-1" ; query.finish(); return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::howManyQSOsInLog END-2" ; return false; } //query.finish(); //return -2; } bool DataBase::updateTo006() {// Updates the DB to 0.0.6 //qDebug() << Q_FUNC_INFO << ": latestRead: " << getDBVersion() ; QString stringQuery = QString(); double latestReaded = getDBVersion(); if (latestReaded >= 0.006f) return true; if (!updateTo005()) return false; if (!recreatePropModes()) return false; if (!updateTableLog(6)) return false; if (!createTableBand(false)) return false; if (!populateTableBand(false)) return false; if (!updateBandIdTableLogToNewOnes()) return false; if (!execQuery(Q_FUNC_INFO, "DROP TABLE band")) return false; if (!execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band")) return false; if (!updateTheModeTableAndSyncLog()) return false; if (!createTableClubLogStatus()) return false; if (!populateTableClubLogStatus()) return false; return updateDBVersion(softVersion, "0.006"); } bool DataBase::updateTableLog(const int _version) { //qDebug() << Q_FUNC_INFO << QString::number(_version); // _version helps to identify which update we need to run if ((_version!=6) && (_version!=7)) return false; QString queryString; QString oldFields; // This variable holds the list of fields BEFORE the update. // Updates are usually done to add ADIF fields to the DB. // We need to move all the table except the new values that are included in this release: switch (_version) { case 6: oldFields = "qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, 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, marked, lognumber"; break; case 7: oldFields = "qso_date, call, rst_sent, rst_rcvd, bandid, modeid, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, award_submitted, award_granted, band_rx, checkcontest, class, clublog_qso_upload_date, clublog_qso_upload_status, cont, contacted_op, contest_id, country, credit_submitted, credit_granted, darc_dok,distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd,eqsl_qsl_sent,fists, fists_cc, force_init, freq, freq_rx, gridsquare, hrdlog_qso_upload_date, hrdlog_qso_upload_status, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_antenna, my_city, my_cnty, my_country, 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_postal_code, my_rig, my_sig, my_sig_info, my_sota_ref, my_state, my_street, my_usaca_counties, my_vucc_grids, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qrzcom_qso_upload_date, qrzcom_qso_upload_status, qslmsg, qslrdate, qslsdate, qsl_rcvd,qsl_sent, qsl_rcvd_via, qsl_sent_via,qsl_via, qso_complete, qso_random, qth, region, rig, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, silent_key,skcc, sota_ref, srx_string, srx, stx_string, stx, state, station_callsign, submode, swl, uksmg, usaca_counties, ve_prov, vucc_grids, ten_ten, tx_pwr, web, qso_date_off, marked, lognumber"; break; default: // We should never reach this value but if we reach it, weexit the function return false; break; } queryString = QString ("INSERT INTO logtemp (%1) SELECT %2 FROM log").arg(oldFields).arg(oldFields); // Everything is ready, we can: // - create the temp table for log, // - move the data from the old table to the new one, taking into account the version // - rename drop the old table // - rename the new table temp as the regular log table //qDebug() << Q_FUNC_INFO << " - Creating the table logtemp"; if (!createTableLog(false)) return false; //qDebug() << Q_FUNC_INFO << " - Creation went OK, lets move the data to the logtemp table"; if (!execQuery(Q_FUNC_INFO, queryString)) return false; //qDebug() << Q_FUNC_INFO << " - Data movement went OK, lets drop old log table"; if (!execQuery(Q_FUNC_INFO, "DROP TABLE log")) return false; //qDebug() << Q_FUNC_INFO << " - Deletion of the table went OK, lets move the logtemp to log"; queryString = "ALTER TABLE logtemp RENAME TO log" ; return execQuery(Q_FUNC_INFO, queryString); } bool DataBase::createTableClubLogStatus() { //qDebug() << "createTableClubLogStatus" ; 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() << Q_FUNC_INFO; QString queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('Y', 'Uploaded')"; if (!execQuery(Q_FUNC_INFO, queryString)) return false; queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('N', 'Do not upload')"; if (!execQuery(Q_FUNC_INFO, queryString)) return false; queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('M', 'Modified')"; return execQuery(Q_FUNC_INFO, queryString); } //TODO: Awards are deprecated bool DataBase::createAndPopulateAwardEnumeration() { QString stringQuery = QString("CREATE TABLE award_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "name VARCHAR(15) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('AJA')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('CQDX')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('CQDXFIELD')")) { return false; } return execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('DXCC')"); } bool DataBase::createAndPopulateARRLSectEnumeration() { QString stringQuery = QString("CREATE TABLE arrl_sect_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(2) NOT NULL, " "name VARCHAR(30) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) return false; if (!execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AL', 'Alabama')")) return false; /* execQuery("); execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AB', 'Alberta')"); execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AR', 'Arkansas')"); execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AZ', 'Arizona')"); execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('BC', 'British Columbia')"); execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('CO', 'Colorado')"); */ //The following must be the last one return execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AK', 'Alaska')"); return false; } bool DataBase::createAndPopulateQSO_CompleteEnumeration() { QString stringQuery = QString("CREATE TABLE qso_complete_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(3) NOT NULL, " "name VARCHAR(10) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('Y', 'Yes')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('N', 'No')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('NIL', 'Not heard')")) { return false; } return execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('?', 'Uncertain')"); } bool DataBase::createAndPopulateAnt_path_enumeration() { QString stringQuery = QString("CREATE TABLE ant_path_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('G', 'GrayLine')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('O', 'Other')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('S', 'ShortPath')")) { return false; } return execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('L', 'LongPath')"); } bool DataBase::createAndPopulateContinents() { //qDebug() << Q_FUNC_INFO ; QString stringQuery = QString("CREATE TABLE continent (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(2) NOT NULL, " "name VARCHAR(15) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AF', 'Africa')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AS', 'Asia')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('EU', 'Europe')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('NA', 'North America')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('OC', 'Oceania')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('SA', 'South America')")) { return false; } return execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AN', 'Antartica')"); } bool DataBase::createAndPopulateQSLSentRecStatus() { //qDebug() << Q_FUNC_INFO << " - Start"; QString stringQuery = QString("CREATE TABLE qsl_rec_status (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } stringQuery = QString("CREATE TABLE qsl_sent_status (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); if (!execQuery(Q_FUNC_INFO, stringQuery)) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('Y', 'Yes')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('N', 'No')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('R', 'Requested')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('Q', 'Queued')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('I', 'Ignore/Invalid')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('Y', 'Yes')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('N', 'No')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('R', 'Requested')")) { return false; } if (!execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('I', 'Ignore/Invalid')")) { return false; } return execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('V', 'Validated')"); } bool DataBase::recreateTableEntity() { //qDebug() << Q_FUNC_INFO << " - Start"; QString stringQuery; if (!createTableEntity(false)) return false; //qDebug() << Q_FUNC_INFO << " - 10"; 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"); if (!execQuery(Q_FUNC_INFO, stringQuery)) return false; //qDebug() << Q_FUNC_INFO << " - 30"; stringQuery = "DROP TABLE entity"; if (!execQuery(Q_FUNC_INFO, stringQuery)) return false; //qDebug() << Q_FUNC_INFO << " - 30"; stringQuery = "ALTER TABLE entitytemp RENAME TO entity"; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateTableLogs() { //qDebug() << Q_FUNC_INFO ; QString stringQuery; if (!createTableLogs(false)) // Now we have a temp entity table with the correct format return false; //qDebug() << Q_FUNC_INFO << ": Table logstemp created!" ; // 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"); if (!execQuery(Q_FUNC_INFO, stringQuery)) return false; stringQuery = "DROP TABLE logs"; if (!execQuery(Q_FUNC_INFO, stringQuery)) return false; stringQuery = "ALTER TABLE logstemp RENAME TO logs"; return execQuery(Q_FUNC_INFO, stringQuery); } 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() << Q_FUNC_INFO ; 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; 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().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": FALSE END" ; 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() << Q_FUNC_INFO << ": (STEP-1) modeFound (numb): " << QString::number(modeFound) ; modetxt = getModeNameFromNumber(modeFound, false); //STEP-2 //qDebug() << Q_FUNC_INFO << ": (STEP-2) mode found (txt): " << modetxt ; //TODO The following query can be executed in: getModeIdFromSubMode() sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(modetxt); // STEP-3 QSqlQuery query2; sqlOk2 = query2.exec(sq); if (sqlOk2) { //qDebug() << Q_FUNC_INFO << ": (STEP-3) sqlOK2 TRUE" ; 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() << Q_FUNC_INFO << ": (STEP-4) ID: " << QString::number(id) << " updated to: " << QString::number(modeFound) <<"/"<< modetxt ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << Q_FUNC_INFO << ": (STEP-4) ID: " << QString::number(id) << " NOT updated-2" ; } } else { query2.finish(); //qDebug() << Q_FUNC_INFO << ": (STEP-3) query2 not valid " ; } } else { //qDebug() << Q_FUNC_INFO << ": query2 not next " ; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << Q_FUNC_INFO << ": ID: " << QString::number(id) << " NOT updated-1" ; } } 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() << Q_FUNC_INFO << ": FALSE END 2" ; query.finish(); return false; } //qDebug() << Q_FUNC_INFO << ": END" ; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << ": FALSE END 3" ; query.finish(); return false; } //qDebug() << Q_FUNC_INFO << ": CHECK IF this is seen - END" ; } bool DataBase::updateBandIdTableLogToNewOnes() { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: " ; 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; 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().text(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END" ; 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 ; QSqlQuery query2; 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 ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateBandIdTableLogToNewOnes - QSOs not updated to main log" ; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not valid " ; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not next " ; } 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" ; } } 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" ; return false; } //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: END OK" ; return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 3" ; return false; } } /* bool DataBase::updateModeIdTableLogToNewOnes() { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: " ; 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 ; 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 ; } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - QSOs not updated to main log" ; errorCode = query3.lastError().nativeErrorCode(); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - query error: " << QString::number(errorCode) ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastQuery: " << query3.lastQuery() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-data: " << query3.lastError().databaseText() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-driver: " << query3.lastError().driverText() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-n: " << QString::number(query3.lastError().nativeErrorCode() ) ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not valid " ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not next " ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" ; } } 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" ; return true; } else { return false; } } */ bool DataBase::updateTo007() {// Updates the DB to 0.0.7 //qDebug() << "DataBase::updateTo007: latestRead: " << getDBVersion() ; bool IAmIn007 = false; bool IAmIn006 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion(); bool sqlOk = false; if (latestReaded >= 0.007f) { //qDebug() << "DataBase::updateTo007: - I am in 007" ; return true; } else { //qDebug() << "DataBase::updateTo007: - I am not in 007" ; IAmIn007 = false; } while (!IAmIn007 && !ErrorUpdating) { while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo007: - And I am not in 006" ; IAmIn006 = updateTo006(); } //qDebug() << "DataBase::updateTo007: - And I am in 006!!!!" ; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo007: NOK-1" ; // 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" ; // 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" ; 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() ; bool IAmIn008 = false; bool IAmIn007 = false; latestReaded = getDBVersion(); if (latestReaded >= 0.008f) { //qDebug() << "DataBase::updateTo008: - I am in 008" ; return true; } else { //qDebug() << "DataBase::updateTo008: - I am not in 008" ; IAmIn008 = false; } while (!IAmIn008) { while (!IAmIn007 ) { //qDebug() << "DataBase::updateTo008: - And I am not in 007" ; IAmIn007 = updateTo007(); } //qDebug() << "DataBase::updateTo008: - I am in 007" ; //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" ; } else { // Version not updated //qDebug() << "DataBase::updateTo008: - NOK-3" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //qDebug() << "DataBase::updateTo008: - NOK-2" ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } //qDebug() << "DataBase::updateTo008: - END" ; 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() ; bool IAmIn009 = false; bool IAmIn008 = false; bool ErrorUpdating = false; //qDebug() << "DataBase::updateTo009: Checking:" << QString::number(latestReaded) << ":" << QString::number(0.009); latestReaded = getDBVersion(); if (latestReaded >= 0.009f) //if ((latestReaded = 0.009) || (latestReaded > 0.009)) { //qDebug() << "DataBase::updateTo009: - I am in 009" ; //IAmIn009 = true; return true; } else { //qDebug() << "DataBase::updateTo009: - I am not in 009 I am in: " << QString::number(latestReaded); IAmIn009 = false; } //qDebug() << "DataBase::updateTo009: compared latestRead: " << QString::number(latestReaded) ; while (!IAmIn009 && !ErrorUpdating) { while (!IAmIn008 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo009: - And I am not in 008" ; IAmIn008 = updateTo008(); } //qDebug() << "DataBase::updateTo009: - And I am already at least in 008" ; 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" ; //IAmIn009 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo009: - version not updated" ; } //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" ; //if (populateTableSatellites(true)) if (recreateTableEntity()) { //qDebug() << "DataBase::updateTo009: - recreateTableEntity OK" ; if (updateTheEntityTableISONames()) { //qDebug() << "DataBase::updateTo009: - isonames updated" ; // Now I need to update the logs table if (updateTableLogs()) { //qDebug() << "DataBase::updateTo009: - logs updated and Function finished successfuly!!" ; IAmIn009 = true; } else { //qDebug() << "DataBase::updateTo009: - logs NOT updated" ; IAmIn009 = false; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo009: - isonames NOT updated" ; IAmIn009 = false; ErrorUpdating = true; } } else { ErrorUpdating = true; IAmIn009 = false; } } else { //qDebug() << "DataBase::updateTo009: - createTableSatellites FALSE" ; ErrorUpdating = true; IAmIn009 = false; } } //qDebug() << "DataBase::updateTo009: - END" ; 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() ; bool IAmIn010 = false; bool IAmIn009 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateTo010: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.010f) { //qDebug() << "DataBase::updateTo010: - I am in 010" ; IAmIn010 = true; return true; } else { //qDebug() << "DataBase::updateTo010: - I am not in 010 I am in: " << QString::number(latestReaded); while (!IAmIn009 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - Check if I am in 009: !" ; IAmIn009 = updateTo009(); if (IAmIn009) { //qDebug() << "DataBase::updateTo010: - updateTo009 returned TRUE - I am in 0.009: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo010: - updateTo009 returned FALSE - I am NOT in 0.009: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - I Could not update to: " << QString::number(dbVersion) ; // 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" ; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << "DataBase::updateTo010: - Band update NOK" ; } 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! " ; IAmIn010 = true; } else { //qDebug() << "DataBase::updateTo010: - Failed to go to 010! " ; IAmIn010 = false; // emit debugLog(Q_FUNC_INFO, "1", 7); } //qDebug() << "DataBase::updateTo010: - END" ; return IAmIn010; } bool DataBase::updateDBVersion(QString _softV, QString _dbV) { QString dateString = util->getDateSQLiteStringFromDate(QDate::currentDate()); //qDebug() << "DataBase::updateDBVersion: (date/SoftVersion/dbVersion): " << dateString << "/" << _softV << "/" << _dbV ; QString stringQuery = "INSERT INTO softwarecontrol (dateupgrade, softversion, dbversion) VALUES ('" + dateString + "', '" + _softV + "', '" + _dbV + "')"; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateTheModeTableAndSyncLog() { //qDebug() << "DataBase::updateTheModeTableAndSyncLog" ; 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 bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE mode"); if (sqlOK) { //qDebug() << "DataBase::updateTheModeTableAndSyncLog - OK - mode was dropped" ; 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().text(), query.lastQuery()); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - ERROR - modetemp not dropped" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTheModeTableAndSyncLog END" ; //return true; } bool DataBase::recreateTableBand() { //qDebug() << "DataBase::recreateTableBand" ; 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().text(), query.lastQuery()); //qDebug() << "DataBase::recreateTableBand - ERROR - bandtemp not dropped" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::recreateTableBand END" ; } 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", 483); // 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", 230); // 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" ; 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() << Q_FUNC_INFO << " : Entity has NO data"; // 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)) { //qDebug() << Q_FUNC_INFO << " : Update entity failed: " << str; return false; } //qDebug() << str << ':' << i; } } //qDebug() << "DataBase::updateTheEntityTableISONames-END" ; 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::doesEntityTablehaveData() { QString sq = QString("SELECT COUNT(id) FROM entity"); QSqlQuery query; if (!query.exec(sq)) return false; else if(!query.next()) return false; else if (!query.isValid()) return false; return ((query.value(0)).toInt() > 0); } bool DataBase::isTheTableExisting(const QString &_tableName) { QSqlQuery query; QString sq = QString("SELECT COUNT(name) FROM sqlite_master WHERE name='%1'").arg(_tableName); if (query.exec(sq)) return false; if (!query.next()) return false; if (!query.isValid()) return false; int _n = (query.value(0)).toInt(); query.finish(); return (_n>0); } bool DataBase::hasTheTableData(const QString &_tableName) { //qDebug() << Q_FUNC_INFO << ": " << _tableName ; QSqlQuery query; QString stringQuery = QString("SELECT count(id) FROM %1").arg(_tableName); if (!query.exec(stringQuery)) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return false; } if (!query.next()) return false; if (!query.isValid()) return false; int _num = (query.value(0)).toInt(); query.finish(); return (_num > 0); } bool DataBase::updateTo011() {// Updates the DB to 0.011: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo011: latestRead: " << getDBVersion() ; bool IAmIn011 = false; bool IAmIn010 = false; QString stringQuery = QString(); //QSqlQuery query; //bool sqlOk = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateTo011: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.011f) { //qDebug() << "DataBase::updateTo011: - I am in 011" ; IAmIn011 = true; return true; } else { //qDebug() << "DataBase::updateTo011: - I am not in 0.012 I am in: " << QString::number(latestReaded); bool ErrorUpdating = false; while (!IAmIn010 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - Check if I am in 010: !" ; IAmIn010 = updateTo010(); if (IAmIn010) { //qDebug() << "DataBase::updateTo011: - updateTo010 returned TRUE - I am in 0.010: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo011: - updateTo009 returned FALSE - I am NOT in 0.010: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo011: - Sats update NOK " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //if (!recreateTableDXCC()) //{ //qDebug() << "DataBase::updateTo011: - recreateTable DXCC NOK " ; // emit debugLog(Q_FUNC_INFO, "3", 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 " ; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo011: - Failed to recreate Table Log " ; // emit debugLog(Q_FUNC_INFO, "6", 7); return false; } if (updateDBVersion(softVersion, "0.011")) { //qDebug() << "DataBase::updateTo011: - We are in 011! " ; IAmIn011 = true; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 011! " ; IAmIn011 = false; } //qDebug() << "DataBase::updateTo011: - END" ; 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() ; bool IAmIn011 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateTo012: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.012f) { //qDebug() << "DataBase::updateTo012: - I am in 012" ; return true; } else { //qDebug() << "DataBase::updateTo012: - I am not in 0.012 I am in: " << getDBVersion() ; while (!IAmIn011 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - Check if I am in 011: !" ; IAmIn011 = updateTo011(); if (IAmIn011) { //qDebug() << "DataBase::updateTo012: - updateTo011 returned TRUE - I am in 0.011: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo012: - updateTo011 returned FALSE - I am NOT in 0.011: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - I Could not update to: " << QString::number(dbVersion) ; // 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!" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } } else { if (createTableSupportedContest()) { if (!recreateSupportedContest()) { //qDebug() << "DataBase::updateTo012: UPDATED NOK-2!" ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } } if (updateDBVersion(softVersion, "0.012")) { //qDebug() << "DataBase::updateTo012: - We are in 012! " ; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 012! " ; // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } //qDebug() << "DataBase::updateTo012: UPDATED OK!" ; 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() ; bool IAmIn012 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateTo013: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.013f) { //qDebug() << "DataBase::updateTo013: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateTo013: - I am not in 0.013 I am in: " << getDBVersion() ; while (!IAmIn012 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - Check if I am in 012: !" ; IAmIn012 = updateTo012(); if (IAmIn012) { //qDebug() << "DataBase::updateTo013: - updateTo012 returned TRUE - I am in 0.012: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo013: - updateTo011 returned FALSE - I am NOT in 0.012: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - I Could not update to: " << QString::number(dbVersion) ; // 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! " ; } else { //qDebug() << "DataBase::updateTo013: - Failed to go to 013! " ; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } //qDebug() << "DataBase::updateTo013: UPDATED OK!" ; return true; } bool DataBase::updateTo014() { // Updates the DB to 0.014: // Updates the Satellite DB //qDebug() << "DataBase::updateto014: latestRead: " << getDBVersion() ; bool IAmIn013 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateto014: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.014f) { //qDebug() << "DataBase::updateto014: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.013 I am in: " << getDBVersion() ; while (!IAmIn013 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 013: !" ; IAmIn013 = updateTo013(); if (IAmIn013) { //qDebug() << "DataBase::updateto014: - updateTo012 returned TRUE - I am in 0.013: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto014: - updateTo011 returned FALSE - I am NOT in 0.013: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto014: - I Could not update to: " << QString::number(dbVersion) ; // 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 " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.014")) { //qDebug() << "DataBase::updateto014: - We are in 013! " ; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 013! " ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo014: UPDATED OK!" ; return true; } bool DataBase::updateTo015() { // Updates the DB to 0.015: // Adds the FT4 mode //qDebug() << "DataBase::updateto015: latestRead: " << getDBVersion() ; bool IAmIn014 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateto015: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.015f) { //qDebug() << "DataBase::updateto015: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() ; while (!IAmIn014 && !ErrorUpdating) { //qDebug() << "DataBase::updateto015: - Check if I am in 014: !" ; IAmIn014 = updateTo014(); if (IAmIn014) { //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.014: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.014: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto015: - I Could not update to: " << QString::number(dbVersion) ; // 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" ; } else { //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" ; //ErrorUpdating = true; } if (updateDBVersion(softVersion, "0.015")) { //qDebug() << "DataBase::updateto015: - We are in 015! " ; } else { //qDebug() << "DataBase::updateto015: - Failed to go to 014! " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTo015: UPDATED OK!" ; return true; } bool DataBase::updateTo016() { // Updates the DB to 0.016: // Updates the Satellite DB //qDebug() << "DataBase::updateto016: latestRead: " << getDBVersion() ; bool IAmIn015 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateto016: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.016f) { //qDebug() << "DataBase::updateto016: - I am in 015" ; return true; } else { //qDebug() << "DataBase::updateto016: - I am not in 0.015 I am in: " << getDBVersion() ; while (!IAmIn015 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 015: !" ; IAmIn015 = updateTo015(); if (IAmIn015) { //qDebug() << "DataBase::updateto016: - updateTo015 returned TRUE - I am in 0.015: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto016: - updateTo015 returned FALSE - I am NOT in 0.015: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto016: - I Could not update to: " << QString::number(dbVersion) ; // 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 " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.016")) { //qDebug() << "DataBase::updateto014: - We are in 016! " ; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 016! " ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo016: UPDATED OK!" ; return true; } bool DataBase::updateTo017() { // Updates the DB to 0.017: // Updates the Satellite DB //qDebug() << "DataBase::updateto017: latestRead: " << getDBVersion() ; bool IAmIn016 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateto017: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.017f) { //qDebug() << "DataBase::updateto017: - I am in 017" ; return true; } else { //qDebug() << "DataBase::updateto017: - I am not in 0.017 I am in: " << getDBVersion() ; while (!IAmIn016 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 016: !" ; IAmIn016 = updateTo016(); if (IAmIn016) { //qDebug() << "DataBase::updateto017: - updateTo016 returned TRUE - I am in 0.016: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto017: - updateTo016 returned FALSE - I am NOT in 0.016: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto017: - I Could not update to: " << QString::number(dbVersion) ; // 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 " ; // emit debugLog(Q_FUNC_INFO, "14", 7); return false; } //qDebug() << "DataBase::updateTo017: - Recreated Table Log " ; /* else { //qDebug() << "DataBase::updateTo017: - Table log recreated OK" ; } */ // 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! " ; } else { //qDebug() << "DataBase::updateto017: - Failed to go to 017! " ; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo017: UPDATED OK!" ; return true; } bool DataBase::updateTo018() { // Updates the DB to 0.018: // Adds the Subdivisions //qDebug() << "DataBase::updateto018: latestRead: " << getDBVersion() ; bool IAmIn017 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << "DataBase::updateto018: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.018f) { //qDebug() << "DataBase::updateto018: - I am in 018" ; return true; } else { //qDebug() << "DataBase::updateto018: - I am not in 0.018 I am in: " << getDBVersion() ; while (!IAmIn017 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 017: !" ; IAmIn017 = updateTo017(); if (IAmIn017) { //qDebug() << "DataBase::updateto018: - updateTo017 returned TRUE - I am in 0.017: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto017: - updateTo017 returned FALSE - I am NOT in 0.017: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto018: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. //if (recreateTablePrimarySubdivisions()) // return false; if (!createTablePrimarySubdivisions(true)) return false; DB_ADIF_Primary_Subdvisions_data primarySubDivisions(Q_FUNC_INFO); if (!primarySubDivisions.addData()) 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! " ; } else { //qDebug() << "DataBase::updateto018: - Failed to go to 018! " ; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo018: UPDATED OK!" ; return true; } bool DataBase::updateTo019() {// Adds FTS4 and FST4W modes // Adds RS-44 sat //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IAmIn018 = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.019f) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" ; 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" ; } else { //qDebug() << Q_FUNC_INFO << " : UPDATED NOK!(9)" ; return false; } if (updateDBVersion(softVersion, "0.019")) { //qDebug() << Q_FUNC_INFO << " : - We are in 019! " ; } else { //qDebug() << Q_FUNC_INFO << " : - Failed to go to 018! " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo022() {// Adds Q65 mode //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.022f) { //qDebug() << Q_FUNC_INFO << " : - I am in 022" ; 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" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.022))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo021() {// Adds 5M & 8M bands //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.021f) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" ; 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" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.021))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo023() {// Recreates the table band //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.023f) { //qDebug() << Q_FUNC_INFO << " : - I am in 023" ; 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" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.023))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo024() {// Recreates the table band //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.024f) { //qDebug() << Q_FUNC_INFO << " : - I am in 024" ; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo023(); if (!IamInPreviousVersion) { //qDebug() << Q_FUNC_INFO << " : Update to previous version failed"; return false; } } // Now I am in the previous version and I can update the DB. if (!updateTheEntityTableISONames()) { //qDebug() << Q_FUNC_INFO << " : Update of entityTableIsonames failed"; return false; } if (updateDBVersion(softVersion, QString::number(dbVersion))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo025() { // Updates the DB to 0.025: // Adds the mods on ADIF 3.1.3 //qDebug() << Q_FUNC_INFO << " latestRead: " << getDBVersion() ; latestReaded = getDBVersion(); if (latestReaded >= 0.025f) { //qDebug() << Q_FUNC_INFO << " - I am in 023" ; return true; } if (!updateTo014()) return false; // Now I am in the previous version and I can update the DB. if (!updateTheModeTableAndSyncLog()) return false; if (!recreatePropModes ()) return false; return updateDBVersion(softVersion, "0.025"); } bool DataBase::updateTo026() { // Updates the DB to 0.026: // Recreates entity table to make UTC a real value // Adds many Modes & Submodes from ADIF 3.1.4 //qDebug() << Q_FUNC_INFO << " latestRead: " << getDBVersion() ; latestReaded = getDBVersion(); if (latestReaded >= 0.026f) { //qDebug() << Q_FUNC_INFO << " - I am in 026" ; return true; } //qDebug() << Q_FUNC_INFO << " - 10" ; if (!updateTo025()) return false; //qDebug() << Q_FUNC_INFO << " - 20" ; if (!recreateTableEntity()) return false; //qDebug() << Q_FUNC_INFO << " - 30" ; if (!updateTheModeTableAndSyncLog()) return false; //qDebug() << Q_FUNC_INFO << " - 40" ; if (!updateTableLog(7)) return false; if (!recreateTablePrimarySubdivisions()) return false; //qDebug() << Q_FUNC_INFO << " - 50" ; return updateDBVersion(softVersion, "0.026"); } int DataBase::getNumberOfQsos(const int _logNumber) { QString stringQuery = QString(); if (_logNumber<1) { stringQuery = QString("SELECT COUNT (*) FROM log"); } else { stringQuery = QString("SELECT COUNT (*) FROM log WHERE lognumber='%1'").arg(_logNumber); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); int qsos = 0; if (sqlOK) { query.next(); qsos = (query.value(0)).toInt(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); return qsos; } int DataBase::getLastInsertedQSO() { //qDebug() << Q_FUNC_INFO << " - Start"; QString stringQuery = QString("SELECT last_insert_rowid()"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); int id = -1; if (sqlOK) { query.next(); id = (query.value(0)).toInt(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); return id; //qDebug() << Q_FUNC_INFO << " - END"; } void DataBase::queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery) { Q_UNUSED(_functionFailed); Q_UNUSED(errorCodeS); Q_UNUSED(_nativeError); Q_UNUSED(_failedQuery); //qDebug() << Q_FUNC_INFO << ": constrid : " << QString::number(constrid) ; //qDebug() << Q_FUNC_INFO << ": Function : " << _functionFailed ; //qDebug() << Q_FUNC_INFO << ": Native : " << _nativeError ; //qDebug() << Q_FUNC_INFO << ": Error : " << _functionFailed << errorCodeS ; //qDebug() << Q_FUNC_INFO << ": Query failed: " << _failedQuery ; } bool DataBase::execQuery(const QString &function, const QString &stringQuery) { //qDebug() << Q_FUNC_INFO << ": " << function << " : " << stringQuery ; QSqlQuery query; query.prepare(stringQuery); bool ok = query.exec(stringQuery); query.finish(); if (!ok) { //qDebug() << Q_FUNC_INFO << ": NOK"; queryErrorManagement(function, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << ": OK"; return ok; } void DataBase::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << _func << ": log: " << _msg; if (logLevel<=_level) emit debugLog (_func, _msg, _level); } void DataBase::setLogLevel(const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } klog-2.4.1/eqslutilities.cpp0000644000175000017500000002324515003153303015035 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" ; Q_UNUSED(_parentFunction); #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(Q_FUNC_INFO); //qDebug()<< "eQSLUtilities::eQSLUtilities - END" ; } eQSLUtilities::~eQSLUtilities() { delete(util); //qDebug()<< "eQSLUtilities::~eQSLUtilities" ; } void eQSLUtilities::setUser(const QString &_call) { //qDebug() << "eQSLUtilities::setUser: " << _call; user = _call; //qDebug() << "eQSLUtilities::setUser: END"; } void eQSLUtilities::setPass(const QString &_pass) { //qDebug() << "eQSLUtilities::setPass: " << _pass; pass = _pass; //qDebug() << "eQSLUtilities::setPass: END"; } void eQSLUtilities::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished" ; QStringList parsedAnswer; parsedAnswer.clear(); result = data->error(); //qDebug()<< Q_FUNC_INFO << " - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); QString text = QString(); if (result == QNetworkReply::NoError) { parsedAnswer << prepareToTranslate(sdata); if (parsedAnswer.at(0).contains("Error")) { //qDebug()<< Q_FUNC_INFO << " - error detected"; QMessageBox::warning(nullptr, tr("KLog - eQSL"), tr("eQSL has sent the following message:\n%1").arg(parsedAnswer.at(1)), QMessageBox::Ok); qsos.clear(); return; } //qDebug()<< sdata; //qDebug()<< Q_FUNC_INFO << " - NO ERROR"; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(QNetworkReply::NoError, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< Q_FUNC_INFO << " - Result = Host Not found! = " << QString::number(result) ; text = "eQSL: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< Q_FUNC_INFO << " - Result = Time out error! = " << QString::number(result) ; text = "eQSL: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } else { //qDebug()<< Q_FUNC_INFO << " - Result = UNDEFINED = " << QString::number(result) ; 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()<< Q_FUNC_INFO << " END - Result = " << QString::number(result); //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); //qDebug()<< received << total; emit actionShowProgres(received, total); } void eQSLUtilities::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: " << QString::number(networkError); result = networkError; /* if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: Host not found"; } else { //qDebug()<< "eQSLUtilities::slotErrorManagement: ERROR!"; } */ } void eQSLUtilities::setCredentials(const QString &_user, const QString &_pass, const QString &_defaultStationCallsign) { //qDebug()<< "eQSLUtilities::setCredentials: user: " << _user << " / Pass: " << _pass << " / StationCallsign: " << _defaultStationCallsign; stationCallsign = _defaultStationCallsign; user = _user; pass = _pass; } QStringList eQSLUtilities::prepareToTranslate(const QString &_m) { //qDebug()<< "eQSLUtilities:: = prepareToTranslate" << _m; 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... " ; return result; } void eQSLUtilities::sendLogFile(const QString &_file, QList _qso) { //qDebug()<< Q_FUNC_INFO << " " << _file; 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()<< Q_FUNC_INFO << " FILE OPEN: " << blob; } else { //qDebug()<< Q_FUNC_INFO << " ERROR File not opened"; return; } file->close(); // The rest of the form goes as usual //qDebug()<< Q_FUNC_INFO << " e: " << user; //qDebug()<< Q_FUNC_INFO << " pass: " << pass; //qDebug()<< Q_FUNC_INFO << " stationcall: " << stationCallsign; 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()<< Q_FUNC_INFO << " Before sending"; manager->post(request, multiPart); //qDebug()<< Q_FUNC_INFO << " After sending"; //multiPart->setParent(reply); //qDebug()<< "eQSLUtilities::sendLogFile - END"; } klog-2.4.1/searchmodel.h0000644000175000017500000000572515003153303014073 0ustar develdevel#ifndef KLOG_SEARCHMODEL_H #define KLOG_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(Awards *awards, QObject *parent = nullptr); ~SearchModel(); void createSearchModel(const int _i); void setFilterString(const QString &_st); void setStationCallsignInHeader(const bool _s); void update(); void setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_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-2.4.1/setuppages/0000755000175000017500000000000015003153303013603 5ustar develdevelklog-2.4.1/setuppages/setuppagesats.cpp0000644000175000017500000005453715003153303017215 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 "setuppagesats.h" SetupPageSats::SetupPageSats(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSats::SetupPageSats"; dataProxy = dp; arrild = QString(); satname = QString(); uplink = QString(); downlink = QString(); modes = QString(); newSat = new SetupPageSatsNew(dataProxy, this); util = new Utilities(Q_FUNC_INFO); 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); createActions(); updateSelectedSats(); //qDebug() << "SetupPageSats::SetupPageSats - END"; } SetupPageSats::~SetupPageSats() { //qDebug() << "SetupPageSats::~SetupPageSats"; delete(util); delete(newSat); } void SetupPageSats::createNewSat() { //qDebug() << "SetupPageSats::createNewSat"; selectedSat = -1; //newSat->clear(); newSat->setEditing(false); newSat->exec(); } void SetupPageSats::slotNewButtonClicked() { //qDebug() << "SetupPageSats::slotNewButtonClicked"; createNewSat(); } void SetupPageSats::slotEditButtonClicked() { //qDebug() << "SetupPageSats::slotEditButtonClicked"; //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) << ")"; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageSats::slotEditButtonClicked -2"; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageSats::slotEditButtonClicked Query OK"; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/ /stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageSats::slotEditButtonClicked Query Valid"; //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"; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } */ } /* void SetupPageSats::slotSatsCancelled(const bool _q) { selectedSat = -1; } */ void SetupPageSats::slotRemoveButtonClicked() { //qDebug() << "SetupPageSats::slotRemoveButtonClicked"; 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() ; if (!sqlOk) { showError(tr("Sat has not been removed. (#2)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedSat) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); showError(tr("Sat has not been removed. (#1)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedSat) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED Sat } void SetupPageSats::createSatsPanel() { //qDebug() << "SetupPageSats::createSatsPanel"; 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"; 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" ; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); } void SetupPageSats::slotSatDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatDoubleClicked" ; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); slotEditButtonClicked(); } void SetupPageSats::slotAnalyzeNewSatData(const QStringList _qs) { Q_UNUSED(_qs); updateSelectedSats(); } void SetupPageSats::createActions() { //qDebug() << "SetupPageSats::createActions"; 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); 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; 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; 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; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageSats::addNewSat ADDED! id = " ; satsModel->select(); updateSelectedSats(); return true; } else { return false; } return false; } */ void SetupPageSats::updateSelectedSats() { //qDebug() << "SetupPageSats::updateSelectedSats"; satsAvailable = readSats(); satsModel->select(); if (satsAvailable.length()>0) { currentSats->clear(); currentSats->addItems(satsAvailable); } else { //qDebug() << "SetupPageSats::updateSelectedSats Not selected (less than 1)"; currentSats->clear(); } } QStringList SetupPageSats::readSats() { //qDebug() << "SetupPageSats::readSats"; 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().text(), query.lastQuery()); return _sats; } } int SetupPageSats::getSelectedSat() { //qDebug() << "SetupPageSats::getSelectedSat: " << currentSats->currentText(); 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); QString n = QString::number(_i) + "-"; int selected = currentSats->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat selected>0: " << QString::number(selected); currentSats->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat not selected"; return; } } 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"; 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"; } else { //qDebug() << "SetupPageSats::slotImportButtonClicked IMPORTED NOK"; 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"; 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); } else { return; } } else { return; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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"; out << "" << QString::number(satsN); out << "" << (dateTime->currentDateTime().date()).toString("yyyyMMdd"); out << ""; 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; //satText.clear(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << "SetupPageSats::slotExportButtonClicked END"; } klog-2.4.1/setuppages/setuppagesatsnew.cpp0000644000175000017500000003353715003153303017724 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 "setuppagesatsnew.h" SetupPageSatsNew::SetupPageSatsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSatsNew::SetupPageSatsNew" ; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); 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" ; } SetupPageSatsNew::~SetupPageSatsNew() { //delete(dataProxy); delete(util); } 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"; 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() ; 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; } else { //It is just one freq if (!isItAFreq(aux)) { hasUplink = false; } } } } bool SetupPageSatsNew::isItAFreq(const QString &_st) { //qDebug() << "SetupPageSatsNew::isItAFreq: It is one freq: " << _st; bool ok = false; double freq = _st.toDouble(&ok); return ((freq>=0.0) && (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; } else { //It is just one freq if (isItAFreq(aux)) { 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(); 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"; QStringList _modes; _modes.clear(); _modes = (modesLineEdit->text()).split(','); //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Starting to process the list" ; foreach (aux, _modes) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing: " << aux; 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; if (dataProxy->getIdFromModeName(aux2)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: true: " << aux2; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: false: " << aux2; hasModes = false; } } } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: " << aux; if (dataProxy->getSubModeIdFromSubMode(aux)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: true: " << aux; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: false: " << aux; 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"; 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"; } else if (!hasName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasName is FALSE"; } else if (!hasUplink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasUpLink is FALSE"; } else if (!hasDownlink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasDownLink is FALSE"; } else if (!hasModes) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasModes is FALSE"; } } //close(); } void SetupPageSatsNew::gatherAndSend() { //qDebug() << "SetupPageSatsNew::gatherAndSend: "; // 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); 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"; emit newSatData(satData); } void SetupPageSatsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSatsNew::slotCancelButtonClicked"; satData.clear(); clear(); emit cancelled(true); close(); } void SetupPageSatsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } klog-2.4.1/setuppages/setuppagedxcluster.h0000644000175000017500000000604015003153303017707 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEDXCLUSTER_H #define KLOG_SETUPPAGES_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 "../utilities.h" class SetupPageDxCluster : public QWidget { Q_OBJECT public: SetupPageDxCluster(QWidget *parent=nullptr); ~SetupPageDxCluster(); void init(); QStringList getDxclusterServersComboBox(); void setDxclusterServersComboBox(const QStringList t); QString getSelectedDxClusterServer(); void setSelectedDxClusterServer(const QString t); void saveSettings(); void loadSettings(); 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 *sendSpotsToMapCheckbox; QCheckBox *saveAllDXClusterDataQCheckbox; Utilities *util; //QStringList dxClusterServers; }; #endif // SETUPPAGEDXCLUSTER_H klog-2.4.1/setuppages/setuppageuserdata.cpp0000644000175000017500000005671715003153303020055 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 "setuppageuserdata.h" #include "../callsign.h" SetupPageUserDataPage::SetupPageUserDataPage(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << Q_FUNC_INFO << " - Start"; slotQRZRunning = false; locator = new Locator(); util = new Utilities(Q_FUNC_INFO); dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); mainCallOK = 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; wrongPalette = new QPalette; 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); personalTab->setLayout(personalLayout); // Station Tab rig1LineEdit = new QLineEdit; rig2LineEdit = new QLineEdit; rig3LineEdit = new QLineEdit; ant1LineEdit = new QLineEdit; ant2LineEdit = new QLineEdit; ant3LineEdit = 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() << Q_FUNC_INFO << " - END"; } SetupPageUserDataPage::~SetupPageUserDataPage() { //qDebug() << Q_FUNC_INFO << " - Start"; delete(locator); delete(util); //delete(world); delete(defaultPalette); delete(wrongPalette); //delete(dataProxy); } void SetupPageUserDataPage::setPrefixes() { //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); //world->readWorld (); } QString SetupPageUserDataPage::getMainCallsign() { Callsign callsign (maincallsignLineEdit->text()); if (callsign.isValid()) { return maincallsignLineEdit->text().toUpper(); } else { return QString(); } } void SetupPageUserDataPage::slotEnterKeyPressed() { emit enterKey(); } void SetupPageUserDataPage::slotQRZTextChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (slotQRZRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } slotQRZRunning = true; //qDebug() << Q_FUNC_INFO << " - " << maincallsignLineEdit->text() << " / Length: " << QString::number((maincallsignLineEdit->text()).size()); int i = maincallsignLineEdit->cursorPosition(); QString _a = util->getClearSQLi (maincallsignLineEdit->text()); if (i<1) { slotQRZRunning = false; //qDebug() << Q_FUNC_INFO << " - END-2"; 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())); } */ //qDebug() << Q_FUNC_INFO << " - END-3"; slotQRZRunning = false; } int SetupPageUserDataPage::getCQz() { return (cqzLineEdit->text()).toInt(); } int SetupPageUserDataPage::getITUz() { return (ituzLineEdit->text()).toInt(); } bool SetupPageUserDataPage::setMainCallsign(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; Callsign callsign(_qrz); if (!callsign.isValid()) return false; 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() << Q_FUNC_INFO << " - Start"; 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; } double SetupPageUserDataPage::getPower() { return myPowerSpinBox->value(); } bool SetupPageUserDataPage::setPower(const float _aux) { myPowerSpinBox->setValue(_aux); 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() << Q_FUNC_INFO << " - Start"; //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(); if (checkOperatorsLineQString(_a)) { //qDebug() << Q_FUNC_INFO << " VALID FORMAT"; operatorsLineEdit->setPalette(*defaultPalette); emit operatorsSignal(operatorsLineEdit->text()); } else { operatorsLineEdit->setPalette(*wrongPalette); //qDebug() << Q_FUNC_INFO << " NOT VALID FORMAT"; } //qDebug() << Q_FUNC_INFO << " -05"; operatorsLineEdit->setCursorPosition(i); //qDebug() << Q_FUNC_INFO << " -END"; } QString SetupPageUserDataPage::getOperators() { if (checkOperatorsLineQString(operatorsLineEdit->text())) { 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(','); bool auxBool = false; for (int ii = 0; ii < _aux.size(); ++ii) { Callsign callsign(_aux.at(ii)); if (callsign.isValid()) auxBool = true; } return auxBool; } void SetupPageUserDataPage::setStationFocus() { //qDebug() << Q_FUNC_INFO << " - Start"; maincallsignLineEdit->setFocus(); } void SetupPageUserDataPage::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); settings.setValue ("Callsign", getMainCallsign()); settings.setValue ("Operators", getOperators()); settings.setValue ("CQz", getCQz ()); settings.setValue ("ITUz", getITUz()); settings.setValue ("StationLocator", getStationLocator()); settings.setValue ("Name", getName()); settings.setValue ("Address1", getAddress1()); settings.setValue ("Address2", getAddress2()); settings.setValue ("Address3", getAddress3()); settings.setValue ("Address4", getAddress4()); settings.setValue ("City", getCity()); settings.setValue ("ZipCode", getZipCode()); settings.setValue ("ProvinceState", getProvince()); settings.setValue ("Country", getCountry()); settings.setValue ("Rig1", getRig1()); settings.setValue ("Rig2", getRig2()); settings.setValue ("Rig3", getRig3()); settings.setValue ("Antenna1", getAntenna1()); settings.setValue ("Antenna2", getAntenna2()); settings.setValue ("Antenna3",getAntenna3()); settings.setValue ("Power", getPower ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageUserDataPage::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); setMainCallsign(settings.value ("Callsign").toString ()); setOperators (settings.value ("Operators").toString ()); setStationLocator (settings.value ("StationLocator").toString ()); cqzLineEdit->setText (settings.value ("CQz").toString ()); ituzLineEdit->setText (settings.value ("ITUz").toString ()); nameLineEdit->setText (settings.value ("Name").toString ()); address1LineEdit->setText(settings.value ("Address1").toString ()); address2LineEdit->setText(settings.value ("Address2").toString ()); address3LineEdit->setText(settings.value ("Address3").toString ()); address4LineEdit->setText(settings.value ("Address4").toString ()); cityLineEdit->setText (settings.value ("City").toString ()); zipLineEdit->setText (settings.value ("ZipCode").toString ()); provinceLineEdit->setText(settings.value ("ProvinceState").toString ()); countryLineEdit->setText (settings.value ("Country").toString ()); rig1LineEdit->setText (settings.value ("Rig1").toString ()); rig2LineEdit->setText (settings.value ("Rig2").toString ()); rig3LineEdit->setText (settings.value ("Rig3").toString ()); ant1LineEdit->setText (settings.value ("Antenna1").toString ()); ant2LineEdit->setText (settings.value ("Antenna2").toString ()); ant3LineEdit->setText (settings.value ("Antenna3").toString ()); myPowerSpinBox->setValue(settings.value ("Power").toDouble ()); settings.endGroup (); } klog-2.4.1/setuppages/hamlibserialconfigwidget.cpp0000644000175000017500000002344015003153303021340 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"); 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(); switch (ret) { case 0: return "None"; break; case 1: return "Hardware"; break; case 2: return "Software"; break; default: // should never be reached return "None"; break; } return "None"; } 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(); switch (ret) { case 0: return "None"; break; case 1: return "Even"; break; case 2: return "Odd"; break; case 3: return "Space"; break; case 4: return "Mark"; break; default: // should never be reached return "None"; break; } return "None"; } 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 } QString HamLibSerialConfigWidget::getStopBits() { int ret = stopBitsComboBox->currentIndex(); switch (ret) { case 0: return "OneStop"; //return QSerialPort::OneStop; break; case 1: return "OneAndHalfStop"; //return QSerialPort::OneAndHalfStop; break; case 2: return "TwoStop"; //return QSerialPort::TwoStop; break; default: // should never be reached return "UnknownStopBits"; break; } } void HamLibSerialConfigWidget::setStopBits(const QString &_st) { if (_st == "OneStop") { stopBitsComboBox->setCurrentIndex(0); } else if (_st == "OneAndHalfStop") { stopBitsComboBox->setCurrentIndex(1); } else if (_st == "TwoStop") { stopBitsComboBox->setCurrentIndex(2); } else { stopBitsComboBox->setCurrentIndex(0); } } 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 { serialBaudsComboBox->setCurrentIndex(0); } return false; } QString HamLibSerialConfigWidget::getSerialPort() { return serialPortComboBox->currentText (); } int HamLibSerialConfigWidget::getSerialBauds() { return (serialBaudsComboBox->currentText ()).toInt(); } klog-2.4.1/setuppages/setuppagelogview.cpp0000644000175000017500000001407115003153303017704 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 "setuppagelogview.h" #include "../utilities.h" SetupPageLogView::SetupPageLogView(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageLogView::SetupPageLogView" ; 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); fLayout->addWidget(fieldsLabel); fLayout->addWidget(fieldsListWidget); layout->addLayout(fLayout); setLayout(layout); //qDebug() << "SetupPageLogView::SetupPageLogView - END" ; } SetupPageLogView::~SetupPageLogView(){} void SetupPageLogView::init() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QStringList humanList; QString aux; foreach(aux, dataProxy->getFields()) humanList.append(util.getLogColumnName(aux)); addFields(humanList); if (fieldsListWidget->count ()<1) { //qDebug() << Q_FUNC_INFO << " - No fields in the widget, populating with default ones"; QStringList defaultList = {"qso_date", "call", "rst_sent", "rst_rcvd", "bandid", "modeid", "comment"}; humanList.clear(); aux.clear(); foreach(aux, defaultList) humanList.append(util.getLogColumnName(aux)); setActiveFields(humanList); } } void SetupPageLogView::addFields(QStringList _b) { //qDebug() << Q_FUNC_INFO << " - fields: " << _b.count(); fieldsListWidget->clear(); QStringList humanDBNames; Utilities util(Q_FUNC_INFO); QString aux; foreach (aux, _b) humanDBNames.append(util.getLogColumnName(aux)); fieldsListWidget->addItems(humanDBNames); for(int i = 0; i < fieldsListWidget->count(); ++i) { QListWidgetItem* item = fieldsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QStringList SetupPageLogView::getActiveFields() { //qDebug() << Q_FUNC_INFO; QStringList activeFields; for (int i = 0; i < fieldsListWidget->count(); ++i) { QListWidgetItem* item = fieldsListWidget->item(i); //qDebug() << Q_FUNC_INFO << " - Field: " << item->text(); if (item->checkState() == Qt::Checked) { activeFields.append(item->text()); } } return activeFields; } void SetupPageLogView::setActiveFields(QStringList q) { //qDebug() << Q_FUNC_INFO << " - Start"; if (q.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - Empty list - END-0"; return; } QListWidgetItem *it; if ( (fieldsListWidget->count()) < 1) { //qDebug() << Q_FUNC_INFO << " No fields in the widget to select - END-1"; return; } for (int i = 0; i < fieldsListWidget->count(); i++) { it = fieldsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext(); //qDebug() << Q_FUNC_INFO << " - Checking(i): " << q.at(j); if (it->text() == q.at(j)) { //qDebug() << Q_FUNC_INFO << " - Adding: " << q.at(j); it->setCheckState(Qt::Checked); } } } //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageLogView::saveSettings() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("LogView"); QStringList humanLogNames = getActiveFields(); QString aux; QStringList dbLogNames; foreach(aux, humanLogNames) dbLogNames.append(util.getLogColumnDBName(aux)); settings.setValue ("LogViewFields", dbLogNames); //settings.endGroup (); } void SetupPageLogView::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile(), QSettings::IniFormat); QStringList fields = dataProxy->filterValidFields(settings.value("LogViewFields").toStringList()); QStringList humanLogNames; QString aux; foreach(aux, fields) humanLogNames.append(util.getLogColumnName(aux)); setActiveFields(humanLogNames); //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/setuppages/setuppagelogview.h0000644000175000017500000000467615003153303017363 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGELOGVIEW_H #define KLOG_SETUPPAGES_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(); void init(); //QString getFields(); void saveSettings(); void loadSettings(); signals: public slots: private: void addFields (QStringList _b); // read the available fields from the DB QStringList getActiveFields(); void setActiveFields(QStringList _q); QListWidget *fieldsListWidget; DataProxy_SQLite *dataProxy; }; #endif // SETUPPAGELOGVIEW_H klog-2.4.1/setuppages/setuppageudp.cpp0000644000175000017500000003243015003153303017017 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 "setuppageudp.h" SetupPageUDP::SetupPageUDP(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageUDP::SetupPageUDP"; 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"; util = new Utilities(Q_FUNC_INFO); defaultport = 2237; // Default WSJTX port defaultTimer = 2000; // 2 secs //qDebug() << "SetupPageUDP::SetupPageUDP: 2"; createUI(); //qDebug() << "SetupPageUDP::SetupPageUDP: 3"; createActions(); //qDebug() << "SetupPageUDP::SetupPageUDP: 4"; fillNetworkInterfaceComboBox(); //qDebug() << "SetupPageUDP::SetupPageUDP - END"; } SetupPageUDP::~SetupPageUDP() { delete(util); //qDebug() << "SetupPageUDP::~SetupPageUDP"; } 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"; 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"; 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 bool _t) { //qDebug() << "SetupPageUDP::setUDPServer: " << t; UDPServerCheckBox->setChecked(_t); slotUDPServerCheckBoxClicked(); } void SetupPageUDP::setUDPServerPort(const int _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number (_t); if ( (_t>0) && (_t<65535)) { UDPServerPortSpinBox->setValue(_t); } 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 int _t) { if ( (_t>=0) && (_t<=30000)) { miliSecsSpinBox->setValue(_t); } else { miliSecsSpinBox->setValue(defaultTimer); } } /* int SetupPageUDP::getTimeout() { int t = miliSecsSpinBox->value(); if ( (t>=0) && (t<=30000) ) { return t } else { return 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 bool _t) { logFromWSJTXCheckbox->setChecked(_t); slotLogFromWSJTCheckBoxClicked(); } void SetupPageUDP::setAutoLogFromWSJTx(const bool _t) { logAutomaticallyWSJTXCheckbox->setChecked(_t); } void SetupPageUDP::setReaDataFromWSJTx(const bool _t) { realDataFromWSJTXCheckbox->setChecked(_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; if (networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith) >= 0) { //qDebug() << "SetupPageUDP::setNetworkInterface: found: " << _t; networkInterfacesComboBox->setCurrentIndex(networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith)); } else { //qDebug() << "SetupPageUDP::setNetworkInterface: NOT found: " << _t; networkInterfacesComboBox->setCurrentIndex(0); } } void SetupPageUDP::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); settings.setValue ("UDPServer", QVariant((UDPServerCheckBox->isChecked()))); settings.setValue ("UDPNetworkInterface", getNetworkInterface()); settings.setValue ("UDPServerPort", getUDPServerPort()); settings.setValue ("LogFromWSJTX", QVariant((logFromWSJTXCheckbox->isChecked()))); settings.setValue ("LogAutoFromWSJTX", QVariant((logAutomaticallyWSJTXCheckbox->isChecked()))); settings.setValue ("RealTimeFromWSJTX", QVariant((realDataFromWSJTXCheckbox->isChecked()))); settings.setValue ("InfoTimeOut", miliSecsSpinBox->value()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageUDP::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); setUDPServer (settings.value("UDPServer").toBool ()); setNetworkInterface (settings.value("UDPNetworkInterface").toString ()); setUDPServerPort (settings.value("UDPServerPort").toInt ()); setUDPServer (settings.value("UDPServer").toBool ()); setLogFromWSJTx(settings.value("LogFromWSJTX").toBool ()); logAutomaticallyWSJTXCheckbox->setChecked(settings.value("LogAutoFromWSJTX").toBool ()); realDataFromWSJTXCheckbox->setChecked(settings.value("RealTimeFromWSJTX").toBool ()); setTimeout(settings.value("InfoTimeOut").toInt ()); settings.endGroup (); } klog-2.4.1/setuppages/hamlibserialconfigwidget.h0000644000175000017500000000237315003153303021007 0ustar develdevel#ifndef KLOG_SETUPPAGES_HAMLIBSERIALCONFIGWIDGET_H #define KLOG_SETUPPAGES_HAMLIBSERIALCONFIGWIDGET_H #include #include #include "../klogdefinitions.h" #include "../utilities.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); QString 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-2.4.1/setuppages/setuppagedxcluster.cpp0000644000175000017500000003545515003153303020256 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 "setuppagedxcluster.h" SetupPageDxCluster::SetupPageDxCluster(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageDxCluster::SetupPageDxCluster"; util = new Utilities(Q_FUNC_INFO); dxclusterServersComboBox = new QComboBox; 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; sendSpotsToMapCheckbox = 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); sendSpotsToMapCheckbox->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); sendSpotsToMapCheckbox->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")); sendSpotsToMapCheckbox->setText (tr("Send DX Spots to the map")); sendSpotsToMapCheckbox->setToolTip (tr("Sends the received DX Spots to the map to know where is the activity.")); 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->addWidget (sendSpotsToMapCheckbox); 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"; } SetupPageDxCluster::~SetupPageDxCluster() { //qDebug() << "SetupPageDxCluster::~SetupPageDxCluster"; delete(util); } void SetupPageDxCluster::init() { showHFQCheckbox->setChecked(true); showVHFQCheckbox->setChecked(true); showWARCQCheckbox->setChecked(true); showWCYQCheckbox->setChecked(true); showWWVQCheckbox->setChecked(true); showANNQCheckbox->setChecked(true); showConfirmedQCheckbox->setChecked(true); showWorkedQCheckbox->setChecked(true); dxclusterServersComboBox->addItem("dxfun.com:8000"); } void SetupPageDxCluster::createActions() { //qDebug() << "SetupPageDxCluster::createActions"; connect(addClusterButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(deleteClusterButton, SIGNAL(clicked()), this, SLOT(slotDeleteButtonClicked()) ); } void SetupPageDxCluster::slotAddButtonClicked() { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked"; bool 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); if (!ok || text.isEmpty()) // User pressed cancel or entered nothing { //qDebug() << Q_FUNC_INFO << " - - User canceled or entered nothing"; break; } //qDebug() << Q_FUNC_INFO << " - - SERVER: " << text; if (!checkIfValidDXCluster(text)) { //qDebug() << Q_FUNC_INFO << " - - Invalid DXCluster"; continue; // Ask again } if (!checkIfNewDXCluster(text)) { //qDebug() << Q_FUNC_INFO << " - - DXCluster already exists"; continue; // Ask again } // Append default port if not specified if (!text.contains(":")) { text += ":41112"; //qDebug() << Q_FUNC_INFO << " - - Default port added: " << text; } dxclusterServersComboBox->insertItem(0, text); //qDebug() << Q_FUNC_INFO << " - - DXCluster added: " << text; ok = true; // Exit the loop } QString aux; foreach(aux, getDxclusterServersComboBox()) { //qDebug() << Q_FUNC_INFO << " - " << aux; } } void SetupPageDxCluster::slotDeleteButtonClicked() { //qDebug() << Q_FUNC_INFO; dxclusterServersComboBox->removeItem (dxclusterServersComboBox->currentIndex ()); } bool SetupPageDxCluster::checkIfValidDXCluster (const QString & tdxcluster) { QUrl url ("http://" + tdxcluster); //return !((!url.host ().isEmpty ()) || (url.port () != -1)); return ((!url.host ().isEmpty ()) || (url.port () != -1)); /* if ((!url.host ().isEmpty ()) || (url.port () != -1)) { return true; } else { return false; } */ } bool SetupPageDxCluster::checkIfNewDXCluster (const QString & tdxcluster) { //qDebug() << "checkIfNewDXCluster: -" << tdxcluster << "-"<< QT_ENDL; return (dxclusterServersComboBox->findText(tdxcluster)<0); } QStringList SetupPageDxCluster::getDxclusterServersComboBox() { //qDebug() << "SetupPageDxCluster::getDxclusterServersComboBox"; QStringList servers; int numberOfDXClusterServers = dxclusterServersComboBox->count (); servers.clear(); if(numberOfDXClusterServers>=1) { //stream << "DXClusterServerToUse=" << dxclusterServersComboBox->currentText (); //servers << dxclusterServersComboBox->currentText (); for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { dxclusterServersComboBox->setCurrentIndex (i); servers << dxclusterServersComboBox->currentText (); //stream << "DXClusterServerPort=" << dxclusterServersComboBox->currentText (); } } return servers; } void SetupPageDxCluster::setDxclusterServersComboBox(const QStringList t) { //qDebug() << "SetupPageDxCluster::setDxclusterServersComboBox"; 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::getSelectedDxClusterServer() { //qDebug() << Q_FUNC_INFO; int dxclusterServerListItems = dxclusterServersComboBox->count(); if (dxclusterServerListItems >= 1) { //qDebug() << Q_FUNC_INFO << ": " << dxclusterServersComboBox->currentText (); return dxclusterServersComboBox->currentText (); } else { return QString(); } } void SetupPageDxCluster::setSelectedDxClusterServer(const QString t) { //qDebug() << Q_FUNC_INFO << ": " << t; dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(t)); } void SetupPageDxCluster::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterServerToUse", getSelectedDxClusterServer()); QList clusters = getDxclusterServersComboBox (); settings.beginWriteArray("DXClusterServers"); for (int i = 0; i < clusters.size(); ++i) { settings.setArrayIndex(i); settings.setValue("Server", clusters.at(i)); //qDebug() << Q_FUNC_INFO << " - Writting Servers: " << clusters.at(i); } settings.endArray(); settings.setValue ("DXClusterShowHF", QVariant((showHFQCheckbox->isChecked()))); settings.setValue ("DXClusterShowVHF", QVariant((showVHFQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWARC", QVariant((showWARCQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWorked", QVariant((showWorkedQCheckbox->isChecked()))); settings.setValue ("DXClusterShowConfirmed", QVariant((showConfirmedQCheckbox->isChecked()))); settings.setValue ("DXClusterShowAnn", QVariant((showANNQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWWV", QVariant((showWWVQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWCY", QVariant((showWCYQCheckbox->isChecked()))); settings.setValue ("DXClusterSave", QVariant((saveAllDXClusterDataQCheckbox->isChecked()))); settings.setValue ("DXClusterSendToMap", QVariant((sendSpotsToMapCheckbox->isChecked()))); settings.endGroup (); } void SetupPageDxCluster::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("DXCluster"); showHFQCheckbox->setChecked (settings.value("DXClusterShowHF", true).toBool ()); showVHFQCheckbox->setChecked (settings.value("DXClusterShowVHF", true).toBool ()); showWARCQCheckbox->setChecked (settings.value("DXClusterShowWARC", true).toBool ()); showWorkedQCheckbox->setChecked (settings.value("DXClusterShowWorked", true).toBool ()); showConfirmedQCheckbox->setChecked (settings.value("DXClusterShowConfirmed", true).toBool ()); showANNQCheckbox->setChecked (settings.value("DXClusterShowAnn", true).toBool ()); showWWVQCheckbox->setChecked (settings.value("DXClusterShowWWV", true).toBool ()); showWCYQCheckbox->setChecked (settings.value("DXClusterShowWCY", true).toBool ()); saveAllDXClusterDataQCheckbox->setChecked (settings.value("DXClusterSave", false).toBool ()); sendSpotsToMapCheckbox->setChecked (settings.value("DXClusterSendToMap", true).toBool ()); QList servers; servers.clear (); int size = settings.beginReadArray("DXClusterServers"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); servers.append (settings.value("Server").toString()); //qDebug() << Q_FUNC_INFO << " - Reading Servers: " << settings.value("Server").toString(); } settings.endArray(); setDxclusterServersComboBox(servers); QString aux = settings.value ("DXClusterServerToUse").toString (); //qDebug() << Q_FUNC_INFO << ": " << aux; dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(aux)); settings.endGroup (); } klog-2.4.1/setuppages/setuppageudp.h0000644000175000017500000000640615003153303016470 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEUDP_H #define KLOG_SETUPPAGES_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 bool _t); void setAutoLogFromWSJTx(const bool _t); void setReaDataFromWSJTx(const bool _t); void setUDPServer(const bool _t); void setUDPServerPort(const int _t); void setTimeout(const int _t); void setNetworkInterface(const QString &_t); QString getLogFromWSJTx(); QString getAutoLogFromWSJTx(); QString getReaDataFromWSJTx(); QString getUDPServerPort(); QString getUDPServer(); //int getTimeout(); QString getNetworkInterface(); void saveSettings(); void loadSettings(); 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-2.4.1/setuppages/setuppagelogsnew.h0000644000175000017500000000710315003153303017351 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGELOGSNEW_H #define KLOG_SETUPPAGES_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 #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" //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); ~SetupPageLogsNew(); 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-2.4.1/setuppages/setuppagesatsnew.h0000644000175000017500000000722615003153303017365 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGESATSNEW_H #define KLOG_SETUPPAGES_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 #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" //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); ~SetupPageSatsNew(); 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-2.4.1/setuppages/setuppagemisc.cpp0000644000175000017500000006304715003153303017172 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 "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"; util = new Utilities(Q_FUNC_INFO); 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); showSecondsCheckBox = new QCheckBox(tr("Show seconds"), 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); //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")); debugLogLevelCombo = new QComboBox; 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"; } SetupPageMisc::~SetupPageMisc() { delete(util); //qDebug() << "SetupPageMisc::~SetupPageMisc"; } 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!" ; klogDir = util->getHomeDir(); // We create the \klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #else //qDebug() << "NO WINDOWS DETECTED!" ; 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 showSecondsCheckBox->setToolTip (tr("Show seconds in the QSO editor")); showSecondsCheckBox->setChecked (true); showSecondsCheckBox->setEnabled (true); 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); debugLogLevelCombo->setCurrentIndex (0); 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.")); debugLogLevelCombo->setToolTip(tr("Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu.")); //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")); fillDebugComboBox(); 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 *logLevelLabel = new QLabel; logLevelLabel->setText(tr("Log level")); QHBoxLayout *logLevelLayout = new QHBoxLayout; logLevelLayout->addWidget(logLevelLabel); logLevelLayout->addWidget(debugLogLevelCombo); QLabel *timeRangeLabel = new QLabel; timeRangeLabel->setText(tr("Dupe time range:")); QHBoxLayout *timeRangeLayout = new QHBoxLayout; timeRangeLayout->addWidget(timeRangeLabel); timeRangeLayout->addWidget(dupeTimeLineEdit); QHBoxLayout *timeLayout = new QHBoxLayout; timeLayout->addWidget (realTimeCheckbox); timeLayout->addWidget (showSecondsCheckBox); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(fileLayout, 0, 0, 1, -1); mainLayout->addLayout(dbLayout, 1, 0, 1, -1); mainLayout->addWidget(alwaysADIFCheckBox, 2, 0, 1, 1); mainLayout->addLayout(logLevelLayout, 2, 1, 1, 1); mainLayout->addWidget(UTCCheckbox, 3, 0, 1, 1); //mainLayout->addWidget(realTimeCheckbox, 3, 1, 1, 1); mainLayout->addLayout(timeLayout, 3, 1, 1, 1); mainLayout->addWidget(imperialCheckBox, 4, 0, 1, 1); mainLayout->addWidget(useDxMarathonCheckBox, 4, 1, 1, 1); mainLayout->addLayout(timeRangeLayout, 5, 0, 1, 1); mainLayout->addWidget(completeWithPreviousCheckBox, 5, 1, 1, 1); mainLayout->addWidget(sendQSLWhenRecCheckBox,6, 0, 1, 1); mainLayout->addWidget(sendEQSLByDefaultSearchCheckBox, 6, 1, 1, 1); mainLayout->addWidget(checkNewVersionCheckBox, 7, 0, 1, 1); //mainLayout->addWidget(provideCallCheckBox, 7, 1, 1, 1); //mainLayout->addWidget(logSortCheckBox, 8, 0, 1, 1); mainLayout->addWidget(showStationCallWhenSearchCheckBox, 8, 0, 1, 1); mainLayout->addWidget(deleteAlwaysAdiFileCheckBox, 8, 1, 1, 1); mainLayout->addWidget (checkCallsCheckBox, 9, 0, 1, 1); setLayout(mainLayout); } void SetupPageMisc::fillDebugComboBox() { debugLogLevelCombo->addItems(util->getDebugLevels()); debugLogLevelCombo->setCurrentIndex(0); } 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; } 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)); } bool SetupPageMisc::getShowSeconds() { return showSecondsCheckBox->isChecked (); } void SetupPageMisc::setShowSeconds(const bool &_t) { showSecondsCheckBox->setChecked (_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; if (_t.length ()<1) { defaultFileName = util->getDebugLogFile (); } else { 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"; 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)); } QString SetupPageMisc::getDefaultDBPath() { return dbDirCurrent; } void SetupPageMisc::setUseDefaultDBPath(const QString &_t) { if (_t.isEmpty ()) { dbDirCurrent = util->getHomeDir(); } else { 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::getDebugLogLevel() { return debugLogLevelCombo->currentText (); } void SetupPageMisc::setDebugLogLevel(const QString &_t) { if (util->isValidLogLevel(_t)) debugLogLevelCombo->setCurrentIndex(debugLogLevelCombo->findText(_t, Qt::MatchCaseSensitive)); else debugLogLevelCombo->setCurrentIndex(0); } 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(); 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; //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target): " << target; if ( QFile::exists(dbDirNew) ) { if (QFile::exists(target)) { //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target EXISTS): " << target; } 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; 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.")); dbPathApplied = true; } else { msgBox.setText(tr("File NOT copied")); msgBox.setDetailedText(tr("The file was not copied due to an unknown problem.")); dbPathApplied = false; } msgBox.exec(); 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); } void SetupPageMisc::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("RealTime", QVariant((realTimeCheckbox->isChecked()))); settings.setValue ("ShowSeconds", QVariant((showSecondsCheckBox->isChecked()))); settings.setValue ("UTCTime", QVariant((UTCCheckbox->isChecked()))); settings.setValue ("AlwaysADIF", QVariant((alwaysADIFCheckBox->isChecked()))); settings.setValue ("UseDefaultName", QVariant((useDefaultName->isChecked()))); settings.setValue ("DefaultADIFFile", defaultFileName); settings.setValue ("DBPath", dbDirCurrent); settings.setValue ("ImperialSystem", QVariant((imperialCheckBox->isChecked()))); settings.setValue ("SendQSLWhenRec", QVariant((sendQSLWhenRecCheckBox->isChecked()))); settings.setValue ("ShowCallsignInSearch", QVariant((showStationCallWhenSearchCheckBox->isChecked()))); settings.setValue ("CompleteWithPrevious", QVariant((completeWithPreviousCheckBox->isChecked()))); settings.setValue ("CheckNewVersions", QVariant((checkNewVersionCheckBox->isChecked()))); settings.setValue ("ManageDXMarathon", QVariant((useDxMarathonCheckBox->isChecked()))); settings.setValue ("DebugLog", debugLogLevelCombo->currentText ()); settings.setValue ("SendEQSLByDefault", QVariant((sendEQSLByDefaultSearchCheckBox->isChecked()))); settings.setValue ("DeleteAlwaysAdiFile", QVariant((deleteAlwaysAdiFileCheckBox->isChecked()))); settings.setValue ("CheckValidCalls", QVariant((checkCallsCheckBox->isChecked()))); settings.setValue ("DuplicatedQSOSlot", dupeTimeLineEdit->text()); //settings.setValue ("ProvideInfo", QVariant((provideCallCheckBox->isChecked()))); //stream << "PSTRotatorActive=" << interfacesWindowsPage->getSendToPSTRotator() << ";"; //stream << "PSTRotatorServer=" << interfacesWindowsPage->getPSTRotatorUDPServer() << ";"; //stream << "PSTRotatorPort=" << interfacesWindowsPage->getPSTRotatorUDPServerPort() << ";"; settings.endGroup (); } void SetupPageMisc::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); realTimeCheckbox->setChecked (settings.value("RealTime").toBool ()); showSecondsCheckBox->setChecked (settings.value("ShowSeconds").toBool ()); UTCCheckbox->setChecked (settings.value("UTCTime").toBool ()); alwaysADIFCheckBox->setChecked (settings.value("AlwaysADIF").toBool ()); useDefaultName->setChecked (settings.value("UseDefaultName").toBool ()); imperialCheckBox->setChecked (settings.value("ImperialSystem").toBool ()); sendQSLWhenRecCheckBox->setChecked (settings.value("SendQSLWhenRec").toBool ()); showStationCallWhenSearchCheckBox->setChecked (settings.value("ShowCallsignInSearch").toBool ()); completeWithPreviousCheckBox->setChecked (settings.value("CompleteWithPrevious").toBool ()); checkNewVersionCheckBox->setChecked (settings.value("CheckNewVersions").toBool ()); useDxMarathonCheckBox->setChecked (settings.value("ManageDXMarathon").toBool ()); sendEQSLByDefaultSearchCheckBox->setChecked (settings.value("SendEQSLByDefault").toBool ()); deleteAlwaysAdiFileCheckBox->setChecked (settings.value("DeleteAlwaysAdiFile").toBool ()); checkCallsCheckBox->setChecked (settings.value("CheckValidCalls").toBool ()); //provideCallCheckBox->setChecked (settings.value("ProvideInfo").toBool ()); setDefaultFileName(settings.value("DefaultADIFFile").toString ()); setUseDefaultDBPath(settings.value("DBPath").toString ()); setDebugLogLevel(settings.value("DebugLog").toString ()); dupeTimeLineEdit->setText (settings.value("DuplicatedQSOSlot").toString ()); settings.endGroup (); } klog-2.4.1/setuppages/hamlibnetworkconfigwidget.cpp0000644000175000017500000000407215003153303021552 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-2.4.1/setuppages/setuppagelogsnew.cpp0000644000175000017500000003633315003153303017713 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 "setuppagelogsnew.h" SetupPageLogsNew::SetupPageLogsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageLogsNew::SetupPageLogsNew" ; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); 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" ; } SetupPageLogsNew::~SetupPageLogsNew() { delete(util); } void SetupPageLogsNew::clear() { //qDebug() << "SetupPageLogsNew::Clear - Start" ; stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); //qDebug() << "SetupPageLogsNew::Clear - END" ; } void SetupPageLogsNew::createWidget() { //qDebug() << "SetupPageLogsNew::createWidget - Start"; 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"; } void SetupPageLogsNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged - Start"; // 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"; } void SetupPageLogsNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged"; // 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"; } void SetupPageLogsNew::slotOKButtonClicked() { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked"; 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: " ; // 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"; emit newLogData(logData); } void SetupPageLogsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageLogsNew::slotCancelButtonClicked"; 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); //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: "; //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); return i; } void SetupPageLogsNew::setTypeN(const int _n) { //qDebug() << "SetupPageLogsNew::setTypeN: " << QString::number(_n); typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageLogsNew::fillWithType(const int _n) { //qDebug() << "SetupPageLogsNew::fillWithType - n = " << QString::number(_n); typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageLogsNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")"; if (contestData.length()== 8) { //qDebug() << "SetupPageLogsNew::fillWithType-2"; //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); } else { //qDebug() << "SetupPageLogsNew::fillWithType-3"; return; } } void SetupPageLogsNew::updateAllCats() { //qDebug() << "SetupPageLogsNew::updateAllCats"; 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-2.4.1/setuppages/setuppageelog.h0000644000175000017500000001057615003153303016631 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEELOG_H #define KLOG_SETUPPAGES_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 setClubLogActive(const bool &_b); // LoTW void setLoTWActive(const bool &_s); //QRZ.COM void setQRZCOMActive(const bool _s); void setQRZCOMAutoCheck(const bool _s); void saveSettings(); void loadSettings(); 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 *clubLogAppPasswordLineEdit, *clubLogPasswordLineEdit, *clubLogEmailLineEdit;//, *callLineEdit; QLabel *clubLogAppPasswordLabel, *clubLogPasswordLabel, *clubLogEmailLabel; //*callLabel, 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 qrzcomAutoFill; // QString qrcomLogbookKey; Utilities *util; QPalette palRed, palBlack; }; #endif // SETUPPAGEELOG_H klog-2.4.1/setuppages/setuppagelogs.cpp0000644000175000017500000003620315003153303017175 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 "setuppagelogs.h" SetupPageLogs::SetupPageLogs(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageLogs::SetupPageLogs"; 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"; } SetupPageLogs::~SetupPageLogs(){ //qDebug() << "SetupPageLogs::~SetupPageLogs"; } void SetupPageLogs::createNewLog() { //qDebug() << "SetupPageLogs::createNewLog"; selectedLog = -1; newLog->setEditing(false); if (defaultStationCallSign.length()>2) { //qDebug() << "SetupPageLogs::createNewLog-1"; 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); if (result == QDialog::Accepted) { //qDebug() << "SetupPageLogs::createNewLog - Accepted, emitting focusOK"; emit focusOK(); } //qDebug() << "SetupPageLogs::createNewLog - END"; } void SetupPageLogs::slotNewButtonClicked() { //qDebug() << "SetupPageLogs::slotNewButtonClicked"; createNewLog(); } void SetupPageLogs::slotEditButtonClicked() { //qDebug() << "SetupPageLogs::slotEditButtonClicked"; //QSqlQuery query; //int nameCol = -1; //selectedLog = getSelectedLog(); //QString call = getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageLogs::slotEditButtonClicked"; newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); //qDebug() << Q_FUNC_INFO ; 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 SetupPageLogs::slotRemoveButtonClicked() { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked"; //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) << ")"; 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) << ")"; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); sqlOk = query.exec(stringQuery); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (!sqlOk) { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageLogs::createLogsPanel() { //qDebug() << "SetupPageLogs::createLogsPanel"; 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"; 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) ; } void SetupPageLogs::slotLogDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageLogs::slotLogDoubleClicked" ; int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); slotEditButtonClicked(); } void SetupPageLogs::createActions() { //qDebug() << "SetupPageLogs::createActions"; //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"; 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().text(), query.lastQuery()); return _logs; } } void SetupPageLogs::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupPageLogs::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")"; 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); } void SetupPageLogs::updateSelectedLogs() { //qDebug() << "SetupPageLogs::updateSelectedLogs"; logsAvailable = readLogs(); } int SetupPageLogs::getSelectedLog() { //qDebug() << "SetupPageLogs::getSelectedLog: " << currentLogs->currentText(); return selectedLog; } 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; defaultStationCallSign = _p; } void SetupPageLogs::setDefaultOperators(const QString &_p) { //SetupPageLogs defaultOperators = _p; } void SetupPageLogs::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO; QWidget::showEvent(event); dataProxy->updateQSONumberPerLog(); logsModel->select(); } void SetupPageLogs::saveSettings() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("Logs"); settings.setValue ("SelectedLog", selectedLog); //settings.endGroup (); } void SetupPageLogs::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; Utilities util(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 00"; QSettings settings(util.getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - 01"; int i = settings.value("SelectedLog").toInt(); //qDebug() << Q_FUNC_INFO << " - 02"; if (!dataProxy->doesThisLogExist(i)) { //qDebug() << Q_FUNC_INFO << " - 10"; i = 0; while((!dataProxy->doesThisLogExist(i)) && (i <500)) {//TODO If a user has more than 500 logs it may fail... i++; //qDebug() << Q_FUNC_INFO << " - Log: " << QString::number(i); } //qDebug() << Q_FUNC_INFO << " - 49"; } //qDebug() << Q_FUNC_INFO << " - 50"; selectedLog = i; //qDebug() << Q_FUNC_INFO << " - 51"; logsView->selectRow(1); //qDebug() << Q_FUNC_INFO << " - 52"; QModelIndex index = logsModel->index(selectedLog, 0); //qDebug() << Q_FUNC_INFO << " - 53"; logsView->setCurrentIndex(index); //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.4.1/setuppages/setuppageelog.cpp0000644000175000017500000006232115003153303017157 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 "setuppageelog.h" #include "../callsign.h" SetupPageELog::SetupPageELog(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageELog::SetupPageELog"; util = new Utilities(Q_FUNC_INFO); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); clubLogEmailLineEdit = new QLineEdit; clubLogPasswordLineEdit = new QLineEdit; clubLogAppPasswordLineEdit = new QLineEdit; clubLogPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); clubLogAppPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); clubLogPasswordLabel = new QLabel(tr("ClubLog password")); clubLogAppPasswordLabel = new QLabel(tr("ClubLog App password")); clubLogEmailLabel = new QLabel(tr("ClubLog email")); clubLogAppPasswordLabel->setBuddy (clubLogAppPasswordLineEdit); 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.)")); clubLogAppPasswordLineEdit->setToolTip(tr("Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!!")); 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"; 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"; QGridLayout *cl1layout = new QGridLayout; cl1layout->addWidget(clubLogEmailLabel, 0, 0); cl1layout->addWidget(clubLogPasswordLabel, 1, 0); cl1layout->addWidget(clubLogAppPasswordLabel, 2, 0); cl1layout->addWidget(clubLogEmailLineEdit, 0, 1); cl1layout->addWidget(clubLogPasswordLineEdit, 1, 1); cl1layout->addWidget(clubLogAppPasswordLineEdit, 2, 1); QVBoxLayout *cl2layout = new QVBoxLayout; cl2layout->addWidget(clubLogActiveCheckBox); //cl2layout->addWidget(warningLabel); cl2layout->addLayout(cl1layout); cl2layout->addWidget(clubLogSendInRealTimeCheckBox); clubLogGroup->setLayout(cl2layout); //qDebug() << "SetupPageELog::SetupPageELog - 00030"; 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"; 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"; 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"; QVBoxLayout *qrzLayout = new QVBoxLayout; qrzLayout->addLayout(qrzcomActive); qrzLayout->addLayout(q1layout); qrzLayout->addWidget(QRZCOMAutoCheckCheckBox); qrzLayout->addLayout(qrzcomKeyLayout); QRZCOMGroup->setLayout(qrzLayout); //qDebug() << "SetupPageELog::SetupPageELog - 00080"; 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"; QVBoxLayout *llayout = new QVBoxLayout; //llayout->addLayout(l2layout); llayout->addWidget(lotwUpGroup); llayout->addWidget(lotwDownGroup); lotwGroup->setLayout(llayout); //qDebug() << "SetupPageELog::SetupPageELog - 00110"; QVBoxLayout *v1layout = new QVBoxLayout; v1layout->addWidget(clubLogGroup); v1layout->addWidget(eQSLccGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00120"; QVBoxLayout *v2layout = new QVBoxLayout; v2layout->addWidget(QRZCOMGroup); v2layout->addWidget(lotwGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00130"; QHBoxLayout *mlayout = new QHBoxLayout; mlayout->addLayout(v1layout); mlayout->addLayout(v2layout); setLayout(mlayout); //qDebug() << "SetupPageELog::SetupPageELog - 00140"; connect(clubLogActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotClubLogActive(bool))); connect(clubLogPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(clubLogAppPasswordLineEdit, 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"; 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"; 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"; setDefaults(); slotClubLogActive(false); setLoTWActive(false); slotTQSLActive(false); slotEQSLActive(false); slotQRZCOMActive(false); //qDebug() << "SetupPageELog::SetupPageELog - END"; } SetupPageELog::~SetupPageELog() { delete(util); } void SetupPageELog::slotQRZCallTextChanged() { //qDebug() << "SetupPageELog::slotQRZCallTextChanged"; int cursor = QRZCOMUserLineEdit->cursorPosition(); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-1"; QString aux = util->getClearSQLi (QRZCOMUserLineEdit->text()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2"; Callsign callsign(aux); if (callsign.isValid()) { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.1"; QRZCOMUserLineEdit->setPalette(palBlack); } else { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.2"; QRZCOMUserLineEdit->setPalette(palRed); } //qDebug() << "SetupPageELog::slotQRZCallTextChanged-3"; QRZCOMUserLineEdit->setText(aux.toUpper()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-4"; QRZCOMUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::slotQRZCallTextChanged - END"; } void SetupPageELog::sloteQSLCallTextChanged() { //qDebug() << "SetupPageELog::sloteQSLCallTextChanged"; int cursor = eQSLUserLineEdit->cursorPosition(); QString aux = util->getClearSQLi (eQSLUserLineEdit->text()); Callsign callsign(aux); if (callsign.isValid()) { eQSLUserLineEdit->setPalette(palBlack); } else { eQSLUserLineEdit->setPalette(palRed); } eQSLUserLineEdit->setText(aux.toUpper()); eQSLUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::sloteQSLCallTextChanged - END"; } void SetupPageELog::slotClubLogEmailDefineColor() { //qDebug() << "SetupPageELog::slotClubLogEmailDefineColor"; if(!clubLogEmailLineEdit->hasAcceptableInput()) clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: red;}"); else clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: black;}"); } void SetupPageELog::slotLoTWEmailDefineColor() { //qDebug() << Q_FUNC_INFO << ": " << lotwUserLineEdit->text(); int cursor = lotwUserLineEdit->cursorPosition(); QString aux = lotwUserLineEdit->text(); Callsign callsign(aux); if (callsign.isValid()) { lotwUserLineEdit->setPalette(palBlack); } else { lotwUserLineEdit->setPalette(palRed); } lotwUserLineEdit->setText(aux.toUpper()); lotwUserLineEdit->setCursorPosition(cursor); } void SetupPageELog::setDefaults() { //qDebug() << "SetupPageELog::setDefaults()"; QRZCOMActiveCheckBox->setChecked (false); QRZCOMAutoCheckCheckBox->setChecked (false); QRZCOMPasswordLineEdit->clear (); QRZCOMUserLineEdit->clear(); QRZCOMLogBookKEYLineEdit->clear (); clubLogActiveCheckBox->setChecked (false); clubLogSendInRealTimeCheckBox->setChecked (false); clubLogEmailLineEdit->clear (); clubLogPasswordLineEdit->clear(); clubLogAppPasswordLineEdit->clear(); eQSLActiveCheckBox->setChecked(false); eQSLPasswordLineEdit->clear(); eQSLUserLineEdit->clear(); lotwPasswordLineEdit->clear (); lotwUserLineEdit->clear (); lotwPasswordLineEdit->clear (); //qDebug() << "SetupPageELog::setDefaults() - END"; } void SetupPageELog::setClubLogActive(const bool &_b) { clubLogActiveCheckBox->setChecked(_b); clubLogSendInRealTimeCheckBox->setEnabled(_b); } void SetupPageELog::slotClubLogActive(const bool _s) { //qDebug() << "SetupPageELog::slotClubLogActive: " << util->boolToQString(_s); clubLogEmailLabel->setEnabled(_s); clubLogPasswordLabel->setEnabled(_s); clubLogEmailLineEdit->setEnabled(_s); clubLogPasswordLineEdit->setEnabled(_s); clubLogAppPasswordLineEdit->setEnabled(_s); clubLogSendInRealTimeCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotClubLogActive"; } // END of CLubLog // Start of eQSL.CC void SetupPageELog::slotEQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotEQSLActive: " << util->boolToQString(_s); eQSLemailLabel->setEnabled(_s); eQSLpasswordLabel->setEnabled(_s); eQSLUserLineEdit->setEnabled(_s); eQSLPasswordLineEdit->setEnabled(_s); } void SetupPageELog::slotTQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotTQSLActive: " << util->boolToQString(_s); setLoTWActive(_s); } // END of eQSL.CC // Start of LoTW void SetupPageELog::setLoTWActive(const bool &_s) { lotwUseTQSLCheckBox->setChecked(_s); lotwTQSLPathLineEdit->setEnabled(_s); lotwSearchTQSLPushButton->setEnabled(_s); } void SetupPageELog::slotSelectTQSLClicked() { //qDebug() << "SetupPageELogr::slotSelectTQSLClicked: " << QStandardPaths::ApplicationsLocation; 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"; } void SetupPageELog::slotPathLineEditChanged(const QString &_q) { if (QFile::exists(_q)) { lotwTQSLPathLineEdit->setPalette(palBlack); } else { lotwTQSLPathLineEdit->setPalette(palRed); } } // END of LoTW void SetupPageELog::slotEnterKeyPressed() { emit enterKey(); } // QRZ.COM void SetupPageELog::setQRZCOMActive(const bool _s) { //qDebug() << "SetupPageELog::setQRZCOMActive "; QRZCOMActiveCheckBox->setChecked(_s); QRZCOMAutoCheckCheckBox->setEnabled(_s); } void SetupPageELog::slotQRZCOMActive(bool _s) { //qDebug() << "SetupPageELog::slotQRZCOMActive: " << util->boolToQString(_s); QRZCOMUserLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 1"; QRZCOMUserLineEdit->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 2"; QRZCOMPasswordLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 3"; QRZCOMPasswordLineEdit->setEnabled(_s); QRZCOMAutoCheckCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - END"; //if (!QRZCOMActiveCheckBox->isChecked()) //{ // QRZCOMAutoCheckCheckBox->setChecked(false); // } } //void SetupPageELog::slotQRZCOMAuto(const bool _s) //{ // emit qrzcomAuto(_s); //} void SetupPageELog::setQRZCOMAutoCheck(const bool _s) { QRZCOMAutoCheckCheckBox->setChecked(_s); } void SetupPageELog::showEvent(QShowEvent *event) { //clubLogSendInRealTimeCheckBox->setChecked(clubLogRealTime); //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (clubLogSendInRealTimeCheckBox->isChecked ()); //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(); } void SetupPageELog::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("eLogs"); settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", QVariant((clubLogActiveCheckBox->isChecked()))); settings.setValue ("ClubLogRealTime", QVariant((clubLogSendInRealTimeCheckBox->isChecked()))); settings.setValue ("ClubLogEmail", clubLogEmailLineEdit->text ()); settings.setValue ("ClubLogPass", clubLogPasswordLineEdit->text()); settings.setValue ("ClubLogAppPass", clubLogAppPasswordLineEdit->text()); settings.endGroup (); settings.beginGroup ("eQSL"); settings.setValue ("eQSLActive", QVariant((eQSLActiveCheckBox->isChecked()))); settings.setValue ("eQSLCall", eQSLUserLineEdit->text ()); settings.setValue ("eQSLPass", eQSLPasswordLineEdit->text()); settings.endGroup (); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", QVariant((QRZCOMActiveCheckBox->isChecked()))); settings.setValue ("QRZcomUser", QRZCOMUserLineEdit->text ()); settings.setValue ("QRZcomPass", QRZCOMPasswordLineEdit->text()); settings.setValue ("QRZcomSubscriber", QVariant((QRZCOMSubscriberCheckBox->isChecked()))); settings.setValue ("QRZcomAuto", QVariant((QRZCOMAutoCheckCheckBox->isChecked()))); settings.setValue ("QRZcomLogBookKey", QRZCOMLogBookKEYLineEdit->text ()); settings.endGroup (); settings.beginGroup ("LoTW"); settings.setValue ("LoTWActive", QVariant((lotwUseTQSLCheckBox->isChecked()))); settings.setValue ("LoTWPath", lotwTQSLPathLineEdit->text()); settings.setValue ("LoTWUser", lotwUserLineEdit->text()); settings.setValue ("LoTWPass", lotwPasswordLineEdit->text()); settings.endGroup (); } void SetupPageELog::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); clubLogActiveCheckBox->setChecked (settings.value("ClubLogActive").toBool ()); clubLogSendInRealTimeCheckBox->setChecked (settings.value("ClubLogRealTime").toBool ()); //qDebug() << Q_FUNC_INFO << ": realTime: " << util->boolToQString (clubLogSendInRealTimeCheckBox->isChecked ()); clubLogEmailLineEdit->setText (settings.value("ClubLogEmail").toString ()); clubLogPasswordLineEdit->setText (settings.value("ClubLogPass").toString ()); clubLogAppPasswordLineEdit->setText (settings.value("ClubLogAppPass").toString ()); settings.endGroup (); settings.beginGroup ("eQSL"); eQSLActiveCheckBox->setChecked (settings.value("eQSLActive").toBool ()); eQSLUserLineEdit->setText (settings.value("eQSLCall").toString ()); eQSLPasswordLineEdit->setText (settings.value("eQSLPass").toString ()); settings.endGroup (); settings.beginGroup ("QRZcom"); QRZCOMActiveCheckBox->setChecked (settings.value("QRZcomActive").toBool ()); QRZCOMSubscriberCheckBox->setChecked (settings.value("QRZcomSubscriber").toBool ()); QRZCOMAutoCheckCheckBox->setChecked (settings.value("QRZcomAuto").toBool ()); QRZCOMUserLineEdit->setText (settings.value("QRZcomUser").toString ()); QRZCOMPasswordLineEdit->setText (settings.value("QRZcomPass").toString ()); QRZCOMLogBookKEYLineEdit->setText(settings.value("QRZcomLogBookKey").toString ()); settings.endGroup (); settings.beginGroup ("LoTW"); lotwUseTQSLCheckBox->setChecked (settings.value("LoTWActive").toBool ()); lotwUserLineEdit->setText (settings.value("LoTWUser").toString ()); //qDebug() << Q_FUNC_INFO << ": LoTWUser: " << lotwUserLineEdit->text (); lotwPasswordLineEdit->setText (settings.value("LoTWPass").toString ()); lotwTQSLPathLineEdit->setText (settings.value("LoTWPath").toString ()); settings.endGroup (); } klog-2.4.1/setuppages/setuppagesubdivisions.cpp0000644000175000017500000003405615003153303020756 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 "setuppagesubdivisions.h" SetupPageSubdivisions::SetupPageSubdivisions(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions"; dataProxy = dp; fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); //util = new Utilities(Q_FUNC_INFO); 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"; } SetupPageSubdivisions::~SetupPageSubdivisions(){ //qDebug() << "SetupPageSubdivisions::~SetupPageSubdivisions"; delete(fileAwardManager); } /* void SetupPageSubdivisions::slotEditButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked"; //QSqlQuery query; //int nameCol = -1; selectedLog = getSelectedLog(); QString getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked"; 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"; 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) << ")"; 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) << ")"; 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() ; if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")"; stringQuery = QString("DELETE FROM award WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (!sqlOk) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageSubdivisions::createLogsPanel() { //qDebug() << "SetupPageSubdivisions::createLogsPanel"; 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"; 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" ; int row = index.row(); setSelectedLog((logsModel->index(row, 0)).data(0).toInt()); } void SetupPageSubdivisions::createActions() { //qDebug() << "SetupPageSubdivisions::createActions"; 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"; 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().text(), query.lastQuery()); return _logs; } } void SetupPageSubdivisions::updateSelectedLogs() { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs"; logsAvailable = readLogs(); if (logsAvailable.length()>0) { currentLogs->clear(); currentLogs->addItems(logsAvailable); } else { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs Not selected (less than 1)"; currentLogs->clear(); } } int SetupPageSubdivisions::getSelectedLog() { //qDebug() << "SetupPageSubdivisions::getSelectedLog: " << currentLogs->currentText(); 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); if (i>=1) { return i; } else { return 0; } } void SetupPageSubdivisions::slotCurrentLogsComboBoxChanged() { //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: " << currentLogs->currentText(); QString a = (currentLogs->currentText()).section('-', 0, 0); //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: a: " << a; setSelectedLog(a.toInt()); } void SetupPageSubdivisions::setSelectedLog(const int _i) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog: " << QString::number(_i); QString n = QString::number(_i) + "-"; int selected = currentLogs->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog selected>=0: " << QString::number(selected); currentLogs->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog not selected"; 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"; if (fileAwardManager->importNewAwardFile()) { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - OK"; } else { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - NOK"; } //QString fileName = QFileDialog::getOpenFileName(this, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - END"; } klog-2.4.1/setuppages/setuppageworldeditor.h0000644000175000017500000000615415003153303020236 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEWORLDEDITOR_H #define KLOG_SETUPPAGES_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-2.4.1/setuppages/setuppagesubdivisionnew.cpp0000644000175000017500000010127415003153303021302 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 "setuppagesubdivisionnew.h" SetupPageSubdivisionNew::SetupPageSubdivisionNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew" ; Q_UNUSED(parent); 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(); 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() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew - END" ; } SetupPageSubdivisionNew::~SetupPageSubdivisionNew() { //delete(dataProxy); } void SetupPageSubdivisionNew::clear() { //qDebug() << "SetupPageSubdivisionNew::Clear - Start" ; 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" ; } void SetupPageSubdivisionNew::createWidget() { //qDebug() << "SetupPageSubdivisionNew::createWidget - Start"; 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); 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"; } void SetupPageSubdivisionNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotOperatorsTextChanged - Start"; // 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"; } void SetupPageSubdivisionNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotStationCallSignTextChanged"; // 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"; } /* void SetupPageSubdivisionNew::slotTypeComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotTypeComboBoxChanged"; // 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()) ; //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()) ; 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()) ; //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()) ; //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()); //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; } void SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged(): " << QString::number(contestCatOverlayComboBox->currentIndex()) ; 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) ; 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()) ; 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) ; if (typeContest < 0) { catModeLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catModeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } */ void SetupPageSubdivisionNew::slotOKButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked"; 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"; typeContestSelected = typeComboBox->currentIndex(); typeConteststr = typeComboBox->currentText(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: type"; typeContestSelected = 0; typeConteststr = QString(); } if (contestCatModeComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: mode"; contestCatMode = contestCatModeComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: mode"; contestCatMode = 0; } if (contestCatOperatorsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: oper"; contestCatOperators = contestCatOperatorsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: oper"; contestCatOperators = 0; } if (contestCatAssistedComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: ass"; contestCatAssisted = contestCatAssistedComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: ass"; contestCatAssisted = 0; } if (contestCatPowerComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr"; contestCatPower = contestCatPowerComboBox->currentIndex(); //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr - " << contestCatPowerComboBox->currentText(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: pwr"; contestCatPower = 0; } if (contestCatBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: Cbands"; contestCatBands = contestCatBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: Cbands"; contestCatBands = 0; } if (contestBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: bands"; contestBands = contestBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: bands"; contestBands = 0; } if (contestCatOverlayComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: over"; contestCatOverlay = contestCatOverlayComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: over"; 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: " ; // 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"; emit newLogData(logData); } void SetupPageSubdivisionNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotCancelButtonClicked"; 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); //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: "; //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); return i; } void SetupPageSubdivisionNew::setTypeN(const int _n) { //qDebug() << "SetupPageSubdivisionNew::setTypeN: " << QString::number(_n); typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageSubdivisionNew::fillWithType(const int _n) { //qDebug() << "SetupPageSubdivisionNew::fillWithType - n = " << QString::number(_n); typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageSubdivisionNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")"; if (contestData.length()== 8) { //qDebug() << "SetupPageSubdivisionNew::fillWithType-2"; //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); } else { //qDebug() << "SetupPageSubdivisionNew::fillWithType-3"; return; } } void SetupPageSubdivisionNew::updateAllCats() { //qDebug() << "SetupPageSubdivisionNew::updateAllCats"; 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-2.4.1/setuppages/setuppageuserdata.h0000644000175000017500000001253015003153303017503 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEUSERDATA_H #define KLOG_SETUPPAGES_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 "../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(); void setPrefixes(); 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(); double getPower(); bool setRigs(const QStringList _aux); bool setAntennas(const QStringList _aux); bool setPower(const float _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(); void saveSettings(); void loadSettings(); 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; bool slotQRZRunning; Utilities *util; }; #endif // SETUPPAGEUSERDATA_H klog-2.4.1/setuppages/setupentitydialog.cpp0000644000175000017500000004011715003153303020067 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: "; //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.fromString("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"; 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"; 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"; /* 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"; 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"; setLayout(mainLayout); setWindowTitle(tr("Entity Dialog")); pal = lonLineEdit->palette(); //qDebug() << "SetupEntityDialog::SetupEntityDialog: END"; } SetupEntityDialog::~SetupEntityDialog() { //qDebug() << "SetupEntityDialog::~SetupEntityDialog "; } void SetupEntityDialog::slotOkButtonClicked() { //qDebug() << "SetupEntityDialog::slotOkButtonClicked "; 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"; if(contBool) { return contLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkEntity() { //qDebug() << "SetupEntityDialog::checkEntity"; if(entityBool) { return entityLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkMainprefix() { //qDebug() << "SetupEntityDialog::checkMainprefix"; if(mainPrefixBool) { return mprefLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkCQz() { //qDebug() << "SetupEntityDialog::checkCQz"; if(cqBool) { return cqLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkITUz() { //qDebug() << "SetupEntityDialog::checkITUz"; if(ituBool) { return ituLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLatitude() { //qDebug() << "SetupEntityDialog::checkLatitude"; if(latBool) { return latLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLongitude() { //qDebug() << "SetupEntityDialog::checkLongitude"; if(lonBool) { return lonLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkUTC() { //qDebug() << "SetupEntityDialog::checkUTC"; if(utcBool) { return utcLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkARRLid() { //qDebug() << "SetupEntityDialog::checkARRLid"; if(arrlidBool) { return arrlidLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkDeleted() { //qDebug() << "SetupEntityDialog::checkDeleted"; if(delBool) { return "Y"; } else { return "N"; } return ""; } QString SetupEntityDialog::checkDeletedDate() { //qDebug() << "SetupEntityDialog::checkDeletedDate"; if(delDateBool) { return "00/00/0000"; } else { return ""; } return ""; } QString SetupEntityDialog::checkPrefixes() { //qDebug() << "SetupEntityDialog::checkPrefixes"; if(prefBool) { return prefLineEdit->text(); } else { return ""; } return ""; } void SetupEntityDialog::slotCancelButtonClicked() { //qDebug() << "SetupEntityDialog::slotCancelButtonClicked "; reject(); } void SetupEntityDialog::slotCheckEntity() { //qDebug() << "SetupEntityDialog::slotCheckEntity "; 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"; 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"; 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"; 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"; 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"; 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"; 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"; 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"; 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"; if (delRbutton->isChecked()) { delBool = true; } else { delBool = false; } } void SetupEntityDialog::slotCheckDeletedDate() { //qDebug() << "SetupEntityDialog::slotCheckDeletedDate"; delDateBool = false; //arrlidLineEdit->setPalette(palw); } void SetupEntityDialog::slotCheckPrefixes() { //qDebug() << "SetupEntityDialog::slotCheckPrefixes"; 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-2.4.1/setuppages/setuppageworldeditor.cpp0000644000175000017500000003070015003153303020563 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 "setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO << " - Start"; //worldPanel = new QWidget; dataProxy = dp; //qDebug() << Q_FUNC_INFO << " - 00"; world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 01"; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 02"; setupEntityDialog = new SetupEntityDialog(); //qDebug() << Q_FUNC_INFO << " - 03"; worldModel = new QSqlRelationalTableModel(this); //qDebug() << Q_FUNC_INFO << " - 04"; worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); //qDebug() << Q_FUNC_INFO << " - 10"; createWorldModel(); createWorldPanel(); //qDebug() << Q_FUNC_INFO << " - 20"; 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")); //qDebug() << Q_FUNC_INFO << " - 30"; 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")); //qDebug() << Q_FUNC_INFO << " - 40"; 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); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); //qDebug() << Q_FUNC_INFO << " - 50"; setLayout(layout); createActions(); //qDebug() << Q_FUNC_INFO << " - 52"; if (isWorldEmpty()) { //qDebug() << Q_FUNC_INFO << " - 53"; QString ctyfile = util->getCTYFile(); //qDebug() << Q_FUNC_INFO << " - 54"; QMessageBox msgBox; if (QFile::exists(ctyfile)) { //qDebug() << Q_FUNC_INFO << " - 60"; 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(); //qDebug() << Q_FUNC_INFO << " - 65"; world->recreate(ctyfile); //qDebug() << Q_FUNC_INFO << " - 66"; worldModel->select(); //qDebug() << Q_FUNC_INFO << " - 67"; //slotImportWorldButtonClicked(); } else { //qDebug() << Q_FUNC_INFO << " - 70"; 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() << Q_FUNC_INFO << " - 80"; } //qDebug() << Q_FUNC_INFO << " - END"; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" ; delete(world); delete(setupEntityDialog); } 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"; 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) { Q_UNUSED(_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"; */ } 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"; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked"; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked"; //TODO } /* void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity"; //TODO //QSqlQuery query; //QString queryString; //int row = index.row(); } */ void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked"; 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; 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"; } klog-2.4.1/setuppages/setuppagesubdivisions.h0000644000175000017500000001121515003153303020413 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGESUBDIVISION_H #define KLOG_SETUPPAGES_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 "../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-2.4.1/setuppages/setuppagecolors.h0000644000175000017500000000752015003153303017177 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGECOLORS_H #define KLOG_SETUPPAGES_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 bool _d); void saveSettings(); void loadSettings(); void loadDarkMode(); // Reads the config to setup the DarkMode private slots: void slotNewOneColorButtonClicked(); void slotConfirmedColorButtonClicked(); void slotWorkedColorButtonClicked(); void slotNeededColorButtonClicked(); void slotDefaultColorButtonClicked(); void slotWSJTXButtonClicked(); void slotKLogButtonClicked(); void slotSetDarkMode(); signals: void darkModeChanged(bool darkMode); // Signal to notify other widgets 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-2.4.1/setuppages/setuppagecolors.cpp0000644000175000017500000003310715003153303017532 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 "setuppagecolors.h" SetupPageColors::SetupPageColors(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageColors::SetupPageColors"; 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"; } 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 "; QString style = "* { background-color: "; style = style + (giveColor(newOneColorButton->palette().color(QPalette::Button))).name(QColor::HexRgb); style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::slotNeededColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(neededColorButton->palette().color(QPalette::Button))).name(QColor::HexRgb); style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::slotWorkedColorButtonClicked () { //qDebug() << "SetupPageColors::slotWorkedColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(workedColorButton->palette().color(QPalette::Button))).name(QColor::HexRgb); style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::slotConfirmedColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(confirmedColorButton->palette().color(QPalette::Button))).name(QColor::HexRgb); style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::slotDefaultColorButtonClicked() { //qDebug() << "SetupPageColors::slotDefaultColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(defaultColorButton->palette().color(QPalette::Button))).name(QColor::HexRgb); 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(QColor::HexRgb); return color; } else { //qDebug() << "SetupPageColors::giveColor NOT valid color"; return colorb; } } QString SetupPageColors::getNewOneColor() { //qDebug() << "SetupPageColors::getNewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); return (newOneColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); } QString SetupPageColors::getNeededColor() { return (neededColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); } QString SetupPageColors::getWorkedColor() { return (workedColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); } QString SetupPageColors::getConfirmedColor() { return (confirmedColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); } QString SetupPageColors::getDefaultColor() { return (defaultColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); } void SetupPageColors::setNewOneColor(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _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::loadDarkMode() {// Reads the config to setup the DarkMode //qDebug() << Q_FUNC_INFO; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setDarkMode (settings.value("DarkMode", false).toBool ()); settings.endGroup (); } void SetupPageColors::slotSetDarkMode() { setDarkMode (!darkMode); } QString SetupPageColors::getDarkMode() { //qDebug() << Q_FUNC_INFO; return util->boolToQString(darkMode); } void SetupPageColors::setDarkMode(const bool _d) { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_d); darkMode = _d; if (darkMode) { //QApplication::setStyle(QStyleFactory::create("Fusion")); QApplication::setStyle("fusion"); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(53,53,53)); p.setColor(QPalette::Text, Qt::white); p.setColor(QPalette::Button, QColor(53,53,53)); p.setColor(QPalette::Highlight, QColor(142,45,197)); p.setColor(QPalette::ButtonText, Qt::white); p.setColor(QPalette::WindowText, Qt::white); p.setColor(QPalette::Base, QColor(100,100,100)); p.setColor(QPalette::ToolTipBase, Qt::white); p.setColor(QPalette::ToolTipText, Qt::black); qApp->setPalette(p); darkModeButton->setText(tr("Light Mode")); //darkMode = true; } else { //QApplication::setStyle(QStyleFactory::create("Fusion")); QApplication::setStyle("fusion"); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(244,246,246)); 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; } emit darkModeChanged(darkMode); } void SetupPageColors::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); //qDebug() << Q_FUNC_INFO << ": Saving NewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb); settings.setValue ("NewOneColor", (newOneColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb)); settings.setValue ("NeededColor", (neededColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb)); settings.setValue ("WorkedColor", (workedColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb)); settings.setValue ("ConfirmedColor", (confirmedColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb)); settings.setValue ("DefaultColor", (defaultColorButton->palette().color(QPalette::Button)).name(QColor::HexRgb)); settings.setValue ("DarkMode", QVariant(darkMode)); settings.endGroup (); } void SetupPageColors::loadSettings() { //qDebug() << Q_FUNC_INFO; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setNewOneColor (settings.value("NewOneColor", "#FF0000").toString ()); //settings.value("interval").toInt(); setNeededColor (settings.value("NeededColor", "#FF8C00").toString ()); setWorkedColor (settings.value("WorkedColor", "#FFD700").toString ()); setConfirmedColor (settings.value("ConfirmedColor", "#32CD32").toString ()); setDefaultColor (settings.value("DefaultColor", "#00BFFF").toString ()); setDarkMode (settings.value("DarkMode", false).toBool ()); settings.endGroup (); } klog-2.4.1/setuppages/setuppagehamlib.h0000644000175000017500000000740215003153303017131 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEHAMLIB_H #define KLOG_SETUPPAGES_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 "../utilities.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); void stopHamlib(); void saveSettings(); void loadSettings(); 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(); 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-2.4.1/setuppages/setuppagebandmode.h0000644000175000017500000000514215003153303017445 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEBANDMODE_H #define KLOG_SETUPPAGES_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" #include "../utilities.h" class SetupPageBandMode : public QWidget { Q_OBJECT public: SetupPageBandMode(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageBandMode(); QStringList getBands(); // 10m, 12m, 15m QStringList getModes(); //ssb, CW void setActiveBands(QStringList q); void setActiveModes(QStringList q); void saveSettings(); 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; Utilities *util; }; #endif // SETUPPAGEBANDMODE_H klog-2.4.1/setuppages/setupentitydialog.h0000644000175000017500000000665615003153303017546 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPENTITYDIALOG_H #define KLOG_SETUPPAGES_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-2.4.1/setuppages/setuppagemisc.h0000644000175000017500000001207515003153303016632 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGEMISC_H #define KLOG_SETUPPAGES_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); bool getShowSeconds(); void setShowSeconds(const bool &_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); //void setReportInfo(const QString &_t); QString getDXMarathon(); void setDXMarathon(const QString &_t); QString getDebugLogLevel(); void setDebugLogLevel(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(); void saveSettings(); void loadSettings(); 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(); void fillDebugComboBox(); Utilities *util; QCheckBox *realTimeCheckbox, *showSecondsCheckBox, *UTCCheckbox, *alwaysADIFCheckBox, *useDefaultName, *completeWithPreviousCheckBox; QCheckBox *imperialCheckBox, *sendQSLWhenRecCheckBox, *showStationCallWhenSearchCheckBox; QCheckBox *checkNewVersionCheckBox, *provideCallCheckBox, *useDxMarathonCheckBox, *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; QComboBox *debugLogLevelCombo; }; #endif // SETUPPAGEMISC_H klog-2.4.1/setuppages/setuppagesubdivisionnew.h0000644000175000017500000001012115003153303020735 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGESUBDIVISIONNEW_H #define KLOG_SETUPPAGES_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 #include #include #include "../dataproxy_sqlite.h" //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); ~SetupPageSubdivisionNew(); 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-2.4.1/setuppages/hamlibnetworkconfigwidget.h0000644000175000017500000000110415003153303021210 0ustar develdevel#ifndef KLOG_SETUPPAGES_HAMLIBNETWORKCONFIGWIDGET_H #define KLOG_SETUPPAGES_HAMLIBNETWORKCONFIGWIDGET_H #include #include "../klogdefinitions.h" #include "../utilities.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-2.4.1/setuppages/setuppagesats.h0000644000175000017500000001026315003153303016646 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGESATS_H #define KLOG_SETUPPAGES_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-2.4.1/setuppages/setuppagelogs.h0000644000175000017500000001032015003153303016632 0ustar develdevel#ifndef KLOG_SETUPPAGES_SETUPPAGELOGS_H #define KLOG_SETUPPAGES_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" #include "../utilities.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); void saveSettings(); void loadSettings(); 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-2.4.1/setuppages/setuppagehamlib.cpp0000644000175000017500000003605115003153303017466 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 "setuppagehamlib.h" SetupPageHamLib::SetupPageHamLib(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { Q_UNUSED(dp); //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::stopHamlib () { hamlib->stop(); } 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 ()); 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)); activateHamlibCheckBox->setEnabled (true); //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)); activateHamlibCheckBox->setChecked (false); activateHamlibCheckBox->setEnabled (false); } 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); pollIntervalQSpinBox->setValue (200); //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(currentTextChanged(QString)), this, SLOT(slotRadioComboBoxChanged(QString)) ); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setRig() { //qDebug() << Q_FUNC_INFO; // 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"; hamlib->initClass(); 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"; } 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"; QString _output; _output.clear(); QString _rigType, _serialPort;//, 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=" + QString::number(serialConfigWidget->getSerialBauds ()) + ";\n"; _output = _output + "HamLibSerialDataBits=" + QString::number(getDataBits()) + ";\n"; _output = _output + "HamLibSerialStopBits=" + serialConfigWidget->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) ; if (_index >= 0) { rigTypeComboBox->setCurrentIndex(_index); return true; } else { rigTypeComboBox->setCurrentIndex(0); } return false; } int SetupPageHamLib::getDataBits() { return serialConfigWidget->getDataBits (); } QString SetupPageHamLib::getFlowControl() { return serialConfigWidget->getFlowControl (); } QString SetupPageHamLib::getParity() { return serialConfigWidget->getParity (); } void SetupPageHamLib::saveSettings() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); settings.setValue ("HamlibActive", QVariant((activateHamlibCheckBox->isChecked()))); settings.setValue ("HamlibReadOnly", QVariant((readOnlyModeCheckBox->isChecked()))); settings.setValue ("HamLibRigType", hamlib->getModelIdFromName(rigTypeComboBox->currentText ())); settings.setValue ("HamlibRigPollRate", QString::number(pollIntervalQSpinBox->value ())); settings.setValue ("HamlibSerialPort", serialConfigWidget->getSerialPort ()); settings.setValue ("HamlibSerialBauds", QString::number(serialConfigWidget->getSerialBauds ())); settings.setValue ("HamLibSerialDataBits", QString::number(getDataBits())); settings.setValue ("HamLibSerialStopBit", serialConfigWidget->getStopBits()); settings.setValue ("HamLibSerialFlowControl", serialConfigWidget->getFlowControl ()); settings.setValue ("HamLibSerialParity", serialConfigWidget->getParity ()); settings.setValue ("HamlibNetAddress", networkConfigWidget->getAddress ()); settings.setValue ("HamlibNetPort", networkConfigWidget->getPort ()); settings.endGroup (); } void SetupPageHamLib::loadSettings() { //qDebug() << Q_FUNC_INFO; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); setRigType (settings.value("HamLibRigType").toString()); pollIntervalQSpinBox->setValue(settings.value("HamlibRigPollRate", 2000).toInt ()); serialConfigWidget->setSerialPort (settings.value("HamlibSerialPort").toString()); serialConfigWidget->setSerialBauds (settings.value("HamlibSerialBauds", 9600).toInt ()); serialConfigWidget->setDataBits (settings.value("HamLibSerialDataBits", 8).toInt ()); serialConfigWidget->setStopBits(settings.value("HamLibSerialStopBit", "OneStop").toString()); serialConfigWidget->setFlowControl (settings.value("HamLibSerialFlowControl", "None").toString()); serialConfigWidget->setParity(settings.value("HamLibSerialParity", "Even").toString()); networkConfigWidget->setAddress (settings.value("HamlibNetAddress", "localhost").toString()); networkConfigWidget->setPort (settings.value("HamlibNetPort", 4532).toInt ()); activateHamlibCheckBox->setChecked (settings.value("HamlibActive", false).toBool ()); readOnlyModeCheckBox->setChecked (settings.value("HamlibReadOnly", false).toBool ()); settings.endGroup (); } klog-2.4.1/setuppages/setuppagebandmode.cpp0000644000175000017500000001403215003153303017776 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" ; 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->getBandNames()); 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" ; } 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); } } QStringList SetupPageBandMode::getBands() { //qDebug() << "SetupPageBandMode::getBands"; if ( (bandsListWidget->count()) < 1) { return QStringList(); } QListWidgetItem *it; QStringList _bands; _bands.clear(); for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); if (it->checkState() == Qt::Checked) { _bands.append (it->text()); } } return _bands; } QStringList SetupPageBandMode::getModes() { //qDebug() << "SetupPageBandMode::getModes"; if ( (modesListWidget->count()) < 1) { return QStringList(); } QListWidgetItem *it; QStringList _modes; _modes.clear (); for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); if (it->checkState() == Qt::Checked) { _modes.append (it->text()); } } return _modes; } void SetupPageBandMode::setActiveBands(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveBands"; 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"; 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); } } } } void SetupPageBandMode::saveSettings() { //qDebug() << Q_FUNC_INFO ; util = new Utilities(Q_FUNC_INFO); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("BandMode"); settings.setValue ("Bands", getBands ()); settings.setValue ("Modes", getModes ()); settings.endGroup (); } klog-2.4.1/klog.icns0000644000175000017500000244751615003153303013260 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*.@ qml/mapqmlfile.qml 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 img/marker.png qml/marker.qml klog-2.4.1/elogqrzlog.cpp0000644000175000017500000006743415003153303014332 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 "callsign.h" //#include eLogQrzLog::eLogQrzLog(DataProxy_SQLite *dp, const QString &_parentFunction, const QString &_klogVersion) { Q_UNUSED(_parentFunction); #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(Q_FUNC_INFO); //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); // serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); //serviceUrl = QUrl("https://xmldata.qrz.com/xml/1.31/ "); //qDebug()<< "eLogQrzLog::eLogQrzLog - END" ; } eLogQrzLog::~eLogQrzLog() { delete(util); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::showDebugLog(const QString &_func, const QString &_log) { Q_UNUSED(_func); Q_UNUSED(_log); #ifdef QT_DEBUG //qDebug() << _func << ": " << _log; #else #endif } void eLogQrzLog::setLogBookKey(const QString &_key) { //qDebug()<< "eLogQrzLog::setLogBookKey: " << _key ; 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" ; showDebugLog (Q_FUNC_INFO, "Start"); sendingQSO = false; result = data->error(); //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); //qDebug() << "eLogQrzLog::slotManagerLogFinished: Received: " << sdata; QString text = QString(); //qDebug() << "eLogQrzLog::slotManagerLogFinished - 00010"; if (result == QNetworkReply::NoError) { QString dataReply(sdata); //parseAppAnswer(1, dataReply); parseAppAnswer(dataReply); showDebugLog (Q_FUNC_INFO, "No error"); //qDebug()<< "eLogQrzLog::slotManageLogFinished - NO ERROR"; } else { parseNetworkError(result); //emit disableQRZAction(true); } if (lastQSO) { lastQSO = false; sendSignal(result, qsos); } //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result); //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result Text = " << text; 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, QString("Start: ").append(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(); //qDebug() << Q_FUNC_INFO << " - quick read encoding: " << xml.documentEncoding().toString(); } if (t == QXmlStreamReader::StartElement) { QString name = xml.name().toString(); //qDebug() << Q_FUNC_INFO << " - quick read name: " << name; if (name == "QRZDatabase" || name == "Session" || name == "Callsign") { //qDebug() << Q_FUNC_INFO << " - No data: " << name; } else if (name == "Key") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - API-Key: " << tdata; 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; } continue; } else if (name == "Callsign") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - CALLSIGN: " << tdata; } continue; } else if (name == "name") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - Name: " << tdata; } continue; } else if (name == "country") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - Country: " << tdata; } continue; } else if (name == "Error") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Error: " << tdata; 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; emit dataFoundSignal("message", tdata); continue; } else if (name == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << Q_FUNC_INFO << " - FName: " << tdata; } continue; } else if (name == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << Q_FUNC_INFO << " - addr1: " << tdata; } 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; } 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(); } } } if (xml.hasError()) { showDebugLog (Q_FUNC_INFO, "Error: " + xml.errorString()); //qDebug() << Q_FUNC_INFO << " - ERROR: " << xml.errorString() ; } else if (xml.atEnd()) { //qDebug() << Q_FUNC_INFO << " - XML END" ; } /* QString tname, tdata; while(!xml.atEnd() && !xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer - 00012"; QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartDocument) { //qDebug() << "eLogQrzLog::parseXMLAnswer - StartDocument"; continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer - 00014"; if (token == QXmlStreamReader::StartElement) { tname = xml.name().toString(); //qDebug() << "eLogQrzLog::parseXMLAnswer - tname = " << tname; if (tname == "Key") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: API-Key: " << tdata; if (tdata.length()>0) { sessionkey = tdata; logged = true; } continue; } if (tname == "Error") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Error: " << tdata; emit dataFoundSignal("error", tdata); } if (tname == "Message") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Message: " << tdata; emit dataFoundSignal("message", tdata); } if (tname == "call") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: CALL: " << tdata; } continue; } if (tname == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: Name: " << tdata; } continue; } if (tname == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr1: " << tdata; } continue; } if (tname == "addr2") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qth", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr2: " << tdata; } 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: " ; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << tdata; } continue; } if (tname == "Session") { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " ; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " << tdata; } continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer: Unknown: " << tname; } } if (xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML error: " << "XML error: " << xml.errorString(); } else if (xml.atEnd()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML END: " << "Reached end, done"; } */ //qDebug() << "eLogQrzLog::parseXMLAnswer: END of token while"; //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); const QByteArray sdata = data->readAll(); //qDebug() << Q_FUNC_INFO << " - Received: " << sdata; QString text = QString(); //qDebug() << Q_FUNC_INFO << " - 00010"; 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); //qDebug() << Q_FUNC_INFO << " - Result Text = " << text; 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); 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); 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"; } else { //qDebug()<< "eLogQrzLog::slotErrorManagement: ERROR!"; } */ 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) { //qDebug() << Q_FUNC_INFO << ": " + _qrz; showDebugLog (Q_FUNC_INFO, "Start: " + _qrz); Callsign callsign(_qrz); if (!callsign.isValid()) { //qDebug()<< "eLogQrzLog::checkQRZ: CALL not valid" ; 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" ; 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) { // This function is called from mainwindow, when the user clicks on OK in AdifLoTWExportWidget::slotOKPushButtonClicked // The list of QSOs is processed below to otain the ADIF and sent one by one //qDebug()<< "eLogQrzLog::sendQSOs: QSOs: " << QString::number(_qsos.length()); showDebugLog (Q_FUNC_INFO, "Start"); errorWhileSendingLog = false; if (logbookkey.length()<1) { //qDebug()<< "eLogQrzLog::sendQSOs: No valid KEY (-2)"; 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) { // Received an ID, obtains the ADIF fo QRZ.com from dataProxy and sends it t QRZ.com //qDebug() << "eLogQrzLog::sendQSO: " << QString::number(_qsoID); showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(_qsoID)); QSO qso; qso.fromDB(_qsoID); if (!qso.isComplete()) return -1; //QString adifQSO = dataProxy->getADIFQSO(_qsoID, ModeEQSL); QString adifQSO = qso.getADIF(); //qDebug()<< "eLogQrzLog::sendQSO: (ADIF) :" << adifQSO; //qDebug()<< "eLogQrzLog::sendQSO: (KEY) :" << logbookkey; QUrlQuery params; params.addQueryItem("KEY", logbookkey); params.addQueryItem("ACTION", "INSERT"); params.addQueryItem("ADIF",adifQSO); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); //qDebug() << "eLogQrzLog::sendQSO: END"; 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; while (sendingQSO) { //qDebug() << "eLogQrzLog::sendQSO: sending QSO... just wait!"; } 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" ; showDebugLog (Q_FUNC_INFO, "Start"); if (logged) { //qDebug()<< "eLogQrzLog::login Already logged!" ; 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" ; //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" ; showDebugLog (Q_FUNC_INFO, "END"); } int eLogQrzLog::sendDataParams(const QUrlQuery &_params) { //qDebug()<< "eLogQrzLog::sendDataParams: Params: " << _params.query(QUrl::FullyEncoded).toUtf8(); 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(); serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //qDebug()<< "eLogQrzLog::sendDataParams: postData: " << postData; manager->post(request, postData); //qDebug()<< "eLogQrzLog::sendDataParams - END"; showDebugLog (Q_FUNC_INFO, "END"); return -1; } void eLogQrzLog::setUser(const QString &_user) { showDebugLog (Q_FUNC_INFO, "Start: " + _user ); user = _user; showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::setPassword(const QString &_pass) { showDebugLog (Q_FUNC_INFO, "Start: " + _pass); pass = _pass; showDebugLog (Q_FUNC_INFO, "END"); } QString eLogQrzLog::prepareToTranslate(const QString &_m) { //qDebug()<< "eLogQrzLog:: = prepareToTranslate" << _m; 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 ; 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 ; //qDebug()<< "eLogQrzLog::parseAppAnswer: responseResult: " << responseResult; if ((responseType == "STATUS") && (responseResult == "OK")) { //qDebug()<< "eLogQrzLog::parseAppAnswer: OK" ; } 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 ; } } 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 ; //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-2.4.1/hamlibclass.h0000644000175000017500000001250715003153303014063 0ustar develdevel#ifndef KLOG_HAMLIBCLASS_H #define KLOG_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 #include "utilities.h" #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 QString &_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 loadSettings(); signals: void freqChanged(double newFreq); void modeChanged(QString newFreq); public slots: void slotTimer(); private: bool readRadioInternal(bool _forceRead); void fillRigsList(); static int addRigToList(const struct rig_caps* caps, void* data); QString hamlibMode2Mode(rmode_t _rmode); rmode_t mode2HamlibMode (const QString &_mode); 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 }; #endif // HAMLIBCLASS_H klog-2.4.1/infowidget.cpp0000644000175000017500000005303615003153303014275 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: " ; 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" ; } InfoWidget::~InfoWidget() { delete(awards); delete(locator); delete(world); } 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(QColor::HexRgb); 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"; 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 QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { awards->setColors (_newOne, _needed, _worked, _confirmed, _default); clearBandLabels(); } 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 int _bandId, const int _entityId) { // Receives band name, Entity number (as a String) //qDebug() << Q_FUNC_INFO << ": " << _b << "/" << _q; EntityStatus _entityStatus; _entityStatus.dxcc = _entityId; _entityStatus.bandId = _bandId; _entityStatus.modeId = -1; _entityStatus.logId = currentLog; //TODO: Check if we can know the mode and replace the -1 //qDebug() << Q_FUNC_INFO << ": (Band/background-color): " << _b << (awards->getQRZDXStatusColor(_qs)).name(QColor::HexRgb) ; return "* { background-color: " + (awards->getQRZDXStatusColor(_entityStatus)).name(QColor::HexRgb) + "; }"; } //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() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << ": " << QString::number(_entity); //QColor getQRZDXStatusColor(const QStringList _qs); // Receives Entity, band, mode & log if (_entity <1) { //qDebug() << Q_FUNC_INFO << ": entity <1"; clearBandLabels(); } bandLabel1->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel1->text()), _entity)); bandLabel2->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel2->text()), _entity)); bandLabel3->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel3->text()), _entity)); bandLabel4->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel4->text()), _entity)); bandLabel5->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel5->text()), _entity)); bandLabel6->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel6->text()), _entity)); bandLabel7->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel7->text()), _entity)); bandLabel8->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel8->text()), _entity)); bandLabel9->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel9->text()), _entity)); bandLabel10->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel10->text()), _entity)); bandLabel11->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel11->text()), _entity)); bandLabel12->setStyleSheet(getStyleColorToLabelFromBand(dataProxy->getIdFromBandName(bandLabel12->text()), _entity)); //qDebug() << Q_FUNC_INFO << " - END"; } void InfoWidget::showEntityInfo(const int _enti, int _cq, int _itu) { //qDebug() << "InfoWidget::showEntityInfo" << QString::number(_enti); 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; 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; } } int InfoWidget::getDistance(bool shortPath) { // Returns the distance in KM //qDebug() << Q_FUNC_INFO << distShortLabel->text (); if (shortPath) { return (distShortLabel->text ()).toInt (); } else { return (distLongLabel->text ()).toInt (); } } int InfoWidget::getCQ() { // Returns the CQ zone shown in the widget return (cqzLabel->text()).toInt(); } int InfoWidget::getITU() { // Returns the CQ zone shown in the widget return (ituzLabel->text()).toInt(); } klog-2.4.1/dataproxy_sqlite.cpp0000644000175000017500000074443415003153303015543 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 "callsign.h" //#include DataProxy_SQLite::DataProxy_SQLite(const QString &_parentFunction, const QString &_softVersion) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << _softVersion << _parentFunction; #else //qDebug() << Q_FUNC_INFO << "Running a release build"; #endif (void)_parentFunction; //qDebug() << Q_FUNC_INFO << ": " << _softVersion << _parentFunction; logLevel = None; //qDebug() << Q_FUNC_INFO << " - 45"; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 46"; util->setVersion(_softVersion); //qDebug() << Q_FUNC_INFO << " - 48: " << util->getKLogDBFile(); db = new DataBase(Q_FUNC_INFO, _softVersion, util->getKLogDBFile()); //qDebug() << Q_FUNC_INFO << " - 49"; dbCreated = db->createConnection(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 50"; //qDebug() << Q_FUNC_INFO << " - 51"; //util->setSpecialCalls(getSpecialCallsigns()); //qDebug() << Q_FUNC_INFO << " - 52"; qso = new QSO; //qDebug() << Q_FUNC_INFO << " - 53"; searching = false; executionN = 0; connect(db, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } DataProxy_SQLite::~DataProxy_SQLite() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); delete(qso); logEvent (Q_FUNC_INFO, "END", Debug); } int DataProxy_SQLite::getHowManyQSOPerPropMode(const QString &_p, const int _logn) { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString; bool sqlOK; if (_logn < 0) { queryString = "SELECT COUNT(DISTINCT id) FROM log WHERE prop_mode= :prop_mode"; if (!query.prepare(queryString)) {return 0;} query.bindValue(":prop_mode", _p); } else { queryString = "SELECT COUNT(DISTINCT id) FROM log WHERE lognumber= :lognumber AND prop_mode= :prop_mode"; if (!query.prepare(queryString)) {return 0;} query.bindValue(":lognumber", _logn); query.bindValue(":prop_mode", _p); } sqlOK = query.exec(); if (sqlOK && query.next() && query.isValid()) { int v = query.value(0).toInt(); query.finish(); logEvent(Q_FUNC_INFO, "END-1", Debug); return v; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return 0; } } QString DataProxy_SQLite::getSoftVersion() { //SELECT MAX (softversion) FROM softwarecontrolç logEvent (Q_FUNC_INFO, "Start", Debug); return util->getVersion(); 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() << Q_FUNC_INFO << " - DATA: " << v; 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 } logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } //logEvent (Q_FUNC_INFO, "END", Debug); } QString DataProxy_SQLite::getDBVersion() { //SELECT MAX (dbversion) FROM softwarecontrol logEvent (Q_FUNC_INFO, "Start", Debug); 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(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } bool DataProxy_SQLite::reconnectDB() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->reConnect(util->getKLogDBFile()); } void DataProxy_SQLite::createLogModel() { logEvent (Q_FUNC_INFO, "Start-END **** EMPTY FUNCTION", Debug); } void DataProxy_SQLite::createLogPanel(){ logEvent (Q_FUNC_INFO, "Start-END **** EMPTY FUNCTION", Debug); } int DataProxy_SQLite::getIdFromModeName(const QString& _modeName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_modeName.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -4; } logEvent (Q_FUNC_INFO, "END", Debug); return db->getModeIdFromSubMode(_modeName); } int DataProxy_SQLite::getSubModeIdFromSubMode(const QString &_subModeName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_subModeName.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); 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(); logEvent (Q_FUNC_INFO, "END-2", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); return -2; } logEvent (Q_FUNC_INFO, "END-3", Debug); return -3; } int DataProxy_SQLite::getModeIdFromSubModeId(const int _sm) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return getIdFromModeName(getNameFromSubMode(getSubModeFromId(_sm))); } bool DataProxy_SQLite::isModeDeprecated (const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_sm.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); 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(); logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return false; } } else { query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); 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().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-5", Debug); return false; // In case we can't check, we don't state it as deprecated } logEvent (Q_FUNC_INFO, "END", Debug); return false; } int DataProxy_SQLite::getIdFromBandName(const QString& _bandName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_bandName.length()<1) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -4; } logEvent (Q_FUNC_INFO, "END", Debug); return db->getBandIdFromName(_bandName); } QString DataProxy_SQLite::getNameFromBandId (const int _id) { logEvent (Q_FUNC_INFO, "Start-END", Debug); return db->getBandNameFromNumber(_id); } QString DataProxy_SQLite::getNameFromModeId (const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getModeNameFromNumber(_id); } QString DataProxy_SQLite::getNameFromSubModeId (const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getSubModeNameFromNumber(_id); } QString DataProxy_SQLite::getSubModeFromId (const int _id) { logEvent (Q_FUNC_INFO, "Start", Debug); 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(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } //logEvent (Q_FUNC_INFO, "END", Debug); } QString DataProxy_SQLite::getNameFromSubMode (const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); 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(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } Frequency DataProxy_SQLite::getFreqFromBandId(const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getFreqFromBandId(_id); } int DataProxy_SQLite::getBandIdFromFreq(const double _n) { //Freq should be in MHz logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_n); bool sqlOk = false; QString queryString = QString("SELECT id FROM band WHERE lower <= :freq and upper >= :freq"); QSqlQuery query; query.prepare(queryString); query.bindValue(":freq", _n); sqlOk = query.exec(); //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); if (sqlOk) { //qDebug() << Q_FUNC_INFO << " - Query OK"; query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return -1; } } else { //qDebug() << Q_FUNC_INFO << " - Query NOK"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return -2; } } QString DataProxy_SQLite::getBandNameFromFreq(const double _n) { logEvent (Q_FUNC_INFO, "Start", Debug); bool sqlOk = false; QString queryString = QString("SELECT name FROM band WHERE lower <= :freq and upper >= :freq"); QSqlQuery query; query.prepare(queryString); query.bindValue(":freq", _n); sqlOk = query.exec(); if (sqlOk) { query.next(); if (query.isValid()) { QString b = (query.value(0)).toString(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return b; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } double DataProxy_SQLite::getLowLimitBandFromBandName(const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_sm.length ()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -1.0; } QString queryString = QString("SELECT lower FROM band WHERE name= :sm OR name= :name"); QSqlQuery query; query.prepare(queryString); query.bindValue(":sm", _sm); query.bindValue(":name", _sm.toUpper()); bool sqlOK = query.exec(); if (sqlOK) { query.next(); if (query.isValid()) { double fr = (query.value(0)).toDouble(); query.finish(); if ( fr < 0 ) { logEvent (Q_FUNC_INFO, "END-2", Debug); return -1.0; } else { //qDebug() << Q_FUNC_INFO << " -(value found): " << QString::number(fr); logEvent (Q_FUNC_INFO, "END-2", Debug); return fr; } } else { //qDebug() << Q_FUNC_INFO << " - -1.0-2"; query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return -1.0; } //qDebug() << Q_FUNC_INFO << " - -1.0-3"; } else { //qDebug() << Q_FUNC_INFO << " - SQL Error"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); return -1.0; } } double DataProxy_SQLite::getLowLimitBandFromBandId(const int _sm) { //qDebug() << Q_FUNC_INFO << " - Start"; QString queryString = QString("SELECT lower FROM band WHERE id= :sm"); QSqlQuery query; query.prepare(queryString); query.bindValue(":sm", _sm); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(1)).toDouble()<0 ) { //qDebug() << Q_FUNC_INFO << " -1.0-1"; query.finish(); return -1.0; } else { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toDouble()); double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << Q_FUNC_INFO << " -1.0-2"; query.finish(); return -1.0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return -1.0; } } double DataProxy_SQLite::getUpperLimitBandFromBandName(const QString &_sm) { //qDebug() << Q_FUNC_INFO << ": " << _sm; 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"; query.finish(); return -1.0; } else { //qDebug() << Q_FUNC_INFO << ": (else): " << QString::number((query.value(0)).toDouble()); double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << Q_FUNC_INFO << ": -1.0-2"; query.finish(); return -1.0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); 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; } return fields; } QStringList DataProxy_SQLite::getBandNames() { //qDebug() << Q_FUNC_INFO; 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() << Q_FUNC_INFO << " : " << queryString; 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().text(), 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() << Q_FUNC_INFO << " - " << QString::number(_qs.length()); if (_qs.length()<2) { return _qs; } QMap map; map.clear(); QStringList qs; qs.clear(); //qDebug() << Q_FUNC_INFO << " : 00"; for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandName(_qs.at(j)), _qs.at(j)); } //qDebug() << Q_FUNC_INFO << " : 10"; QMap::const_iterator i = map.constBegin(); //qDebug() << Q_FUNC_INFO << " : 20"; while (i != map.constEnd()) { qs << i.value(); ++i; } //qDebug() << Q_FUNC_INFO << " : END -lengh = " << QString::number(qs.length()); qs.removeDuplicates(); return qs; } QStringList DataProxy_SQLite::getBandIDs() { //qDebug() << Q_FUNC_INFO; 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() << Q_FUNC_INFO ; 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() << Q_FUNC_INFO << " - Start "; 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() << Q_FUNC_INFO << " - " << modes.join(" - "); modes.sort(); return modes; } int DataProxy_SQLite::getMostUsedBand(const int _log) { //qDebug() << Q_FUNC_INFO << " - Start "; 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() << Q_FUNC_INFO << " -OK: " << QString::number(v)<< QT_ENDL; return v; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << " --ERROR-1: "; return -1; } //qDebug() << Q_FUNC_INFO << " --ERROR-2: "; return -2; } int DataProxy_SQLite::getMostUsedMode(const int _log) { //qDebug() << Q_FUNC_INFO << " - Start "; 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().text(), query.lastQuery()); query.finish(); return -1; } return -2; } int DataProxy_SQLite::getLastQSOid() { //qDebug() << Q_FUNC_INFO << " - Start"; 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().text(), query.lastQuery()); query.finish(); return -1; } } QDate DataProxy_SQLite::getFirstQSODateFromCall (const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; QSqlQuery query; QString stringQuery; QDate _date; Callsign callsign(_call); if (callsign.isValid()) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date ASC LIMIT 1").arg(_call); } else if (_call == "NOT") { stringQuery = QString("SELECT qso_date from log where ((station_callsign IS NULL) OR (station_callsign='')) ORDER BY qso_date ASC LIMIT 1"); } else { // ALL stringQuery = QString("SELECT qso_date from log where 1 ORDER BY qso_date ASC LIMIT 1"); } bool sqlOK = query.exec(stringQuery); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); 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() << Q_FUNC_INFO << ": END OK" ; return _date; } else { //qDebug() << Q_FUNC_INFO << ": END-1 " ; return QDate(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": END-2" ; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": END-3" ; return QDate(); } } QDate DataProxy_SQLite::getLastQSODateFromCall (const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; QSqlQuery query; QString stringQuery; QDate _date; Callsign callsign(_call); if (callsign.isValid()) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date DESC LIMIT 1").arg(_call); } else if (_call == "NOT") { stringQuery = QString("SELECT qso_date from log where ((station_callsign IS NULL) OR (station_callsign='')) ORDER BY qso_date DESC LIMIT 1"); } else { // ALL 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() << Q_FUNC_INFO << ": OK"; return _date; } else { //qDebug() << Q_FUNC_INFO << ": END-1"; return QDate(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": END-2"; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": END-3"; return QDate(); } } bool DataProxy_SQLite::clearLog() { //qDebug() << Q_FUNC_INFO << " - Start"; //int errorCode = 0; QSqlQuery query; bool sqlOK = query.exec("DELETE FROM log"); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - Log deleted!"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() <getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() <getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - - OK"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - - NOK"; } return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate) { //qDebug() <getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " -: TRUE"; //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - FALSE"; return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << Q_FUNC_INFO << " - " << _updateDate; 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() << Q_FUNC_INFO << " - QSL already requested"; //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() << Q_FUNC_INFO << " - Request QSL-1"; //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() << Q_FUNC_INFO << " -Request QSL-2"; 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() << Q_FUNC_INFO << " -Request QSL-3"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " - TRUE"; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - FALSE"; query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate) { //qDebug() << Q_FUNC_INFO << " -"; 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().text(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << Q_FUNC_INFO << " - " << _updateDate; 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() << Q_FUNC_INFO << " - QSL already requested"; 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() << Q_FUNC_INFO << " - Request QSL-1"; 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() << Q_FUNC_INFO << " - Request QSL-2"; 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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Request QSL-3"; 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() << Q_FUNC_INFO << " - TRUE"; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - FALSE"; query.finish(); return false; } bool DataProxy_SQLite::qslSentAsRequested(const int _qsoId, const QDate &_updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << Q_FUNC_INFO << " -"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << Q_FUNC_INFO << " - " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " -"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " -"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << Q_FUNC_INFO << " - " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - OK"; query.finish(); return true; } else { //qDebug() << Q_FUNC_INFO << " - NOK"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " - " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - - TRUE"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - - FALSE"; 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() << Q_FUNC_INFO << " -: " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - - TRUE"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - - FALSE"; 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() << Q_FUNC_INFO << " -" << QString::number(_qsoId); 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() << Q_FUNC_INFO << " - " << QString::number(_qsoId) << "QSL Received"; return true; } else { //qDebug() << Q_FUNC_INFO << " -: " << QString::number(_qsoId) << "QSL NOT Received-1"; return false; } } else { //qDebug() << Q_FUNC_INFO << " -: " << QString::number(_qsoId) << "QSL NOT Received-2"; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); } return false; } bool DataProxy_SQLite::isQSLSent(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_qsoId); 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() << Q_FUNC_INFO << " - " << QString::number(_qsoId) << "QSL Sent"; return true; } else { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_qsoId) << "QSL NOT Sent-1"; return false; } } else { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_qsoId) << "QSL NOT Sent-2"; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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().text(), 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().text(), 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().text(), 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().text(), query.lastQuery()); query.finish(); } return -1; } QList DataProxy_SQLite::getBandModeDXCCCQZlogIDFromId(const int _qsoId) { QList result; result.clear(); QSqlQuery query; query.prepare("SELECT bandid, modeid, dxcc, cqz, lognumber FROM log WHERE id = :id"); query.bindValue(":id", _qsoId); if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish (); return result; } if (!query.next() || !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(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("dxcc"); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("cqz"); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("lognumber"); 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() << Q_FUNC_INFO << " -; 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().text(), query.lastQuery()); query.finish(); } return QString(); } QStringList DataProxy_SQLite::getClubLogRealTimeFromId(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_qsoId); /* 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() << Q_FUNC_INFO << " - sqlOK -1"; if (query.next()) { //qDebug() << Q_FUNC_INFO << " - qsl next -1"; if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - sql valid -1"; 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() << Q_FUNC_INFO << " - without BAND-RX"; 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() << Q_FUNC_INFO << " - NO VALID"; return QStringList(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << " - ERROR-1"; return QStringList(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << " - ERROR-2"; return QStringList(); } sqlOk = query.exec(queryString); dataC << QString::number(_qsoId); //qDebug() << Q_FUNC_INFO << " - lastQuery: " << query.lastQuery(); if (sqlOk) { //qDebug() << Q_FUNC_INFO << " - sqlOK-1"; if (query.next()) { //qDebug() << Q_FUNC_INFO << " - query next = OK"; if (query.isValid()) { QSqlRecord rec = query.record(); //qDebug() << Q_FUNC_INFO << " - query valid = OK"; QString aux; nameCol = rec.indexOf("qso_date"); aux = util->getADIFDateFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << Q_FUNC_INFO << " - ERROR-3: " << aux; return QStringList(); } dataC << aux; aux = util->getADIFTimeFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << Q_FUNC_INFO << " - ERROR-4: " << aux; return QStringList(); } //qDebug() << Q_FUNC_INFO << " - Time_on: " << aux; 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() << Q_FUNC_INFO << " - ERROR-5: " << aux; 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() << Q_FUNC_INFO << " - ERROR-6: " << aux; return QStringList(); } dataC << aux; //nameCol = rec.indexOf("B.name"); // BAND aux = (query.value(7)).toString(); if (aux.length()<1) { query.finish(); //qDebug() << Q_FUNC_INFO << " - ERROR-7: " << aux; 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(); Callsign callsign(aux2); if (callsign.isValid()) { dataC << aux2; } else { dataC << call; } //qDebug() << Q_FUNC_INFO << " - RETURNING ... OK"; query.finish(); return dataC; } else { //NO VALID //qDebug() << Q_FUNC_INFO << " - NO VALID NOT OK"; query.finish(); return QStringList(); } } } else { //qDebug() << Q_FUNC_INFO << " - NOT sqlOK"; //qDebug() << Q_FUNC_INFO << " - 2 LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << " - 2 LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " - 2 LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " - 2 LastError-n: " << QString::number(query.lastError().text() ); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QStringList(); } //qDebug() << Q_FUNC_INFO << " - ERROR-10"; return QStringList(); } QStringList DataProxy_SQLite::getFilteredLocators(const QString &_band, const QString &_mode, const QString &_prop, const QString &_sat, bool _confirmed) { //qDebug() << Q_FUNC_INFO << ": " << _band; //qDebug() << Q_FUNC_INFO << ": " << _mode; //qDebug() << Q_FUNC_INFO << ": " << _prop; //qDebug() << Q_FUNC_INFO << ": " << _sat; QStringList grids = QStringList(); QSqlQuery query; QString queryString; QString bandString = QString(); int bandId = getIdFromBandName(_band); if (util->isValidBandId(bandId)) { bandString = QString("bandid = '%1'").arg(bandId); } else { bandString = QString("bandid <> ''"); } QString modeString = QString(); int modeId = getIdFromModeName(_mode); if (util->isValidModeId(modeId)) { modeString = QString("AND modeid = '%1'").arg(modeId); } else { modeString = QString("AND modeid <> '' "); } QString propString = QString(); QString satsString = QString(); if (isValidPropMode(_prop)) { propString = QString("AND prop_mode = '%1'").arg(_prop); if (_prop == "SAT") { //qDebug() << Q_FUNC_INFO << ": SAT: " << _sat; if (getDBSatId(_sat)>0) { satsString = QString("AND sat_name = '%1'").arg(_sat); } else { satsString = QString("AND sat_name <> 'x'"); } } else { satsString = QString("AND sat_name = ''"); } } else { propString = QString("AND prop_mode <> 'x'"); satsString = QString("AND sat_name = ''"); } QString confirmedString = QString(); if (_confirmed) { confirmedString = QString("AND ((qsl_rcvd = 'Y') OR (lotw_qsl_rcvd = 'Y'))"); } else { confirmedString = QString("AND qsl_rcvd <> 'x' "); } queryString = QString("SELECT DISTINCT gridsquare from log WHERE %1 %2 %3 %4 %5 ORDER BY id ASC").arg(bandString).arg(modeString).arg(propString).arg(satsString).arg(confirmedString); bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << queryString ; while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); grids.append(queryString); if (grids.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << queryString ; } } else { query.finish(); return QStringList(); } } query.finish(); grids.sort(); return grids; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QStringList(); } } bool DataProxy_SQLite::QRZCOMModifyFullLog(const int _currentLog) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_currentLog); 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"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - END FALSE: " << query.lastError().databaseText() ; return false; } //qDebug() << Q_FUNC_INFO << " - END TRUE" ; //return false; } bool DataProxy_SQLite::QRZCOMSentQSOs(const QList &_qsos) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << Q_FUNC_INFO << " - updating QSO: " << QString::number(_qsos.at(i)); 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() << Q_FUNC_INFO << " - exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - END FALSE" ; return false; } } //qDebug() << Q_FUNC_INFO << " - END TRUE" ; return true; } bool DataProxy_SQLite::clublogSentQSOs(const QList &_qsos) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << Q_FUNC_INFO << " - updating QSO: " << QString::number(_qsos.at(i)); 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() << Q_FUNC_INFO << " -: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " -: END FALSE" ; return false; } } //qDebug() << Q_FUNC_INFO << " -: END TRUE" ; return true; } bool DataProxy_SQLite::clublogModifyFullLog(const int _currentLog) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_currentLog); 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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " -: END FALSE" ; return false; } //qDebug() << Q_FUNC_INFO << " -: END TRUE" ; //return false; } bool DataProxy_SQLite::eQSLModifyFullLog(const int _currentLog) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_currentLog); 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() << Q_FUNC_INFO << " -: END TRUE"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " -: END FALSE: " << query.lastError().databaseText() ; return false; } //qDebug() << Q_FUNC_INFO << " -: END TRUE" ; } bool DataProxy_SQLite::eQSLSentQSOs(const QList &_qsos) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << Q_FUNC_INFO << " -: updating QSO: " << QString::number(_qsos.at(i)); 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() << Q_FUNC_INFO << " -: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " -: END FALSE" ; return false; } } //qDebug() << Q_FUNC_INFO << " -: END TRUE" ; 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() << Q_FUNC_INFO << _dxcall; //_qso format: Date/TimeOn/call/bandid/modeid/freq/dxgrid/timeOff/rsttx/rstrx/txpower/comments/name QSO qso; qso.setCall(_dxcall); qso.setDateTimeOn(_datetime); qso.setBand(_band); qso.setFreq(_freq); qso.setMode(_mode); qso.setDateOff(_datetime_off.date()); qso.setTimeOff(_datetime_off.time()); qso.setRSTTX(_rstTX); qso.setRSTRX(_rstRX); qso.setStxString(_sTX); qso.setSrxString(_sRX); qso.setComment(_comment); qso.setName(_name); qso.setGridSquare(_dxgrid); qso.setMyGridSquare(_mygrid); qso.setTXPwr(txpower); qso.setOperatorCallsign(_operator); qso.setStationCallsign(_stationcallsign); qso.setDXCC(_dxcc); if (_sendQSL) { qso.setQSLVia("B"); qso.setLoTWQSL_SENT("Q"); qso.setEQSLQSL_SENT("Q"); qso.setHRDLogStatus("M"); qso.setClubLogStatus("M"); qso.setQRZCOMStatus("M"); } qso.setLogId(_logNumber); return (qso.toDB()>0); } bool DataProxy_SQLite::deleteQSO(const int _qsoId) { //qDebug() << Q_FUNC_INFO << " -"; 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().text(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::isWorkedB4(const QString &_qrz, const int _currentLog) { //qDebug() << Q_FUNC_INFO << " -"; //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().text(), query.lastQuery()); query.finish(); return -1; } } QList DataProxy_SQLite::isThisQSODuplicated (const QSO &_qso, const int _secs) { //qDebug() << Q_FUNC_INFO << " - 000"; QList dupeQsos; //qDebug() << Q_FUNC_INFO << " - 001"; dupeQsos.clear(); //qDebug() << Q_FUNC_INFO << " - 002"; QSO q(_qso); //qDebug() << Q_FUNC_INFO << " - 003"; //qDebug() << Q_FUNC_INFO << " - Call: " << q.getCall(); if (!q.isValid()) { //qDebug() << Q_FUNC_INFO << " - END Empty 3" ; return dupeQsos; } //qDebug() << Q_FUNC_INFO << " - 005"; int validityPeriod = _secs * 60; QString initTime = util->getDateTimeSQLiteStringFromDateTime(q.getDateTimeOn().addSecs(-validityPeriod)); QString endTime = util->getDateTimeSQLiteStringFromDateTime(q.getDateTimeOn().addSecs(validityPeriod)); //yyyy-MM-dd hh:mm:ss // We will match +-15min //qDebug() << Q_FUNC_INFO << " - 010"; QString queryString = QString("SELECT id, qso_date FROM log WHERE call = ':call' AND bandid = ':bandid' AND modeid= ':modeid' AND qso_date BETWEEN ':initTime' AND ':endTime'"); //QString queryString = QString("SELECT id, qso_date FROM log WHERE call= :call AND bandid = :bandid AND modeid= :modeid AND qso_date >= ':initTime' AND qso_date <= ':endTime'"); //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); QSqlQuery query; if (!query.prepare(queryString)) { //qDebug() << Q_FUNC_INFO << ": ERROR preparing the Query"; return dupeQsos; } //qDebug() << Q_FUNC_INFO << " - 020"; query.bindValue(":call", q.getCall()); query.bindValue(":bandid", getIdFromBandName(q.getBand())); query.bindValue(":modeid", getIdFromModeName(q.getMode())); query.bindValue(":initTime", initTime); query.bindValue(":endTime", endTime); //qDebug() << Q_FUNC_INFO << " - 030"; //qDebug() << Q_FUNC_INFO << " QUERY: " << q.getCall(); //qDebug() << Q_FUNC_INFO << " QUERY: " << getIdFromBandName(q.getBand()); //qDebug() << Q_FUNC_INFO << " QUERY: " << getIdFromModeName(q.getMode()); //qDebug() << Q_FUNC_INFO << " QUERY: " << initTime; //qDebug() << Q_FUNC_INFO << " QUERY: " << endTime; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - 050"; if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - 051"; while (query.next()) { if (query.isValid()) { int dupeQSO = (query.value(0)).toInt(); if (dupeQSO>0) { dupeQsos.append(dupeQSO); } } else { //qDebug() << Q_FUNC_INFO << " - END Empty 2" ; } } //qDebug() << Q_FUNC_INFO << " - END - ok" ; return dupeQsos; } else { //qDebug() << Q_FUNC_INFO << " - 052"; //qDebug() << Q_FUNC_INFO << " : Native Error1 " << query.lastError().text(); //qDebug() << Q_FUNC_INFO << " : Native Error2 " << query.lastError(); //qDebug() << Q_FUNC_INFO << " : Native Error3 " << query.lastError().text(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << " - END Empty 1" ; return dupeQsos; } } int DataProxy_SQLite::getDuplicatedQSOId(const QString &_qrz, const QDateTime &_datetime, const int _band, const int _mode) { //qDebug() << Q_FUNC_INFO; 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().text(), query.lastQuery()); query.finish(); return -1; } //return -1; } bool DataProxy_SQLite::isHF(const int _band) {// 160M is considered as HF if ( (_band>=getIdFromBandName("10M")) && (_band<=getIdFromBandName("160M")) ) { //qDebug() << Q_FUNC_INFO << " - TRUE"; return true; } else { //qDebug() << Q_FUNC_INFO << " - FALSE"; return false; } } bool DataProxy_SQLite::isWARC(const int _band) { if ( (_band==getIdFromBandName("12M")) || (_band==getIdFromBandName("17M")) || ((_band==getIdFromBandName("30M")) ) ) { //qDebug() << Q_FUNC_INFO << " - tRUE"; return true; } else { //qDebug() << Q_FUNC_INFO << " - FALSE"; return false; } } bool DataProxy_SQLite::isVHF(const int _band) { if (_band<=getIdFromBandName("6M")) { //qDebug() << Q_FUNC_INFO << " - TRUE"; return true; } else { //qDebug() << Q_FUNC_INFO << " - FALSE"; return false; } } bool DataProxy_SQLite::isUHF(const int _band) { if (_band<=getIdFromBandName("70CM")) { //qDebug() << Q_FUNC_INFO << " - TRUE"; return true; } else { //qDebug() << Q_FUNC_INFO << " - FALSE"; return false; } } QStringList DataProxy_SQLite::getOperatingYears(const int _currentLog) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_currentLog); 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() << Q_FUNC_INFO << " - -1"; bool sqlOk = query.exec(queryString); if (!sqlOk) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); return years; } //qDebug() << Q_FUNC_INFO << " - sqlOk = true"; while (query.next()) { if (query.isValid()) { //QString year = (query.value(0)).toString(); //qDebug() << Q_FUNC_INFO << " - year=" << year; years << (query.value(0)).toString(); //year.clear(); } } //qDebug() << Q_FUNC_INFO << " - END OK - " << QString::number(years.size())<< QT_ENDL; query.finish(); if (years.length()>0) { years.sort(); } 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() << Q_FUNC_INFO << " - Date:" << _updateDate << " /" << QString::number(_currentLog); 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' OR lotw_qsl_sent IS NULL").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' OR lotw_qsl_sent IS NULL").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().text(), 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() << Q_FUNC_INFO << " - " << QString::number(_currentLog); 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().text(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentQSOs(const QList &_qsos) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << Q_FUNC_INFO << " -: updating QSO: " << QString::number(_qsos.at(i)); //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() << Q_FUNC_INFO << " -: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " -: END FALSE" ; return false; } } //qDebug() << Q_FUNC_INFO << " -: END TRUE" ; 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() << Q_FUNC_INFO << " - " << _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() << Q_FUNC_INFO << " - Modified Id: " << QString::number(id); return id; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - SQL ERROR"; return -4; } } else { //qDebug() << Q_FUNC_INFO << " - ID Not found"; query.finish(); return -5; } } else if ((query.lastError().text()).toInt() == -1) { //qDebug() << Q_FUNC_INFO << " - QSO not found " << query.lastQuery(); return -1; } else { //qDebug() << Q_FUNC_INFO << " - Unknown error " << query.lastQuery(); //qDebug() << Q_FUNC_INFO << " - Error: " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << " - Error: " << QString::number(query.lastError().text()); query.finish(); return -3; } } else { //qDebug() << Q_FUNC_INFO << " - Query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); return -100; } QString DataProxy_SQLite::getStringQueryLogNumber (const int _a) { // Returns the string to build a query. // This is used by: // DataProxy_SQLite::getQSOsListLoTWToSend // DataProxy_SQLite::getQSOsListClubLogToSent // DataProxy_SQLite::getQSOsListEQSLToSent // DataProxy_SQLite::getQSOsListQRZCOMToSent // DataProxy_SQLite::getQSOsListToBeExported if (doesThisLogExist (_a)) { return QString(" AND lognumber='%1'").arg(_a); } else { return QString(); } } QString DataProxy_SQLite::getStringQueryMyGrid (const QString &_a) { // Returns the string to build a query. // This is used by: // DataProxy_SQLite::getQSOsListToBeExported if (util->isValidGrid (_a)) { return QString("my_gridsquare='%1'").arg(_a); } else if (_a == "ALL") { return QString("((my_gridsquare!='ALL') OR (my_gridsquare IS NULL) OR (my_gridsquare=''))"); } else { // NO GRID return QString("(my_gridsquare='' OR my_gridsquare IS NULL)"); } } QString DataProxy_SQLite::getStringQueryStationCallSign (const QString &_a) { // Returns the string to build a query. // This is used by: // DataProxy_SQLite::getQSOsListLoTWToSend // DataProxy_SQLite::getGridsToBeSent // DataProxy_SQLite::getQSOsListClubLogToSent // DataProxy_SQLite::getQSOsListEQSLToSent // DataProxy_SQLite::getQSOsListQRZCOMToSent // DataProxy_SQLite::getQSOsListToBeExported // DataProxy_SQLite::getQSOsListeQSLNotSent Callsign callsign(_a); if (callsign.isValid()) { return QString("station_callsign='%1'").arg(_a); } else if (_a == "ALL") { return QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { return QString("((station_callsign='') OR (station_callsign IS NULL))"); } } QList DataProxy_SQLite::getQSOsListLoTWToSend(const QString &_stationCallsign, const QString &_myGrid, const QDate &_startDate, const QDate &_endDate, bool _justQueued, int _logN) { //qDebug() << Q_FUNC_INFO << " - Call/Start/end: " << _stationCallsign << _myGrid << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _queryGrid_string = getStringQueryMyGrid (_myGrid); QString _query_justQueued; if (_justQueued) { //qDebug() << Q_FUNC_INFO << " - justQueued TRUE"; _query_justQueued = QString("lotw_qsl_sent='Q'"); } else { //qDebug() << Q_FUNC_INFO << " - justQueued FALSE"; _query_justQueued = QString("lotw_qsl_sent!='1'"); } QString _query_logNumber = getStringQueryLogNumber(_logN); QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 AND %3 %4 AND %5 AND %6").arg(_queryST_string).arg(_queryGrid_string).arg(_query_justQueued).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QList qsoList; qsoList.clear(); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery() ; if (sqlOK) { // //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); 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"); //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().text(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QStringList DataProxy_SQLite::getGridsToBeSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, const ExportMode _em, bool _justModified, int _logN) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList grids; grids.clear (); QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _queryST_logNumber = getStringQueryLogNumber (_logN); QString _query_justQueued; if ((_justModified) && (_em == ModeLotW)) { _query_justQueued = QString("lotw_qsl_sent='Q'"); } else { _query_justQueued = QString("((lotw_qsl_sent!='1') OR (lotw_qsl_sent IS NULL))"); } queryString = QString("SELECT DISTINCT my_gridsquare FROM log WHERE %1 AND ((my_gridsquare<>'') OR (my_gridsquare IS NOT NULL)) AND qso_date>='%2' AND qso_date<='%3' AND %4 %5").arg(_queryST_string).arg(util->getDateSQLiteStringFromDate(_startDate)).arg(util->getDateSQLiteStringFromDate(_endDate.addDays (1))).arg(_query_justQueued).arg(_queryST_logNumber); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery (); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString(); if (aux.length()>1) { grids.append ((query.value(0)).toString()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); grids.sort (); //qDebug() << Q_FUNC_INFO << " - END-1"; return grids; } query.finish(); grids.sort(); //qDebug() << Q_FUNC_INFO << " - END"; return grids; } QList DataProxy_SQLite::getQSOsListClubLogToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << Q_FUNC_INFO << " - Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _query_justModified; if (_justModified) { //qDebug() << Q_FUNC_INFO << " - justQueued TRUE"; _query_justModified = QString("clublog_qso_upload_status='M'"); } else { //qDebug() << Q_FUNC_INFO << " - justQueued FALSE"; _query_justModified = QString("clublog_qso_upload_status!='M'"); } //qDebug() << Q_FUNC_INFO << " - logN: " << QString::number(_logN); QString _query_logNumber = getStringQueryLogNumber(_logN); QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); 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"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { //qDebug() << Q_FUNC_INFO << " - Adding: " << QString::number((query.value(0)).toInt()); qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); //qDebug() << Q_FUNC_INFO << " - Returning: #" << QString::number(qsoList.length()); return qsoList; } QList DataProxy_SQLite::getQSOsListEQSLToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << Q_FUNC_INFO << " -Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _query_justModified; if (_justModified) { //qDebug() << Q_FUNC_INFO << " -justQueued TRUE"; _query_justModified = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << Q_FUNC_INFO << " -justQueued FALSE"; _query_justModified = QString("eqsl_qsl_sent!='M'"); } QString _query_logNumber = getStringQueryLogNumber(_logN); QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " -Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << " -Query: " << query.lastQuery(); 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"); //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().text(), 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, int _logN) { //qDebug() << Q_FUNC_INFO << " - Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _query_justModified; if (_justModified) { //qDebug() << Q_FUNC_INFO << " - justQueued TRUE"; _query_justModified = QString("qrzcom_qso_upload_status='M'"); } else { //qDebug() << Q_FUNC_INFO << " - justQueued FALSE"; _query_justModified = QString("qrzcom_qso_upload_status!='-'"); } QString _query_logNumber = getStringQueryLogNumber(_logN); QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); 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"); //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().text(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListToBeExported(const QString &_stationCallsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, int _logN) { //qDebug() << Q_FUNC_INFO << QString("Call: %1, Grid: %2, StartDate: %3, EndDate: %4").arg(_stationCallsign).arg(_grid).arg(_startDate.toString("yyyyMMdd")).arg(_endDate.toString("yyyyMMdd")); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _queryGrid_String = getStringQueryMyGrid (_grid); QString _query_logNumber = getStringQueryLogNumber(_logN); QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5 ").arg(_queryST_string).arg(_queryGrid_String).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo);; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); 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"); //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().text(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsAll() { QString queryString = QString("SELECT id FROM log") ; QSqlQuery query; QList qsoList; qsoList.clear(); bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { qsoList.append((query.value(0)).toInt()); } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); return qsoList; } QList DataProxy_SQLite::getQSOsListeQSLNotSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued) { //qDebug() << Q_FUNC_INFO << " - Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string = getStringQueryStationCallSign(_stationCallsign); QString _query_justQueued; if (_justQueued) { //qDebug() << Q_FUNC_INFO << " - justQueued TRUE"; _query_justQueued = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << Q_FUNC_INFO << " - justQueued FALSE"; _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() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << " - Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite: QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //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().text(), 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() << Q_FUNC_INFO << " -" << QString::number(_id); QStringList result; result.clear(); //getNameFromBandId QSqlQuery query; //QString queryString = QString("SELECT call, qso_date, my_gridsquare, bandid, modeid FROM log WHERE id='%0'").arg(_id); QString queryString = QString("SELECT call, qso_date, my_gridsquare, band.name, mode.name FROM log JOIN band ON log.bandid=band.id JOIN mode on log.modeid=mode.id WHERE log.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 myGrid = query.value(2).toString(); QString bandid = query.value(3).toString(); QString modeid = query.value(4).toString(); query.finish(); //qDebug() << Q_FUNC_INFO << " - - date: " << date; //qDebug() << Q_FUNC_INFO << " - - time: " << time; //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 (myGrid); result.append(bandid); result.append(modeid); //qDebug() << Q_FUNC_INFO << " - - END: call: " << call; return result; } //qDebug() << Q_FUNC_INFO << " - - END: no valid " ; } query.finish(); //qDebug() << Q_FUNC_INFO << " - - END: no next " ; return result; } else { //qDebug() << Q_FUNC_INFO << " - - END: SQL NOK " ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return result; } } int DataProxy_SQLite::getQSOonYear(const int _year, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_year) << "/" << QString::number(_logNumber); 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() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getDXCConYear(const int _year, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_year) << "/" << QString::number(_logNumber); 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() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getCQzonYear(const int _year, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_year); 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() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithDXCC(const int _dxcc, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_dxcc); QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc LIKE '%1'").arg(_dxcc); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc = '%1'").arg(_dxcc); } else { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc LIKE '%2'").arg(_logNumber).arg(_dxcc); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc = '%2'").arg(_logNumber).arg(_dxcc); } sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHour(const int _hour, const int _log) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_hour); 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() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHourOnBand(const int _hour, const int _band, const int _log) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_hour); 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 bandid='%1' AND qso_date LIKE '% %2:%'").arg(_band).arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND bandid='%2' AND qso_date LIKE '% %3:%' ").arg(_log).arg(_band).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsOnMonth(const int _month, const int _log) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_month); 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() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; query.finish(); return 0; } } bool DataProxy_SQLite::updateQSONumberPerLog() { //qDebug() << Q_FUNC_INFO; 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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - TRUE2"; 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() << Q_FUNC_INFO << " -"; 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() << Q_FUNC_INFO << " - - Existing DXCC"; existingDXCC = true; } if ( (query.value(1)).toInt() == _cq) { //qDebug() << Q_FUNC_INFO << " - - Existing CQz"; existingCQz = true; } } } if (existingDXCC && existingCQz) { //qDebug() << Q_FUNC_INFO << " - - FALSE"; query.finish(); return false; } else { //qDebug() << Q_FUNC_INFO << " - - TRUE1"; query.finish(); return true; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - - TRUE2"; 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() << Q_FUNC_INFO << " -" ; 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() << Q_FUNC_INFO << " - " << queryString ; 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().text(), 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().text(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getContestOverlays() { //qDebug() << Q_FUNC_INFO << " - "<< 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() << Q_FUNC_INFO << " - " << queryString ; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QStringList(); } } bool DataProxy_SQLite::isValidPropMode(const QString &_prop) { QSqlQuery query; QString queryString = QString("SELECT shortname FROM prop_mode_enumeration WHERE shortname='%1'").arg(_prop); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { query.finish(); return true; } } return false; } QStringList DataProxy_SQLite::getPropModeList() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), 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().text(), 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) { QSqlQuery query; QString queryString; if (id > 0) { queryString = QString( "UPDATE satellites SET satarrlid = :arrlId, satname = :name, uplink = :upLink, downlink = :downLink, satmode = :mode WHERE id = :id" ); query.prepare(queryString); query.bindValue(":id", id); } else { queryString = QString( "INSERT INTO satellites (satarrlid, satname, uplink, downlink, satmode) VALUES (:arrlId, :name, :upLink, :downLink, :mode)" ); query.prepare(queryString); } query.bindValue(":arrlId", _arrlId); query.bindValue(":name", _name); query.bindValue(":upLink", _upLink); query.bindValue(":downLink", _downLink); query.bindValue(":mode", _mode); if (query.exec()) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getDBSatId(const QString &_arrlId) { int aux = -1; QSqlQuery query; QString queryString = "SELECT id FROM satellites WHERE satarrlid= :arrlId"; query.prepare(queryString); query.bindValue(":arrlId", _arrlId); if (query.exec()) { if (query.next()) { aux = query.value(0).toInt(); } else { query.finish(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); } query.finish(); return aux; } QStringList DataProxy_SQLite::getSatellitesList() { //qDebug() << Q_FUNC_INFO << " -" ; 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 { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } QString DataProxy_SQLite::getSatelliteUplink(const QString &_sat, int _pair) { //qDebug() << Q_FUNC_INFO << " - " << _sat; 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, _pair)); } else { //qDebug() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteDownlink(const QString &_sat, int _pair) { //qDebug() << Q_FUNC_INFO << " - " << _sat; 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,_pair)); } else { //qDebug() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; return aux; } QString DataProxy_SQLite::getSatelliteFullUplink(const QString &_sat) { //qDebug() << Q_FUNC_INFO << " - " << _sat; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullDownlink(const QString &_sat) { //qDebug() << Q_FUNC_INFO << " - " << _sat; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; return aux; } QString DataProxy_SQLite::getSatelliteName(const QString &_sat) { //qDebug() << Q_FUNC_INFO << " - " << _sat; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; 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() << Q_FUNC_INFO << " - query not valid" ; query.finish(); return QString(); } } else { //qDebug() << Q_FUNC_INFO << " - query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - final: " << aux; return aux; } double DataProxy_SQLite::getFreqFromRange(QString _fr, int _pair) { //May even receive: 145.900-146.00 and should return the mid in the range (145.950) //qDebug() << Q_FUNC_INFO << " - " << _fr; 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 if((_pair<0) || (_pair>1)) { _pair = 0; } //qDebug() << Q_FUNC_INFO << " - has several freqs: " << aux; aux = aux.section(',', _pair, _pair); // We select the selected package } if (aux.contains('-')) // Potentially somethink like: 435.030-435.456 { //qDebug() << Q_FUNC_INFO << " - has several freqs: " << aux; fr2 = aux.section('-', 1, 1); // We select the second freq fr1 = aux.section('-', 0, 0); // We select the first freq //qDebug() << Q_FUNC_INFO << " - fr1: " << fr1; //qDebug() << Q_FUNC_INFO << " - fr2: " << fr2; f1 = fr1.toDouble(); f2 = fr2.toDouble(); //qDebug() << Q_FUNC_INFO << " - f1: " << QString::number(f1); //qDebug() << Q_FUNC_INFO << " - f2: " << QString::number(f2); f1 = (f2 + f1)/2; //qDebug() << Q_FUNC_INFO << " - f1 after calc: " << QString::number(f1); } else { // It is only one freq 145.950 so this is what must be returned f1 = aux.toDouble(); } //qDebug() << Q_FUNC_INFO << " - Return: " << QString::number(f1); return f1; } QStringList DataProxy_SQLite::getQSLRcvdList() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLSentList() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getClubLogStatusList() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLViaList() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } bool DataProxy_SQLite::haveAtLeastOneLog() { //qDebug() << Q_FUNC_INFO << " -"; 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().text(), query.lastQuery()); query.finish(); return false; } //return false; } QStringList DataProxy_SQLite::getColumnNamesFromTableLog() { //qDebug() << Q_FUNC_INFO << " -"; return getColumnNamesFromTable("log"); } QStringList DataProxy_SQLite::getColumnNamesFromTable(const QString &_tableName) { //qDebug() << Q_FUNC_INFO << " -; return db->getColumnNamesFromTable(_tableName); } 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() << Q_FUNC_INFO << " - length: " << _name; // id / name / shortname / prefix / regionalgroup / regionalid / dxcc / cqz / ituz / start_date / end_date / deleted QString queryString; QSqlQuery query; bool sqlOK = false; //qDebug() << Q_FUNC_INFO << " - Importing: " << _regionalAward.getRegionalAwardRefName(i) ; 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() << Q_FUNC_INFO << " - " << query.lastQuery(); query.finish(); } else { //qDebug() << Q_FUNC_INFO << " - ERROR "; //qDebug() << Q_FUNC_INFO << " - - query error: " << QString::number(query.lastError().text()); //qDebug() << Q_FUNC_INFO << " - LastQuery: " << query.lastQuery() ; //qDebug() << Q_FUNC_INFO << " - LastError-data: " << query.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " - LastError-driver: " << query.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " - LastError-n: " << QString::number(query.lastError().text() ); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } //qDebug() << Q_FUNC_INFO << " - END" ; return true; } QList DataProxy_SQLite::getPrimarySubDivisions(const int _entity, const QString &_pref) { // Returns the Primary Subdivision for an Entity // If _pref is empty, and entity >=0 we look for all the subdivisions of the Entity, // If _pref is not empty, we look for the subdivisions with that entity, if none, we look for the number. //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_entity) << "/" << _pref; QList list; list.clear(); QSqlQuery query; QString queryString; if ((_pref.length()>0)) { //qDebug() << Q_FUNC_INFO << " - Running for no pref, delivering ALL for the entity"; queryString = QString("SELECT dxcc, prefix, name, shortname, cqz, ituz FROM primary_subdivisions WHERE prefix = :prefix ORDER BY shortname"); query.prepare(queryString); query.bindValue(":prefix", _pref); } else { //qDebug() << Q_FUNC_INFO << " - Running with a pref, delivering just for the prefix"; //qDebug() << Q_FUNC_INFO << QString("If the entity is <=0 The list will be empty. Entity: %1").arg(_entity); if (_entity<=0) { //qDebug() << Q_FUNC_INFO << " - END: entity <= 0"; return list; } queryString = QString("SELECT dxcc, prefix, name, shortname, cqz, ituz FROM primary_subdivisions WHERE dxcc = :dxcc ORDER BY shortname"); query.prepare(queryString); query.bindValue(":dxcc", _entity); } bool sqlOK = query.exec(); if (sqlOK) { //qDebug() << Q_FUNC_INFO << ": sqlOK true"; while (query.next()) { if (query.isValid()) { PrimarySubdivision ps; ps.dxcc = (query.value(0)).toInt(); ps.prefix = (query.value(1)).toString(); ps.name = (query.value(2)).toString(); ps.shortName = (query.value(3)).toString(); ps.cqz = (query.value(4)).toInt(); ps.ituz = (query.value(5)).toInt(); list.append(ps); //qDebug() << Q_FUNC_INFO << " : " << ps.name ; } else { //qDebug() << Q_FUNC_INFO << ": query not valid"; } } //qDebug() << Q_FUNC_INFO << ": query not next"; } else { //qDebug() << Q_FUNC_INFO << ": sqlOK FALSE"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); list.clear(); } query.finish(); //qDebug() << Q_FUNC_INFO << " - END - " << QString::number(list.count()) ; return list; } int DataProxy_SQLite::getNumberOfManagedLogs() { //qDebug() << Q_FUNC_INFO << " -"; 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().text(), 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().text(), 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() << Q_FUNC_INFO << " -"; 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() << Q_FUNC_INFO << " -: " << (query.value(0)).toString() ; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); qs.clear(); } query.finish(); return qs; } QString DataProxy_SQLite::getStationCallSignFromLog(const int _log) { //qDebug() << Q_FUNC_INFO << " - " << 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() << Q_FUNC_INFO << " - " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - query failed"; query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - END"; //return QString(); } QStringList DataProxy_SQLite::getStationCallSignsFromLog(const int _log) { //qDebug() << Q_FUNC_INFO << " -"; 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() << Q_FUNC_INFO << " -: " << queryString; } else { query.finish(); //qDebug() << Q_FUNC_INFO << " --END-1 - fail"; return QStringList(); } } query.finish(); calls.removeDuplicates(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << " --END-2 - fail"; return QStringList(); } calls.sort(); //qDebug() << Q_FUNC_INFO << " --END"; return calls; } QStringList DataProxy_SQLite::getStationCallSignsFromLogWithLoTWPendingToSend(const int _log) { //qDebug() << Q_FUNC_INFO << ": logNumber: " << _log; // Check if the log exists; return an empty list if it doesn't if (!doesThisLogExist(_log)) { return QStringList(); } // Prepare the SQL query with placeholders QString queryString = "SELECT DISTINCT station_callsign FROM log WHERE lotw_qsl_sent = 'Q' AND lognumber = :logNumber"; QSqlQuery query; // Bind parameters to the prepared query query.prepare(queryString); //query.bindValue(":lotwStatus", "Q"); query.bindValue(":logNumber", _log); // Execute the query if (!query.exec()) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.executedQuery()); return QStringList(); } // Collect valid call signs QStringList calls; while (query.next()) { QString callSign = query.value(0).toString().trimmed(); if (callSign.length() > 2) { // Ensure valid call signs calls.append(callSign); } } // Remove duplicates and sort the results calls.removeDuplicates(); calls.sort(); return calls; } QString DataProxy_SQLite::getOperatorsFromLog(const int _log) { //qDebug() << Q_FUNC_INFO << " - " << 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() << Q_FUNC_INFO << " - " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - query failed"; query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - END"; //return QString(); } QString DataProxy_SQLite::getCommentsFromLog(const int _log) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_log); 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() << Q_FUNC_INFO << ": " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << ": Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << ": query failed"; query.finish(); return QString(); } } QString DataProxy_SQLite::getLogDateFromLog(const int _log) { //qDebug() << Q_FUNC_INFO << " - " << 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() << Q_FUNC_INFO << " - " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - query failed"; query.finish(); return QString(); } //qDebug() << Q_FUNC_INFO << " - END"; //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().text(), query.lastQuery()); query.finish(); return -1; } } /* bool DataProxy_SQLite::fillEmptyDXCCInTheLog() { //qDebug() << Q_FUNC_INFO << " - Start"; int qsos = getHowManyEmptyDXCCorCont(); 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); QString queryString = QString("SELECT id, call FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); QSqlQuery query; bool 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() << Q_FUNC_INFO << ": DXCC: " << _dxcc; //qDebug() << Q_FUNC_INFO << ": Cont: " << _continent; // UPDATE THE ID WITH THE DXCC sqlOK = updateDXCCAndContinent(_id.toInt(), _dxcc.toInt(), _continent); if (!sqlOK) { query.finish(); return false; } 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() << Q_FUNC_INFO << ": progress canceled"; query.finish(); return true; } j++; } } query.finish(); 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().text(), 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().text(), 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().text(), 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().text(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithContinent(const QString &_cont, const int _logNumber) { //qDebug() << Q_FUNC_INFO << " - " << _cont; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where continent = '%1'").arg(_cont); } else { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont LIKE '%2'").arg(_logNumber).arg(_cont); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont='%2'").arg(_logNumber).arg(_cont); } sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " - queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << Q_FUNC_INFO << " - 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error"; 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().text(), 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().text(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getDXCCInBand(const int _bandid, const bool _confirmed, const int _log) { //(SELECT COUNT (DISTINCT dxcc) from log inner join band on log.bandid = band.id where band.name="80M") Q_UNUSED(_bandid); if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QChar _confirmedChar = 'N'; if (_confirmed) { _confirmedChar = 'Y'; } QString queryString; QSqlQuery query; if (_log < 0) { queryString = QString("SELECT COUNT (DISTINCT dxcc) from log where band.id= :bandid AND (qsl_rcvd= :confirmed OR lotw_qsl_rcvd= :confirmed)"); } else { queryString = QString("SELECT COUNT (DISTINCT dxcc) from log where band.id= :bandid AND log.id= :log AND (qsl_rcvd= :confirmed OR lotw_qsl_rcvd= :confirmed)"); } if (!query.prepare (queryString)) { return 0; } query.bindValue (":confirmed", _confirmedChar); query.bindValue (":log", _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().text(), query.lastQuery()); query.finish(); return 0; } } QList> DataProxy_SQLite::getTop10QSOPerDXCC(const int _log) { //qDebug() << Q_FUNC_INFO << " : " << QString::number(_log); 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().text(), query.lastQuery()); query.finish(); return result; } //qDebug() << Q_FUNC_INFO << " - END" ; //return result; } bool DataProxy_SQLite::addNewLog (const QStringList _qs) { //qDebug() << Q_FUNC_INFO << " - " << _qs.at(2) << "/" << _qs.at(5) << "/" << _qs.at(6); //qDebug() << Q_FUNC_INFO << " - Size: " << QString::number(_qs.size()); // newLogq << dateString << stationCallsign << operators << comment << QString::number(selectedLog) << _qs.at(4) ; (last field is 1 or 0 editing) if (_qs.size()!=6) { //qDebug() << Q_FUNC_INFO << " - != 6" ; return false; } //qDebug() << Q_FUNC_INFO << " - Has the appropriate length" ; 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() << Q_FUNC_INFO << " - We are editing!"; //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() << Q_FUNC_INFO << " - Editing OK!"; query.finish(); return true; } else { //qDebug() << Q_FUNC_INFO << " - Editing NOK!"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } //return false; } //qDebug() << Q_FUNC_INFO << " - We are adding a new log"; // 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() << Q_FUNC_INFO << " - query1: " << queryString; sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - query error: " << queryString; // It seems that the log is already existing! return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " - query1: " << queryString; sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return false; } //return false; } bool DataProxy_SQLite::doesThisLogExist(const int _log) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_log); //qDebug() << Q_FUNC_INFO << " - - Name:" << db->getDBName(); QSqlQuery query; //SELECT COUNT (*) FROM log WHERE lognumber='3' //SELECT COUNT (*) FROM logs WHERE id='1' QString queryString = QString("SELECT COUNT (*) FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << " query: " << query.lastQuery() ; if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " - END False 1"; return false; } if (!query.next()) { //qDebug() << Q_FUNC_INFO << " - END False 2"; return false; } if (!query.isValid()) { //qDebug() << Q_FUNC_INFO << " - END False 3"; return false; } return (query.value(0).toInt() >0); /* //int i = query.value(0).toInt(); //qDebug() << Q_FUNC_INFO << " - Value: " << QString::number(i); //qDebug() << Q_FUNC_INFO << " - END TRUE"; return true; if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); //qDebug() << Q_FUNC_INFO << " - END TRUE" ; return true; } else { query.finish(); //qDebug() << Q_FUNC_INFO << " - END FALSE 1" ; return false; } } else { query.finish(); //qDebug() << Q_FUNC_INFO << " - END FALSE 2" ; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << " - END FALSE 3" ; return false; } //qDebug() << Q_FUNC_INFO << " - END FALSE 4" ; 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().text(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getContinentShortNameFromEntity(const int _n) { // SELECT DISTINCT dxcc, bandid, modeid, id, lognumber from log WHERE qsl_rcvd='Y' OR lotw_qsl_rcvd='Y' GROUP BY dxcc, bandid, modeid 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.id WHERE entity.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().text(), 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); 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().text(), 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().text(), 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().text(), 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().text(), query.lastQuery()); query.finish(); return false; } } QStringList DataProxy_SQLite::filterValidFields(const QStringList &_fields) { const QStringList validFields = getFields(); QStringList returningFields; for (QString field : _fields) { field = field.trimmed(); if (field.endsWith(';')) { field.chop(1); } if (validFields.contains(field)) { returningFields << field; } } // If no valid fields are found, return default fields 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); QString queryString = QString("SELECT ituz FROM prefixesofentity WHERE prefix = '%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().text(), 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); QString queryString = QString("SELECT cqz FROM prefixesofentity WHERE prefix = '%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().text(), 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().text(), 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().text(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getEntityNameFromId(const int _n) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_n); 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().text(), 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().text(), query.lastQuery()); query.finish(); return QString(); } //return QString(); } int DataProxy_SQLite::getEntityIdFromName(const QString &_e) { //qDebug() << Q_FUNC_INFO << " -" << _e; int id = -1; QString queryString; QSqlQuery query; 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().text(), 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; } } } QMap DataProxy_SQLite::getAllEntiNameISOAndPrefix() { QMap entities; entities.clear(); QString queryString("SELECT dxcc, name, isoname, mainprefix FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish (); return entities; } while (query.next()) { if (!query.isValid()) continue; int dxcc = (query.value(0)).toInt(); EntityData entity; entity.dxcc = dxcc; entity.name = (query.value(1)).toString(); entity.isoname = (query.value(2)).toString(); entity.mainprefix = (query.value(3)).toString(); entities.insert(entity, dxcc); } return entities; } QString DataProxy_SQLite::getEntityMainPrefix(const int _entityN) { //qDebug() << Q_FUNC_INFO << " -" << QString::number(_entityN); 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().text(), 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() << Q_FUNC_INFO << " -" << _e; 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().text(), 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() << Q_FUNC_INFO << " - " << _p << "-"; QSqlQuery query; QString queryString = QString("SELECT dxcc FROM prefixesofentity WHERE prefix='%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << ": query OK: query: " << queryString; if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << Q_FUNC_INFO << ": return 0: " << QString::number(v) ; return v; } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": return -1: "; return -1; } } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": return -2: "; return -2; } } else { //qDebug() << Q_FUNC_INFO << ": query NOK: query: " << queryString; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": return -3: "; return -3; } } */ 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().text(), 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().text(), 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().text(), 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().text(), 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().text(), 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::getSpecialCallsigns() { //qDebug() << Q_FUNC_INFO; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT prefix from prefixesofentity WHERE prefix like '=%'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { //aux.clear(); aux = (query.value(0)).toString(); aux = aux.remove(0,1); qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); qs.sort(); //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(qs.count()); return qs; } QHash DataProxy_SQLite::getWorldData() { //qDebug() << Q_FUNC_INFO << "Start"; QHash world; world.clear(); QString queryString; QSqlQuery query; QString pref; queryString = "SELECT prefix, dxcc FROM prefixesofentity"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << "END-FAIL-1 - !sqlOK"; return world; } else { while ( (query.next())) { if (query.isValid()) { //qDebug() << Q_FUNC_INFO << QString("Pref/Ent = %1/%2").arg((query.value(0)).toString()).arg((query.value(1)).toInt()); pref = (query.value(0)).toString(); if (pref.startsWith('=')) { pref.remove(0,1); } world.insert(pref, (query.value(1)).toInt()); } else { query.finish(); world.clear(); //qDebug() << Q_FUNC_INFO << "END-FAIL - Query not valid"; return world; } } } query.finish(); //qDebug() << Q_FUNC_INFO << "END"; //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(world.count()); return world; } QStringList DataProxy_SQLite::getLongPrefixes() {//select prefix FROM prefixesofentity WHERE (length(prefix)>2) AND (length(prefix)<6) AND (prefix NOT LIKE '%/%') //qDebug() << Q_FUNC_INFO; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT prefix from prefixesofentity WHERE prefix NOT like '=%'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString(); qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } query.finish(); qs.sort(); //foreach(aux, qs) //{ // //qDebug() << aux; //} return qs; } QStringList DataProxy_SQLite::getEntitiesNames() { //qDebug() << Q_FUNC_INFO << " -" ; 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().text(), 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().text(), 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().text(), 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().text(), query.lastQuery()); query.finish(); return -1; } } QList DataProxy_SQLite::getListOfDXCCIds() { QSqlQuery query; QString queryString = QString("SELECT dxcc FROM entity"); QList entities; entities.clear(); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return entities; } while(query.next()) { if (query.isValid()) { entities.append((query.value(0)).toInt()); } } query.finish(); //int i; //foreach (i, entities) { // //qDebug() << Q_FUNC_INFO << " - " << QString::number(i); //} return entities; } bool DataProxy_SQLite::updateISONames() { //qDebug() << Q_FUNC_INFO << " -" ; return db->updateTheEntityTableISONames(); } QString DataProxy_SQLite::getISOName(const int _n) { //qDebug() << Q_FUNC_INFO << " - " << QString::number(_n) ; if (_n <= 0 ) { //qDebug() << Q_FUNC_INFO << " - NOT KNOWN - UN"; 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().text(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - Query error - UN" ; query.finish(); return "un"; // When no flag is known, we return the UN flag } else { query.next(); if (query.isValid()){ //qDebug() << Q_FUNC_INFO << " - " << "N: " << QString::number(_n) << "- ISO Name: " << (query.value(0)).toString(); 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() << Q_FUNC_INFO << " - NO ISO Name: " ; query.finish(); return "un"; // When no flag is known, we return the UN flag } } } bool DataProxy_SQLite::addPrimarySubdivisions() { //qDebug() << Q_FUNC_INFO; return db->populateTablePrimarySubdivisions(); } /* int DataProxy_SQLite::getPrefixId(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": -" << _qrz <<"-"; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number Callsign callsign(_qrz); if (!callsign.isValid()) return -1; if (!callsign.isValidPrefix()) return -2; QString aux = callsign.getHostFullPrefix(); int entityID = 0; while ((entityID <= 0) && (aux.length()>=1) ) { entityID = getDXCCFromPrefix(aux); //qDebug() << Q_FUNC_INFO << ": in the while" << aux << " = " << QString::number(entityID); if (entityID<=0) { aux.chop(1); } } //qDebug() << Q_FUNC_INFO << ": " << _qrz << QString::number(entityID); return entityID; } */ void DataProxy_SQLite::setLogLevel (const DebugLogLevel _l) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _l; db->setLogLevel(logLevel); logEvent (Q_FUNC_INFO, "END", Debug); } void DataProxy_SQLite::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } /* QString DataProxy_SQLite::getADIFQSO(const int _qsoId, ExportMode _em) { // Called from eLogQrzLog::sendQSO just for the QRZ.com QSO send //qDebug() << Q_FUNC_INFO << ": " << QString::number(_qsoId); QSqlQuery query; QString queryString = QString("SELECT * FROM log WHERE id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); if (!sqlOk) return QString(); if (!query.next()) return QString(); if (!query.isValid()) return QString(); QSqlRecord rec = query.record(); return getADIFFromQSOQuery(rec, _em, false, false, -1); } */ QString DataProxy_SQLite::getADIFValueFromRec(QSqlRecord _rec, const QString &_fieldName) {// To refactor the getADIFFromQSOQuery function int nameCol = _rec.indexOf(_fieldName); if (nameCol>=0) { QSqlField field = _rec.field(nameCol); return (field.value()).toString(); } return QString(); } QString DataProxy_SQLite::getADIFFromQSOQuery(QSqlRecord rec, ExportMode _em, bool _justMarked, bool _onlyRequested, const int _logN ) { //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); //qDebug() << Q_FUNC_INFO << ": START"; int nameCol; QString aux; QSO qso; qso.clear(); QSqlField field; if (_justMarked) { nameCol = rec.indexOf("marked"); field = rec.field(nameCol); aux = (field.value()).toString(); if (aux != "X") { return QString(); } } if (_onlyRequested) { nameCol = rec.indexOf("qsl_sent"); field = rec.field(nameCol); aux = (field.value()).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( aux !="R" ) { return QString(); } } qso.setCall(getADIFValueFromRec(rec, "call")); QDateTime tDateTime; aux = getADIFValueFromRec(rec, "qso_date"); tDateTime = util->getDateTimeFromSQLiteString(aux); qso.setDateTimeOn(tDateTime); aux = getADIFValueFromRec(rec, "bandid"); qso.setBand(getNameFromBandId(aux.toInt())); aux = getADIFValueFromRec(rec, "freq"); qso.setFreq(aux.toDouble()); aux = getADIFValueFromRec(rec, "band_rx"); aux = getNameFromBandId(aux.toInt()); qso.setBandRX(aux); aux = getADIFValueFromRec(rec, "freq_rx"); qso.setFreqRX((aux.toDouble())); aux = getADIFValueFromRec(rec, "modeid"); QString aux2 = getSubModeFromId(aux.toInt()); aux = getNameFromSubMode(aux2); qso.setMode(aux); qso.setSubmode(aux2); qso.setPropMode(getADIFValueFromRec(rec, "prop_mode")); qso.setSatName(getADIFValueFromRec(rec, "sat_name")); qso.setGridSquare(getADIFValueFromRec(rec, "gridsquare")); qso.setMyGridSquare(getADIFValueFromRec(rec, "my_gridsquare")); if (_em != ModeEQSL) qso.setStationCallsign(getADIFValueFromRec(rec, "station_callsign")); aux = getADIFValueFromRec(rec, "qso_date_off"); tDateTime = util->getDateTimeFromSQLiteString(aux); qso.setDateOff(tDateTime.date()); qso.setTimeOff(tDateTime.time()); qso.setSrx((getADIFValueFromRec(rec, "srx")).toInt()); qso.setSrxString(getADIFValueFromRec(rec, "srx_string")); qso.setStx((getADIFValueFromRec(rec, "stx")).toInt()); qso.setStxString(getADIFValueFromRec(rec, "stx_string")); qso.setCQZone((getADIFValueFromRec(rec, "cqz")).toInt()); qso.setItuZone((getADIFValueFromRec(rec, "ituz")).toInt()); qso.setDXCC((getADIFValueFromRec(rec, "dxcc")).toInt()); //qDebug() << Q_FUNC_INFO << ": - 100"; qso.setAddress(getADIFValueFromRec(rec, "address")); qso.setAge((getADIFValueFromRec(rec, "age")).toDouble()); qso.setCounty(getADIFValueFromRec(rec, "cnty")); qso.setComment(getADIFValueFromRec(rec, "comment")); qso.setA_Index((getADIFValueFromRec(rec, "a_index")).toInt()); qso.setAnt_az((getADIFValueFromRec(rec, "ant_az")).toDouble()); qso.setAnt_el((getADIFValueFromRec(rec, "ant_al")).toDouble()); qso.setAnt_Path(getADIFValueFromRec(rec, "ant_path")); qso.setARRL_Sect(getADIFValueFromRec(rec, "arrl_sect")); qso.setCheck(getADIFValueFromRec(rec, "checkcontest")); qso.setClass(getADIFValueFromRec(rec, "class")); //qDebug() << Q_FUNC_INFO << ": - 30"; qso.setContinent(getADIFValueFromRec(rec, "cont")); qso.setContactedOperator(getADIFValueFromRec(rec, "contacted_op")); qso.setContestID(getADIFValueFromRec(rec, "contest_id")); qso.setCountry(getADIFValueFromRec(rec, "country")); qso.setCreditSubmitted(getADIFValueFromRec(rec, "credit_submitted")); qso.setCreditGranted(getADIFValueFromRec(rec, "credit_granted")); qso.setDistance(getADIFValueFromRec(rec, "distance").toDouble()); qso.setDarcDok(getADIFValueFromRec(rec, "darc_dok")); qso.setEQ_Call(getADIFValueFromRec(rec, "eq_call")); qso.setEmail(getADIFValueFromRec(rec, "email")); aux = getADIFValueFromRec(rec, "eqsl_qslrdate"); qso.setEQSLQSLRDate(util->getDateFromSQliteString(aux)); aux = getADIFValueFromRec(rec, "eqsl_qslsdate"); qso.setEQSLQSLSDate(util->getDateFromSQliteString(aux)); qso.setEQSLQSL_RCVD(getADIFValueFromRec(rec, "eqsl_qsl_rcvd")); qso.setEQSLQSL_SENT(getADIFValueFromRec(rec, "eqsl_qsl_sent")); qso.setFists(getADIFValueFromRec(rec, "fists").toInt()); qso.setFistsCC(getADIFValueFromRec(rec, "fists_cc").toInt()); qso.setForceInit(util->QStringToBool(getADIFValueFromRec(rec, "force_init"))); aux = getADIFValueFromRec(rec, "hrdlog_qso_upload_date"); qso.setHRDUpdateDate(util->getDateFromSQliteString(aux)); qso.setHRDLogStatus(getADIFValueFromRec(rec, "hrdlog_qso_upload_status")); qso.setMyAntenna(getADIFValueFromRec(rec, "my_antenna")); //qDebug() << Q_FUNC_INFO << ": my_antenna-99"; qso.setMyDXCC(getADIFValueFromRec(rec, "my_dxcc").toInt()); qso.setMyFists(getADIFValueFromRec(rec, "my_fists").toInt()); qso.setIOTA(getADIFValueFromRec(rec, "iota")); qso.setIotaID(getADIFValueFromRec(rec, "iota_island_id").toInt()); qso.setMyIOTA(getADIFValueFromRec(rec, "my_iota")); qso.setMyIotaID(getADIFValueFromRec(rec, "my_iota_island_id").toInt()); qso.setK_Index(getADIFValueFromRec(rec, "k_index").toInt()); qso.setMyITUZone(getADIFValueFromRec(rec, "my_itu_zone").toInt()); qso.setLatitude(getADIFValueFromRec(rec, "lat")); qso.setLongitude(getADIFValueFromRec(rec, "lon")); qso.setMyLatitude(getADIFValueFromRec(rec, "my_lat")); qso.setMyLongitude(getADIFValueFromRec(rec, "my_lon")); aux = getADIFValueFromRec(rec, "lotw_qslrdate"); qso.setLoTWQSLRDate(util->getDateFromSQliteString(aux)); aux = getADIFValueFromRec(rec, "lotw_qslsdate"); qso.setLoTWQSLSDate(util->getDateFromSQliteString(aux)); qso.setLoTWQSL_RCVD(getADIFValueFromRec(rec, "lotw_qsl_rcvd")); qso.setLoTWQSL_SENT(getADIFValueFromRec(rec, "lotw_qsl_sent")); aux = getADIFValueFromRec(rec, "clublog_qso_upload_date"); qso.setClubLogDate(util->getDateFromSQliteString(aux)); qso.setClubLogStatus(getADIFValueFromRec(rec, "clublog_qso_upload_status")); aux = getADIFValueFromRec(rec, "qrzcom_qso_upload_date"); qso.setQRZCOMDate(util->getDateFromSQliteString(aux)); qso.setQRZCOMStatus(getADIFValueFromRec(rec, "qrzcom_qso_upload_status")); qso.setMaxBursts(getADIFValueFromRec(rec, "max_bursts").toInt()); qso.setMsShower(getADIFValueFromRec(rec, "ms_shower")); qso.setMyCity(getADIFValueFromRec(rec, "my_city")); qso.setMyCounty(getADIFValueFromRec(rec, "my_cnty")); qso.setMyCountry(getADIFValueFromRec(rec, "my_country")); qso.setMyCQZone(getADIFValueFromRec(rec, "my_cq_zone").toInt()); qso.setMyName(getADIFValueFromRec(rec, "my_name")); qso.setName(getADIFValueFromRec(rec, "name")); qso.setOperatorCallsign(getADIFValueFromRec(rec, "operator")); qso.setOwnerCallsign(getADIFValueFromRec(rec, "owner_callsign")); qso.setMyPostalCode(getADIFValueFromRec(rec, "my_postal_code")); qso.setMyRig(getADIFValueFromRec(rec, "my_rig")); qso.setMySig(getADIFValueFromRec(rec, "my_sig")); qso.setMySOTA_REF(getADIFValueFromRec(rec, "my_sota_ref")); qso.setMyState(getADIFValueFromRec(rec, "my_state")); qso.setMyStreet(getADIFValueFromRec(rec, "my_street")); qso.setNotes(getADIFValueFromRec(rec, "notes")); qso.setNrBursts(getADIFValueFromRec(rec, "nr_bursts").toInt()); qso.setNrPings(getADIFValueFromRec(rec, "nr_pings").toInt()); qso.setPrefix(getADIFValueFromRec(rec, "pfx")); qso.setPrecedence(getADIFValueFromRec(rec, "precedence")); qso.setPublicKey(getADIFValueFromRec(rec, "public_key")); qso.setQSLMsg(getADIFValueFromRec(rec, "qslmsg")); aux = getADIFValueFromRec(rec, "qslrdate"); qso.setQSLRDate(util->getDateFromSQliteString(aux)); aux = getADIFValueFromRec(rec, "qslsdate"); qso.setQSLSDate(util->getDateFromSQliteString(aux)); qso.setQSL_RCVD(getADIFValueFromRec(rec, "qsl_rcvd")); qso.setQSLRecVia(getADIFValueFromRec(rec, "qsl_rcvd_via")); qso.setQSL_SENT(getADIFValueFromRec(rec, "qsl_sent")); qso.setQSLSenVia(getADIFValueFromRec(rec, "qsl_sent_via")); qso.setQSLVia(getADIFValueFromRec(rec, "qsl_via")); qso.setQSOComplete(util->getADIFQSO_CompleteFromDB(getADIFValueFromRec(rec, "qso_complete"))); qso.setQSORandom(util->QStringToBool(getADIFValueFromRec(rec, "qso_random"))); qso.setQTH(getADIFValueFromRec(rec, "qth")); qso.setRSTTX(getADIFValueFromRec(rec, "rst_sent")); qso.setRSTRX(getADIFValueFromRec(rec, "rst_rcvd")); qso.setRegion(getADIFValueFromRec(rec, "region")); qso.setRig(getADIFValueFromRec(rec, "rig")); qso.setRXPwr(getADIFValueFromRec(rec, "rx_pwr").toDouble()); qso.setTXPwr(getADIFValueFromRec(rec, "tx_pwr").toDouble()); qso.setSatMode(getADIFValueFromRec(rec, "sat_mode")); qso.setSFI(getADIFValueFromRec(rec, "sfi").toInt()); qso.setSIG(getADIFValueFromRec(rec, "sig")); qso.setSIG_INFO(getADIFValueFromRec(rec, "sig_info")); qso.setSilentKey(util->QStringToBool(getADIFValueFromRec(rec, "silent_key"))); qso.setSkcc(getADIFValueFromRec(rec, "skcc")); qso.setSOTA_REF(getADIFValueFromRec(rec, "sota_ref")); qso.setState(getADIFValueFromRec(rec, "state")); qso.setSwl(util->QStringToBool(getADIFValueFromRec(rec, "swl"))); qso.setTenTen(getADIFValueFromRec(rec, "ten_ten").toInt()); qso.setUksmg(getADIFValueFromRec(rec, "uksmg").toInt()); qso.setVeProv(getADIFValueFromRec(rec, "ve_prov")); qso.setMyUsacaCounties(getADIFValueFromRec(rec, "my_usaca_counties")); qso.setUsacaCounties(getADIFValueFromRec(rec, "usaca_counties")); qso.setVUCCGrids(getADIFValueFromRec(rec, "vucc_grids")); qso.setMyVUCCGrids(getADIFValueFromRec(rec, "my_vucc_grids")); qso.setWeb(getADIFValueFromRec(rec, "web")); if (_logN == -1) qso.setLogId(getADIFValueFromRec(rec, "lognumber").toInt()); return qso.getADIF(); } 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); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ": log exists " ; 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 " ; stringQuery = QString("SELECT call, qso_date, band.name, mode.submode, 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"; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " - bandid" << QString::number((query.value(nameCol)).toInt()); _qso->setBand(query.value(nameCol).toString()); //nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromSubMode (query.value(3).toString())); _qso->setSubmode(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"; return _qsos; } QList DataProxy_SQLite::getGridStats(int _log) { //qDebug() << Q_FUNC_INFO << ": log = " << QString::number(_log); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ":: log exists " ; 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 " ; 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"; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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()); _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); _qso->setSubmode (getSubModeFromId ((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; //qDebug() << Q_FUNC_INFO << ": band: " << _band; //qDebug() << Q_FUNC_INFO << ": mode: " << _mode; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << Q_FUNC_INFO << ": Query OK"; } //qDebug() << Q_FUNC_INFO << " - END"; return _qsos; } QList DataProxy_SQLite::getSatGridStats(int _log) { //qDebug() << Q_FUNC_INFO << " - log = " << QString::number(_log); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << " - log exists " ; 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() << Q_FUNC_INFO << " - log does not exist " ; 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() << Q_FUNC_INFO << " - Query NOK"; //qDebug() << Q_FUNC_INFO << " - " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << " - " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), 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() << Q_FUNC_INFO << " - bandid" << QString::number((query.value(nameCol)).toInt()); _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << " - modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); _qso->setSubmode(getSubModeFromId((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() << Q_FUNC_INFO << " - call: " << _call; //qDebug() << Q_FUNC_INFO << " - band: " << _band; //qDebug() << Q_FUNC_INFO << " - mode: " << _mode; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << Q_FUNC_INFO << ": Query OK"; } //qDebug() << Q_FUNC_INFO << " - END"; 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; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " : Query NOK"; //qDebug() << Q_FUNC_INFO << " : " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << " : " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); query.finish(); return 0; } else { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " : " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } } query.finish(); return 0; } void DataProxy_SQLite::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _l) { logEvent(_func, _msg, _l); } klog-2.4.1/database/0000755000175000017500000000000015003153303013167 5ustar develdevelklog-2.4.1/database/queryexecutor.cpp0000644000175000017500000000222215003153303016615 0ustar develdevel#include "queryexecutor.h" QueryExecutor::QueryExecutor(const QString &_parentClass) { Q_UNUSED(_parentClass); //qDebug() << Q_FUNC_INFO << _parentClass ; } void QueryExecutor::queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery) { Q_UNUSED(_functionFailed); Q_UNUSED(errorCodeS); Q_UNUSED(_nativeError); Q_UNUSED(_failedQuery); //qDebug() << Q_FUNC_INFO << ": Function : " << _functionFailed ; //qDebug() << Q_FUNC_INFO << ": Native : " << _nativeError ; //qDebug() << Q_FUNC_INFO << ": Error : " << _functionFailed << errorCodeS ; //qDebug() << Q_FUNC_INFO << ": Query failed: " << _failedQuery ; } bool QueryExecutor::execQuery(const QString &function, const QString &stringQuery) { //qDebug() << Q_FUNC_INFO << " " << function << " : " << stringQuery ; QSqlQuery query; query.prepare(stringQuery); bool ok = query.exec(stringQuery); query.finish(); if (!ok) { queryErrorManagement(function, query.lastError().databaseText(), query.lastError().text(), query.lastQuery()); } return ok; } klog-2.4.1/database/db_adif_primary_subdvisions_data.cpp0000644000175000017500000010316515003153303022435 0ustar develdevel#include "db_adif_primary_subdvisions_data.h" DB_ADIF_Primary_Subdvisions_data::DB_ADIF_Primary_Subdvisions_data(const QString &_parentClass) { Q_UNUSED(_parentClass); //qDebug() << Q_FUNC_INFO << _parentClass ; } bool DB_ADIF_Primary_Subdvisions_data::addData() { /* stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "dxcc INTEGER NOT NULL, " // arrlId (281) "name VARCHAR NOT NULL, " // Madrid "shortname VARCHAR NOT NULL, " // M "prefix VARCHAR, " // EA4 "cqz INTEGER NOT NULL, " // 14 "ituz INTEGER NOT NULL, " // 37 "regionalgroup VARCHAR, " // Comunidad de Madrid "regionalid INTEGER, " // Oblast in Russia or any other Id "start_date DATETIME, " "end_date DATETIME, " "deleted VARCHAR, " "UNIQUE (id, shortname, name), " "FOREIGN KEY (cqz) REFERENCES entity (cqz), " "FOREIGN KEY (ituz) REFERENCES entity (ituz), " "FOREIGN KEY (dxcc) REFERENCES entity (dxcc) )"); */ //qDebug() << Q_FUNC_INFO << " - Checking if DB exists"; if (!isDBCreated()) return false; //qDebug() << Q_FUNC_INFO << " - Adding 1"; if (!add_Canada_1()) // Adds the data for Canada return false; //qDebug() << Q_FUNC_INFO << " - Adding 6"; if (!add_USA_6()) // Adds the data for Alaska return false; //qDebug() << Q_FUNC_INFO << " - Adding 21"; if (!add_EA6_21()) // Adds the data for Balearic Is return false; //qDebug() << Q_FUNC_INFO << " - Adding 29"; if (!add_EA8_29()) // Adds the data for Canary Is return false; //qDebug() << Q_FUNC_INFO << " - Adding 32"; if (!add_EA9_32()) // Adds the data for Ceuta y Melilla return false; //qDebug() << Q_FUNC_INFO << " - Adding 50"; if (!add_Mexico_50()) // Adds the data for Mexico return false; //qDebug() << Q_FUNC_INFO << " - Adding 100"; if (!add_Argentina_100()) // Adds the data for Argentina return false; //qDebug() << Q_FUNC_INFO << " - Adding 108"; if (!add_Brazil_108()) // Adds the data for Brazil return false; //qDebug() << Q_FUNC_INFO << " - Adding 110"; if (!add_USA_110()) // Adds the data for Hawaii return false; //qDebug() << Q_FUNC_INFO << " - Adding 149"; if (!add_CT_149()) // Adds the data for Azores return false; //qDebug() << Q_FUNC_INFO << " - Adding 256"; if (!add_CT_256()) // Adds the data for Madeira return false; //qDebug() << Q_FUNC_INFO << " - Adding 272"; if (!add_CT_272()) // Adds the data for Portugal return false; //qDebug() << Q_FUNC_INFO << " - Adding 281"; if (!add_EA_281()) // Adds the data for Spain return false; //qDebug() << Q_FUNC_INFO << " - Adding 291"; if (!add_USA_291()) // Adds the data for United States of America return false; //qDebug() << Q_FUNC_INFO << " - Adding 339"; if (!add_Japan_339()) // Adds the data for Japan return false; return true; } bool DB_ADIF_Primary_Subdvisions_data::isDBCreated() { return true; } bool DB_ADIF_Primary_Subdvisions_data::addValues(const QString &rows, const QStringList &values) { // This function will add all the values that come in the QStringList // It receives the list of rows and the values that will feed the table with the // values for primary subdivisions (provinces?) of the DXCC entity. QueryExecutor exe(Q_FUNC_INFO); QString sq = QString("INSERT INTO primary_subdivisions (%1) VALUES ").arg(rows); QString aux, oneValue; foreach (aux, values) { oneValue = QString("%1 (%2)").arg(sq, aux); if (!exe.execQuery(Q_FUNC_INFO, oneValue)) return false; } return true; } bool DB_ADIF_Primary_Subdvisions_data::add_Canada_1() { // This function contains the Primary Subdivision data for Canada // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'1', 'Nova Scotia', 'NS', 'VE1', '05', '09', '', '-1', '', '', 'N'" << "'1', 'Quebec', 'QC', 'VE2', '02', '04', '', '-1', '', '', 'N'" << "'1', 'Quebec', 'QC', 'VE2', '05', '09', '', '-1', '', '', 'N'" << "'1', 'Ontario', 'ON', 'VE3', '04', '03', '', '-1', '', '', 'N'" << "'1', 'Ontario', 'ON', 'VE3', '04', '04', '', '-1', '', '', 'N'" << "'1', 'Manitoba', 'MB', 'VE4', '04', '03', '', '-1', '', '', 'N'" << "'1', 'Manitoba', 'MB', 'VE4', '04', '04', '', '-1', '', '', 'N'" << "'1', 'Saskatchewan', 'SK', 'VE5', '04', '03', '', '-1', '', '', 'N'" << "'1', 'Alberta', 'AB', 'VE6', '04', '02', '', '-1', '', '', 'N'" << "'1', 'British Columbia', 'BC', 'VE7', '03', '02', '', '-1', '', '', 'N'" << "'1', 'Northwest Territories', 'NT', 'VE8', '01', '03', '', '-1', '', '', 'N'" << "'1', 'Northwest Territories', 'NT', 'VE8', '02', '04', '', '-1', '', '', 'N'" << "'1', 'Northwest Territories', 'NT', 'VE8', '04', '75', '', '-1', '', '', 'N'" << "'1', 'New Brunswick', 'NB', 'VE9', '05', '09', '', '-1', '', '', 'N'" << "'1', 'New foundland', 'NL', 'VO1', '02', '09', '', '-1', '', '', 'N'" << "'1', 'New foundland', 'NL', 'VO1', '05', '09', '', '-1', '', '', 'N'" << "'1', 'Yukon', 'YT', 'VY1', '01', '02', '', '-1', '', '', 'N'" << "'1', 'Prince Edward island', 'PE', 'VY2', '05', '09', '', '-1', '', '', 'N'" << "'1', 'Nunavut', 'NU', 'VY0', '02', '04', '', '-1', '', '', 'N'" << "'1', 'Nunavut', 'NU', 'VY0', '02', '09', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_USA_6() { // This function contains the Primary Subdivision data for Alaska // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'6', 'Alaska', 'AK', 'KL7', '1', '1', '', '-1', '', '', 'N'"; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_EA6_21() { // This function contains the Primary Subdivision data for Balearic is // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'21', 'Baleares', 'IB', 'EA6', '14', '37', 'Islas Baleares', '-1', '', '', 'N'"; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_EA8_29() { // This function contains the Primary Subdivision data for Canary island // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'29', 'Las Palmas', 'GC', 'EA8', '33', '36', 'Islas Canarias', '-1', '', '', 'N'" << "'29', 'Tenerife', 'TF', 'EA8', '33', '36', 'Islas Canarias', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_EA9_32() { // This function contains the Primary Subdivision data for Ceuta & Melilla // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'32', 'Ceuta', 'CE', 'EA9', '33', '37', 'Ceuta Y Melilla', '-1', '', '', 'N'" << "'32', 'Melilla', 'ML', 'EA9', '33', '37', 'Ceuta y Melilla', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_Mexico_50() { // This function contains the Primary Subdivision data for Mexico // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'50', 'Colima', 'COL', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Distrito Federal', 'DF', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Estado de Mexico', 'EMX', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Guanajuato', 'GTO', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Hidalgo', 'HGO', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Jalisco', 'JAL', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Michoacan', 'MIC', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Morelos', 'MOR', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Nayarit', 'NAY', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Puebla', 'PUE', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Queretaro', 'QRO', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Tlaxcala', 'TLX', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Veracruz', 'VER', 'XE1', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Aguascalientes', 'AGS', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Baja California', 'BC', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Baja California Sur','BCS', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Chihuahua', 'CHH', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Coahuila', 'COA', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Durango', 'DGO', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Nuevo Leon', 'NL', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'San Luis Potosi', 'SLP', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Sinaloa', 'SIN', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Sonora', 'SON', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Tamaulipas', 'TMS', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Zacatecas', 'ZAC', 'XE2', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Campeche', 'CAM', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Chiapas', 'CHS', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Guerrero', 'GRO', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Oaxaca', 'OAX', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Quintana Roo', 'QTR', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Tabasco', 'TAB', 'XE3', '06', '10', '', '-1', '', '', 'N'" << "'50', 'Yucatan', 'YUC', 'XE3', '06', '10', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_Argentina_100() { // This function contains the Primary Subdivision data for Mexico // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'100', 'Buenos Aires City', 'C', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Provincia de Buenos Aires', 'B', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Santa Fe', 'S', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Chaco', 'H', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Formosa', 'P', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Cordoba', 'X', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Misiones', 'N', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Entre Rios', 'E', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Tucuman', 'T', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Corrientes', 'W', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Mendoza', 'M', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Santiago del Estero', 'G', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Salta', 'A', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'San Juan', 'J', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'San Luis', 'D', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Catamarca', 'K', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'La Rioja', 'F', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Jujuy', 'Y', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'La Pampa', 'L', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Rio Negro', 'R', 'LU', '13', '14', '', '-1', '', '', 'N'" << "'100', 'Chubut', 'U', 'LU', '13', '16', '', '-1', '', '', 'N'" << "'100', 'Santa Cruz', 'Z', 'LU', '13', '16', '', '-1', '', '', 'N'" << "'100', 'Tierra del Fuego', 'V', 'LU', '13', '16', '', '-1', '', '', 'N'" << "'100', 'Neuquen', 'Q', 'LU', '13', '14', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_Brazil_108() { // This function contains the Primary Subdivision data for Mexico // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'108', 'Espirito Santo', 'ES', 'PP1', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Goias', 'GO', 'PP2', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Santa Catarina', 'SC', 'PP5', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Sergipe', 'SE', 'PP6', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Alagoas', 'AL', 'PP7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Amazonas', 'AM', 'PP8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Tocantins', 'TO', 'PQ2', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Amapa', 'AP', 'PQ8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Paraiba', 'PB', 'PR7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Maranhao', 'MA', 'PR8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Rio Grande do Norte', 'RN', 'PS7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Piuai', 'PI', 'PS8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Brasila', 'DF', 'PT2', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Ceara', 'CE', 'PT7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Acre', 'AC', 'PT8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Mato Grosso do Sul', 'MS', 'PT9', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Roraima', 'RR', 'PV8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Rondonia', 'RO', 'PW8', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Rio de Janeiro', 'RJ', 'PY1', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Sao Paulo', 'SP', 'PY2', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Rio Grande do Soul', 'RS', 'PY3', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Minas Gerais', 'MG', 'PY4', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Parana', 'PR', 'PY5', '11', '15', '', '-1', '', '', 'N'" << "'108', 'Bahia', 'BA', 'PY6', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Pernambuco', 'PE', 'PY7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Para', 'PA', 'PY7', '11', '13', '', '-1', '', '', 'N'" << "'108', 'Mato Grosso', 'MT', 'PY9', '11', '13', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_USA_110() { // This function contains the Primary Subdivision data for Hawaii // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'110', 'Hawaii', 'HI', 'KH6', '31', '61', '', '-1', '', '', 'N'"; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_CT_149() { // This function contains the Primary Subdivision data for Azores Is. // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'149', 'Açores', 'AC', 'CU', '14', '36', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_CT_256() { // This function contains the Primary Subdivision data for Madeira Is. // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'256', 'Madeira', 'MD', 'CT9', '33', '36', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_CT_272() { // This function contains the Primary Subdivision data for Portugal // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'272', 'Aveiro', 'AV', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Beja', 'BJ', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Braga', 'BR', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Bragança', 'BG', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Castelo Branco', 'CB', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Coimbra', 'CO', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Evora', 'EV', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Faro', 'FR', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Guarda', 'GD', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Leiria', 'LR', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Lisboa', 'LX', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Portoalegre', 'PG', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Porto', 'PT', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Santarem', 'SR', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Setubal', 'ST', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Viana do Castelo', 'VC', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Vila Real', 'VR', 'CT', '14', '37', '', '-1', '', '', 'N'" << "'272', 'Viseu', 'VS', 'CT', '14', '37', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_EA_281() { // This function contains the Primary Subdivision data for Spain // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'281', 'Avila', 'AV', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Burgos', 'BU', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'A Coruña', 'C', 'EA1', '14', '37', 'Galicia', '-1', '', '', 'N'" << "'281', 'Leon', 'LE', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'La Rioja', 'LO', 'EA1', '14', '37', 'La Rioja', '-1', '', '', 'N'" << "'281', 'Lugo', 'LU', 'EA1', '14', '37', 'Galicia', '-1', '', '', 'N'" << "'281', 'Asturias', 'O', 'EA1', '14', '37', 'Asturias', '-1', '', '', 'N'" << "'281', 'Ourense', 'OU', 'EA1', '14', '37', 'Galicia', '-1', '', '', 'N'" << "'281', 'Palencia', 'P', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Pontevedra', 'PO', 'EA1', '14', '37', 'Galicia', '-1', '', '', 'N'" << "'281', 'Cantabria', 'S', 'EA1', '14', '37', 'Cantabria', '-1', '', '', 'N'" << "'281', 'Salamanca', 'SA', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Segovia', 'SG', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Soria', 'SO', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Valladolid', 'VA', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Zamora', 'ZA', 'EA1', '14', '37', 'Castilla y León', '-1', '', '', 'N'" << "'281', 'Vizcaya', 'BI', 'EA2', '14', '37', 'Pais Vasco', '-1', '', '', 'N'" << "'281', 'Huesca', 'HU', 'EA2', '14', '37', 'Aragon', '-1', '', '', 'N'" << "'281', 'Navarra', 'NA', 'EA2', '14', '37', 'Navarra', '-1', '', '', 'N'" << "'281', 'Guipuzcoa', 'SS', 'EA2', '14', '37', 'Pais Vasco', '-1', '', '', 'N'" << "'281', 'Teruel', 'TE', 'EA2', '14', '37', 'Aragon', '-1', '', '', 'N'" << "'281', 'Alava', 'VI', 'EA2', '14', '37', 'Pais Vasco', '-1', '', '', 'N'" << "'281', 'Zaragoza', 'Z', 'EA2', '14', '37', 'Aragon', '-1', '', '', 'N'" << "'281', 'Barcelona', 'B', 'EA3', '14', '37', 'Cataluña', '-1', '', '', 'N'" << "'281', 'Girona', 'GI', 'EA3', '14', '37', 'Cataluña', '-1', '', '', 'N'" << "'281', 'Lleida', 'L', 'EA3', '14', '37', 'Cataluña', '-1', '', '', 'N'" << "'281', 'Tarragona', 'T', 'EA3', '14', '37', 'Cataluña', '-1', '', '', 'N'" << "'281', 'Badajoz', 'BA', 'EA4', '14', '37', 'Extremadura', '-1', '', '', 'N'" << "'281', 'Caceres', 'CC', 'EA4', '14', '37', 'Extremadura', '-1', '', '', 'N'" << "'281', 'Ciudad Real', 'CR', 'EA4', '14', '37', 'Castilla La Mancha', '-1', '', '', 'N'" << "'281', 'Cuenca', 'CU', 'EA4', '14', '37', 'Castilla La Mancha', '-1', '', '', 'N'" << "'281', 'Guadalajara', 'GU', 'EA4', '14', '37', 'Castilla La Mancha', '-1', '', '', 'N'" << "'281', 'Madrid', 'M', 'EA4', '14', '37', 'Madrid', '-1', '', '', 'N'" << "'281', 'Toledo', 'TO', 'EA4', '14', '37', 'Castilla La Mancha', '-1', '', '', 'N'" << "'281', 'Alicante', 'A', 'EA5', '14', '37', 'Comunidad Valenciana', '-1', '', '', 'N'" << "'281', 'Albacete', 'AB', 'EA5', '14', '37', 'Castilla La Mancha', '-1', '', '', 'N'" << "'281', 'Castellon', 'CS', 'EA5', '14', '37', 'Comunidad Valenciana', '-1', '', '', 'N'" << "'281', 'Valencia', 'V', 'EA5', '14', '37', 'Comunidad Valenciana', '-1', '', '', 'N'" << "'281', 'Murcia', 'MU', 'EA5', '14', '37', 'Region de Murcia ', '-1', '', '', 'N'" << "'281', 'Almeria', 'AL', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Cadiz', 'CA', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Cordoba', 'CO', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Granada', 'GR', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Huelva', 'H', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Jaen', 'J', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Malaga', 'MA', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" << "'281', 'Sevilla', 'SE', 'EA7', '14', '37', 'Andalucia', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_USA_291() { // This function contains the Primary Subdivision data for United States of America // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'291', 'Connecticut', 'CT', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Maine', 'ME', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Massachusetts', 'MA', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'New Hampshire', 'NH', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Rhode Island', 'RI', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Vermont', 'VT', 'K1', '05', '08', '', '-1', '', '', 'N'" << "'291', 'New Jersey', 'NJ', 'K2', '05', '08', '', '-1', '', '', 'N'" << "'291', 'New York', 'NY', 'K2', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Delaware', 'DE', 'K3', '05', '08', '', '-1', '', '', 'N'" << "'291', 'District of Columbia', 'DC', 'K3', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Maryland', 'MD', 'K3', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Pennsylvania', 'PA', 'K3', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Alabama', 'AL', 'K4', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Florida', 'FL', 'K4', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Georgia', 'GA', 'K4', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Kentucky', 'KY', 'K4', '04', '08', '', '-1', '', '', 'N'" << "'291', 'North Carolina', 'NC', 'K4', '04', '08', '', '-1', '', '', 'N'" << "'291', 'South Carolina', 'SC', 'K4', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Tennessee', 'TN', 'K4', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Tennessee', 'TN', 'K4', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Virginia', 'VA', 'K4', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Arkansas', 'AR', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Arkansas', 'AR', 'K5', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Lousiana', 'LA', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Lousiana', 'LA', 'K5', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Mississippi', 'MS', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Mississippi', 'MS', 'K5', '04', '08', '', '-1', '', '', 'N'" << "'291', 'New Mexico', 'NM', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Oklahoma', 'OK', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Texas', 'TX', 'K5', '04', '07', '', '-1', '', '', 'N'" << "'291', 'California', 'CA', 'K6', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Arizona', 'AZ', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Arizona', 'AZ', 'K7', '03', '07', '', '-1', '', '', 'N'" << "'291', 'Idaho', 'ID', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Montana', 'MT', 'K7', '04', '06', '', '-1', '', '', 'N'" << "'291', 'Montana', 'MT', 'K7', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Nevada', 'NV', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Oregon', 'OR', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Utah', 'UT', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Utah', 'UT', 'K7', '03', '07', '', '-1', '', '', 'N'" << "'291', 'Washington', 'WA', 'K7', '03', '06', '', '-1', '', '', 'N'" << "'291', 'Wyoming', 'WY', 'K7', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Michigan', 'MI', 'K8', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Michigan', 'MI', 'K8', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Ohio', 'OH', 'K8', '04', '08', '', '-1', '', '', 'N'" << "'291', 'West Virginia', 'WV', 'K8', '05', '08', '', '-1', '', '', 'N'" << "'291', 'Illinois', 'IL', 'K9', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Illinois', 'IL', 'K9', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Indiana', 'IN', 'K9', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Wisconsin', 'WI', 'K9', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Wisconsin', 'WI', 'K9', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Colorado', 'CO', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Iowa', 'IA', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Kansas', 'KS', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Minnesota', 'MN', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Minnesota', 'MN', 'K0', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Missouri', 'MO', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'Missouri', 'MO', 'K0', '04', '08', '', '-1', '', '', 'N'" << "'291', 'Nebraska', 'NE', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'North dakota', 'ND', 'K0', '04', '07', '', '-1', '', '', 'N'" << "'291', 'South Dakota', 'SD', 'K0', '04', '07', '', '-1', '', '', 'N'" ; return addValues(rows, values); } bool DB_ADIF_Primary_Subdvisions_data::add_Japan_339() { // This function contains the Primary Subdivision data for Japan // Source of data is https://www.adif.org (version 3.1.4) // Last modification 20240620 QString rows = QString("dxcc, name, shortname, prefix, cqz, ituz, regionalgroup, regionalid, start_date, end_date, deleted"); QStringList values; values.clear(); values << "'339', 'Chiba', '12', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Gunma', '16', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Ibaraki', '14', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Kanagawa', '11', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Saitama', '13', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Tochigi', '15', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Tokyo', '10', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Yamanashi', '17', 'JA1', '25', '45', 'Kanto', '-1', '', '', 'N'" << "'339', 'Aichi', '20', 'JA2', '25', '45', 'Tokai', '-1', '', '', 'N'" << "'339', 'Gifu', '19', 'JA2', '25', '45', 'Tokai', '-1', '', '', 'N'" << "'339', 'Mie', '21', 'JA2', '25', '45', 'Tokai', '-1', '', '', 'N'" << "'339', 'Shizuoka', '18', 'JA2', '25', '45', 'Tokai', '-1', '', '', 'N'" << "'339', 'Hyogo', '27', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Kyoto', '22', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Nara', '24', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Osaka', '25', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Shiga', '23', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Wakayama', '26', 'JA3', '25', '45', 'Kansai', '-1', '', '', 'N'" << "'339', 'Hiroshima', '35', 'JA4', '25', '45', 'Chugoku', '-1', '', '', 'N'" << "'339', 'Okayama', '31', 'JA4', '25', '45', 'Chugoku', '-1', '', '', 'N'" << "'339', 'Shimane', '32', 'JA4', '25', '45', 'Chugoku', '-1', '', '', 'N'" << "'339', 'Tottori', '34', 'JA4', '25', '45', 'Chugoku', '-1', '', '', 'N'" << "'339', 'Yamaguchi', '33', 'JA4', '25', '45', 'Chugoku', '-1', '', '', 'N'" << "'339', 'Ehime', '38', 'JA5', '25', '45', 'Shikoku', '-1', '', '', 'N'" << "'339', 'Kagawa', '36', 'JA5', '25', '45', 'Shikoku', '-1', '', '', 'N'" << "'339', 'Kochi', '39', 'JA5', '25', '45', 'Shikoku', '-1', '', '', 'N'" << "'339', 'Tokushima', '37', 'JA5', '25', '45', 'Shikoku', '-1', '', '', 'N'" << "'339', 'Fukuoka', '40', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Kagoshima', '46', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Kumamoto', '43', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Miyazaki', '45', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Nagasaki', '42', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Oita', '44', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Okinawa', '47', 'JS6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Saga', '41', 'JA6', '25', '45', 'Kyushu', '-1', '', '', 'N'" << "'339', 'Akita', '04', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Aomori', '02', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Fukushima', '07', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Iwate', '03', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Miyagi', '06', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Yamagata', '05', 'JA7', '25', '45', 'Tohoku', '-1', '', '', 'N'" << "'339', 'Hokkaido', '01', 'JA8', '25', '45', 'Hokkaido', '-1', '', '', 'N'" << "'339', 'Fukui', '29', 'JA9', '25', '45', 'Hokuriku', '-1', '', '', 'N'" << "'339', 'Ishikawa', '30', 'JA9', '25', '45', 'Hokuriku', '-1', '', '', 'N'" << "'339', 'Toyama', '28', 'JA9', '25', '45', 'Hokuriku', '-1', '', '', 'N'" << "'339', 'Nagano', '09', 'JA0', '25', '45', 'Shinestu', '-1', '', '', 'N'" << "'339', 'Niigata', '08', 'JA0', '25', '45', 'Shinestu', '-1', '', '', 'N'" ; return addValues(rows, values); } klog-2.4.1/database/db_adif_primary_subdvisions_data.h0000644000175000017500000000702715003153303022102 0ustar develdevel#ifndef KLOG_DATABASE_DB_ADIF_PRIMARY_SUBDVISIONS_DATA_H #define KLOG_DATABASE_DB_ADIF_PRIMARY_SUBDVISIONS_DATA_H /*************************************************************************** db_adif_primary_subdivisions_data.h - description ------------------- begin : Apr 2024 copyright : (C) 2024 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 contains the data of the Primary Subdivisions of ADIF as listed here: https://www.adif.org/314/ADIF_314.htm#Primary_Administrative_Subdivision This class exists just to have one single place to maintain any ADIF modification in the future. */ #include #include "queryexecutor.h" class DB_ADIF_Primary_Subdvisions_data : public QObject { Q_OBJECT public: explicit DB_ADIF_Primary_Subdvisions_data(const QString &_parentClass); bool addData(); signals: private: // To add new entity data, a new function should be created. // The format should be "add_MAIN-PREFIX-ARRLid QueryExecutor *exe; bool isDBCreated(); // This function checks if the DB is created. bool addValues(const QString &rows, const QStringList &values); bool add_Canada_1(); // Adds the data for Canada bool add_USA_6(); // Adds the data for Alaska bool add_EA6_21(); // Adds the data for Balearic Is bool add_EA8_29(); // Adds the data for Canary Is bool add_EA9_32(); // Adds the data for Ceuta y Melilla bool add_Mexico_50(); // Adds the data for Mexico bool add_Argentina_100();// Adds the data for Argentina bool add_Brazil_108(); // Adds the data for Brazil bool add_EA_281(); // Adds the data for Spain bool add_USA_110(); // Adds the data for Hawaii bool add_CT_149(); // Adds the data for Azores bool add_CT_256(); // Adds the data for Madeira bool add_CT_272(); // Adds the data for Portugal bool add_USA_291(); // Adds the data for United States of America bool add_Japan_339(); // Adds the data for Japan }; #endif // DB_ADIF_PRIMARY_SUBDVISIONS_DATA_H klog-2.4.1/database/queryexecutor.h0000644000175000017500000000454415003153303016273 0ustar develdevel#ifndef KLOG_DATABASE_QUERYEXECUTOR_H #define KLOG_DATABASE_QUERYEXECUTOR_H /*************************************************************************** queryexecutor.h - description ------------------- begin : Apr 2024 copyright : (C) 2024 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 defines a test to try to control DB executions from one single place. This class may be removed without any notice :) */ #include #include #include class QueryExecutor : public QObject { Q_OBJECT public: explicit QueryExecutor(const QString &_parentClass); bool execQuery(const QString &function, const QString &stringQuery); void queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery); private: }; #endif // QUERYEXECUTOR_H klog-2.4.1/callsign.cpp0000644000175000017500000004472615003153303013740 0ustar develdevel/*************************************************************************** callsign.cpp - description ------------------- begin : ago 2024 copyright : (C) 2024 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 "callsign.h" //TODO: Add support for FK/c, FO/a, FO/m, FT/g, FT/j, ... calls Callsign::Callsign(const QString &callsign, QObject *parent) : QObject{parent} { initialize(callsign); } Callsign::~Callsign(){} void Callsign::operator()(const QString &newCallsign) { initialize(newCallsign); } void Callsign::initialize(const QString &callsign) { clear(); // Clear existing data fullCall = callsign.toUpper(); bool hostAreaNumberExist1 = false; // Helper to check if the value exists or not bool hostSpecialNumberExist1 = false; // Helper to check if the value exists or not bool homeAreaNumberExist = false; // Helper to check if the value exists or not bool hostAreaNumberExist2 = false; // Helper to check if the value exists or not bool hostSpecialNumberExist2 = false; // Helper to check if the value exists or not bool homeSpecialAreaNumberExist = false; // Helper to check if the value exists or not // KB1/EA4K/QRP QString hostFullPrefix1; // KB1 QString hostNormalPrefix1; // KB //int hostAreaNumber1; // 1 QString hostSpecialPrefix1; // 3D2 (in 3D2/EA4K) int hostSpecialNumber1; // 0 (in 3D20/EA4K)(not sure if this usecase will exist!) QString hostFullPrefix2; // VU2 in EA4K/VU2 QString hostNormalPrefix2; // VU in EA4K/VU2 //int hostAreaNumber2; // 2 in EA4K/VU2 QString hostSpecialPrefix2; // 3D2 (in EA4K/3D2) //int hostSpecialNumber2; // 0 (in EA4K/3D20)(not sure if this usecase will exist!) QString homeNormalPrefix; // EA in EA4K QString homeSpecialPrefix; // 3D2 in 3D2A // int homeSpecialAreaNumber; // 0 in 3D20A QString suffix; // String containing Suffixes like QRP in EA4K/QRP but also 3D2 in EA4K/3D2 if (fullCall.contains('\\')) // Lets normalize complx calls fullCall.replace('\\', '/'); QString string2test = fullCall; QRegularExpression callsignRE = callsignRegEx(); QRegularExpression prefnRE = prefixRegEx(); QRegularExpressionMatch match = callsignRE.match(string2test); QRegularExpressionMatch matchPrefix = prefnRE.match(string2test); // Needed fields for a call are: // - hostFullPrefix (QString) // - hostPrefix (QString) // - hostAreaNumber (int) // - homeCallsign // - homeFullPrefix (QString) // - homePrefix (QString) // - homeAreaNumber (int) // - homeSuffix (QString) // - suffix (QString) if ( match.hasMatch() ) { //qDebug() << Q_FUNC_INFO << " - 10"; //it is a valid callsign valid = true; prefValid = true; hostFullPrefix1 = match.captured("hostfullprefix1"); hostNormalPrefix1 = match.captured("hostnormalprefix1"); int hostAreaNumber1 = match.captured("hostareanumber1").toInt(&hostAreaNumberExist1); hostSpecialPrefix1 = match.captured("hostspecialprefix1"); hostSpecialNumber1 = match.captured("hostspecialareanumber1").toInt(&hostSpecialNumberExist1); //qDebug() << Q_FUNC_INFO << " - 40"; homeCallsign = match.captured("homecall"); homeFullPrefix = match.captured("homefullprefix"); //qDebug() << Q_FUNC_INFO << " homeFullPrefix: " << homeFullPrefix; homeNormalPrefix = match.captured("homenormalprefix"); homeSpecialPrefix = match.captured("homespecialprefix"); int homeSpecialAreaNumber = match.captured("homespecialareanumber").toInt(&homeSpecialAreaNumberExist); homeAreaNumber = match.captured("homeareanumber").toInt(&homeAreaNumberExist); homeSuffix = match.captured("homesuffix"); suffix = match.captured("suffix"); hostFullPrefix2 = match.captured("hostfullprefix2"); hostNormalPrefix2 = match.captured("hostnormalprefix2"); int hostAreaNumber2 = match.captured("hostareanumber2").toInt(&hostAreaNumberExist2); hostSpecialPrefix2 = match.captured("hostspecialprefix2"); int hostSpecialNumber2 = match.captured("hostspecialareanumber2").toInt(&hostSpecialNumberExist2); generalSuffix = match.captured("generalsuffix"); // Now we have all raw data, let's select what is valid if (hostFullPrefix1.length()>0) { //qDebug() << Q_FUNC_INFO << " - 100"; hostFullPrefix = hostFullPrefix1; if (hostNormalPrefix1.length()>0) { //qDebug() << Q_FUNC_INFO << " - 110"; hostPrefix = hostNormalPrefix1; if (hostAreaNumberExist1) { //qDebug() << Q_FUNC_INFO << " - 120"; hostAreaNumber = hostAreaNumber1; } else { hostAreaNumber = -1; } } else if (hostSpecialPrefix1.length()>0) { //qDebug() << Q_FUNC_INFO << " - 130"; hostPrefix = hostSpecialPrefix1; if (hostSpecialNumberExist1) { //qDebug() << Q_FUNC_INFO << " - 140"; hostAreaNumber = hostSpecialNumber1; } else { hostAreaNumber = -1; } } } else if (hostFullPrefix2.length()>0) { //qDebug() << Q_FUNC_INFO << " - 200"; hostFullPrefix = hostFullPrefix2; if (hostNormalPrefix2.length()>0) { //qDebug() << Q_FUNC_INFO << " - 210"; hostPrefix = hostNormalPrefix2; if (hostAreaNumberExist2) { //qDebug() << Q_FUNC_INFO << " - 220"; hostAreaNumber = hostAreaNumber2; } else { //qDebug() << Q_FUNC_INFO << " - 230"; hostAreaNumber = -1; } } else if (hostSpecialPrefix2.length()>0) { //qDebug() << Q_FUNC_INFO << " - 240"; hostPrefix = hostSpecialPrefix2; if (hostSpecialNumberExist2) { //qDebug() << Q_FUNC_INFO << " - 250"; hostAreaNumber = hostSpecialNumber2; } else { //qDebug() << Q_FUNC_INFO << " - 260"; hostAreaNumber = -1; } } } else { //qDebug() << Q_FUNC_INFO << " - 250"; hostAreaNumber = -1; } if (homeSpecialPrefix.length()<=0) // There is no special prefix { homePrefix = homeNormalPrefix; } else { homePrefix = homeSpecialPrefix; homeAreaNumber = -1; if (homeSpecialAreaNumberExist) // Not all Special prefixes have area number // 3D2A vs 3D20A homeAreaNumber = homeSpecialAreaNumber; } //qDebug() << Q_FUNC_INFO << " - 300"; if (generalSuffix.length()>0) // looking for cases like EA4K/6 where the right call should be EA6/EA4K { //qDebug() << Q_FUNC_INFO << " - 301"; bool generalSuffixIsANumber = false; int areaN = generalSuffix.toInt(&generalSuffixIsANumber); if (generalSuffixIsANumber) { //qDebug() << Q_FUNC_INFO << " - 320"; hostPrefix = homePrefix; hostAreaNumber = areaN; hostFullPrefix = hostPrefix + generalSuffix; generalSuffix.clear(); } //qDebug() << Q_FUNC_INFO << " - 399"; } if (hostFullPrefix.isEmpty() && (homeFullPrefix.length()>=0)) { hostFullPrefix = homeFullPrefix; hostPrefix = homePrefix; hostAreaNumber = homeAreaNumber; } //qDebug() << Q_FUNC_INFO << " - @ hostFullPrefix : " << hostFullPrefix; //qDebug() << Q_FUNC_INFO << " - @ hostPrefix : " << hostPrefix; //qDebug() << Q_FUNC_INFO << " - @ hostAreaNumber : " << QString::number(hostAreaNumber); //qDebug() << Q_FUNC_INFO << " - @ homeCallsign : " << homeCallsign; //qDebug() << Q_FUNC_INFO << " - @ homeFullPrefix : " << homeFullPrefix; //qDebug() << Q_FUNC_INFO << " - @ homePrefix : " << homePrefix; //qDebug() << Q_FUNC_INFO << " - @ homeNormalPrefix : " << homeNormalPrefix; //qDebug() << Q_FUNC_INFO << " - @ homeAreaNumber : " << QString::number(homeAreaNumber); //qDebug() << Q_FUNC_INFO << " - @ homeSuffix : " << homeSuffix; //qDebug() << Q_FUNC_INFO << " - @ suffix : " << generalSuffix; } else if ( matchPrefix.hasMatch() ) { //qDebug() << Q_FUNC_INFO << " - 50"; bool prefixHostSpecialNumberExist = false; prefValid = true; hostFullPrefix = matchPrefix.captured("hostprefix"); hostPrefix = matchPrefix.captured("hostnormalprefix"); QString prefixHostSpecialPrefix = matchPrefix.captured("hostspecialprefix"); int _hostSpecialNumber = matchPrefix.captured("hostspecialareanumber").toInt(&prefixHostSpecialNumberExist); hostAreaNumber = matchPrefix.captured("hostareanumber").toInt(&homeAreaNumberExist); //qDebug() << Q_FUNC_INFO << " - hostFullPrefix: " << hostFullPrefix; //qDebug() << Q_FUNC_INFO << " - hostPrefix: " << hostPrefix; //qDebug() << Q_FUNC_INFO << " - hostSpecialPrefix: " << prefixHostSpecialPrefix; // Now we have the data, let's select the good one if (prefixHostSpecialPrefix.length() > 0) { hostPrefix = prefixHostSpecialPrefix; if (prefixHostSpecialNumberExist) { hostAreaNumber = _hostSpecialNumber; } else { hostAreaNumber = -1; } } else { if (!homeAreaNumberExist) hostAreaNumber = -1; } //qDebug() << Q_FUNC_INFO << " - @ hostFullPrefix : " << hostFullPrefix; //qDebug() << Q_FUNC_INFO << " - @ hostPrefix : " << hostPrefix; //qDebug() << Q_FUNC_INFO << " - @ hostAreaNumber : " << QString::number(hostAreaNumber); } else { //qDebug() << Q_FUNC_INFO << " - 60"; //it is an invalid callsign clear(); } //qDebug() << Q_FUNC_INFO << " - 100"; } QRegularExpression Callsign::callsignRegEx() { // Returns a REGEX that matches a hamradio callsign return QRegularExpression(callsignRegExString(), QRegularExpression::CaseInsensitiveOption); } QRegularExpression Callsign::prefixRegEx() { // Returns a REGEX that matches a hamradio prefix return QRegularExpression(prefixRegExString(), QRegularExpression::CaseInsensitiveOption); } QString Callsign::callsignRegExString() { // This REGEX matches full callsigns including prefixes and suffixes QString aux = getSpecialPrefixes(); return QString("^((?((?%1)(?[0-9]*))|(?[A-Z]{2}|B|F|G|I|K|M|N|R|U|W|[A-Z][0-9]|[0-9][A-Z])(?[0-9]*))\\/)?(?(?(?%2)(?[0-9]*)|(?B|F|G|I|K|M|N|R|U|W|[A-Z][0-9]|[A-Z]{1,2}|[0-9][A-Z])(?[0-9]+))(?[A-Z]+))(\\/(?(?(?%3)(?[0-9]*)|(?B|F|G|I|K|M|N|R|U|W|[A-Z][0-9]|[A-Z]{2}|[0-9][A-Z])(?[0-9]*))|(?[A-Z0-9]*)))?$").arg(aux).arg(aux).arg(aux); } QString Callsign::prefixRegExString() { //qDebug() << Q_FUNC_INFO; // Returns a REGEX string that matches a hamradio prefix like F in F/EA4K/QRP or EA6 in EA6/EA4K QString aux = getSpecialPrefixes(); return QString("^(?(?%1)(?[0-9]*)|(?[A-Z]{2}|B|F|G|I|K|M|N|R|U|W|[A-Z][0-9]|[0-9][A-Z])(?[0-9]*))").arg(aux); } QString Callsign::getSpecialPrefixes() { return QString("3D2|3D6|3D2C|3D2R|3DA|4U1I|4U1U|4U1V|KH7K|PY0F|PY0S|PY0T|R1FJ|SV2A|VK0H|VK0M|VK9C|VK9L|VK9M|VK9N|VK9W|VK9X|VP2E|VP2M|VP2V"); } // if getHomeIfEmpty is true and no hostprefix is identified, it will return homePrefix QString Callsign::getCallsign() {return fullCall;} QString Callsign::getHostFullPrefix() {return hostFullPrefix;} QString Callsign::getHostPrefix() { //qDebug() << Q_FUNC_INFO << " - hostPrefix: " << hostPrefix; //qDebug() << Q_FUNC_INFO << " - homePrefix: " << homePrefix; return hostPrefix; } int Callsign::getHostAreaNumber() {return hostAreaNumber;} QString Callsign::getHomeCallsign() {return homeCallsign;} QString Callsign::getHomeFullPrefix() {return homeFullPrefix;} QString Callsign::getHomePrefix() {return homePrefix;} int Callsign::getHomeAreaNumber() {return homeAreaNumber;} QString Callsign::getHomeSuffix() {return homeSuffix;} QString Callsign::getSuffix() {return generalSuffix;} bool Callsign::isValid() { return valid; } bool Callsign::isValidPrefix() { return prefValid; } bool Callsign::isSimple() { if (fullCall.contains('/')) return false; if (fullCall.contains('\\')) return false; return valid; } void Callsign::clear() { fullCall.clear(); hostFullPrefix.clear(); hostPrefix.clear(); homeSuffix.clear(); generalSuffix.clear(); homeCallsign.clear(); // EA4K homeFullPrefix.clear(); // EA4 homePrefix.clear(); // EA hostAreaNumber = -1; homeAreaNumber = -1; // 4 valid = false; // The entered string is a correct callsign prefValid = false; // The entered string is a correct prefix } bool Callsign::isAOneLetterHostPrefix() { QList validFirstLettersOnly = {'B', 'F', 'G', 'I', 'K', 'M', 'N', 'R', 'U', 'W'}; if (hostPrefix.length() == 1) return validFirstLettersOnly.contains (hostPrefix); return false; } // Based on wiki information // https://en.wikipedia.org/wiki/Amateur_radio_call_signs /* QStringList Callsign::secondarySpecialSuffixes = { "A", // operator at a secondary location registered with the licensing authorities "AM", // aeronautical mobile "M", // mobile operation "MM", // marine mobile "P", // portable operation "QRP", // QRP - unofficial "R", // repeaters "B", // beacon "LGT" // 'LIGHTHOUSE' or 'LIGHTSHIP' - unofficial "LH" // LightHouse bool Utilities::isAValidOperatingSuffix (const QString &_c) { //TODO: This list should be moved to Callsign //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << _c; QStringList validSuffixes = {"A", "P", "Q", "AM", "M", "MM", "LH", "R", "J", "FF", "QRP", "QRPP", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}; return validSuffixes.contains (_c); } }; */ // https:// cqwpx.com/rules.htm /* 1. A PREFIX is the letter/numeral combination which forms the first part of the amateur call. Examples: N8, W8, WD8, HG1, HG19, KC2, OE2, OE25, LY1000, etc. Any difference in the numbering, lettering, or order of same shall count as a separate prefix. A station operating from a DXCC entity different from that indicated by its call sign is required to sign portable. The portable prefix must be an authorized prefix of the country/call area of operation. In cases of portable operation, the portable designator will then become the prefix. Example: N8BJQ operating from Wake Island would sign N8BJQ/KH9 or N8BJQ/NH9. KH6XXX operating from Ohio must use an authorized prefix for the U.S. 8th district (/W8, /AD8, etc.). Portable designators without numbers will be assigned a zero (Ø) after the second letter of the portable designator to form the prefix. Example: PA/N8BJQ would become PAØ. All calls without numbers will be assigned a zero (Ø) after the first two letters to form the prefix. Example: XEFTJW would count as XEØ. Maritime mobile, mobile, /A, /E, /J, /P, or other license class identifiers do not count as prefixes. */ klog-2.4.1/showerrordialog.cpp0000644000175000017500000000727215003153303015351 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" ; 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" ; } void ShowErrorDialog::setText(const QString txt) { //qDebug() << "ShowErrorDialog::setVersion: " << txt; text = txt; txtLabel->setText(txt); //textBrowser->setHtml(text); } ShowErrorDialog::~ShowErrorDialog() { //qDebug() << "ShowErrorDialog::~ShowErrorDialog" ; } void ShowErrorDialog::slotAcceptButtonClicked() { //qDebug() << "ShowErrorDialog::slotAcceptButtonClicked" ; accept(); } void ShowErrorDialog::keyPressEvent(QKeyEvent *event) { switch (event->key()) { break; default: //QFrame::keyPressEvent(event) slotAcceptButtonClicked(); } } klog-2.4.1/translations/0000755000175000017500000000000015003153303014144 5ustar develdevelklog-2.4.1/translations/klog.pot0000644000175000017500000033704315003153303015636 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-2.4.1/translations/klog_cs.ts0000644000175000017500000144633715003153303016157 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 My Locator Můj lokátor 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 QSOs: %1/%2 KLog Warning There are no queued QSOs. 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Navázané C Confirmed, please try to keep the C Confirmed U Unknown Unknown 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. DXClusterAssistant DX DX Freq Frek Status 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 Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat značku v QRZ.com 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: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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. 1 bit 1 bit 1.5 bits 1.5 bits 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. 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. 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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. Look up info about the current callsign on qrz.com 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 &Save &Cancel &Zrušit 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 - KLog folder not found 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! This version of KLog requires that the DXCC database is updated. The database will be updated. 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ě. Show Map &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! To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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! It was not possible to define the KLog folder. Some functions may not work properly! KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 Queue all QSOs from this log to be sent 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 The selection you have done does not include any QSO. 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). Status of the DX entity. Status DX země. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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. The selection you have done does not include any QSO 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 - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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í Show All 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. Show all subdivisions for the current DXCC Entity. 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 None Identified SOTA Ref SOTA Ref Age Věk POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF Ref 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. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 Altitude 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 status Continent Kontinent Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL odesláno Force Init Freq Frek Freq RX Frek RX Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW odesláno Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Jméno Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App password 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) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 Show seconds &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. Show seconds in the QSO editor 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. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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 Log level 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Země Continent Kontinent Reading cty.csv... Čtení cty.csv... Abort reading Přerušit čtení 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. 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 It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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-2.4.1/translations/klog_en.ts0000644000175000017500000121431515003153303016141 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-2.4.1/translations/klog_da.ts0000644000175000017500000147701415003153303016132 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! Vær opmærksom på, at dette er en udviklingsudgivelse, og den kan indeholde mange fejl.<br>Sikkerhedskopier dine data, før du bruger denne 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. Siden 0.6.2 er KLog blevet fuldstændigt omskrevet for at levere en applikation på tværs af platforme, der kører på alle større operativsystemer (GNU/Linux, macOS og Windows) og til at understøtte ny funktionalitet. 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>! Hvis du vil yde support, er du velkommen til at tilmelde dig <a href="https://groups.io/g/klog">KLog-mailinglisten</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Vær opmærksom på, at du kan aktivere/deaktivere denne funktion fra fanen Diverse under Indstillinger. 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>! Hvis KLog stadig ikke er på dit sprog, og du vil hjælpe os, er du velkommen til at kontakte os via <a href="https://groups.io/g/klog">KLog-mailinglisten</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. KLog-udviklere har inkluderet en funktion, der rapporterer nogle brugerdata til KLog-serveren med det ene formål at identificere antallet af installerede versioner, for at fokusere udviklingen i den ene eller anden retning under hensyntagen til brugernes behov. 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. Vælg det stationskaldesignal, du vil bruge til at uploade loggen. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Vælg startdatoen for at eksportere QSO'erne. Standarddatoen er datoen for den første QSO med denne stations kaldesignal. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Vælg slutdatoen for at eksportere QSO'erne. Standarddatoen er datoen for den sidste QSO med denne stations kaldesignal. Station callsign Stationkaldesignal My Locator Min locator Start date Startdato End date Slutdato Ok OK Cancel Afbryd DX DX Date/Time Dato/tid Band Bånd Mode Tilstand Not defined Ikke defineret ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Alle QSOs: QSO'er: KLog - QSOs to be uploaded to LoTW. KLog - QSO'er, der skal uploades til LoTW. This table shows the QSOs that will be sent to LoTW. Denne tabel viser de QSO'er, der vil blive sendt til LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO'er, der skal uploades til ClubLog. This table shows the QSOs that will be sent to ClubLog. Denne tabel viser de QSO'er, der vil blive sendt til ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO'er, der skal uploades til eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Denne tabel viser de QSO'er, der vil blive sendt til eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO'er, der skal uploades til QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Denne tabel viser de QSO'er, der vil blive sendt til QRZ.com. This table shows the QSOs that will be exported to ADIF. Denne tabel viser de QSO'er, der vil blive eksporteret til ADIF. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Bearbejdet C Confirmed, please try to keep the C Confirmed Bekræftet U Unknown Unknown 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-elementer. Number of worked DXCC entities. Antallet af bearbejdede DXCC-elementer. 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. Antal QSO'er bearbejdet i det valgte år. Number of DXCCs worked in the selected year. Antal DXCC'er bearbejdet i det valgte år. Number of CQ Zones worked in the selected year. Antal CQ Zoner bearbejdet i det valgte år. Score for the DXMarathon in the selected year. Score for DXMarathon i det valgte år. 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. KLog bruger filen cty.csv fra https://www.country-files.com/ til at få DXCC-oplysninger. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Du skal downloade cty.csv-filen, hvis du vil have KLog til at vise dig landene, locatoren osv. for de QSO'er, du laver. 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. Det ser ud til, at dxcc-statussen i din database ikke er opdateret, og KLog kan ikke finde nogen dxcc-oplysninger. Du kan prøve at løse dette ved at opdatere loggen. 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? Vil du opdatere din DXCC-status? Entity Entitet Prefix Præfiks Pref: Præf: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Entitet fungerede ikke i dette bånd. DXClusterAssistant DX DX Freq Frek Status 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 Check in QRZ.com Tjek på QRZ.com Check this callsign in QRZ.com Tjek dette kaldesignal på QRZ.com 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: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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! Det var ikke muligt at åbne filen for at gemme DX-Spots til skrivning. DX-Cluster-aktivitet vil ikke blive gemt! DataProxy_SQLite Software version in DB is null Programversion i DB er nul Query didn't failed Forespørgslen mislykkedes ikke 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 KLog - Ugyldigt kaldesignal fundet 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? Der er fundet et tomt kaldesignal. Vil du alligevel eksportere denne QSO (klik på Ja) eller fjerne feltet fra den eksporterede ADIF-post? 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? Der er fundet et ugyldigt kaldesignal %1. Vil du alligevel eksportere dette kaldesignal (klik på Ja) eller fjerne opkaldet fra den eksporterede 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. Eksport af forkerte opkald kan skabe problemer i de programmer, du potentielt importerer denne logfil til. Det kan dog være et godt kaldesignal, der fejlagtigt er identificeret af KLog som ugyldigt. 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 Åbn Award fil Award files (*.awa) Award filer (*.awa) Award file not opened Award fil erikke åbnet KLog was not able to read the award file KLog var ikke i stand til at åbne award filen It was not possible to open the file %1 for reading. Det var ikke muligt at åbne filen %1 for at læse den. AWA wrong format AWA forkert format The AWA file does not have the right format AWA filen har ikke det rigtige format AWA file does not have an <EOH> field AWA filen har ikke et <EOH> felt KLog - %1 KLog - %1 FileManager Writing ADIF file... Skriver ADIF-fil ... Abort writing Afbryd skrivning Exporting ADIF file... QSO: %1 / %2 Eksporterer ADIF-fil... 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 KLog - Fejl The selected log does not exist, please check it again. Den valgte log findes ikke, tjek den venligst igen. The file %1 can't be opened. Filen %1 kan ikke åbnes. Processing LoTW ADIF file... Behandler LoTW ADIF fil... Abort processing Afbryd behandling LoTW reading LoTW læser KLog - Add new QSOs? KLog - Tilføj nye QSO'er? Do you want to add non existing QSOs to your local log? Ønsker du at tilføje ikke eksisterende QSO'er til din lokale log? There are some QSOs in the LoTW log that are not in your local log. Der er nogle QSO'er i LoTW-loggen, som ikke er i din lokale log. Processing LoTW ADIF file...... QSO: %1 / %2 Behandler LoTW ADIF-fil...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Du har annulleret LoTW-behandlingen. Processen vil blive stoppet, og din log vil muligvis ikke være fuldstændig opdateret. Do you want to add dupe QSOs to your local log? dupe is slang please avoid Vil du tilføje duplikerede QSO'er til din lokale log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Der er nogle QSO'er i denne logfil, der kan være dubletter, da de har samme opkald, bånd og tilstand og en meget tæt dato. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Klik på Ja for at tilføje en standard %1 for tilstand %2 til alle QSO'er med et lignende problem. KLog - Don't ask again KLog - Spørg ikke igen Do you want to reuse your answer? Vil du genbruge dit svar? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog vil automatisk bruge dit tidligere svar til alle lignende forekomster, uden at spørge dig igen. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Dato/tid:</i> %1</li><li>Kaldesignal: %2</li><li>Bånd: %3</li><li>Tilstand: %4< /li></ul> KLog - QSO not found KLog - QSO ikke fundet Do you want to add this QSO to the log?: Vil du tilføje denne QSO til loggen?: 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? Vi har fundet en QSO fra LoTW, som ikke er i din lokale log. Vil du have KLog til at tilføje denne QSO til loggen? KLog - Invalid call detected KLog - Ugyldigt kaldesignal fundet 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? Der er fundet et tomt kaldesignal. Vil du alligevel eksportere denne QSO (klik på Ja) eller fjerne feltet fra den eksporterede logfil? 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? Der er fundet et ugyldigt kaldesignal %1. Vil du alligevel eksportere dette kaldesignal (klik på Ja) eller fjerne opkaldet fra den eksporterede logfil? 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. Eksport af forkerte opkald kan skabe problemer i de programmer, du potentielt importerer denne logfil til. Det kan dog være et godt kaldesignal, der fejlagtigt er identificeret af KLog som ugyldigt. Du kan dog redigere ADIF-filen, når eksportprocessen er afsluttet. KLog - User cancelled KLog - Afbrudt af bruger 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. Det valgte kaldesignal (%1) er ikke gyldigt, tjek det igen for at eksportere loggen. KLog - File not opened KLog - Filen blev ikke åbnet It was not possible to open the file %1 for reading. Det var ikke muligt at åbne filen %1 for at læse den. KLog was not able to read the LoTW file KLog var ikke i stand til at læse LoTW-filen Reading LoTW file... Læser LotW-fil ... Importing LoTW ADIF file... Importerer LoTW ADIF fil... KLog - Log selection KLog - Valg af log KLog - Duplicated QSOs KLog - Duplikerede QSO'er 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 har fundet én QSO uden defineret Stationskaldesignal. Indtast det stationskaldesignal, der blev brugt til at udføre denne QSO med %1 på %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 har fundet én QSO uden defineret Stationskaldesignal. Indtast det stationskaldesignal, der blev brugt til at udføre denne QSO på %1: You have canceled the file import. The file will be removed and no data will be imported. Du har annulleret filimporten. Filen vil blive fjernet, og ingen data vil blive importeret. There are no QSOs pending to be exported with that station callsign. Der er ingen QSO'er, der afventer at blive eksporteret med den pågældende stations kaldesignal. Export Eksport Export progress Eksport fremdrift This QSO is not including the minimum data to consider a QSO as valid! Denne QSO inkluderer ikke minimumsdata for en gyldig QSO! - 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. Nogle QSO'er i denne log (f.eks.: %1) ser ud til at mangle RST-TX-oplysninger. If you select NO, maybe the QSO will not be imported. Hvis du vælger Nej, vil QSO'en måske ikke blive importeret. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. i.e. means "that is" but assuming it is a typo Nogle QSO'er i denne log (f.eks.: %1) ser ud til at mangle RST-RX-oplysninger. KLog - Apply to all QSOs in this log? KLog - Anvend på alle QSO'er i denne log? KLog - No Station callsign entered. KLog - Intet stationskaldesignal indtastet. KLog - QSO without Station Callsign KLog - QSO uden Stationskaldesignal 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. Indtast værtsnavnet eller adressen på radioen. Set de network port of the radio. Indstil netværksporten på radioen. Host/Address Vært/Adresse Port Port Enter the port of the radio. Indtast porten på radioen. 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. 1 bit 1 bit 1.5 bits 1,5 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. KLog er et gratis amatørradio-logningsprogram, der kan køre på GNU/Linux, macOS og Windows. 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. Det er designet til at lave generel DX- og konkurrencelogning. 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 KLog - LoTW adgangskode kræves Please enter your LoTW password: Indtast venligst din LoTW-adgangskode: Are you sure that you want to use that station callsign (%1)? Er du sikker på, at du vil bruge denne stations kaldesignal (%1)? There is a file already existing with the name that will be used. Der findes allerede en fil med det navn, som vil blive brugt. The file %1 already exist. Do you want to overwrite? Filen %1 findes allerede. Vil du overskrive? KLog was not able to save the file %1. Error returned: %2 KLog kunne ikke gemme filen %1. Fejl returneret: %2 Downloading data to file: %1. Downloader data til fil: %1. KLog - LoTW download 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. missing . in orig Dette er den første dato for en QSO med kaldesignalet %1 i denne log. Hvis du tror, at du i LoTW kan have tidligere QSO'er, så svar nej. Do you want to use this date (%1) as start date? Vil du bruge denne dato (%1) som startdato? The remote server redirected our connection to %1 Fjernserveren omdirigerede vores forbindelse til %1 Do you want to follow the redirection? Vil du følge omdirigeringen? It was not possible for find the file %1 that has been just downloaded. Det var ikke muligt at finde filen %1, der lige er blevet downloadet. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Det ser ud til, at LoTW ikke har nogen QSO med det stationskaldesignal, du bruger (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Prøv igen og send den downloadede fil (%1) til KLog-udvikleren til analyse. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog downloadede %1 QSO'er. Vil du opdatere din log med de downloadede data? KLog - LoTW File already exists KLog - LoTW-fil eksisterer allerede Double click on the date that you want to use as the start date for downloading QSOs. Dobbeltklik på den dato, du vil bruge som startdato for download af QSO'er. KLog - LoTW Station callsign KLog - LoTW stationskaldesignal There is not a single QSO in the log with that station callsign. Der er ikke en eneste QSO i loggen med den pågældende stations kaldesignal. KLog - LoTW Can't write the file KLog - LoTW Kan ikke skrive filen The file %1 already exists. Filen %1 findes allerede. KLog - LoTW Start date selection KLog - LoTW Valg af startdato KLog - LoTW Download error KLog - LoTW Download fejl There was an error (%1) while downloading the file from LoTW. Der opstod en fejl (%1) under download af filen fra LoTW. The downloading error details are: %1 Oplysningerne om downloadfejl er: %1 KLog - LoTW Redirection found KLog - LoTW-omdirigering fundet KLog - LoTW File not found KLog - LoTW Filen blev ikke fundet KLog can't find the downloaded file. KLog kan ikke finde den downloadede fil. KLog - LoTW user/password error KLog - LoTW bruger/adgangskode fejl LoTW server did not recognized your user/password typo in orig LoTW-serveren genkendte ikke din bruger/adgangskode Check your user and password and ensure your are using the right one before trying again. Tjek din bruger og adgangskode, og sørg for, at du bruger den rigtige, før du prøver igen. KLog - LoTW No QSOs KLog - LoTW Ingen QSO'er LoTW sent no QSOs LoTW sendte ingen QSO'er KLog - LoTW Unknown error KLog - LoTW Ukendt fejl KLog can't recognize the file that has been downloaded from LoTW. KLog kan ikke genkende den fil, der er blevet downloadet fra LoTW. Now KLog will process the downloaded QSO and update your local log. Nu vil KLog behandle den downloadede QSO og opdatere din lokale log. LogWindow There was a problem with the log, please restart KLog and contact the development team if the error persist. 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 Tjek på QRZ.com Check this callsign in QRZ.com Tjek dette kaldesignal på QRZ.com Check in DXHeat.com Tjek på DXHeat.com Check this callsign in DXHeat.com Tjek dette kaldesignal på DXHeat.com Delete selected QSOs Slet valgte QSO'er Delete the selected QSOs duplicate of previous string? Slet de valgte QSO'er Export to ADIF Eksporter til ADIF Export the selected QSOs to an ADIF file. Eksporter de valgte QSO'er til en ADIF-fil. Upload to LoTW Upload til LoTW Upload the selected QSOs to LoTW Upload de valgte QSO'er til LoTW Upload to ClubLog Upload til ClubLog Upload the selected QSOs to ClubLog Upload de valgte QSO'er til ClubLog Upload to eQSL.cc Upload til eQSL.cc Upload the selected QSOs to eQSL.cc Upload de valgte QSO'er til eQSL.cc Send these QSLs via bureau Send disse QSL'er via bureau Send these QSLs via direct Send disse QSL'er direkte QSLs received via bureau QSL'er modtaget via bureau QSLs received via direc&t QSL'er modtaget via direk&te Select none Vælg ingen Remove all selections Fjern alle valg Select all Vælg alle Select all the QSOs Vælg alle QSO'er MainQSOEntryWidget &Add &Tilføj &Clear &Ryd Callsign of the QSO. QSO'ens kaldesignal. 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. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog viser realtid, hvis den er aktiveret. Real time Realtid Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kaldesignal &Save &Cancel &Afbryd 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. Det ser ud til, at du aldrig har lavet en backup eller eksporteret din log til ADIF. It was not possible to open the debug file for writing. No debug log will be saved! Det var ikke muligt at åbne fejlfindingsfilen til skrivning. Ingen fejlretningslog vil blive gemt! It seems that the latest backup you did is older than one month. Det ser ud til, at den seneste sikkerhedskopiering, du lavede, er ældre end en måned. Log backup recommended! Log backup anbefales! 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. Det er en god praksis at sikkerhedskopiere din fulde log regelmæssigt for at undgå at miste data i tilfælde af et problem. Når du eksporterer din log til en ADIF-fil, skal du kopiere filen til et sikkert sted, f.eks. et USB-drev, et cloud-drev, en anden computer, ... KLog vil minde dig om at sikkerhedskopiere på månedsbasis. It seems that you are running this version of KLog for the first time. Det ser ud til, at du kører denne version af KLog for første gang. The setup will be open to allow you to do any new setup you may need. Opsætningen vil åbne, så du kan lave enhver ny opsætning, du måtte have brug for. Ready Klar KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSO'er: %2 - %3 KLog - %1 - QSOs: %2 KLog - %1 - QSO'er: %2 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 KLog - Ikke gyldigt kaldesignal Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Tilføjelse af ugyldige kaldesignaler til loggen kan skabe problemer ved ansøgning om præmier, eksport af ADIF-filer til andre systemer eller applikationer. 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 Ingen 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 KLog - QRZ.com RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Vil du virkelig afslutte 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. Viser DX-QSL'er, for hvilke anmodninger eller QSL'er er blevet sendt uden svar. 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 KLog - Filen er ikke åben Status bar ... Statuslinje ... KLog - Unexpected error KLog - Uventet fejl KLog - Select correct entity KLog - Vælg korrekt identitet KLog - Exit KLog - Afslut 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. Sender loggen til LoTW, der kalder 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 Tjek altid det aktuelle kaldesignal i QRZ.com You can update the entities database in Tools->Update cty.csv Du kan opdatere enhedsdatabasen i Værktøjer->Opdater cty.csv Do you want to do it now? Vil du gøre det nu? The backup was done successfully Sikkerhedskopieringen blev udført med succes KLog will remind you to backup your data again in aprox one month. KLog vil minde dig om at sikkerhedskopiere dine data igen om cirka en måned. The backup was not properly done. Sikkerhedskopieringen blev ikke udført korrekt. It is recommended to backup your data periodically to prevent lose or corruption of your log. typo in orig Det anbefales at sikkerhedskopiere dine data med jævne mellemrum for at forhindre tab eller korruption af din log. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Kaldesignalet %1 er ikke gyldigt. Vil du virkelig tilføje dette kaldesignal til loggen? KLog - Not valid callsign KLog - Ikke gyldigt kaldesignal The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Kaldesignalet %1 er ikke et gyldigt kaldesignal. Vil du virkelig tilføje dette kaldesignal til loggen? You have requested to delete several QSOs Du har anmodet om at slette flere QSO'er The ClubLog upload process has finished with an error and the log was possibly not uploaded. ClubLog-uploadprocessen er afsluttet med en fejl, og loggen blev muligvis ikke uploadet. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Tjek venligst dine legitimationsoplysninger, din internetforbindelse og din Clublog-konto. Den modtagne fejlkode var: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Vil du markere alle QSO'er, der er uploadet til ClubLog, som uploadet? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. typo in orig? Der opstod en fejl under opdatering af ClubLog QSO-uploadoplysningerne. 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-uploadprocessen er afsluttet, og KLog oprettede en fil (%1) i din KLog-mappe. Vil du have KLog til at fjerne den fil? The file has not been removed. Filen er ikke blevet fjernet. It seems that there was something that prevented KLog from removing the file You can remove it manually. Det ser ud til, at der var noget, der forhindrede KLog i at fjerne filen Du kan fjerne den manuelt. The eQSL upload process has finished with an error and the log was possibly not uploaded. eQSL-uploadprocessen er afsluttet med en fejl, og loggen blev muligvis ikke uploadet. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Tjek venligst dine legitimationsoplysninger, din internetforbindelse og din eQSL-konto. Den modtagne fejlkode var: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Vil du markere som uploadet alle QSO'er, der er uploadet til eQSL? There was an error while updating to Yes the eQSL QSO upload information. typo in orig? Der opstod en fejl under opdatering af eQSL QSO-uploadoplysningerne. 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-uploadprocessen er afsluttet, og KLog oprettede en fil (%1) i din KLog-mappe. Vil du have KLog til at fjerne den fil? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. QRZ.com-uploadprocessen er afsluttet med en fejl, og loggen blev muligvis ikke uploadet. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Vil du markere som uploadet alle QSO'er, der er uploadet til QRZ.com? KLog - QRZ.com KLog - QRZ.com Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found It was not possible to define the KLog folder. Some functions may not work properly! Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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. Der opstod en fejl under opdatering af QRZ.com QSO-uploadoplysningerne til Ja. The QRZ.com upload process has finished successfully QRZ.com-uploadprocessen er afsluttet Call not found in QRZ.com Kaldesignal ikke fundet i QRZ.com You need to activate the %1 service in the eLog preferences. Du skal aktivere %1-tjenesten i eLog-indstillingerne. It is important to export to ADIF and save a copy as a backup. Det er vigtigt at eksportere til ADIF og gemme en kopi som backup. Saving the log was done successfully. Logfilen blev gemt med succes. The ADIF export was not properly done. ADIF-eksporten blev ikke udført korrekt. &Import from ADIF ... &Importer fra ADIF ... Export to ADIF ... Eksporter til ADIF... Export all logs to ADIF ... Eksporter alle logfiler til ADIF ... &Print Log ... &Udskriv log... Settings ... Indstillinger ... QSL tools ... QSL værktøjer ... Find QSO to QSL Find QSO til QSL Find DX-QSLs pending to receive Find DX-QSL'er, der afventer modtagelse Find requested pending to receive Find anmodede, der afventer modtagelse LoTW tools ... LoTW værktøjer ... Queue all QSOs from this log to be sent Mark all queued QSOs from this log as sent Marker alle QSO'er i kø fra denne log som sendt Queue all the QSOs to be uploaded Sæt alle QSO'er, der skal uploades, i kø Check the current callsign in QRZ.com Tjek det nuværende kaldesignal på QRZ.com Queue all the QSO to be uploaded Sæt alle QSO'er i kø til at blive uploadet For updated DX-Entity data, update cty.csv. For opdaterede DX-Entity-data, opdater cty.csv. Show Map &Help &Hjælp Now you can upload them to LoTW. Nu kan du uploade dem til LoTW. There was a problem to mark all pending QSOs as queued for LoTW! Der var et problem med at markere alle afventende QSO'er som i kø til LoTW! KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL er ikke installeret, eller KLog kan ikke finde det. Tjek venligst konfigurationen. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Fejl #1: Processen blev annulleret af brugeren, eller TQSL blev ikke konfigureret. Ingen QSO'er blev uploadet. Error #2: Upload was rejected by LoTW, please check your data. Fejl #2: Upload blev afvist af LoTW, tjek venligst dine data. Error #3: The TQSL server returned an unexpected response. Fejl #3: TQSL-serveren returnerede et uventet svar. Error #4: There was a TQSL error. Fejl #4: Der var en TQSL-fejl. Error #5: There was a TQSLLib error. Fejl #5: Der var en TQSLLib-fejl. Error #6: It was not possible to open the input file. Fejl #6: Det var ikke muligt at åbne inputfilen. Error #7: It was not possible to open the ouput file. Fejl #7: Det var ikke muligt at åbne outputfilen. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Fejl #8: Ingen QSO'er blev behandlet, da nogle QSO'er var dubletter eller forældede. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Fejl #9: Nogle QSO'er blev behandlet, og nogle QSO'er blev ignoreret, fordi de var dubletter eller forældede. Error #10: Command syntax error. KLog sent a bad syntax command. Fejl #10: Kommandosyntaksfejl. KLog sendte en kommando med dårlig syntaks. Error #11: LoTW Connection error (no network or LoTW is unreachable). Fejl #11: LoTW-forbindelsesfejl (intet netværk eller LoTW kan ikke nås). Error #00: Unexpected error. Please contact the development team. Fejl #00: Uventet fejl. Kontakt venligst udviklingsteamet. 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. Du har ikke valgt noget kaldesignal. KLog vil fuldføre QSO'erne uden et defineret stationskaldesignal og dem med det kaldesignal, du indtaster her. KLog - No station selected KLog - Ingen station valgt 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. Viser de DX-QSL'er, der er blevet anmodet om. Queue all QSLs from this log to be sent Sæt alle QSL'er fra denne log i kø til at blive sendt Mark all non-sent QSOs in this log as queued to be uploaded. Marker alle ikke-sendte QSO'er i denne log som i kø til at blive uploadet. Queue all QSLs to be sent Sæt alle QSL'er i kø til at blive sendt Put all the non-sent QSOs in the queue to be uploaded. Sæt alle ikke-sendte QSO'er i køen til at blive uploadet. Mark all queued QSOs as sent Marker alle QSO'er i kø som sendt All pending QSOs of this log has been marked as queued for LoTW! Alle afventende QSO'er i denne log er blevet markeret som i kø til LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Der var et problem med at markere alle afventende QSO'er i denne log som i kø til LoTW! Your log has not been updated. Din log er ikke blevet opdateret. 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. Ingen QSO blev opdateret med de data, der kommer fra LoTW. Dette kan være på grund af fejl i logfilen eller simpelthen fordi din log allerede var opdateret. All pending QSOs has been marked as queued for LoTW! Alle afventende QSO'er er blevet markeret som i kø til 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. Du skal vælge én stations kaldesignal for at kunne sende din log til ClubLog. Do you want to add this QSOs to your ClubLog existing log? Vil du tilføje disse QSO'er til din eksisterende ClubLog-log? If you don't agree, this upload will overwrite your current ClubLog existing log. Hvis du ikke er enig, vil denne upload overskrive din nuværende ClubLog eksisterende log. KLog - eQSL KLog - eQSL Upload the queued QSOs to LoTW Upload QSO'erne i kø til LoTW KLog needs to update the Entities database. KLog skal opdatere Entities-databasen. KLog - Backup KLog - Backup KLog - New version detected! KLog - Ny version fundet! This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Denne operation fjerner definitivt alle de valgte QSO og tilknyttede data, og du vil ikke være i stand til at gendanne dem igen. KLog - ClubLog error KLog - ClubLog fejl KLog - eQSL error KLog - eQSL fejl KLog - QRZ.com error KLog - QRZ.com fejl KLog has received an error from QRZ.com. KLog har modtaget en fejl fra QRZ.com. KLog - %1 KLog - %1 KLog - ADIF export KLog - ADIF eksport Download from LoTW ... Download fra LoTW ... Download the full log from LoTW ... Download hele loggen fra LoTW ... ClubLog tools ... ClubLog værktøjer ... Upload the queued QSOs to ClubLog ... Upload QSO'erne i kø til ClubLog ... eQSL tools ... eQSL værktøjer ... Upload the queued QSOs to eQSL.cc ... Upload QSO'erne i kø til eQSL.cc ... QRZ.com tools ... QRZ.com værktøjer ... Upload the queued QSOs to QRZ.com ... Upload QSO'erne i kø til QRZ.com ... Update cty.csv Opdater cty.csv Update Satellite Data Opdater Satellitdata Online manual (F1) ... Onlinemanual (F1) ... &Tips ... &Tips ... &Debug ... &Debug ... &About ... &Om ... About Qt ... Om Qt ... Check updates ... Tjek opdateringer ... 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. Vil du virkelig markere ALLE QSO'erne i denne log, som skal UPLOADES? Skal KUN gøres, HVIS DET ER FØRSTE GANG, du uploader disse QSO'er til 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. Vil du virkelig markere ALLE afventende QSO'er til at blive UPLOADET? Skal KUN gøres, HVIS DET ER FØRSTE GANG, du uploader disse QSO'er til LoTW. About ... Om ... KLog - Update checking result KLog - Opdatering kontrollerer resultat TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL afsluttet uden fejl. Vil du markere alle de QSO'er, der er uploadet til LoTW som Sendt? You need to select one station callsign to be able to send your log to eQSL.cc. Du skal vælge én stations kaldesignal for at kunne sende din log til eQSL.cc. Select the Station Callsign to use when quering LoTW: Vælg det stationskaldesignal, der skal bruges, når du forespørger LoTW: Please check the LoTW setup Tjek venligst LoTW-opsætningen You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Du har ikke defineret en LoTW-bruger eller et korrekt stationskaldesignal. Åbn fanen LoTW i opsætningen, og konfigurer din LoTW-forbindelse. The log is ready to be uploaded to ClubLog. Loggen er klar til at blive uploadet til ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Alle QSO'er i denne log er blevet markeret som Ændret i ClubLog-statusfeltet KLog could not mark the full log to be sent to ClubLog KLog kunne ikke markere den fulde log til at blive sendt til ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Noget forhindrede KLog i at markere QSO'erne som ændrede. Genstart KLog, og prøv igen, før du kontakter KLog-udviklerne. The log is ready to be uploaded to eQSL.cc. Loggen er klar til at blive uploadet til eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Alle QSO'er i denne log er blevet markeret som Modificeret i eQSL.cc-statusfeltet KLog could not mark the full log to be sent to eQSL KLog kunne ikke markere den fulde log til at blive sendt til eQSL The log is ready to be uploaded to QRZ.com. Loggen er klar til at blive uploadet til QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Alle QSO'er i denne log er blevet markeret som Modificeret i QRZ.com-statusfeltet KLog could not mark the full log to be sent to QRZ.com KLog kunne ikke markere hele loggen til at blive sendt til QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Du skal definere en korrekt API-nøgle til din QRZ.com-logbog i eLog-præferencerne. Filling QSOs ... Udfylder QSO'er ... Date/Time Dato/tid Callsign Kaldesignal Printing the log ... Udskriver loggen ... KLog - QSO received KLog - QSO modtaget Station Callsign Stationkaldesignal Operator Callsign Operatør kaldesignal KLog - WSJTX Dupe QSO KLog - WSJTX Duplikeret QSO This QSO seems to be duplicated. Do you want to save or discard it? Denne QSO ser ud til at være duplikeret. Vil du gemme eller kassere den? KLog - Non-supported mode KLog - Ikke-understøttet tilstand A new mode not supported by KLog has been received from an external program or radio: En ny tilstand, der ikke understøttes af KLog, er modtaget fra et eksternt program eller en radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Vil du blive ved med at modtage disse underretninger? (Hvis du deaktiverer disse advarsler, forhindres det, at der registreres ugyldige tilstande) Native Error Underliggende fejl Recommendation: Anbefaling: Periodically export your data to ADIF to prevent a potential data loss. Eksporter jævnligt dine data til ADIF for at forhindre et potentielt datatab. 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 KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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. Det ser ud til, at der ikke er nogen QSO'er i databasen. This function is disabled. Go to the Setup->LoTW tab to enable it. Opsætning / Indstillinger? Denne funktion er deaktiveret. Gå til fanen Opsætning->LoTW for at aktivere den. Logging operator's callsign. Logningsoperatørs kaldesignal. Callsign used over the air. Kaldesignal brugt over radioen. No QSOs have been exported to ADIF. Ingen QSO'er er blevet eksporteret til ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog har eksporteret %1 QSO'er til ADIF-filen: %2 You need to select one station callsign to be able to send your log to LoTW. Du skal vælge én stations kaldesignal for at kunne sende din log til LoTW. There was an error while updating to Yes the LoTW QSL sent information. Der opstod en fejl under opdatering af LoTW QSL sendte oplysninger til Ja. KLog - Select the Station Callsign. KLog - Vælg stationens kaldesignal. The logfile has been modified. Logfilen er blevet ændret. KLog - CTY.dat update KLog - CTY.dat opdatering 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. Din log er blevet opdateret med de LoTW-downloadede QSO'er. KLog has updated %1 QSOs from LoTW. KLog har opdateret %1 QSO'er fra LoTW. All queued QSOs has been marked as sent to LoTW! Alle QSO'er i kø er blevet markeret som sendt til LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Der var et problem med at markere alle QSO'er i kø i denne log som sendt til 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? LoTW-overførselsprocessen er afsluttet, og KLog oprettede en fil (%1) i din KLog-mappe. Vil du have KLog til at fjerne den fil? The file has been removed. Filen er blevet fjernet. KLog - LoTW 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! Alle QSO'er i kø i denne log er blevet markeret som sendt til LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Der var et problem med at markere alle QSO'er i kø som sendt til LoTW! The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 Vil du virkelig markere, at ALLE dine QSO'er skal UPLOADES? Skal KUN gøres, HVIS DET ER FØRSTE GANG, du uploader QSO'er til %1 ClubLog ClubLog QRZ.COM QRZ.COM To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. - Needed for DXMarathon - Krævet for DXMarathon Abort filling Afbryd udfyldning Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Udfylder DXCC, CQz, ITUz, kontinent i QSO'er... 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. Duplikerede QSO'er skal matche en anden eksisterende QSO med samme opkald, bånd, mode, dato og klokkeslæt, under hensyntagen til den periode, der kan defineres i indstillingerne. 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 - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Duplikeret satellit 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 KLog - Vis fejl 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. Dato for upload af QRZ.com. 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 på QRZ.com. Status of the LoTW sending. Status for LoTW-afsendelsen. Status of the LoTW reception. Status for LoTW-modtagelsen. QRZ.com 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 Udbredelsestilstand Others Andre Keep propagation mode Behold udbredelsestilstand Show All 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. Beholder den samme udbredelsestilstand til næste QSO. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Vælg det relevante ADIF-felt for denne QSO. Value for the selected ADIF field. Værdi for det valgte ADIF-felt. Not Identified Ikke Identificeret Not - Not Identified Ikke - ikke identificeret None Identified SOTA Ref SOTA Ref Age Alder POTA Ref SIG SIG Info VUCC grids VUCC Net WWFF Ref Not selected Distance Afstand 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. Effekt brugt af kontaktens station. Name of the contacted operator. Navn på kontaktens operatør. QTH of the contacted station. QTH for den kontaktede staion. Locator of the contacted station. Locator for den kontaktede station. Watts Watt MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Navn QTH QTH DX Locator DX-Locator Power(rx) Effekt(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frekvens TX Freq RX Frekvens RX DX QTH locator. DX QTH Locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH locator. Formatet skal være Maidenhead som IN70AA op til 10 tegn. 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 Effekt Operator callsign Operatørens kaldesignal Station Callsign Stationkaldesignal My Locator Min locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Min QTH locator. Formatet skal være Maidenhead som IN70AA op til 10 tegn. My Rig Min Rig My Antenna Min Antenne My POTA Ref My SIG My SIG Info My SOTA Ref My WWFF Ref My SOTA_Ref Min SOTA Ref My VUCC_GRIDS Mine VUCC Net 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. Lokalisering af DX-stationen. Formatet skal være Maidenhead som IN70AA op til 10 tegn. 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! Vær opmærksom på, at satellitnavnet ikke vil blive gemt, hvis det ikke er på listen, så information kan gå tabt! 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. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Serveren returnerede følgende fejl: %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. Opgradering af software kan potentielt forårsage problemer. Det er altid en god idé at sikkerhedskopiere din DB, før du opgraderer. Do you want to backup your DB now? Vil du sikkerhedskopiere din DB nu? The backup finished successfully. Sikkerhedskopieringen blev afsluttet. You can find the backup in this file: %1 Du kan finde sikkerhedskopien i denne fil: %1 The backup was not properly done. Sikkerhedskopieringen blev ikke udført korrekt. You will be sent back to the starting point. Du bliver sendt tilbage til udgangspunktet. KLog - DB can't be updated automatically KLog - DB kan ikke opdateres automatisk You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. strange wording Du opgraderer fra en for gammel KLog-version, og denne opgradering kan ikke opgraderes automatisk fra den version. KLog - DB update KLog - DB opdatering 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... Opdaterer oplysninger om DXCC-præmien... Updating DXCC Award information... Opdaterer oplysninger om DXCC-præmien... Updating WAZ award information... Opdaterer oplysninger om WAZ-præmien... Updating WAZ Award information... Opdaterer oplysninger om WAZ-præmien... 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. Processen til at opgradere er: - Brug en gammel KLog-version til at eksportere din log til ADIF. - Fjern din logbook.dat-fil fra din KLog-mappe. - Installer den nye KLog-version. - Importer din ADIF-fil. KLog afsluttes, når du klikker på OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Alle data blev migreret korrekt. Du skal nu gå til Opsætning->Indstillinger->Logs for at kontrollere, at alt er 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. KLog er allerede startet. It is allowed to run only one instance. Det er kun tilladt at køre en instans. 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... Opdaterer 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. Der er fundet et forkert kaldesignal: %1. Indtast venligst et nyt kaldesignal eller bekræft, at det nuværende kaldesignal er et gyldigt kaldesignal. An empty callsign has been detected. If it is possible, please enter the right call. Der er fundet et tomt kaldesignal. Hvis det er muligt, bedes du indtaste det rigtige kaldesignal. KLog - Not valid callsign found KLog - Ikke gyldigt kaldesignal fundet Altitude Date Dato Call Kaldesignal RSTtx RSTtx RSTrx RSTrx Band Bånd Comment Kommentar Mode Tilstand CQz CQz ITUz ITUz DXCC DXCC Address Adresse Age Alder County Land A_Index A_Index Ant_Az Ant_Az Ant_El And_El Ant_Path Ant_Path ARRL_SECT ARRL_SECT Award_Submitted Præmie_Indsendt Award_granted Præmie_Tildelt Band_RX Bånd_RX CheckContest TjekKonkurrence Class Klasse ClubLog SDate ClubLog SDate ClubLog status ClubLog status Continent Kontinent Contacted Op Kontaktet Op Contest Id Konkurrence ID Country Land Credit Submitted Kreditering Indsendt Credit granted Kreditering modtaget Dark Dok Do not translate if unsure, common hamradio term. ?? Dark Dok 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. ?? Mine Fists Nr bursts Do not translate if unsure, common hamradio term. ?? Antal Bursts Nr pings Do not translate if unsure, common hamradio term. Antal pings Sat mode Satellit tilstand SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Afstand ClubLog SDate Date when it was sent ClubLog SDate Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email Email EQ_Call EQ_Kaldesignal eQSL RDate eQSL RDato eQSL SDate eQSL SDato eQSL Rcvd qQSL Modt eQSL Sent eQSL Sendt Force Init ?? Force Init Freq Frek Freq RX Frek RX Gridsquare Gridsquare Guest OP Gæst OP HRDLog SDate HRDLog SDato HRDLog status HRDLog status IOTA IOTA IOTA Island id IOTA Island ID K Index K Indeks Lat latitude=breddegrad Bredde Lon longitude=længdegrad Længde LoTW RDate LoTW RDato LoTW SDate LoTW SDato LoTW Rcvd LoTW Modt LoTW Sent LoTW sendt Max Bursts Max Bursts Multiplier Multiplikator MS Shower MS Regn My Antenna Min Antenne My City Min By My Cnty Mit Land My Country Mit Land My CQz Min CQz My DXCC Min DXCC My Gridsquare Min Gridsquare My IOTA Min IOTA My IOTA island id Min IOTA Island ID My ITUz Min ITUz My Lat Min Bredde My Lon Min Længde My Name Mit Navn My Postal code Mit Postnummer My Rig Min Rig My Sig Mit Kald My Sig Info Mit Kald Info My SOTA ref Min SOTA ref My State Min Landsdel My Street Min Gade My USACA counties ?? Min USACA kommune My VUCC grids Mine VUCC net Name Navn Notes Notater Operator Operatør Owner Callsign Ejers Kaldesignal Pfx Præfix Points Point eQSL SDate Date when it was sent eQSL SDato Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HRDLog SDato HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent LoTW SDato Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My WWFF POTA Precedence Forrang Prop Mode Udbred. Tilstand Public Key Offentlig Nøgle QRZcom SDate QRZ.com SDato QRZcom status QRZ.com status QSL msg QSL Besked QSL RDate QSL RDato QSL SDate QSL SDato QSL Rcvd QSL modt QSL Sent QSL sendt QSL rcvd via QSL modt via QSL sent via QSL sendt via QSL via QSL via QSO complete QSL færdig QSO random QSL tilfældig QTH QTH Region Region Rig Rig RX Pwr RX Eff Sat name Sat-navn 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 Streng SRX SRX STX String STX Streng State Stat Submode Undertilstand UKSMG UKMSG USACA counties USACA kommuner VE prov ?? VE prov VUCC grids VUCC-net TX Pwr TX Eff Web Web WWFF QSO Date off offset? QSO Dato off Transmitter id Sender ID Log number Log nummer 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 Alle logfiler Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Indtast kaldesignalet for at søge efter. Indtast '*' for at vise alle QSO'erne... det kan være langsomt i store logfiler! Select the Station Callsign used to do this QSO. Vælg det stationskaldesignal, der bruges til at udføre denne QSO. All in log Alle i loggen Not defined Ikke defineret &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 Stationkaldesignal ID Id Call Kaldesignal Date/time Dato/tid Station callsign Stationkaldesignal 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&irekte Send this QSL via direct Send denne QSL via direkte Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct Direkte QSL received via direc&t QSL modtaget via direk&te Check in QRZ.com Tjek på QRZ.com Check this callsign in QRZ.com Tjek dette kaldesignal på QRZ.com Check in DXHeat.com Tjek på DXHeat.com Check this callsign in DXHeat.com Tjek dette kaldesignal på DXHeat.com &Request my QSL &Anmod om min QSL Mark my QSL as requested Marker min QSL som anmodet Via Direct and mark DX QSL as requested Via Direkte og marker DX som anmodet Send this QSL via direct and mark DX QSL as requested Send denne QSL via Direkte og marker DX QSL som anmodet Via Bureau and mark DX QSL as requested Via Bureau og marker DX QSL som anmodet Send this QSL via bureau and mark DX QSL as requested Send denne QSL via bureau og marker DX QSL som anmodet &Request the QSL &Anmod om QSL'en Mark the QSL as requested Marker QSL'en som anmodet Via bureau and mark my QSL as requested Via bureau og marker min QSL som anmodet QSL received via bureau and mark my QSL as requested QSL modtaget via bureau og marker min QSL som anmodet Direc&t and mark as my QSL requested Direk&te og marker min QSL som anmodet QSL received via direct and mark my QSL as requested QSL modtaget via direkte og marker min QSL som anmodet Needed QSO to send the QSL Krævet QSO for at sende QSL'en My QSL requested to be sent Min QSL anmodet om at blive sendt DX QSL pending to be received DX QSL venter på at blive modtaget 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 Logviser D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings Indstillinger 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) Vil du tilføje én log på fanen Logs eller afslutte KLog? (Klik Ja for at tilføje en log eller Nej for at afslutte 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. Du skal som minimum indtaste et gyldigt kaldesignal. Go to the User tab and enter valid callsign. Gå til fanen Bruger og indtast et gyldigt kaldesignal. eLog eLog DB has not been moved to new path. DB er ikke flyttet til ny sti. 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 Ok 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 WSJT-X palette Default palette Standard palette Dark Mode Mørk Tilstand Color when the DXCC is an ATNO (All Time New One). Farve, når DXCC er en ATNO (All Time New One). DXCC is confirmed in this band. DXCC er bekræftet i dette bånd. Default color. Standardfarve. Sets a palette of colors similar to the one used in WSJT-X. Indstiller en palet af farver, der ligner den, der bruges i WSJT-X. Sets the default palette. Sætter standardpaletten. Light Mode Lys Tilstand This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Denne DXCC blev bearbejdet før i et andet bånd, men ikke i det valgte band. Det kan være nødvendigt på grund af CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Bearbejdet DXCC, men ikke bekræftet i dette bånd. Sets the Dark Mode Sætter Mørk Tilstand 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 Gem DX Cluster-aktivitet Saves all the DX-Cluster activity to a file in the KLog folder Gemmer al DX-Cluster-aktiviteten i en fil i KLog-mappen Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 adgangskode ClubLog App password ClubLog email ClubLog email Enter the email you used to register in ClubLog. Indtast email adressen, du registrerede 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.) Indtast din adgangskode til ClubLog her. Advarsel: Adgangskoden vil blive gemt i klartekst i KLog-konfigurationsfilen!! (Hvis du ikke ønsker at indtaste adgangskoden, vil KLog spørge dig, når det er nødvendigt.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Send QSO'er i realtid Activate ClubLog Aktiver 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 Aktiver eQSL.cc Enter your username of eQSL.cc. Indtast dit eQSL.cc brugernavn. 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.) Indtast din adgangskode til eQSL.cc her. Advarsel: Adgangskoden vil blive gemt i klartekst i KLog-konfigurationsfilen!! (Hvis du ikke ønsker at indtaste adgangskoden, vil KLog spørge dig, når det er nødvendigt.) eQSL.cc password eQSL.cc adgangskode eQSL.cc user eQSL.cc bruger 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. Indtast brugernavnet på din QRZ.com-konto. Du skal abonnere på QRZ.com for at bruge denne tjeneste. User Bruger 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.) Indtast din adgangskode til QRZ.com her. Advarsel: Adgangskoden vil blive gemt i klartekst i KLog-konfigurationsfilen!! (Hvis du ikke ønsker at indtaste adgangskoden, vil KLog spørge dig, når det er nødvendigt.) Password Adgangskode Activate QRZ.com Aktiver QRZ.com Check automatically Tjek automatisk Check in Qrz.com all Calls as they are entered Tjek alle kaldsignaler på Qrz.com, efterhånden som de indtastes Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook nøgle 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. Logbogsnøgle til QSO-upload. Du kan få denne nøgle på din QRZ.com logbogs webside. Husk, at du skal have et QRZ.com-abonnement for at bruge denne funktion. LoTW LoTW Upload Upload Download Hent TQSL path TQSL sti Use TQSL Brug TQSL LoTW password LoTW adgangskode LoTW user LoTW bruger Enter your LoTW user. Indtast dit LoTW brugernavn. 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.) Indtast din adgangskode til LoTW her. Advarsel: Adgangskoden vil blive gemt i klartekst i KLog-konfigurationsfilen!! (Hvis du ikke ønsker at indtaste adgangskoden, vil KLog spørge dig, når det er nødvendigt.) Path to the TQSL software. Sti til TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Aktiver LoTW-integration med TQSL. Du skal have TQSL installeret Select File Vælg Fil 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 Skrivebeskyttet tilstand If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Hvis aktiveret, vil KLog læse Frekv/Tilstand fra radioen, men vil aldrig sende nogen kommando til radioen. Radio Radio Select your rig. Vælg din rig. Serial Network Defines the interval to poll the radio in msecs. Definerer intervallet for at polle radioen i msek. Poll interval Poll interval 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. Bauds Bauds Test: OK Test: Ok Test: NOK Test: Ikke Ok Test Test Click to test the connection to the radio Klik for at teste forbindelsen til radioen Enter the hostname or address of the radio. Indtast værtsnavnet eller adressen på radioen. Set de network port of the radio. typo in orig Indstil netværksporten på radioen. Serial radio Seriel radio Network radio Netværksradio Select the serial port speed. Vælg den serielle porthastighed. 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. 1 bit 1 bit 1.5 bits 1,5 bit 2 bits 2 bit Stop bits Stop-bit Select the serial stop bits. Vælg den serielle stop-bit. Host/Address Vært/Adresse Enter the port of the radio. Indtast porten på radioen. SetupPageLogView Fields Felter 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... Alle QSO'er fra denne log vil også blive slettet... QSOs QSO'er The new log could not be created. Den nye log kunne ikke oprettes. 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. Tilføj en kommentar om denne log. Hvis den er udfyldt, vil den blive vist i KLog-hovedtitlen for at identificere loggen. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Du skal indtaste et gyldigt kaldesignal i boksen Stationskaldesignal. Loggen vil ikke blive åbnet. 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 Aktiver applikationens fejlretningslog Mark sent eQSL && LoTW in new QSO as queued Marker sendte eQSL && LoTW i ny QSO som i kø 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. Søgefeltet vil også vise kaldesignalet i luften for at udføre QSO'en. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Hvis ny versionskontrol er valgt, sender KLog udvikleren dit kaldesignal, KLog-version og operativsystem for at hjælpe med at forbedre KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Klik for at markere som i kø (skal sendes) alle eQSL (LoTW og eQSL) i alle de nye QSOer som standard. 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 Show seconds &Delete always temp ADIF file after uploading QSOs Slet alti&d midlertidig ADIF-fil efter upload af QSO'er In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Indtast tidsintervallet i sekunder for at overveje en dublet, hvis samme opkald, bånd og tilstand er indtastet. Show seconds in the QSO editor 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. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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. Aktiverer programmets fejlretningslog. Dette kan være nyttigt, hvis noget ikke fungerer som forventet. En debug-fil vil blive oprettet i KLog-mappen. Delete Always the adif file created after uploading QSOs Slet Altid den adif-fil, der oprettes efter upload af QSO'er Log level Dupe time range: Dublet tidsinterval: 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 KLog - Flyt DB File moved Fil flyttet File copied Fil kopieret File already exist. Filen findes allerede. 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. Destinationsfilen findes allerede, og KLog vil ikke erstatte den. Fjern venligst filen fra destinationsmappen, før du flytter filen med KLog for at sikre, at KLog kan kopiere filen. File NOT copied Filen blev IKKE kopieret The file was not copied due to an unknown problem. Filen blev ikke kopieret på grund af et ukendt 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. Importer en satellitfil. Det vil erstatte de satellitter, du har på den aktuelle liste. This satellite will no be longer available to be selected ... Denne satellit vil ikke længere være tilgængelig til at blive valgt ... 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. Nogle af de data, du har indtastet, er ikke korrekte; satellitten kan ikke tilføjes. SetupPageSubdivisionNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &Ok &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. Tilføj en kommentar om denne log. Hvis den er udfyldt, vil den blive vist i KLog-hovedtitlen for at identificere loggen. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Du skal indtaste et gyldigt kaldesignal i boksen Stationskaldesignal. Loggen vil ikke blive åbnet. SetupPageSubdivisions &Remove &Fjern Import new Importer ny Import an AWA file with the subdivision details. Importer en AWA-fil med underinddelingsdetaljerne. Remove the selected references. Fjern de valgte referencer. Select the references you want to open. Vælg de referencer, du ønsker at åbne. KLog KLog Do you really want to remove the data of this entity? Er du sikker på at du ønsker at fjerne data for denne enhed? All the subdivision information for this entity will be deleted... Al information om underinddeling for denne enhed vil blive slettet... 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 Kort Navn CQ Zone CQ-zone ITU Zone ITU-zone Deleted Slettet Start Date Startdato End Date Slutdato DXCC DXCC An error has occurred showing the following error code: Der er opstået en fejl, der viser følgende fejlkode: KLog - SetupPageSubdivisions KLog - Indstil Side-underinddelinger SetupPageUDP Start UDP Server Start UDP-server Automatically log QSOs from WSJT-X Log automatisk QSO'er fra WSJT-X Allow WSJT-X to send logged QSOs to KLog Tillad WSJT-X at sende loggede QSO'er til KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSO'er, der er logget på WSJT-X, vil blive sendt til KLog, og KLog vil spørge, før de logges i KLog, medmindre "%1" er valgt KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog vil automatisk logge enhver QSO, der kommer fra WSJT-X uden nogen manuel bekræftelse. Update status information from WSJT-X Opdater statusoplysninger fra WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog vil automatisk vise og opdatere data, der kommer fra WSJT-X (DX kaldesignal, Rapport, tilstand, ...) 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. Sørg for, at det er den samme port, som de andre programmer sender dataene til. Standardporten er 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. Vælg interface for at lytte efter UDP-pakker, der kommer fra WSJT-X. Network interface Netværksinterface QSOs notification timeout (milisecs) QSO'er notifikationstimeout (millisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. Millisekunder, hvor meddelelsen om QSO'er modtaget fra WSJTX vil blive vist. 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 effekt-information. 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 E&ffekt 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 &Kaldesignal &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. unclear orig text Følgende QSO'er er de QSO'er, hvor du har modtaget LoTW-bekræftelsen. Ok O.k. DX 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> <center><h2>Klog ny version (%1) er tilgængelig! </h2></center><br>Der er en ny version af KLog tilgængelig.<br><br><b>Du kan hente den nye version fra:<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 Satellit netstatus Satellite DXCC status Satellit DXCC status Grids per band status Net per bånd status DXCC per band status DXCC per bånd 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 Vis kun bekræftede Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Kun LEO satellitter 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: Tilstand: Band Bånd Worked Bearbejdet Confirmed Bekræftet StatsGridsOnSatsWidget Show confirmed only Vis kun bekræftede Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Kun LEO satellitter Number Nummer Callsign Kaldesignal Date Dato Band Bånd Mode Tilstand Grid Net 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 QSO'er pr bånd fordeling 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 QSO'er pr tilstand fordeling 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 KLog tips Next Næste Previous Forrige <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>Ved du...<br>Du kan bruge <a href="#ToolsFillInQSO">Værktøjer->Udfyld QSO-data</a> til automatisk at læse fuld log for at udfylde DXCC, CQ, ITU-zonerne og kontinentet? <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>Ved du...<br>Du kan bruge <a href="#ToolsFindQSO2QSL">Værktøjer->QSL-værktøjer...->Find QSO til QSL< /a> for at se efter alle de QSO'er, som du skal sende din QSL, fordi du stadig skal bekræfte, at DXCC og du stadig ikke har sendt dit QSL-kort? <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>Ved du det...<br>Du kan finde de QSL'er, som du stadig skal sende med <a href="#ToolsSendPendingQSL">Værktøjer->QSL-værktøjer. ..->Find My-QSL'er, der afventer afsendelse</a>.<bR>Dette værktøj vil vise dig i søgefeltet alle QSO'er med QSL-Sent markeret som <i>Anmodet</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>Tip #4:</b><br>Ved du...<br>Du kan indtaste et '*' i søgefeltet i søgevinduet for at søge efter alle QSO'er udført med en bestemt station kaldesignal? <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>Ved du det...<br>Du kan finde filen, der indeholder al din log og andre oplysninger i filen logbook.dat og klogrc-filen, der indeholder KLog-konfigurationen fil i KLog-mappen ved at åbne menuen <a href="#FileOpenKLogFolder">Fil->KLog-mappe</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>Ved du det...<br>Du kan uploade din QSO markeret som i kø til LoTW via TQSL med <a href="#ToolsUploadLoTW">Værktøjer->LoTW-værktøjer ...->Sender loggen til LoTW kalder TQSL.</a> ?<br><br>Du skal konfigurere TQSL i præferencerne for at kunne bruge denne funktionalitet. <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>Ved du det...<br>Du kan se QSO'en, der bekræfter én specifik DXCC-entitet i et specifikt bånd ved at placere musen over det bånd i DXCC-widgetten? <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>Ved du det...<br>Du kan finde de QSL'er, du stadig venter på, med <a href="#ToolsReceivePendingQSL">Værktøjer->QSL-værktøjer. ..->Find DX-QSL'er, der afventer modtagelse</a>.<bR>Dette værktøj viser dig i søgefeltet alle QSO'er med QSL-Sent markeret som <i>Sendt</i>, men du har stadig ikke modtaget QSL-kortet fra 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>Tip #9:</b><br>Ved du det...<br>Du kan finde de QSL'er, du stadig venter på, med <a href="#ToolsReceiveRecPendingQSL">Værktøjer->QSL-værktøjer. ..->Find anmodet afventer at modtage</a>.<bR>Dette værktøj viser dig i søgefeltet alle QSO'er med QSL-Rec markeret som <i>Request</i>, men du har stadig ikke modtaget QSL-kortet fra 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>Ved du...<br>Du kan abonnere på <a href=https://t.me/klogchat>den engelske KLog Telegram-gruppe</a> at diskutere om KLog på engelsk? <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>Ved du...<br>Du kan abonnere på <a href=https://t.me/KLogES>spansk telegram-gruppe</a> for at diskutere om KLog på spansk? <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>Ved du det...<br>Du kan abonnere på <a href=https://groups.io/g/klog>KLog-mailinglisten</a> diskutere via e-mail om KLog på engelsk? <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>Ved du det...<br>Du kan <a href=https://twitter.com/_ea4k>følge EA4K på Twitter</a> for at få opdateringer om 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>Ved du...<br>Du kan skrive din egen <a href=https://www.eham.net/reviews/detail/3118>anmeldelse i eHam.net om KLog</a> for at hjælpe andre brugere med at beslutte at bruge 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>Ved du...<br>Du kan slutte dig til udviklingsteamet ved blot at <a href=https://www.klog.xyz/contact>kontakte os< /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>Ved du...<br>At der er mange måder at bidrage til KLog på, og nogle af dem er opført i <a href=https://www. klog.xyz/contrib>Klog bidrag</a> side? <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>Ved du...<br>Du kan støtte oversættelse af KLog til dit sprog? Tjek venligst siden <a href=https://www.klog.xyz/contrib/translations>KLog-oversættelser</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>Ved du det...<br>Du kan dobbeltklikke på en enhedsnavn i DXCC-tabellen, og alle QSO'erne med den DXCC-enhed vil blive vist i søgningen boks? <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>Ved du det...<br>Du kan højreklikke på en QSO og vælge <i>Tjek ind QRZ.com</i> for at kontrollere det kaldesignal 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entitet Continent Kontinent Reading cty.csv... Læser cty.csv ... Abort reading Afbryd læsning 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. WorldMapWidget World map Verdenskort View Visning Zoom In(25%) Zoom Ind(25%) Zoom Out(25%) Zoom Ud(25%) Normal Size Normal Størrelse Fit to window Tilpas til vindue 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)... Udefineret fejlkode (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. QSO dupe or not existing (#%1)... dupe is slang QSO-duplikat eller ikke eksisterende (#%1)... We have received an undefined error from Clublog (%1) Vi har modtaget en udefineret fejl fra Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. original text is not grammatically correct Denne fejl kan skyldes, at QSO'en duplikeres eller, hvis den fjernes, forsøger at fjerne en ikke-eksisterende 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. Tjek venligst din konfiguration i opsætningen og kontakt KLog-udviklingsteamet, hvis du ikke kan rette det. ClubLog-uploads vil blive deaktiveret. 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 OK 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) Udefineret fejlnummer (#%1) We have received the following error from QRZ.com (%1) Vi har modtaget følgende fejl fra QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Ikke gyldig API nøgle fundet 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. Konfigurer venligst din QRZ.com API-nøgle. Du finder det på din QRZ.com logbogs indstillingsside. Du skal bruge et QRZ.com-abonnement for at bruge denne funktion. KLog - QRZ.com password needed KLog - QRZ.com adgangskode kræves Please enter your QRZ.com password: Indtast venligst din QRZ.com adgangskode: KLog - QRZ.com KLog - QRZ.com Callsign missing Kaldesignal mangler eQSLUtilities Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! Undefined error number (#%1)... Udefineret fejlnummer (#%1)... eQSL Error: User or password incorrect eQSL-fejl: Bruger eller adgangskode er forkert eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL Advarsel: Mindst én af de uploadede QSO'er er duplikeret. eQSL: All the QSOs were properly uploaded. eQSL: Alle QSO'er blev uploadet korrekt. KLog - eQSL.cc password needed KLog - eQSL.cc adgangskode påkrævet Please enter your eQSL.cc password: Indtast venligst din eQSL.cc adgangskode: KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL har sendt følgende besked: %1 We have received an undefined error from eQSL (%1) Vi har modtaget en udefineret fejl fra 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. Tjek venligst din konfiguration i opsætningen og kontakt KLog-udviklingsteamet, hvis du ikke kan rette det. eQSL-uploads vil blive deaktiveret. klog-2.4.1/translations/klog_fi.ts0000644000175000017500000141574215003153303016144 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 My Locator Minun lokaattori Start date End date Ok Ok Cancel Peru DX Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila Not defined ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Kaikki 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Työstetty C Confirmed, please try to keep the C Confirmed Vahvistettu U Unknown Unknown 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 DXClusterAssistant DX Freq Taajuus Status DXClusterWidget Click on Connect to connect to the DX-Cluster server Napsauta yhdistä, kun haluat muodostaa yhteyden DX-klusteripalvelimeen Connect Yhdistä Clear Tyhjennä Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa 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: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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 Reading LoTW file... Luetaan LoTW-tiedostoa... Abort reading Keskeytä lukeminen 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... 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) 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. 1 bit 1 bitti 1.5 bits 1.5 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kutsutunnus &Save &Cancel DUPE Translator: DUPE is a common world for hams. Do not translate of not sure 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. For updated DX-Entity data, update cty.csv. Päivitettyjä DX-yksikkö tietoja varten, päivitä cty.csv. Settings ... Always check the current callsign in QRZ.com Upload queued QSOs to LoTW It was not possible to define the KLog folder. Some functions may not work properly! Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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ö 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 The callsign %1 is not a valid call. 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 - KLog folder not found KLog needs to update the Entities database. KLog - Backup KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. 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 Queue all QSOs from this log to be sent 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 Show Map &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 ... The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Filling QSOs ... Date/Time Päivämäärä/aika Callsign Kutsutunnus Printing the log ... Station Callsign Aseman kutsutunnus 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. 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! 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 - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 Show All 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. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Ei tunnistettu Not - Not Identified Ei - Ei tunnistettu None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF 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ä. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 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 Altitude 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 status Continent Manner Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL Sent Force Init Freq Taajuus Freq RX RX Taajuus Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW lähetetty Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Nimi Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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 Show seconds &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. Show seconds in the QSO editor 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 Log level 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Yksikkö Continent Manner Reading cty.csv... Luetaan cty.csv... Abort reading Keskeytä luku 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. 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)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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-2.4.1/translations/klog_ru.ts0000644000175000017500000137204415003153303016171 0ustar develdevel AboutDialog About KLog О KLog By К KLog is a free logbook for hamradio operators. 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 (Linux, macOS and Windows) and to support new functionality. Начиная с версии 0.6.2, KLog был полностью переписан, чтобы предоставить кроссплатформенное приложение, работающее во всех основных операционных системах (Linux, macOS и Windows) и поддерживающее новые функции. Please provide your review in KLog's eHam review page: Пожалуйста, оставьте свой отзыв на странице отзывов KLog eHam: 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! KLog разрабатывается очень небольшой командой, и мы приглашаем вас присоединиться! 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>! Если вы хотите оказать поддержку, присоединяйтесь к <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">списку рассылки разработчиков KLog</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Вы также можете помочь нам, отправив отчеты об ошибках или небольшие дополнения к коду, идеи или все, что, по вашему мнению, может улучшить KLog. Authors Авторы Translators bring KLog into your language. They are really an important part of the KLog development team. Переводчики переводят KLog на ваш язык. Они действительно важная часть команды разработчиков 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://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Если KLog все еще не на вашем языке и вы хотите помочь нам, вы можете связаться с нами через <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">рассылку по разработке KLog. список</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. Разработчики KLog включили функцию, которая передает некоторые пользовательские данные на сервер KLog с единственной целью определения количества установленных версий, чтобы сосредоточить разработку в том или ином направлении с учетом потребностей пользователей. At present, the data that is provided is the following: На данный момент предоставлены следующие данные: Callsign Позывной KLog version KLog-версия 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. Выберите дату начала для экспорта 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 Хорошо Cancel Отмена DX DX Date/Time Дата/Время Band Диапазон Mode Режим Not defined Не определен All Все QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - QSO для загрузки в LoTW. This table shows the QSOs that will be sent to LoTW. В этой таблице показаны QSO, которые будут отправлены в LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO для загрузки в ClubLog. This table shows the QSOs that will be sent to ClubLog. В этой таблице показаны QSO, которые будут отправлены в ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO для загрузки на eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. В этой таблице показаны QSO, которые будут отправлены на eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO для загрузки на QRZ.com. This table shows the QSOs that will be sent to QRZ.com. В этой таблице показаны QSO, которые будут отправлены на QRZ.com. This table shows the QSOs that will be exported to ADIF. В этой таблице показаны QSO, которые будут экспортированы в ADIF. AwardsWidget Recalculate Пересчитать Click to recalculate the award status. Нажмите, чтобы пересчитать статус награды. Select the year you want to check. Выберите год, который хотите проверить. QSOs QSOs DXCC DXCC CQ CQ Award Награда Confirmed Подтвержденный Worked Работал WAZ 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 &Скачать &Ignore &пропустить Country data needed Необходимые данные о стране KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog использует файл cty.csv с https://www.country-files.com/ для получения информации 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. Вам необходимо загрузить файл cty.csv, если вы хотите, чтобы KLog показывал вам страны, локаторы и т. д. ваших QSO. 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 Обновить Prefix Префикс Entity Корреспондент Pref: Pref: CQ: CQ: ITU: ITU: Beam: Луч: Entity not worked in this band. Корреспондент не работал на этом диапазоне. DXClusterWidget Click on Connect to connect to the DX-Cluster server Нажмите Подключиться , чтобы подключиться к серверу DX-Cluster Connect Подключиться Clear Прозрачный Click on connect to connect to the DX-Cluster Нажмите Подключиться, чтобы подключиться к DX-кластеру Trying to connect to the server Пытаюсь подключиться к серверу KLog DXCluster 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. Соединение было отклонено узлом. Убедитесь, что сервер DXCluster запущен, и проверьте правильность имени хоста и параметров порта. The following error occurred: %1. Произошла следующая ошибка: %1. Connected to server Подключено к серверу KLog message KLog-сообщение Enter your callsign to connect to the cluster: Введите свой позывной для подключения к кластеру: Enter your password to connect to the cluster: (Just hit enter for no password) Введите пароль для подключения к кластеру: (Просто нажмите Enter, чтобы не было пароля) Disconnect Отключиться 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. Connection closed by the server Соединение закрыто сервером Click on Connect to connect to the DX-Cluster server. Нажмите подключиться, чтобы подключиться к серверу DX-Cluster. Send Отправлять It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Не удалось открыть файл для сохранения DX-Spots для записи. Активность DX-кластера не будет сохранена! 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 Спорадический 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 Распространенный термин в радиолюбителях, не переводите, если не уверены F2 Отражение 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 Клог DXCC All QSOs have been updated with a DXCC and the Continent. Все QSO были обновлены с DXCC и Continent. KLog - Invalid call detected KLog — Обнаружен недействительный вызов 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> KLog - %1 Клог — %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. Выбранный позывной (%1) недействителен, проверьте его еще раз, чтобы экспортировать журнал. The file %1 can't be opened. Файл %1 не может быть открыт. There are no QSOs pending to be exported with that station callsign. Нет ожидающих экспорта QSO с этим позывным станции. Writing ADIF file... Запись файла ADIF... Abort writing Прервать запись Export Экспорт Exporting ADIF file... QSO: %1 / %2 Экспорт файла ADIF... QSO: %1 / %2 KLog - User cancelled KLog — Пользователь удален 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: Запись файла ADIF... QSO: 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 в свой локальный журнал? 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. Процесс будет остановлен, и ваш журнал может быть обновлен не полностью. Reading LoTW file... Чтение файла LoTW... Abort reading Прервать чтение Importing LoTW ADIF file... Импорт файла LoTW ADIF... QSO: QSO: You have canceled the file import. The file will be removed and no data will be imported. Вы отменили импорт файла. Файл будет удален, и никакие данные не будут импортированы. KLog - Log selection KLog — выбор журнала 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... Чтение файла ADIF... 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 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 действительным! Please edit the ADIF file and make sure that it include at least: Please edit the ADIF file and make sure that it include at least: and и This QSO had: Это QSO было: - 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! KLog: Не все необходимые данные найдены! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. В некоторых QSO этого лога (например: %1) отсутствует информация RST-TX. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Нажмите Да, чтобы добавить %1 по умолчанию для режима %2 ко всем QSO с похожей проблемой. If you select NO, maybe the QSO will not be imported. Если вы выберете НЕТ, возможно, QSO не будет импортировано. KLog: No RST TX found! KLog: RST TX не найден! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. В некоторых QSO этого журнала (например: %1) отсутствует информация RST-RX. KLog: No RST RX found! KLog: RST RX не найден! KLog - No Station callsign entered. KLog - Позывной станции не введен. KLog - Apply to all QSOs in this log? KLog - Применить ко всем QSO в этом логе? 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 без определенного позывного станции. Введите позывной станции, которая использовалась для проведения этого QSO с %1 на %2: KLog - QSO without Station Callsign KLog - QSO без позывного станции KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog обнаружил одно QSO без определенного позывного станции. Введите позывной станции, которая использовалась для проведения этого QSO на %1: KLog - Don't ask again KLog - больше не спрашивать 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> %1</li><li>Позывной: %2</li><li>Диапазон: %3</li><li>Режим: %4< /ли></ул> 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? Мы обнаружили QSO из LoTW, которого нет в вашем локальном журнале. Вы хотите, чтобы KLog добавил это QSO в лог? KLog - Invalid call detected KLog — Обнаружен недействительный вызов 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 после завершения процесса экспорта. 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 Континент Prefix Префикс CQ CQ ITU ITU Short Path Короткий путь Long Path Долгий путь Deg градус Miles Мили Km Km IntroPage Welcome to KLog! Добро пожаловать в Клог! Welcome to KLog! - brought to you under the terms of the GPL! Добро пожаловать в Клог! - принесено вам на условиях GPL! Welcome to 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 Linux, macOS, and Windows. KLog — бесплатная программа для ведения журналов радиолюбителей, которая может работать в 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... форматы файлов Cabrillo и многие другие функции... 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 Double click on the date that you want to use as the start date for downloading QSOs. Дважды щелкните дату, которую вы хотите использовать в качестве даты начала загрузки QSO. KLog - LoTW password needed KLog - требуется пароль LoTW Please enter your LoTW password: Пожалуйста, введите свой пароль LoTW: KLog - LoTW Station callsign KLog — позывной станции LoTW There is not a single QSO in the log with that station callsign. В логе нет ни одного QSO с этим позывным станции. Are you sure that you want to use that station callsign (%1)? Вы уверены, что хотите использовать позывной этой станции (%1)? KLog - LoTW File already exists KLog — файл LoTW уже существует 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 - LoTW Can't write the file KLog - LoTW Невозможно записать файл KLog was not able to save the file %1. Error returned: %2 KLog не удалось сохранить файл %1. Возвращена ошибка: %2 The file %1 already exists. Файл %1 уже существует. Downloading data to file: %1. Загрузка данных в файл: %1. KLog - LoTW download KLog - загрузка LoTW KLog - LoTW Start date selection 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. Это первая дата QSO с позывным %1 в этом журнале. Если вы считаете, что в LoTW у вас могут быть предыдущие QSO, ответьте Нет. Do you want to used this date (%1) as start date? Вы хотите использовать эту дату (%1) в качестве даты начала? 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 The remote server redirected our connection to %1 Удаленный сервер перенаправил наше соединение на %1 Do you want to follow the redirection? Хотите следовать перенаправлению? KLog - LoTW File not found KLog — Файл LoTW не найден KLog can't find the downloaded file. KLog не может найти загруженный файл. It was not possible for find the file %1 that has been just downloaded. Не удалось найти только%1 что загруженный файл. 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 Нет связей LoTW sent no QSOs LoTW не провел QSO It seems that LoTW has no QSO with the Station Callsign you are using (%1). Похоже, что у LoTW нет связей с позывным станции, которую вы используете (%1). KLog - LoTW Unknown error KLog — Неизвестная ошибка LoTW KLog can't recognize the file that has been downloaded from LoTW. KLog не может распознать файл, загруженный с 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. Хотите обновить свой журнал загруженными данными? Now KLog will process the downloaded QSO and update your local log. Теперь KLog обработает загруженное QSO и обновит ваш локальный журнал. LogModel Date Дата Call Позывной Band диапазон Mode выд излучение RSTtx RSTtx RSTrx RSTrx Comment Комментарий LogWindow QSL Send QSL отправить QSL Rcvd QSL Rcvd &Delete &Удалить Delete a QSO Удалить QSO &Edit QSO &Редактировать QSO Edit this QSO Редактировать это QSO Via &bureau Через&бюро Send this QSL via bureau Отправьте эту QSL через бюро D&irect &Прямой Send this QSL via direct Отправьте эту QSL через direct Via bureau Через бюро QSL &received via bureau QSL, &полученные через бюро Direct Прямой QSL received via direc&t QSL, полученные &напрямую 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 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 Загрузить в 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 через direct QSLs received via bureau QSLs, полученные через бюро QSLs received via direc&t QSLs, полученные &напрямую Select none Выберите ничего Remove all selections Удалить все выделения Select all Выбрать все Select all the QSOs Выбрать все QSO MainQSOEntryWidget &Add &Добавить &Clear &Очистить 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 будет показывать в реальном времени, если он включен. Callsign Позывной &Modify &Изменить 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 Всегда проверяйте текущий позывной на QRZ.com KLog - File not open KLog - Файл не открыт It was not possible to open the debug file for writing. No debug log will be saved! Не удалось открыть отладочный файл для записи. Журнал отладки не будет сохранен! Status bar ... Статус бар ... DX Entity DX-сущность Starting KLog Запуск KLog &Log Window &окно журнала Upload the queued QSOs to LoTW Загрузить поставленные в очередь QSO в LoTW Watts Вт MHz МГц Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Переводчик: «Сплит» — это общепринятый термин для радиолюбителей. Не переводите, если не уверены. Расколоть KLog CTY.dat update Обновление KLog CTY.dat KLog needs to update the Entities database. KLog необходимо обновить базу данных сущностей. You can update the entities database in Tools->Update cty.csv Вы можете обновить базу данных сущностей в 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. Похоже, вы никогда не делали резервную копию и не экспортировали журнал в 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. Хорошей практикой является регулярное резервное копирование полного журнала, чтобы избежать потери данных в случае возникновения проблемы. После того, как вы экспортируете свой журнал в файл ADIF, вы должны скопировать этот файл в безопасное место, например на USB-накопитель, облачный диск, другой компьютер и т. д. KLog ежемесячно будет напоминать вам о резервном копировании. KLog backup Резервное копирование KLog The backup was done successfully Резервное копирование было сделано успешно KLog will remind you to backup your data again in aprox one month. KLog напомнит вам снова сделать резервную копию ваших данных примерно через месяц. 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! Обнаружена новая версия KLog! 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. Настройка будет открыта, чтобы вы могли выполнить любую новую настройку, которая может вам понадобиться. Ready Готовый KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSO: %2 - %3 KLog - %1 - QSOs: %2 KLog - %1 - QSO: %2 KLog Клог KLog - Unexpected error KLog — непредвиденная ошибка 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 - Недействительный вызов The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Позывной %1 недействителен. Вы действительно хотите добавить этот позывной в журнал? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Добавление недействительных вызовов в журнал может создать проблемы при подаче заявок на награды, экспорте файлов ADIF в другие системы или приложения. KLog - Select correct entity KLog — выберите правильный объект 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. 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 не является допустимым позывным. Вы действительно хотите добавить этот позывной в журнал? No DXCC Нет DXCC None Никто Click on the prefix of the right entity or Cancel to correct. Нажмите на префикс нужного объекта или Отмена, чтобы исправить. Save ADIF File Сохранить файл ADIF You have requested to delete several QSOs Вы запросили удаление нескольких QSO This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Эта операция обязательно удалит все выбранные QSO и связанные с ними данные, и вы не сможете восстановить их снова. Are you sure? Вы уверены? You have requested to delete the QSO with: %1 Вы запросили удаление QSO с: %1 KLog ClubLog error Ошибка KLog ClubLog The ClubLog upload process has finished with an error and the log was possibly not uploaded. Процесс загрузки ClubLog завершился с ошибкой, возможно, журнал не был загружен. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Проверьте свои учетные данные, подключение к Интернету и учетную запись Clublog. Получен код ошибки: %1 KLog ClubLog KLog ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Вы хотите пометить как загруженные все QSO, загруженные в ClubLog? KLog - ClubLog KLog - Клублог There was an error while updating to Yes the ClubLog QSO upload information. Произошла ошибка при обновлении на «Да» информации о загрузке 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? Процесс загрузки ClubLog завершен, и KLog создал файл (%1) в вашей папке KLog. Вы хотите, чтобы KLog удалил этот файл? 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 удалить файл Вы можете удалить его вручную. KLog eQSL error Ошибка eQSL 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 KLog eQSL KLog eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Вы хотите пометить как загруженные все QSO, загруженные в eQSL? KLog - eQSL KLog - eQSL There was an error while updating to Yes the eQSL QSO upload information. Произошла ошибка при обновлении на «Да» информации о загрузке QSO 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? Процесс загрузки eQSL завершен, и KLog создал файл (%1) в вашей папке KLog. Вы хотите, чтобы KLog удалил этот файл? KLog QRZ.com error KLog Ошибка QRZ.com The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Процесс загрузки QRZ.com завершился с ошибкой, и журнал, возможно, не был загружен. KLog QRZ.com KLog QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Вы хотите пометить как загруженные все QSO, загруженные на QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Произошла ошибка при обновлении информации о загрузке QRZ.com QSO на «Да». 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. KLog %1 Клог %1 You need to activate the %1 service in the eLog preferences. Вам необходимо активировать службу %1 в настройках eLog. KLog - Exit Клог - Выход Do you really want to exit KLog? Вы действительно хотите выйти из KLog? 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 был выполнен неправильно. &File &файл &Import from ADIF ... &импорт файла в ADIF... Import an ADIF file into the current log. Импортируйте файл ADIF в текущий журнал. Export to ADIF ... Экспорт в ADIF... Export the current log to an ADIF logfile. Экспортируйте текущий журнал в файл журнала ADIF. Export all logs to ADIF ... Экспортировать все журналы в ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Экспортируйте ВСЕ QSO в один файл ADIF, объединив QSO из всех журналов. &Print Log ... &печать журнала... Print your log. Распечатайте свой журнал. KLog folder Папка KLog Opens the data folder of KLog. Открывает папку данных KLog. E&xit &выход &Tools &Инструменты Fill in QSO data Заполнить данные QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Просмотрите журнал, повторно используя предыдущие QSO, чтобы заполнить недостающую информацию в других QSO. QSL tools ... QSL-инструменты... Find QSO to QSL Найти QSO на QSL Shows QSOs for which you should send your QSL and request the DX QSL. Показывает QSO, для которых вы должны послать свою QSL и запросить 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! Показывает QSO с ожидающими запросами на отправку QSL. Вы должны держать эту очередь пустой! Find DX-QSLs pending to receive Найти ожидающие получения DX-QSL 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 in this log as sent to LoTW. Пометить все поставленные в очередь QSO в этом журнале как отправленные в LoTW. Mark all queued QSOs as sent Отметить все QSO в очереди как отправленные Mark all queued QSOs as sent to LoTW. Пометить все QSO в очереди как отправленные в LoTW. Download from LoTW ... Скачать с LoTW... Download the full log from LoTW ... Скачать полный лог с LoTW... ClubLog tools ... Инструменты ClubLog ... Queue all the QSOs to be uploaded Поставьте в очередь все QSO для загрузки 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... Check the current callsign in QRZ.com Проверьте текущий позывной на QRZ.com Queue all the QSO to be uploaded Поставьте в очередь все QSO для загрузки Upload the queued QSOs to QRZ.com ... Загрузите QSO из очереди на QRZ.com... Update cty.csv Обновить cty.csv For updated DX-Entity data, update cty.csv. Для получения обновленных данных DX-Entity обновите cty.csv. Update Satellite Data Обновление спутниковых данных Stats Статистика Show the statistics of your radio activity. Показать статистику вашей радиоактивности. Setup Настраивать Setup ... Настраивать ... &Help &Помощь &Tips ... &Подсказки... &Debug ... &Отладка... &About ... &О... About Qt ... По поводу Qt... Check updates ... Проверьте обновления... KLog LoTW KLog LoTW All pending QSOs of this log has been marked as queued for LoTW! Все ожидающие связи в этом журнале отмечены как поставленные в очередь LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Теперь вы можете перейти в меню «Файл», чтобы экспортировать файл LoTW ADIF и загрузить его в LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Возникла проблема с пометкой всех ожидающих QSO в этом журнале как находящихся в очереди на LoTW! Your log has been updated with the LoTW downloaded QSOs. Ваш журнал обновлен за счет загруженных LoTW связей. KLog has updated %1 QSOs from LoTW. KLog обновил %1 связей с 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. Ни одно QSO не было обновлено данными, поступающими от LoTW. Это может быть связано с ошибками в файле журнала или просто с тем, что ваш журнал уже обновлен. All pending QSOs has been marked as queued for LoTW! Все ожидающие связи отмечены как поставленные в очередь LoTW! KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL не установлен или KLog не может его найти. Пожалуйста, проверьте конфигурацию. TQSL finished with no error. TQSL завершился без ошибок. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Ошибка №1: процесс был отменен пользователем или TQSL не настроен. Никакие связи не были загружены. 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. Выбранный Вами журнал содержит более одного позывного для радиостанции. Please select the station callsign you want to mark as sent to LoTW: Пожалуйста, выберите позывной станции, который вы отметите для отправки в 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. Вы не выбрали позывной. KLog помечает QSO не с позывным определенной радиостанции, а с тем позывным, который вы вводите здесь. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Введите позывной радиостанции, который будет использоваться для этого журнала, или оставьте его пустым для QSO без позывного радиостанции: KLog - No station selected KLog - радиостанция не выбрана 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 Вы действительно хотите отметить ВСЕ эти QSO для загрузки? Это может быть сделано ТОЛЬКО ЕСЛИ ЭТО ВАШ ПЕРВАЯ ЗАГРУЗКА QSO в LoTW All queued QSOs of this log has been marked as sent for LoTW! Все поставленные в очередь QSO этого журнала были помечены как отправленные для LoTW! There was a problem to mark all queued QSOs of this log as sent 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 ... О... KLog update checking result Результат проверки обновления KLog Congratulations! Поздравляем! You already have the latest version. У вас уже есть последняя версия. You can find the KLog data folder here: Вы можете найти папку с данными KLog здесь: start Старт UDP Server error The UDP server failed to %1. start or stop Ошибка UDP-сервера. Сбой UDP-сервера%1. stop Стоп It seems that there are no QSOs in the database. Возможно, 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. Если вы уверены, что в базе данных есть QSO, и KLog не может их найти, обратитесь за помощью к разработчикам (см. О KLog). Sends the log to LoTW calling TQSL. Отправляет журнал в LoTW, используя TQSL. This function is disabled. Go to the Setup->LoTW tab to enable it. Эта функция отключена. Перейдите на вкладку Setup- > LoTW, чтобы включить ее. TX Frequency in MHz. Частота TX в МГц. RX Frequency in MHz. Частота RX в МГц. 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. QTH работающей радиостанции. Locator of the contacted station. Локатор работающей радиостанции. TX RST. Передаваемый RST. RX RST. Принятый RST. Status of the DX entity. Субъектность DX. Name of the DX entity. Наименование субъекта DX. Name Имя QTH Местоположение DX Locator DX локатор Power(rx) Передаваемая мощность (tx) RST(tx) Передаваемый RST (tx) RST(rx) Принятый RST (rx) Freq TX Частота передачи Freq RX Частота приёма QSO QSO QSL QSL eQSL eQSL Comment Комментарии Others Другое My Data Мои данные Satellite Спутник Info Информация Awards Дипломы Search Поиск Log Журнал DX-Cluster DX-кластер DXCC DXCC No QSOs have been exported to ADIF. QSO не были экспортированы в ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog экспортировал%1 QSO в файл ADIF: %2 KLog - LoTW KLog - LoTW You need to select one station callsign to be able to send your log to LoTW. Выберите один позывной радиостанции, чтобы отправить свой журнал в 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? Если вы загрузили какой-либо QSO в LoTW используя TQSL, то вы можете отметить их как отправленные в KLog. Вы хотите отметить все отправленные QSO как загруженные в LoTW? There was an error while updating to Yes the LoTW QSL sent information. Произошла ошибка при обновлении до того, как Да LoTW отправил QSL. 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. Вы хотите, чтобы KLog удалил этот файл? You need to select one station callsign to be able to send your log to ClubLog. Выберите один позывной радиостанции, чтобы отправить свой журнал в ClubLog. 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. You need to select one station callsign to be able to send your log to eQSL.cc. Выберите один позывной радиостанции, чтобы отправить свой журнал в eQSLcc. KLog - Select the Station Callsign. Klog - выбор позывного радиостанции. 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 и сконфигурируйте Ваше соединение с 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 ClubLog Вы действительно хотите отметить ВСЕ свои QSO для загрузки? Это должно быть сделано ТОЛЬКО ЕСЛИ ЭТО ВАША ПЕРВАЯ загрузка QSO в ClubLog 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 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. 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 Вы действительно хотите отметить ВСЕ свои QSO для загрузки? Это должно быть сделано ТОЛЬКО ЕСЛИ ЭТО ВАША ПЕРВАЯ загрузка QSOs в eQSL 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 в этом журнале помечены как Изменено в поле состояния QRZ.COM Все QSO в этом журнале помечены как Изменено в поле состояния eQSL.cc KLog could not mark the full log to be sent to eQSL KLog не удалось пометить весь журнал для отправки в eQSL KLog QRZ.COM 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 Вы действительно хотите отметить ВСЕ свои QSO для загрузки? Это должно быть сделано ТОЛЬКО ЕСЛИ ЭТО ВАША ПЕРВАЯ загрузка QSOs в QRZ.COM 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 KLog could not mark the full log to be sent to QRZ.com KLog не удалось пометить весь журнал для отправки в QRZ.COM You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Определите правильный ключ API для вашего журнала QRZ.com в настройках eLog. Open File Открыть файл DX QTH locator. DX-QTH-локатор. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH-локатор. Формат должен быть изначально как IN70AA до 10 символов. - Needed for DXMarathon - Требуется для DXMarathon Filling QSOs ... Заполнение QSOs... Abort filling Прервать заполнение Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Заполнение DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Номер Date/Time Дата/Время Callsign Позывной RSTtx RSTпереданный RSTrx RSTпринятый Band Диапазон Mode Мода Print Log Журнал печати Printing the log ... Печать журнала... Abort printing Прервать печать Printing the log... QSO: Печать журнала... 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 KLog QSO полученный The following QSO data has been received from WSJT-X to be logged: Следующие данные QSO были получены от WSJT-X для регистрации: Freq Частота Time On Время начала Time Off Время окончания RST TX RST передачи RST RX RST приёма DX-Grid DX-Grid-локатор Local-Grid Местный Grid-локатор Station Callsign Позывной радиостанции Operator Callsign Позывной оператора KLog - WSJTX Dupe QSO KLog - WSJTX повторное QSO This QSO seems to be duplicated. Do you want to save or discard it? Этот QSO, повторное. Сохранить или удалить его? 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 должны соответствовать другому записанному QSO с тем же позывным, диапазоном, модуляцией, датой и временем, принимая во внимание период, который может быть определен в настройках. QSO logged from WSJT-X: QSO, зарегистрированное в WSJT-X: KLog - Non-supported mode KLog - неподдерживаемая модуляция A new mode not supported by KLog has been received from an external program or radio: Новая модуляция, не поддерживаемая KLog, получен от внешней программы или радио: If the received mode is correct, please contact KLog development team and request support for that mode Если полученная модуляция правильная, пожалуйста, свяжитесь с командой разработчиков KLog и запросите поддержку для это модуляции Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Вы хотите продолжать получать эти оповещения? (отключение этих предупреждений предотвратит обнаружение недопустимых модуляций) KLog - Duplicated satellite KLog - повторный спутник 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. Периодически экспортируйте свои данные в ADIF, чтобы предотвратить потенциальную потерю данных. KLog - Show errors KLog - Показать ошибки Do you want to keep showing errors? Продолжить отображение ошибок? MainWindowInputComment Comment Комментарий Add a comment for this QSO. Добавьте комментарий к этому 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 ClubLog. Состояние на ClubLog. Status on QRZ.com. Состояние на QRZ.COM. Status of the eQSL sending. Состояние отправки в eQSL. Status of the eQSL reception. Состояние получения в eQSL. Status of the LoTW sending. Состояние отправки в LoTW. Status of the LoTW reception. Состояние получения в LoTW. ClubLog ClubLog QRZ.com QRZ.com eQSL Sent eQSL отправлено eQSL Rec eQSL получено LoTW Sent LoTW отправлено LoTW Rec LoTW получено MainWindowInputOthers Primary Div Основное подразделение Secondary Div вспомогательное подразделение IOTA IOTA Entity Объект Propagation mode Популярная модуляция Keep propagation mode Сохранить популярную модуляцию Select the primary division for this QSO. Выберите основное подразделение для этого QSO. Select the secondary division for this QSO. Выберите вспомогательное подразделение для этого QSO. Select the entity for this QSO. Выберите объект для этого QSO. Select the propagation mode for this QSO. Выберите популярную модуляцию для этого QSO. Select the IOTA continent for this QSO. Выберите IOTA континент для этого QSO. Select the IOTA reference number for this QSO. Выберите номер референции IOTA для этого QSO. Keeps the same propagation mode for next QSO. Сохраняет тот же популярную модуляцию для следующего QSO. Not Identified не определено Not - Not Identified Нет - не определено MainWindowInputQSL QSL Sent QSL отправлено QSL Rec QSL получено QSL Via QSL к QSL Msg QSL сообщение 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. MainWindowMyDataTab Watts Ватты Keep this data Сохранить эти данные Data entered in this tab will be copied into the next QSO. Данные, введенные на этой закладке, будут скопированы в следующий QSO. Power used for the QSO in watts. Используемая мощность для QSO в ваттах. Logging operator's callsign. Зарегистрированный позывной операторов. Callsign used over the air. Позывной используется в эфире. My QTH locator. Мой QTH-локатор. Power Мощность Operator callsign Позывной оператора Station Callsign Позывной станции My Locator Мой локатор My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Мой QTH-локатор. Формат должен быть изначально, как IN70AA до 10 символов. MainWindowSatTab Keep this data Сохранить эти данные Data entered in this tab will be copied into the next QSO. Данные, введенные на этой закладке, будут скопированы в следующее QSO. Other - Sat not in the list Другое - Sat нет в списке 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. UpLink диапазон. DownLink band. DownLink диапазон. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Локатор DX-станции. Это поле синхронизируется с полем Локатор на вкладке QSO. UpLink UpLink DownLink DownLink Satellite Спутник Mode Модуляция DX Locator DX-локатор Other Другое MHz МГц Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Локатор DX-станции. Формат должен быть изначально, как IN70AA до 10 символов. 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. KLog обнаружил имя спутника, которое он не распознает. Если вместо этого он должен использовать одно из имен известных спутников, выберите его из списка. В качестве альтернативы, пожалуйста, свяжитесь с командой разработчиков, чтобы добавить новое имя спутника. The satellite you have in your QSO is: Спутник, который у вас есть в вашем QSO: 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. Выгрузить результат поиска в файл ADIF. Select/Unselect all the QSOs shown. Выберите/отмените выбор всех показанных QSO. 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! Введите позывной для поиска. Введите «*», чтобы показать все QSO... это может быть медленно в больших журналах! Select the Station Callsign used to do this QSO. Выберите позывной радиостанции, используемый для данного QSO. You have requested to delete the QSO with: %1 Вы запросили удаление QSO с помощью:%1 Are you sure? Вы уверены? All in log Всё в журнале Not defined Не определён &Clear selection &Очистить выделение Save File Сохранить файл SearchWindow Call Позывной Date/Time Дата/Время Band Диапазон Mode Модуляция QSL Sent QSL отправлено QSL Rcvd QSL принято Station Callsign Позывной радиостанции ID ID Date/time Дата/Время Station callsign Позывной радиостации QSL Send QSL отправить &Delete &Удалить Delete a QSO Удалить QSO &Edit QSO &Редактировать QSO Edit this QSO Редактировать это QSO Via &bureau Через &бюро Send this QSL via bureau Отправьте эту QSL через бюро D&irect На&прямую Send this QSL via direct Отправьте эту QSL напрямую Via bureau Через бюро QSL &received via bureau QSL &получено через бюро Direct Напрямую QSL received via direc&t QSL получено напрям&ую 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 Mark my QSL as requested Отметить мою QSL в соответствии с запросом Via Direct and mark DX QSL as requested Напрямую и отметить DX QSL в соответствии с запросом Send this QSL via direct and mark DX QSL as requested Отправьте этот QSL напрямую и отметьте DX QSL в соответствии с запросом Via Bureau and mark DX QSL as requested Через бюро и отметьте DX QSL в соответствии с запросом Send this QSL via bureau and mark DX QSL as requested Отправьте этот QSL через бюро и отметьте DX QSL в соответствии с запросом &Request the QSL &Запросить QSL Mark the QSL as requested Отметьте QSL в соответствии с запросом Via bureau and mark my QSL as requested Через бюро и отметить DX QSL в соответствии с запросом QSL received via bureau and mark my QSL as requested QSL, полученный через бюро, и отметьте мой QSL в соответствии с запросом Direc&t and mark as my QSL requested Напряму&ю и отметьте как мою запрошенную QSL QSL received via direct and mark my QSL as requested QSL, полученный напрямую, и отметьте мой QSL в соответствии с запросом Needed QSO to send the QSL Необходимо QSO для отправки QSL My QSL requested to be sent Моя QSL подготовленный ктправке DX QSL pending to be received Ожидается получение DX QSL SetupDialog User data Пользовательские данные Bands/Modes Диапазон/Модуляция D&X-Cluster D&X-кластер Colors Цвета Misc Разное World Editor Международный редактор Logs Журналы eLog eLog WSJT-X WSJT-X Satellites Спутники HamLib 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) Добавить один журнал на вкладке « Журналы » или выйти из KLog? (Нажмите кнопку « Да », чтобы добавить журнал, или кнопку « Нет », чтобы выйти из KLog) DX-Cluster DX-кластер 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. Перейдите на вкладку Misc и нажмите на Move 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 Объект Name of the Entity. Имя объекта. CQ CQ CQ zone. CQ-зона. ITU ITU ITU zone. ITU-зона. Latitude Широта Longitude of the Entity. Долгота объекта. Longitude Долгота UTC UTC Local time difference to UTC. Разница по местному времени с UTC. Main prefix Основной префикс Main prefix of the entity. Основной префикс объекта. ARRL ID ARRL ID ARRL ID. ARRL ID. Prefixes Префиксы Comma separated possible prefixes, e.g. EA1, EA2, ... Разделенные запятыми возможные префиксы, например, 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 WSJT-X палитра Default palette палитра по умолчанию Color when the DXCC is an ATNO (All Time New One). Цвет, когда DXCC является 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, ... Этот DXCC ранее работал на другом диапазоне, но не в выбранно диапазоне. Это может понадобиться из-за CQ, ITU, Grid,... Worked DXCC, but not confirmed in this band. Работал DXCC, но не подтвержден на этом диапазоне. DXCC is confirmed in this band. DXCC подтвержден на этом диапазоне. Default color. Цвет по умолчанию. Sets a palette of colors similar to the one used in WSJT-X. Устанавливает палитру цветов, аналогичную используемой в WSJT-X. Sets the default palette. Устанавливает палитру по умолчанию. Choose a color Выберите цвет SetupPageDxCluster Add Добавить Delete Удалить Show &HF spots Показать &HF споты Show V/&UHF spots Показать V/&UHF споты Show W&ARC spots Показать W&ARC споты Show &worked spots Показать &сработанные споты Show &confirmed spots Показать &подтвержденные споты Show ANN/&FULL messages Показать ANN/&FULL сообщения Show WW&V messages Показать WW&V сообщения Show WC&Y messages Показать WC&Y сообщения Save DX Cluster activity Сохранить DX-кластер активным 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 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 Klog Do you really want to remove this log? Действительно удалить этот журнал? All the QSOs from this log will also be deleted... Все QSO из этого журнала также будут удалены... Log has not been removed. (#3) Журнал не был удален. (#3) Log has not been removed. (#2) Журнал не был удален. (#2) Log has not been removed. (#1) Журнал не был удален. (#1) ID ID Date Дата Station Callsign Позывной радиостанции Operators Операторы Comments Комментарии QSOs QSOs The new log could not be created. Не удалось создать новый журнал. An error has occurred showing the following error code: Произошла ошибка со следующим кодом ошибки: KLog - SetupPageLogs KLog - страница настройки журнала SetupPageLogsNew &Date &Дата &Station Callsign &Позывной радиостанции &Operators &Операторы Comm&ent Коммента&рии &Ok &Хорошо &Cancel &Отмена Callsign used for this log. Позывной, используемый для этого журнала. Comma separated list of operators: callsign1, callsign2. Список операторов, разделенных запятыми: 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. Добавить комментарий об этом журнале. Если он заполнен, он будет отображаться в заголовке основного файла KLog для идентификации журнала. 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. Выберите sat, который требуется открыть. KLog 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 не был удален. (#3) Sat has not been removed. (#2) Sat не был удален. (#2) Sat has not been removed. (#1) Sat не был удален. (#1) ID ID Short Короткий Name Имя Uplink UpLink Downlink DownLink Modes Модуляция An error has occurred showing the following error code: Произошла ошибка со следующим кодом ошибки: KLog - SetupPageSats Klog - страница настроек спутников Open Satellites File Открыть файл Спутники KLog warning 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. Непредвиденная ошибка при импорте спутниковых данных. Это может быть вызвано тем, что файл, который вы пытаетесь импортировать, имеет неверный формат. 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 Модуляции &Ok &Хорошо &Cancel &Отмена Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Введите короткое имя. Попробуйте использовать короткое имя для LoTW, чтобы впоследствии вы могли загрузить свое QSO в LoTW. Enter the name of the satellite. Введите имя спутника. Enter the uplink frequencies in this format: 144.300 Введите частоту uplink в формате: 144.300 Enter the downlink frequencies in this format: 144.300 Введите частоту downlink в формате: 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 &Дата &Station Callsign &Позывной радиостанции &Operators &Операторы Comm&ent Коммента&рий &Ok &Хорошо &Cancel &Отмена Callsign used for this log. Позывной, используемый для этого журнала. Comma separated list of operators: callsign1, callsign2. Список операторов, разделенных запятыми: 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. Добавить комментарий об этом журнале. Если он заполнен, он будет отображаться в заголовке основного файла KLog для идентификации журнала. 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. Загрузите файл AWA со сведениями о подразделе. 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 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 KLog - страница настройки подраздела SetupPageUDP Start UDP Server Запуск UDP-сервера Automatically log QSOs from WSJT-X Автоматическая запись QSO из WSJT-X 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 QSO, зарегистрированные в WSJT-X, будут отправлены в KLog, и KLog спросит перед входом в KLog, если не выбрано «%1» KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog автоматически регистрирует любые QSO, поступающие из WSJT-X, без какого-либо ручного подтверждения. 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 Server получит QSO, отправленные другими программами, такими как WSJT-X, что позволит вам автоматически входить в KLog из этих программ. UDP Port UDP порт Select the interface to listen for UDP datagrams coming from WSJT-X. Выберите интерфейс для прослушивания дейтаграмм UDP, поступающих из WSJT-X. Network interface сетевой интерфейс QSOs notification timeout (milisecs) Тайм-аут уведомления QSO (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. Милисекунды потребуются для уведомления о QSO, полученное от WSJTX. SetupPageUserDataPage &Personal data &Персональные данные Station &data Данные &станции 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. Введите Вашу страну. &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 &Трансивер 1 R&ig 2 Т&рансивер 2 Ri&g 3 Тран&сивер 3 Antenna &1 Антенна &1 Antenna &2 Антенна &2 Antenna &3 Антенна &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. Введите локатор Вашей радиостанции. Кроме того, KLog может использовать приблизительный локатор на основе вашего позывного. &Callsign &Позывной &Operators &Операторы &CQ Zone &CQ зона &ITU Zone &ITU-зона &Locator &Локатор &Locator (not valid) &Локатор (недопустимый) 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. В папке KLog обнаружен файл сведений об объектах (cty.csv), который будет загружен. No entities information file (cty.csv) has been detected in your KLog folder. В папке KLog не обнаружен файл сведений об объектах (cty.csv). KLog will not be able to show entities information. KLog не сможет показывать сведения об объектах. Prefix Префикс Entity Объект ARRL ID ARRL ID Continent Континент CQ Zone CQ-зона ITU Zone ITU-зона UTC UTC Latitude Широта Longitude Долгота Deleted Удаленный Since Date Начало периода To Date Конец периода Open File Открыть файл BigCTY (*.csv) 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. Следующие QSO - это те QSO, на которые вы получили подтверждение LoTW. Ok Хорошо DX DX Date/Time Date/Time Band Диапазон Mode Модуляция ShowErrorDialog KLog Message KLog-сообщение SoftwareUpdateDialog Ok Хорошо KLog update Обновление KLog 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 QSO в DXCC QSO per Continent QSO на контененте QSO per hour QSO за час QSO per month QSO за месяц Worked / Confirmed status Статус Сработано/Подтверждено Worked / Sent status Статус Сработано/Отправлено Sent / Confirmed status Статус Отправлено/Подтверждено Satellite grid status Статус Спутник Grid-локатор Satellite DXCC status Статус Спутник DXCC StatsCQZPerYearBarChartWidget CQ Zones per year Зон CQ в год Reading data ... Чтение данных ... Abort reading Прервать чтение CQ zones CQ-зоны CQ zones per year Зоны CQ в год Reading data ... Чтение данных ... Years: %1/%2 Годы: %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. Только LEO sat Number Номер Callsign Позывной Date Дата Band Диапазон Mode Модуляция DXCC DXCC Satellite Спутник Confirmed Подтверждено No Нет StatsEntitiesPerYearBarChartWidget Chart title Итоговый список Reading data ... Чтение данных... Abort reading Прервать чтение DXCC Entities DXCC корреспонденты DXCC Entities per year DXCC корреспондентов за год 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. Только LEO sats Number Номер Callsign Позывной Date Дата Band Диапазон Mode Модуляция Grid Grid-локатор Satellite Спутник Confirmed Подтверждено No Нет StatsQSOsPerBandBarChartWidget QSOs per band QSOs на диапазоне Reading data ... Чтение данных... Abort reading Прервать чтение Bands Диапазоны QSOs per band distribution QSOs на разных диапазонах Reading data ... Чтение данных... Bands: Диапазоны: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs в континенте Reading data ... Чтение данных... Abort reading Прервать чтение Continents Континенты Reading data ... Чтение данных... Hours: Часы: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs в DXCC Reading data ... Чтение данных... Abort reading Прервать чтение Reading data... Чтение данных... DXCC DXCC Top ten DXCC per QSO Десять лучших DXCC за QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs за час Reading data ... Чтение данных... Abort reading Прервать чтение Hours Часы QSOs at hour QSOs в час 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 QSOs за месяц Reading data ... Чтение данных... Abort reading Прервать чтение Jan Январь Feb Февраль Mar Март Apr Апрель May Май Jun Июнь Jul Июль Aug Август Sep Сентябрь Oct Октябрь Nov Ноябрь Dec Декабрь Months Месяц QSOs at Month QSOs в месяц Reading data ... Чтение данных... Months: Месяцев: StatsQSOsPerYearBarChartWidget QSOs per year общее количество связей за год Reading data ... Чтение данных... Abort reading Прервать чтение QSOs общее количество связей Reading data ... Чтение данных... Чтение данных... QSO: %1/%2 количество связей %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Отправлено — %1 Confirmed - %2 Подтверждено - %2 Sent / Confirmed status Статус отправлен/подтвержден StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Сработало, не подтверждено - %1 Confirmed - %2 Подтверждено - %2 Worked / Confirmed status Рабочий / Подтвержденный статус StatsWorkedSentPieChartWidget Worked - %1 Сработало - %1 Sent - %2 Отправлено — %2 Worked / Sent status Статус Работал/Отправлено TipsDialog KLog tips Klog подсказки 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 TIP - по умолчанию: текст UpdateSatsData Reading Satellites data file... Чтение файла данных спутников... Abort reading Прервать чтение The Satellites information has been updated. Информация о спутниках обновлена. Open File Открыть файл Sat Data Спутниковые данные World Entity Сущность Continent Континент Reading cty.csv... Чтение cty.csv... Abort reading Прервать чтение WorldMapWidget World map Карта мира View Вид Zoom In(25%) Увеличить (25%) Zoom Out(25%) Уменьшить (25%) Normal Size Нормальный размер Fit to window Подходит к окну eLogClubLog Host not found! узел не найден! Timeout error! время ожидания превышено! QSO dupe or not existing (#%1)... QSO повторно или нет (#%1)... KLog - ClubLog Klog -журнал клуба We have received an undefined error from Clublog (%1) Получена неопределенная ошибка от клубного журнала(%1) 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)... 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 будут отключены. 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, действия не нужны 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) KLog - QRZ.com Klog - QRZ.com We have received the following error from QRZ.com (%1) Получена неопределенная ошибка от 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. Пожалуйста, настройте свой API ключ QRZ.com. Вы найдете его на своей веб-странице настроек журнала QRZ.com. Для использования этой функции требуется QRZ.com подписка. KLog - QRZ.com password needed KLog - QRZ.com требуется пароль Please enter your QRZ.com password: пожалуйста, введите свой пароль QRZ.com: Callsign missing Позывной отсутствует eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL отправил следующее сообщение: %1 Host not found! Хост не найден! Timeout error! Ошибка таймаута! Undefined error number (#%1)... Неопределенный номер ошибки (#%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 продублировано. 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-2.4.1/translations/klog_hr.ts0000644000175000017500000143235115003153303016152 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 My Locator Moj lokator 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 QSOs: %1/%2 KLog Warning There are no queued QSOs. 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Rađeno C Confirmed, please try to keep the C Confirmed Potvrđeno U Unknown Unknown 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. DXClusterAssistant DX DX Freq Frekv Status 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 Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com Clears the DXCluster command line. The DXCluster server desconnected the session. 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 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. 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! 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. 1 bit 1 bit 1.5 bits 1,5 bita 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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. Look up info about the current callsign on qrz.com 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 &Save &Cancel &Poništi DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPLI 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 KLog needs to update the Entities database. The backup was not properly done. Spremanje sigurnosne kopije nije bilo uspješno. 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 Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 QSOs from this log to be sent Queue all the QSOs to be uploaded Queue all the QSO to be uploaded Show Map 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? The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. 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 ... 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. 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. It was not possible to define the KLog folder. Some functions may not work properly! 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. 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 KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 The callsign %1 is not a valid call. 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 - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 Show All 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. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nije identificiran Not - Not Identified Nije - Nije identificiran None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF 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. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 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 Altitude 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 status Continent Kontinent Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL poslana Force Init Freq Frekv Freq RX Frekv RX Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW Posl Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Ime Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 Show seconds Mark sent eQSL && LoTW in new QSO as queued Označite poslane eQSL i LoTW u novim QSOima kao poredane Show seconds in the QSO editor 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 the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Log level 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entitet Continent Kontinent Abort reading Prekini čitanje Reading cty.csv... Čitam cty.csv... KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Svi QSOi su bili nadopunjeni DXCCom i kontinentom. 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. It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. 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-2.4.1/translations/klog_ca.ts0000644000175000017500000151152615003153303016126 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 subscriviu 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ó My Locator El meu localitzador 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: %1/%2 QSO: %1/%2 KLog Warning Avís del Klog There are no queued QSOs. No hi ha cap QSO a la cua. 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. Awards A Do not translate A ATNO All Time New One, Do not translate ATNO N Needed, please try to keep the N N Needed Necessari W Worked, please try to keep the W W Worked Treballat C Confirmed, please try to keep the C C Confirmed Confirmat U Unknown D Unknown Desconegut 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. Sembla que l'estat dels DXCC a la base de dades no està actualitzat i el KLog no ha pogut trobar cap informació dels DXCC. Podeu intentar corregir això actualitzant el registre. Do you want to update your DXCC status? Voleu actualitzar l'estat dels DXCC? 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. DXClusterAssistant DX DX Freq Freq Status Estat 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 Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Clears the DXCluster command line. Neteja la línia d'ordres del DXCluster. Trying to connect to the server S'intenta connectar amb el servidor The DXCluster server desconnected the session. El servidor del DXCluster ha desconnectat la sessió. 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. Introduïu 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. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Bits d'aturada 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. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. El KLog és un programa lliure de registre de radioaficció 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. Hi ha hagut un problema amb el registre, reinicieu el KLog i contacteu amb l'equip de desenvolupament si l'error persisteix. 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. Look up info about the current callsign on qrz.com Cerca informació sobre l'indicatiu actual a qrz.com 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. Atura l'actualització automàtica de la informació dels QSO per part del WSJT-X i la «hamlib». Manual Mode Mode manual Callsign Indicatiu &Save De&sa &Cancel &Cancel·la 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. 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 It was not possible to define the KLog folder. Some functions may not work properly! No s'ha pogut definir la carpeta del KLog. Algune sfunciones no funcionaran correctament! 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 KLog - QSO received - NEW KLog - QSO rebut - NOU <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> <HTML><body>ASK-S'han rebut les dades següents del QSO per a enregistrar-les: <table><tr><TH>Indicatiu:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Hora d'inici:</TH><TD>%4</TD></TR><TR><TH>Hora final:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comentari:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Indicatiu de l'estació:</TH><TD>%11</TD></TR><TR><TH>Indicatiu de l'operador:</TH><TD>%12</TD></TR></table></body></html> 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 Always check the current callsign in QRZ.com Comprova sempre l'indicatiu actual a QRZ.com Upload queued QSOs to LoTW Puja els QSO de la cua a LoTW Do you want to update now? Voleu actualitzar-ho ara? You seem to have never backed up or exported your log to ADIF. Sembla que no heu fet mai còpies de seguretat o exportat el registre a ADIF. Your latest backup seems older than one month. La darrera còpia de seguretat és anterior a un mes. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Les còpies de seguretat habituals eviten la pèrdua de dades i són pràctica bona d'operador. Un cop exportat, copieu el fitxer ADIF a un lloc segur com ara una unitat USB, una unitat al núvol o un altre ordinador remot. El KLog us recordarà que feu còpies de seguretat mensualment. Backup completed successfully La còpia de seguretat s'ha efectuat correctament KLog will remind you again in approximately one month. El KLog us recordarà que ho troneu a fer aproximadament d'aquí a un mes. Backup failed. La òpia de seguretat ha fallat. Periodic data backups are recommended to prevent data loss and corruption of your log. És recomanable fer periòdicament còpies de seguretat de les dades per a evitar la pèrdua de dades o la corrupció del registre. The setup will now open to allow you to change your settings. S'obrirà la configuració per a permetre les opcions. 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. 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 - Stop the war in Ukraine! KLog - Aturem la guerra a Ucraïna! KLog - Stop the war in Ukraine! KLog - Aturem la guerra a Ucraïna! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. Esteu empreant un idenficador rus (%1). Probablement podeu ajudar a aturar la guerra russa, la gent està morint. Demaneu als vostres líders que aturin la guerra. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Esteu emprant un identificador ucraïnès. Tingueu cura i protegiu-vos, també a la vostra família. Els desenvolupadors del KLog us desitgen molta sort en aquest moment tan difícil. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. La gent està morint a la guerra de Rússia contra Ucraïna. Podeu ajudar la guerra russa contra Ucraïna. Mostre el vostre desacord amb els vostres líders, o en les vostres xarxes socials per a aturar la guerra. KLog - KLog folder not found KLog - No s'ha trobat la carpeta del KLog KLog - Settings update KLog - Actualització de la configuració The settings system has been changed and KLog will update your settings file. El sistema de configuració ha canviat i el KLog actualitzarà el fitxer de configuració. This version of KLog requires that the DXCC database is updated. Aquesta versió del KLog requereix que la base de dades DXCC s'actualitzi. The database will be updated. La base de dades s'actualitzarà. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Llibre de registre de %2 - QSO: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Llibre de registre de %2 - Indicatiu d'estació: %3 - QSO: %4 The entity that is selected is different from the one proposed by KLog: L'entitat que està seleccionada és diferent de la proposada pel KLog: Unknown Keep it short, its a button text Desconegut - There is no selected DXCC. - No hi ha cap DXCC seleccionat. - KLog couldn't find a DXCC - No s'ha pogut trobar cap DXCC Please select the one you want to keep for this QSO. Seleccioneu el que vulgueu mantenir per a aquest QSO. KLog - QRZ.com warning KLog - Avís de QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha retornat un error de no subscrit i s'han desactivat les consultes a QRZ.com. Please check your QRZ.com subcription or credentials. Comproveu la vostra subscripció a QRZ.com o les credencials. 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 QSOs from this log to be sent Posa a la cua tots els QSO d'aquest registre per a enviar-los 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 Show Map Mostra el mapa 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 selection you have done does not include any QSO La selecció que heu fet no inclou cap QSO The selection you have done does not include any QSO. La selecció que heu fet no inclou cap QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Per pujar els QSO cal una subscripció a QRZ.com. Si en teniu una, aneu a la pestanya Configuració->QRZ.com per activar-la. 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 - QSO Dupe KLog - QSO duplicat A dupe QSO has been detected in the file and will not be added to the log. S'ha detectat un QSO duplicat al fitxer i no s'afegirà al registre. Please check the QSO information file and ensure it is properly added. Comproveu el fitxer d'informació del QSO i assegureu-vos que s'afegeix correctament. 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ó Show All Mostra-ho tot 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. Show all subdivisions for the current DXCC Entity. Mostra totes les subdivisions de l'entitat DXCC actual. 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 None Identified No s'ha identificat cap SOTA Ref Referència SOTA Age Antiguitat POTA Ref Referència POTA SIG SIG SIG Info Informació del SIG VUCC grids Quadrícules VUCC WWFF Ref Referència WWFF Not selected No seleccionat Distance Distància 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 RX Frequency Freqüència 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 POTA Ref La meva referència POTA My SIG El meu SIG My SIG Info La informació del meu SIG My SOTA Ref La meva referència SOTA My WWFF Ref La meva referència WWFF 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: MapWindowWidget Select QSOs in this band. Selecciona els QSO d'aquesta banda. Select QSOs in this mode. Selecciona els QSO d'aquest mode. Select QSOs in this propagation mode. Selecciona els QSO d'aquest mode de propagació. Select QSOs using this Satellite. Selecciona els QSO que usin aquest satèl·lit. Only confirmed Només els confirmats Select only confirmed QSOs. Selecciona només els QSO confirmats. All bands Totes les bandes Show nothing No mostris res All modes Tots els modes All propagation modes Tots els modes de propagació All satellites Tots els satèl·lits 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 Altitude Altitud 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. Dark Dok 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. My Fists 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 Mode de satèl·lit 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 ClubLog SDate Date when it was sent ClubLog SDate Contacted_Op OP_contactat Darc Dok Do not translate if unsure, common hamradio term. Darc Dok 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 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 eQSL SDate Date when it was sent eQSL SDate Gridsquare ext Extended gridsquare Gridsquare ampliat HamLog status Estat del HamLog HamLog SDate Date when it was sent HamLog SDate HRDLog SDate Date when it was sent HRDLog SDate HamQTH status Estat del HamQTH HamQTH SDate Date when it was sent HamQTH SDate LoTW SDate Date when it was sent LoTW SDate Marcado Marcat My Altitude La meva altitud My ARRL Sect La meva Sect ARRL My Gridsquare Ext El meu Gridsquare ampliat My POTA La meva POTA My SOTA La meva 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 My WWFF El meu WWFF Name Nom Notes Notes Operator Operador Owner Callsign Indicatiu de l'operador POTA POTA Pfx Pfx 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 WWFF WWFF QSO Date off Data fi QSO 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 Send DX Spots to the map Envia els avisos DX al mapa Sends the received DX Spots to the map to know where is the activity. Envia els avisos DX rebuts al mapa per a conèixer a on és l'activitat. 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 App password Contrasenya de l'aplicació 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) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Introduïu aquí la contrasenya de l'aplicació ClubLog. Es pot obtenir al ClubLog (menú Configuració -> Contrasenyes d'aplicacions). Avís: la contrasenya de l'aplicació es desarà en clar al fitxer de configuració del KLog!! 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 Subscriptor de pagament Check it if you are paying for a qrz.com subscription Comproveu si esteu pagant una subscripció a QRZ.com 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 Sèrie Network Xarxa 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. Si desactiveu aquesta casella de verificació, el KLog no comprovarà els indicatius per a identificar indicatius erronis. 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 Comprova els indicatius no vàlids Show seconds Mostra els segons Mark sent eQSL && LoTW in new QSO as queued Marca els eQSL enviats i LoTW als QSO nous com a posats a la cua Show seconds in the QSO editor Mostra els segons a l'editor de QSO 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 the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Selecciona el nivell de 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 i/o es mostra amb el menú Ajuda->Depura. Log level Nivell de registre 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 UpdateSettings KLog - Settings update KLog - Actualització de la configuració The settings system has been changed and KLog will update your settings file. El sistema de configuració ha canviat i el KLog actualitzarà el fitxer de configuració. World Entity Entitat Continent Continent Abort reading Interromp la lectura Reading cty.csv... S'està llegint el «cty.csv»... KLog DXCC DXCC del KLog All QSOs have been updated with a DXCC and the Continent. S'han actualitzat tots els QSO amb un DXCC i el continent. 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. It seems to be a CREDENTIALS ERROR; check your email and password. Sembla que hi ha un error de credencials, verifiqueu el vostre correu i contrasenya. It seems that your ClubLog credentials are not correct. Sembla que les vostres credencials del ClubLog no són correctes. Please check your credentials in the setup. ClubLog uploads will be disabled. Verifiqueu les vostres credencials a la configuració. Les pujades al ClubLog estan desactivades. 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. No esteu subscrit a 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-2.4.1/translations/klog_es.ts0000644000175000017500000147630515003153303016157 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 My Locator Mi locator 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: %1/%2 QSOs: %1/%2 KLog Warning Advertencia de KLog There are no queued QSOs. No hay QSO en cola 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed Necesitado W Worked, please try to keep the W T Worked Trabajado C Confirmed, please try to keep the C C Confirmed Confirmado U Unknown D Unknown Desconocido 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 en la base de datos y KLog no puede encontrar información de DXCC. Puede intentar arreglarlo 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. DXClusterAssistant DX DX Freq Frec Status Estado 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 Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Clears the DXCluster command line. Limpia la linea comandos de DXCluster. Trying to connect to the server Intentando conectar con el servidor The DXCluster server desconnected the session. El servidor DXCluster desconectó la sesión. 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. Solo 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. 1 bit 1 bit 1.5 bits 1.5 bits 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. 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. Hubo un problema con el log. Reinicia KLog y contacta con el desarrollador si el problema persiste. 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. Look up info about the current callsign on qrz.com Buscar información sobre el indicativo actual en qrz.com 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 y Hamlib actualicen información automáticamente. Manual Mode Modo Manual Callsign Indicativo &Save &Guardar &Cancel &Cancelar DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE 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 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. KLog - QSO received - NEW KLog - QSO recibido - NUEVO <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> It seems that there are no QSOs in the database. Parece que no hay QSOs en la base de datos. 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 It was not possible to define the KLog folder. Some functions may not work properly! No fue posible definir la carpeta de KLog. Algunas funciones pueden no funcionar correctamente. 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, para enviar, todos los QSOs de este log Mark all non-sent QSOs in this log as queued to be uploaded. Encolar, para enviar, todos los QSOs no enviados de este log 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! Always check the current callsign in QRZ.com Comprobar siempre el indicativo actual en QRZ.com Upload queued QSOs to LoTW Enviar QSOs en cola a LoTW Do you want to update now? ¿Quiere actualizar ahora? You seem to have never backed up or exported your log to ADIF. Parece que no ha hecho nunca una copia de seguridad o exportado su log a ADIF. Your latest backup seems older than one month. Parece que la última copia de seguridad que hizo fue hace más de un mes. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite 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. Backup completed successfully La copia de seguridad se terminó correctamente. KLog will remind you again in approximately one month. KLog no le recordará de nuevo, en un mes, que debe realizar la copia de seguridad. Backup failed. Falló la copia de seguridad. Periodic data backups are recommended to prevent data loss and corruption of your log. Exporte periódicamente los datos a ADIF para prevenir una potencial pérdida de datos. The setup will now open to allow you to change your settings. Se abrirá la el menú de configuración para que pueda hacer cualquier nueva configuración que pueda necesitar. 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? The selection you have done does not include any qso-> La selección no incluye ningún QSO. 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) KLog - QSO Dupe KLog - QSO duplicado A dupe QSO has been detected in the file and will not be added to the log. Se ha detectado un QSO duplicado y no se añadirá al log. Please check the QSO information file and ensure it is properly added. Revise el fichero de información de QSO y asegúrese de que se ha añadido correctamente. 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 - Stop the war in Ukraine! KLog - Paremos la guerra de Ucrania! KLog - Stop the war in Ukraine! KLog - Paremos la guerra de Ucrania! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. Tiene un indicativo ruso (%1). Probablemente pueda ayudarnos a parar la guerra de Rusia, la gente está muriendo. Por favor haga un llamamiento a sus líderes para parar la guerra. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Tiene un inficativo ucraniano. Tenga cuidado y protéjase usted y su familia. Los desarrolladores de KLog le desean la mejor de las suertes en este momento tan difícil. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. La gente está muriendo en la guerra de Rusia contra Ucrania. Puede ayudar a parar la guerra de Rusia contra Ucrania. Muestre su descontento a sus líderes o a través de redes sociales para parar la guerra. KLog - KLog folder not found KLog - Carpeta de KLog no encontrada KLog - Settings update KLog - Actualización de configuración The settings system has been changed and KLog will update your settings file. El sistema de configuración ha cambiado y KLog debe actualizar el fichero de configuración. This version of KLog requires that the DXCC database is updated. Esta versión requiere que se actualice la base de datos del DXCC. The database will be updated. La base de datos se actualizará. 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 The entity that is selected is different from the one proposed by KLog: La entidad seleccionada es diferente de la propuesta por KLog: Unknown Keep it short, its a button text Desconocido - There is no selected DXCC. - No hay DXCC seleccionado. - KLog couldn't find a DXCC - KLog no pudo encontrar un DXCC Please select the one you want to keep for this QSO. Selecciona el que se deba usar en este QSO. 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-subcripción y se deshabilitarán las peticiones a QRZ.com. Please check your QRZ.com subcription or credentials. Compruebe su subscripción a QRZ.com o sus credenciales. Settings ... Ajustes ... Queue all QSOs from this log to be sent Encolar todos los QSOs de este log para enviar Show Map Mostrar mapa 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! The selection you have done does not include any QSO La selección no incluye ningún QSO. The selection you have done does not include any QSO. La selección no incluye ningún QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Para subir QSOs necesita una subscripción a QRZ.com. Si tiene una, vaya a Preferencias->QRZ.com para habilitarlo 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. Fecha 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 Show All Mostrar todas 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. Show all subdivisions for the current DXCC Entity. Mostrar todas las subdivisiones para esta entidad DXCC. 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 None Identified Ninguna identificada SOTA Ref Ref SOTA Age Edad POTA Ref Ref POTA SIG SIG SIG Info Info SIG VUCC grids Locators VUCC WWFF Ref Ref WWFF Not selected No seleccionada Distance Distancia 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 RST TX TX RX RX Frequency Frecuencia 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 POTA Ref Mi ref POTA My SIG Mi SIG My SIG Info Mi info SIG My SOTA Ref Mi ref SOTA My WWFF Ref Mi Ref WWFF 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: MapWindowWidget Select QSOs in this band. Seleccionar QSOs en esta banda. Select QSOs in this mode. Seleccionar QSOs en este modo. Select QSOs in this propagation mode. Seleccionar QSOs con este modo de propagación. Select QSOs using this Satellite. Seleccionar QSOs por satélite. Only confirmed Solo confirmados Select only confirmed QSOs. Selecciona sólo QSOs confirmados. All bands Todas las bandas Show nothing No mostrar nada All modes Todos los modos All propagation modes Todos los modos de propagación All satellites Todos los satélites 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 Altitude Altitud 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 Fecha CLublog 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 ClubLog SDate Date when it was sent Fecha envio Clublog Contacted_Op Operador contactado Darc Dok Do not translate if unsure, common hamradio term. DOK de DARC 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 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 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 eQSL SDate Date when it was sent eQSL Fecha env Gridsquare ext Extended gridsquare Locator extendido HamLog status Estado HamLog HamLog SDate Date when it was sent HamLog Fecha env HRDLog SDate Date when it was sent HRDLog Fecha env HamQTH status Estado HamQTH HamQTH SDate Date when it was sent HamQTH Fecha env LoTW SDate Date when it was sent LoTW Fecha env Marcado Marcado My Altitude Mi altitud My ARRL Sect Mi Sec ARRL My Gridsquare Ext Mi locator ext My POTA Mi POTA My SOTA Mi OTA My WWFF Mi WWFF POTA POTA 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 WWFF WWFF QSO Date off Fecha fin QSO 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. Send DX Spots to the map Enviar avisos de DX al mapa Sends the received DX Spots to the map to know where is the activity. Envia los avisos de DX al mapa para saber dónde está la actividad. 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) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Introduzca aquí su contraseña de aplicación de ClubLog. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. 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 App password Contraseña de aplicación Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app 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.) Introducir la contraseña de aplicación de ClubLog. Puede obtenerse en ClubLog (Menú: Settings->App Password). Atención: La contraseña de aplicación se guardará en claro en el fichero de configuración. 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 Comprobar que tiene una subscripción de pago en 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 lo deshabilita KLog no comprobará los indicativos en busca de indicativos erróneos. 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 Show seconds Mostrar segundos Mark sent eQSL && LoTW in new QSO as queued Marcar eQSL y LoTW como en cola en todos los QSO nuevos Show seconds in the QSO editor Mostrar los segundos en el editor de QSO 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 the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Seleccione el nivel de log de debug. Puede ser útil si algo nofunciona como debe. Se crea un fichero de depuración en la carpeta de KLog y/o mostrado en el menú Ayuda->Debug. Log level Nivel de depuración 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 Qsos QSOs 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 UpdateSettings KLog - Settings update KLog - Actualización de configuración The settings system has been changed and KLog will update your settings file. El sistema de configuración ha cambiado y KLog debe actualizar el fichero de configuración. World Entity Entidad Continent Continente Abort reading Cancelar lectura Reading cty.csv... Leyendo cty.csv... KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Todos los QSO se han actualizado con un DXCC y un continente. 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. It seems to be a CREDENTIALS ERROR; check your email and password. Parece haber un error con las credenciales; revise la dirección de correo electrónico y contraseña. It seems that your ClubLog credentials are not correct. Parece que las credenciales de CLubLog no son correctas. Please check your credentials in the setup. ClubLog uploads will be disabled. Revise las credenciales el la configuración. Se deshabilitan las subidas 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-2.4.1/translations/klog_de.ts0000644000175000017500000136132415003153303016132 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 My Locator Mein Locator Start date End date Ok OK Cancel Abbrechen DX Date/Time Datum/Zeit Band Band Mode Modus Not defined ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Alle 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Bearbeitet C Confirmed, please try to keep the C Confirmed Bestätigt U Unknown Unknown 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. DXClusterAssistant DX Freq Frequenz Status 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 Check in QRZ.com Check this callsign in QRZ.com 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: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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 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 Reading LoTW file... LoTW-Datei wird gelesen ... Abort reading Lesen abbrechen 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 ... Importing ADIF file... ADIF-Datei wird importiert ... 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) 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 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: - 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 - 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. 1 bit 1.5 bits 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Rufzeichen &Save &Cancel &Abbrechen DUPE Translator: DUPE is a common world for hams. Do not translate of not sure Duplikat MainWindow Starting KLog KLog wird gestartet DX Entity DX-Eintrag &Log Window &Protokollfenster KLog KLog KLog - File not open Status bar ... Log backup recommended! It seems that you are running this version of KLog for the first time. Ready Bereit 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. 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. 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. 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 Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 ... 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. Show Map &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. 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 It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update You can update the entities database in Tools->Update cty.csv 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 - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent 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 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 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 ... Station Callsign Stations-Rufzeichen 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! The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. 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 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) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 Show All 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. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nicht identifiziert Not - Not Identified Nicht - Nicht identifiziert None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF 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. UpLink DownLink Satellite Satellit Mode Modus DX Locator DX-Locator Other Sonstige MHz MHz 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. RX-Frequenz in MHz. TX Frequency in MHz. TX-Frequenz in MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 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 Altitude 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 status Continent Kontinent Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL gesendet Force Init Freq Frequenz Freq RX RX-Frequenz Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW versendet Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Name Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 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. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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 Show seconds &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. Show seconds in the QSO editor 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. Delete Always the adif file created after uploading QSOs Log level 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Eintrag Continent Kontinent Reading cty.csv... Die Datei „“cty.csv wird gelesen ... Abort reading Lesen abbrechen KLog DXCC KLog-DXCC All QSOs have been updated with a DXCC and the Continent. eLogClubLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung KLog - ClubLog KLog - Club Log Undefined error... Undefinierter Fehler ... Undefined error number (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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-2.4.1/translations/klog_it.ts0000644000175000017500000145133515003153303016160 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 My Locator Il mio Locator 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 Tutto QSOs: %1/%2 QSO: %1/%2 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. Sembra che lo stato DXCC nel tuo database non sia aggiornato e qundi KLog non riesce a trovare alcuna informazione dxcc. Puoi provare a risolvere questo problema aggiornando il lof. Do you want to update your DXCC status? Vuoi aggiornare ul tuo status DXCC? 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 Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com 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. 1 bit 1 bit 1.5 bits 1,5 bits 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. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog è un software di Log che può girare 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. Look up info about the current callsign on qrz.com Cerca informazioni sul corrente nominativo su qrz.com 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. Arresta wsjt e hamlib perl'aggiornamento automatico dei dati sui QSO. Manual Mode Modalità manuale Callsign Nominativo &Save &Salva &Cancel &Annulla 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 It was not possible to define the KLog folder. Some functions may not work properly! Non riesco a impostare la cartellla di KLog. Alcune funzioni potranno lavorare improrpiamente! 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. 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 KLog - QSO Dupe KLog - QSO Duplicati A dupe QSO has been detected in the file and will not be added to the log. QSO duplicato rilevato nel file non sarà aggiunto al log. Please check the QSO information file and ensure it is properly added. Per favore controlla il file informazioni QSO e accertati che sia correttamente aggiunto. 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 Always check the current callsign in QRZ.com Controlla sempre il corrente nominativo su QRZ.com Upload queued QSOs to LoTW Trasferisce QSO in coda verso LoTW Do you want to update now? Vuoi aggiorare adesso? You seem to have never backed up or exported your log to ADIF. Mi sembra che tu non abbia mai backuppato o esportato il tuo log su ADIF. Your latest backup seems older than one month. Il tuo backup più recente è più vecchio di un mese. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup regolari prevengono perdite di dati e costituiscono una buoan pratica operativa. Appena esportato, copia il tuo ADIF file in un luogo sicuro come una pdrive USB, drive cloud o altri computer fuori linea. KLog ti riconderà di fare il backup mensilmente. Backup completed successfully Backup completato con successo KLog will remind you again in approximately one month. Klog ti ricorderà di nuovo approssimativamente in un mese. Backup failed. Backup fallito. Periodic data backups are recommended to prevent data loss and corruption of your log. Backup periodici dei dati sono racocmandati per prevenire perdite di dati e danneggiamento del log. The setup will now open to allow you to change your settings. Il pannello impostazioni si aprirà per permetterti di cambiare le tue impostazioni. 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. 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 - Stop the war in Ukraine! KLog . Ferma la guerra in Ucraina! KLog - Stop the war in Ukraine! KLog - Ferma la guerra in Ucraina! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. Usi un nominativo Russo (%1). Puoi probabilmente aiutare a fermare la guerra in Russia, le persone stanno morendo. Per favore contatta i tuoi leder per fermare la guerra. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Usi un nominativo Ucraino. Per favore prendici cura e proteggi te statto e la tua famiglia. Gli sviluppatori di KLog ti augurano ogni fortuna in questo difficile momento. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Persone stanno morendo per la guerra della Russia contro l'Ucraina. Tu puoi aiutare a fermare la guerra della Russia contro l'ucraina. Per favore mostra il tuo disaccordo ai tuoi leader, oppure sui social network per fermare la guerra. KLog - KLog folder not found KLog -cartella KLog non trovata This version of KLog requires that the DXCC database is updated. Questa versione di KLog richiede che il database DXCC sia aggiornato. The database will be updated. Il database sarà aggiornato. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Logbook of %2 - Nominativo stazione: %3 - QSOs: %4 KLog - QRZ.com warning KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha restituito l'errore di non iscrizione e qundi non sarà possibile interpellare QRZ.com. Please check your QRZ.com subcription or credentials. Per favore controlla la tua iscrizione al servizio QRZ.com. Settings ... Impostazioni... Queue all QSOs from this log to be sent Metti in coda tutti i QSO da questo log per l'invio Show Map Mostra mappa 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? The selection you have done does not include any QSO La tua selezione non include nessun QSO The selection you have done does not include any QSO. La tua selezione non non include alcun QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Per poter trasferire QSO a QRZ.com è necessario essere iscritti al servizio. Se sei iscritto vai alal pagina Setup-> QRZ.com per abilitare la funzionalità. 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 Distance Distanza 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 RST TX TX RX RX Frequency Frequenza 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 è: MapWindowWidget Select QSOs in this band. Scegli i QSO di questa banda. Select QSOs in this mode. Scegli i QSO in questa modalità. Select QSOs in this propagation mode. Scegli i QSO in questa modalità di propagazione. Select QSOs using this Satellite. Scegli i QSO che utilzizano questo satellite. Only confirmed Solo conferma Select only confirmed QSOs. Scegli solo i QSO confermati. All bands Tute le bande Show nothing Non mostrare niente All modes Tutte le modalità All propagation modes Tutti i modi di propagazione All satellites Tutti i satelliti 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. Fists Fists CC Do not translate if unsure, common hamradio term. Fists CC My Fists Do not translate if unsure, common hamradio term. My Fists 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 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 Distanza Contacted_Op Operatore_contattato 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 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 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 Send DX Spots to the map Invia Spot DX alla mappa Sends the received DX Spots to the map to know where is the activity. Invia gli spot DX ricevuti alla mappa per far sapere dove c'è attività. 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 App password ClubLog App password 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Inserisci qua la password della tua applicazione ClubLog. La puoi ottenere su ClubLog (Settings > App Password menu). Attenzione: la password sarà salvata in chiaro nel file di configurazione di KLog!! 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 Pagamento Sottoscrizione Check it if you are paying for a qrz.com subscription Controlla di stare pagando per la sottoscrizione a QRZ.com 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 Seriale Network Rete 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. Show seconds Mostra secondi Show seconds in the QSO editor Mostra secondi nell'editor QSO Click to move the DB to the new directory. Clicca per spostare il DB su una nuova cartella. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Seleziona il debug level dell'applicazione. Potrebbe essere utile se qualcosa non dovesse funzionare come previsto. Un file di debug sarà creato nella cartella di KLog e/o mostrato su Help->Debug menu. Log level Livello Log 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 Controllo nominativi non validi 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. Se disattivi la spunta di questa opzione KLog non controllerà i nomiantivi sbagliati. 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 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. Only LEO sats 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. Only LEO sats 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 UpdateSettings KLog - Settings update KLog - Aggiornamento setup The settings system has been changed and KLog will update your settings file. Le impostazioni di sistema sono cambiate e KLog aggiornerà il file di configrazione. World Entity Collegamento Continent continente Abort reading Annulla lettura Reading cty.csv... Lettura cty.cvs... 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)... It seems to be a CREDENTIALS ERROR; check your email and password. Rilevo un errore sulle credenziali; controlla email e password. It seems that your ClubLog credentials are not correct. Sembra che le tue credenziali ClubLog non siano corrette. Please check your credentials in the setup. ClubLog uploads will be disabled. Per favore controlla le tue credenziali nelle impostazioni. Invio file ClubLog disabilitato. 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. Non sei iscritto a 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-2.4.1/translations/klog_lv.ts0000644000175000017500000134777015003153303016174 0ustar develdevel AboutDialog About KLog Par KLog By Autors KLog is a free logbook for hamradio operators. KLog ir bezmaksas hamradio operatoriem.žurnāls. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Lūdzu, ņemiet vērā, ka šis ir izstrādes laidiens un tajā var būt daudz kļūdu.<br>Pirms šīs programmatūras izmantošanas dublējiet savus datus! 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. Kopš 0.6.2 KLog ir pilnībā pārrakstīts, lai nodrošinātu starpplatformu lietojumprogrammu, kas darbojas visās lielākajās operētājsistēmās (Linux, macOS un Windows), un atbalstītu jaunas funkcionalitātes. Please provide your review in KLog's eHam review page: Lūdzu, sniedziet savu atsauksmi KLog eHam pārskata lapā: Find more information and the latest release at Plašāku informāciju un jaunāko izlaidumu meklējiet vietnē Author Autors today šodien Main developer Galvenais izstrādātājs KLog is developed by a very small team and you are invited to join! KLog izstrādā ļoti maza komanda, un jūs esat aicināti pievienoties! 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>! Ja vēlaties sniegt atbalstu, laipni lūdzam pievienoties <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog izstrādes adresātu sarakstam</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Varat arī mums palīdzēt, nosūtot kļūdu ziņojumus vai nelielu koda ieguldījumu, idejas vai visu, kas, jūsuprāt, varētu uzlabot KLog. Authors Autori Translators bring KLog into your language. They are really an important part of the KLog development team. Tulkotājimi ienes KLog jūsu valodā. Viņi patiešām ir svarīga KLog izstrādes komandas sastāvdaļ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://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Ja KLog joprojām nav jūsu valodā un vēlaties mums palīdzēt, varat sazināties ar mums, izmantojot <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog izstrādes vēstuli. saraksts</a>! 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. Kopš 0.6.2 KLog ir pilnībā pārrakstīts, lai nodrošinātu starpplatformu lietojumprogrammu, kas darbojas visās lielākajās operētājsistēmās (GNU/Linux, macOS un Windows), un atbalstītu jaunas funkcionalitātes. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Ja vēlaties sniegt atbalstu, laipni lūdzam pievienoties <a href="https://groups.io/g/klog">KLog adresātu sarakstam</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>! Ja KLog joprojām nav jūsu valodā un vēlaties mums palīdzēt, varat sazināties ar mums, izmantojot <a href="https://groups.io/g/klog">KLog adresātu sarakstu</a>! Translators Tulkotāji Privacy advisory Privātuma ieteikums 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 izstrādātāji ir iekļāvuši funkciju, kas ziņo par dažiem lietotāja datiem KLog serverim ar vienīgo mērķi identificēt instalēto versiju skaitu, lai fokusētu attīstību vienā vai otrā virzienā, ņemot vērā lietotāju vajadzības. At present, the data that is provided is the following: Šobrīd sniegtie dati ir šādi: Callsign Izsaukuma signāls KLog version KLog versija Operating system Operētājsistēma Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Ņemiet vērā, ka šo funkciju varat iespējot/atspējot iestatīšanas lapas cilnē Dažādi. KLog KLog Privacy Privātums AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Atlasiet stacijas izsaukuma signālu, kuru vēlaties izmantot žurnāla augšupielādei. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Izvēlieties sākuma datumu, lai eksportētu QSO. Noklusējuma datums ir pirmā QSO datums ar šo stacijas izsaukuma signālu. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Atlasiet beigu datumu, lai eksportētu QSO. Noklusējuma datums ir pēdējā QSO datums ar šo stacijas izsaukuma signālu. Station callsign Stacijas izsaukuma signāls My Locator mans Lokators Start date Sākuma datums End date Beigu datums Ok Labi Cancel Atcelt DX DX Date/Time Datums Laiks Band Diepazons Mode Režīms Not defined Nav definēts ALL Vissi QSOs: %1/%2 QSO: %1/%2 All Visi QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog — QSO, kas jāaugšupielādē LoTW. This table shows the QSOs that will be sent to LoTW. Šajā tabulā parādīti QSO, kas tiks nosūtīti uz LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO, kas augšupielādējami ClubLog. This table shows the QSOs that will be sent to ClubLog. Šajā tabulā parādīti QSO, kas tiks nosūtīti uz ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog — QSO, kas augšupielādējami eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Šajā tabulā parādīti QSO, kas tiks nosūtīti uz eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog — QSO, kas jāaugšupielādē uz QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Šajā tabulā parādīti QSO, kas tiks nosūtīti uz QRZ.com. This table shows the QSOs that will be exported to ADIF. Šajā tabulā parādīti QSO, kas tiks eksportēti uz ADIF. AwardsWidget Recalculate Pārrēķināt Click to recalculate the award status. Noklikšķiniet, lai pārrēķinātu balvas statusu. Select the year you want to check. Atlasiet gadu, kuru vēlaties pārbaudīt. QSOs QSO DXCC DXCC CQ CQ Award Balva Confirmed Apstiprināts Worked Strādāja WAZ WAZ Score Rezultāts Annual Gada Number of confirmed DXCC entities. Apstiprināto DXCC skaits. Number of worked DXCC entities. Nostrādāto DXCC skaits. Number of confirmed WAZ zones. Apstiprināto WAZ zonu skaits. Number of worked WAZ zones. Nostrādāto WAZ zonu skaits. Number of confirmed QSOs. Apstiprināto QSO skaits. Number of worked QSOs. Nostrādāto QSO skaits. Number of QSOs worked in the selected year. Nostrādāto QSO skaits izvēlētajā gadā. Number of DXCCs worked in the selected year. Nostrādāto DXCC skaits atlasītajā gadā. Number of CQ Zones worked in the selected year. Nostrādāto CQ zonu skaits izvēlētajā gadā. Score for the DXMarathon in the selected year. Rezultāts DXMarathon izvēlētajā gadā. DX-Marathon DX-maratons CTYPage Country data download Valsts datu lejupielāde KLog needs country data... KLog nepieciešami valstu dati... &Download &Ignore Country data needed Nepieciešami valsts dati KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog izmanto cty.csv failu no https://www.country-files.com/, lai iegūtu DXCC informāciju. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Jums ir jālejupielādē cty.csv fails, ja vēlaties, lai KLog parādītu jūsu veikto QSO valstis, vietrādi utt. Click on Download to download now. Noklikšķiniet uz Lejupielādēt, lai lejupielādētu tūlīt. KLog Klogs I can't find the host. Please check your network and try again Do you want to try again? Es nevaru atrast saimnieku. Lūdzu, pārbaudiet savu tīklu un mēģiniet vēlreiz Vai vēlaties mēģināt vēlreiz? DXCCStatusWidget Update Atjaunināt 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. Šķiet, ka DXCC statuss jūsu datu bāzē nav atjaunināts un KLog nevar atrast dxcc informāciju. Varat mēģināt to novērst, atjauninot žurnālu. Do you want to update your DXCC status? Vai vēlaties atjaunināt savu DXCC statusu? Prefix Prefix Entity Entity Pref: Prefiks: CQ: CQ: ITU: ITU: Beam: Sija: Entity not worked in this band. Vienība nedarbojās šajā joslā. DXClusterWidget Click on Connect to connect to the DX-Cluster server Noklikšķiniet uz Savienot lai izveidotu savienojumu ar DX-Cluster serveri Connect Savienot Clear Dzēst Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster Noklikšķiniet uz izveidot savienojumu, lai izveidotu savienojumu ar DX-klasteri Trying to connect to the server Mēģina izveidot savienojumu ar serveri KLog DXCluster Klog DXCluster The host was not found. Please check: Saimnieks netika atrasts. Lūdzu pārbaudi: - your network connection; - the host name and port settings. - jūsu tīkla savienojums; - resursdatora nosaukums un porta iestatījumi. 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. Līdzinieks atteicās izveidot savienojumu. Pārliecinieties, vai darbojas DXCluster serveris, un pārbaudiet, vai resursdatora nosaukums un porta iestatījumi ir pareizi. The following error occurred: %1. Radās šāda kļūda: %1. Connected to server Savienots ar serveri KLog message Klog ziņojums Enter your callsign to connect to the cluster: Ievadiet savu izsaukuma signālu, lai izveidotu savienojumu ar klasteri: Enter your password to connect to the cluster: (Just hit enter for no password) Ievadiet savu paroli, lai izveidotu savienojumu ar klasteri: (Vienkārši nospiediet Enter, lai bez paroles) Disconnect Atvienoties Not logged on, you may need to enter your callsign again. Neesat pieteicies, iespējams, vēlreiz jāievada izsaukuma signāls. Enter here the commands to be sent to the DX-Cluster server. Šeit ievadiet komandas, kas jānosūta uz DX-Cluster serveri. Connection closed by the server Savienojumu noslēdzis serveris Click on Connect to connect to the DX-Cluster server. Noklikšķiniet uz Savienot, lai izveidotu savienojumu ar DX-Cluster serveri. Send Sūtīt It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Nevarēja atvērt failu, lai saglabātu DX-Spots rakstīšanai. DX klastera darbība netiks saglabāta! DataProxy_SQLite Software version in DB is null Programmatūras versija DB ir nulle Query didn't failed Vaicājums neizdevās Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Zeme-Mēness-Zeme Sporadic E Sporādisks E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Laukā izlīdzinātie pārkāpumi F2 Reflection Common term in hamradio, do not translate if not sure F2 Atspulgs Internet-assisted Ar interneta palīdzību Ionoscatter Common term in hamradio, do not translate if not sure Jonu izkliede Meteor scatter Common term in hamradio, do not translate if not sure Meteoru izkliede Terrestrial or atmospheric repeater or transponder Virszemes vai atmosfēras atkārtotājs vai retranslators Rain scatter Common term in hamradio, do not translate if not sure Lietus izkliedē Satellite Satelīts Trans-equatorial Common term in hamradio, do not translate if not sure Transekvatoriāls Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfēras kanāli Yes No Requested Pieprasīts Ignore/Invalid Ignorēt/nederīgs Validated Apstiprināts Queued Rindā Uploaded Augšupielādēts Do not upload Neaugšupielādēt Modified Pārveidots Bureau Common term in hamradio, do not translate if not sure Birojs Direct Tieša Electronic Elektroniskā Manager Common term in hamradio, do not translate if not sure KLog DXCC Klog DXCC All QSOs have been updated with a DXCC and the Continent. Visi QSO ir atjaunināti ar DXCC un kontinentu. KLog - Invalid call detected KLog — konstatēts nederīgs izsaukumasignals 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? Ir konstatēts tukšs izsaukuma signāls. Vai tomēr vēlaties eksportēt šo QSO (noklikšķināt uz Jā) vai noņemt lauku no eksportētā ADIF ieraksta? 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? Ir konstatēts nederīgs izsaukuma signāls %1. Vai tomēr vēlaties eksportēt šo izsaukuma signālu (noklikšķināt uz Jā) vai noņemt zvanu no eksportētā žurnāla? 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. Nepareizu zvanu eksportēšana var radīt problēmas lietojumprogrammās, kurās, iespējams, importējat šo žurnālfailu. Tomēr tas var būt labs izsaukuma signāls, ko KLog nepareizi identificē kā nederīgu. DownLoadCTY Download of cty.csv failed with the following error code: Cty.csv lejupielāde neizdevās ar šādu kļūdas kodu: Download of cty.csv done. Cty.csv lejupielāde ir pabeigta. There is already a cty.csv file in the folder but it will be replaced with the new one. Mapē jau ir fails cty.csv, taču tas tiks aizstāts ar jaunu. Could not open %1 for writing Nevarēja atvērt %1 rakstīšanai FileAwardManager Open Award file Atveriet balvas failu Award files (*.awa) Apbalvojuma faili (*.awa) Award file not opened Balvas fails nav atvērts KLog was not able to read the award file KLog nevarēja nolasīt balvas failu It was not possible to open the file %1 for reading. Nevarēja atvērt failu %1 lasīšanai. AWA wrong format AWA nepareizs formāts The AWA file does not have the right format AWA failam nav pareizais formāts AWA file does not have an <EOH> field AWA failam nav <EOH> lauka KLog - %1 Klog — %1 FileManager KLog - Error KLog — kļūda 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 Pārtraukt rakstīšanu 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: Notiek ADIF faila rakstīšana... QSO: KLog - File not opened It was not possible to open the file %1 for reading. Nevarēja atvērt failu %1 lasīšanai. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing Pārtraukt apstrādi LoTW reading LoTW lasīšana KLog - Add new QSOs? Klog — pievienot jaunus QSO? 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... Notiek LoTW faila lasīšana... Abort reading Pārtraukt lasīšanu Importing LoTW ADIF file... QSO: 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 KLog — konstatēts nederīgs izsaukumasignals 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. 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. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10M 15M 15M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinents Prefix Prefiks CQ CQ ITU ITU Short Path Īss ceļš Long Path Garais ceļš Deg Miles Jūdzes Km Km IntroPage Welcome to KLog! Laipni lūdzam KLog! Welcome to KLog! - brought to you under the terms of the GPL! Laipni lūdzam KLog! - sniegta jums saskaņā ar GPL noteikumiem! Welcome to KLog Laipni lūdzam KLog This looks like it's the first time you've run KLog on this computer. Šķiet, ka šī ir pirmā reize, kad šajā datorā palaižat KLog. KLog is a free hamradio logging program that can run on Linux, macOS, and Windows. KLog ir bezmaksas hamradio reģistrēšanas programma, kas var darboties operētājsistēmās Linux, macOS un Windows. 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. Tas ir paredzēts, lai nodrošinātu vispārējas nozīmes DX un sacensību reģistrēšanu. It supports QSL management, import and export of ADIF Tā atbalsta QSL pārvaldību, ADIF importu un eksportu and Cabrillo file formats and many other features... un Cabrillo failu formāti un daudzas citas funkcijas... Before you can start using KLog, you will be asked to: Pirms sākat lietot KLog, jums tiks lūgts: Acknowledge to the terms of the license. Apstipriniet licences nosacījumus. Download the DX entities information. Lejupielādējiet DX entītiju informāciju. Enter your callsign, CQ zone, etc. and main configuration. Ievadiet savu izsaukuma signālu, CQ zonu utt. un galveno konfigurāciju. Enjoy KLog and contact the development team if you have any suggestions! Izbaudiet KLog un sazinieties ar izstrādes komandu, ja jums ir kādi ieteikumi! LicPage KLog License information Informācija par KLog licenzi Welcome to KLog!- brought to you under the terms of the GPL! Laipni lūdzam KLog! — nodrošināts saskaņā ar GPL noteikumiem! Acknowledge Atzīt Be aware that KLog is free software. Ņemiet vērā, ka KLog ir bezmaksas programmatūra. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Veiciet dubultklikšķi uz datuma, kuru vēlaties izmantot kā QSO lejupielādes sākuma datumu. KLog - LoTW password needed KLog — nepieciešama LoTW parole 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 lejupielāde 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 use 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 — LoTW fails nav atrasts 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 Datums Call Izsaukuma signāls Band Diapazons Mode Režīms RSTtx RSTtx RSTrx RSTrx Comment Komentāri 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 Tieša 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. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Izsaukuma signāls &Save &Cancel 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 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 KLog needs to update the Entities database. You can update the entities database in Tools->Update cty.csv Log backup recommended! It seems that you are running this version of KLog for the first time. Ready KLog 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. 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 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 - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. KLog - Backup Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - ClubLog error 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. 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? KLog - 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? 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 — QRZ.com 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. 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 Do you really want to exit KLog? The logfile has been modified. Do you want to save your changes? 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. Settings ... 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 ... 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. &Help Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... 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 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. 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. All pending QSOs has been marked as queued for 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. 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 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 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! KLog - %1 Klog — %1 KLog - ADIF export Queue all QSOs from this log to be sent Show Map 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. Now you can upload them to 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 ... Congratulations! You already have the latest version. Jums jau ir jaunākā versija. You can find the KLog data folder here: start UDP Server error The UDP server failed to %1. start or stop stop TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 KLog - QRZ.COM QRZ.COM To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. 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. KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. Native Error 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. Status of the DX entity. Name of the DX entity. QSO QSL eQSL Comment Komentāri Others My Data Satellite Info Awards Search Log DX-Cluster DXCC DXCC No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog - LoTW KLog - Update checking result 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. 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. 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. 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. Open File Atver failu - Needed for DXMarathon Filling QSOs ... Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Numurs Date/Time Datums Laiks Callsign Izsaukuma signāls RSTtx RSTtx RSTrx RSTrx Band Mode Print Log Printing the 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 Station Callsign 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: 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 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 Komentāri 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 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. 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 Distance 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. 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 Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name QTH DX Locator Power(rx) RST TX RX Frequency 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 My QTH locator. 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 My VUCC_GRIDS 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. UpLink DownLink Satellite Mode Other 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! MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified QObject New One, work it! Needed, work it! Worked but not confirmed Confirmed Apstiprināts 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 DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... 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 Datums Call Izsaukuma signāls RSTtx RSTtx RSTrx RSTrx Band Comment Komentāri 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 Kontinents Contacted_Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. Force Init Freq Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Fists Do not translate if unsure, common hamradio term. 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 Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Operator Owner Callsign Pfx 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 Region Rig RX Pwr Sat mode 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 SWL Do not translate if unsure, common hamradio term. UKSMG USACA counties VE prov VUCC grids Ten-Ten Do not translate, it is a hamradio group name. TX Pwr Web QSO Date off Log number KLog is already running. It is allowed to run only one instance. 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 Nav definēts &Clear selection Save File SearchWindow Call Izsaukuma signāls Date/Time Datums Laiks Band Mode QSL Sent QSL Rcvd Station Callsign ID Date/time Station callsign Stacijas izsaukuma signāls 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 Tieša 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 Log widget D&X-Cluster Colors Misc World Editor Logs eLog WSJT-X Satellites HamLib Cancel Atcelt 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 Entity Name of the Entity. CQ CQ CQ zone. ITU 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 Atcelt Ok Labi Entity Dialog SetupPageBandMode Bands Diapazons Modes 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). 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. Sets the Dark Mode Choose a color Light Mode 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 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. Test Click to test the connection to the radio Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Test: OK Test: NOK Poll interval SetupPageLogView Fields 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 Datums Station Callsign Operators Comments QSOs QSO 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 Manage DX-Marathon 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. 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. Check non-valid calls Show seconds In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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 Log level Dupe time range: Open File Atver failu 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 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 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 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 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 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 Entity ARRL ID Continent Kontinents CQ Zone ITU Zone UTC Latitude Longitude Deleted Since Date To Date Open File Atver failu 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 Labi DX DX Date/Time Datums Laiks Band Mode ShowErrorDialog KLog Message KLog ziņojums SoftwareUpdateDialog Ok Labi KLog update Klog atjauninājums <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! Your KLog has been updated. Jūsu KLog ir atjaunināts. You already have the latest version. Jums jau ir jaunākā versija. 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 CQ zonas gadā 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 CQ zonas gadā Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu CQ zones CQ zonas CQ zones per year CQ zonas gadā Reading data ... Notiek datu lasīšana ... Years: %1/%2 Gadi: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Rādīt tikai apstiprināts Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Tikai LEO satelīti Number Numurs Callsign Izsaukuma signāls Date Datums Band Diapazons Mode Mode DXCC DXCC Satellite Satelīti Confirmed Apstiprināts No StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu DXCC Entities Reading data ... Notiek datu lasīšana ... Entities: StatsFieldPerBandWidget All Visi Mode: Band Worked Strādāja Confirmed Apstiprināts StatsGridsOnSatsWidget Show confirmed only Rādīt tikai apstiprināts Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Tikai LEO satelīti Number Numurs Callsign Izsaukuma signāls Date Datums Band Mode Grid Satellite Confirmed Apstiprināts No StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Bands Diapazons QSOs per band distribution Reading data ... Notiek datu lasīšana ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Continents Reading data ... Notiek datu lasīšana ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Reading data... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Hours QSOs at hour Reading data ... Notiek datu lasīšana ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Modes Modes QSOs per mode distribution Reading data ... Notiek datu lasīšana ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Months QSOs at Month Reading data ... Notiek datu lasīšana ... Months: StatsQSOsPerYearBarChartWidget QSOs per year Reading data ... Notiek datu lasīšana ... Abort reading Pārtraukt lasīšanu QSOs QSO Reading data ... Notiek datu lasīšana ... 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 #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 #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 #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... Notiek satelītu datu faila lasīšana... Abort reading Pārtraukt lasīšanu The Satellites information has been updated. Satelītu informācija ir atjaunināta. Open File Atver failu Sat Data Satelitu Dati UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Continent Kontinents Reading cty.csv... Lasu cty.csv... Abort reading Pārtraukt lasīšanu WorldMapWidget World map Pasaules karte View Skatīt Zoom In(25%) Tuvināt (25%) Zoom Out(25%) Tālināt (25%) Normal Size Normāls izmērs Fit to window Pielāgot logam eLogClubLog Host not found! Timeout error! Taimauta kļūda! QSO dupe or not existing (#%1)... QSO ir dublikāts vai nepastāv (#% 1)... KLog - ClubLog KLog - ClubLog It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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)... Nedefinēts kļūdas numurs (#%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 Trūkst izsaukuma signāla Invalid callsign Skipping SWL callsign Callsign is your own call Invalid callsign with no DXCC mapping Updated QSO Atjaunināts QSO Invalid ADIF record Nederīgs ADIF ieraksts 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! Domēna nav Timeout error! Taimauta kļūda! Undefined error number (#%1) Nedefinēts kļūdas numurs (#%1) KLog - QRZ.com KLog — QRZ.com We have received the following error from QRZ.com (%1) Mēs esam saņēmuši šādu kļūdu no QRZ.com (% 1) You are not subscribed to QRZ.com. Not valid KEY found Atrasts nederīgs 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. Lūdzu, konfigurējiet savu QRZ.com API atslēgu. Jūs to atradīsit savā QRZ.com žurnāla iestatījumu tīmekļa vietnē. Lai izmantotu šo funkciju, jums ir nepieciešams QRZ.com abonements. KLog - QRZ.com password needed KLog — nepieciešama QRZ.com parole Please enter your QRZ.com password: Lūdzu, ievadiet savu QRZ.com paroli: Callsign missing Trūkst izsaukuma signāla eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ir nosūtījis šādu ziņojumu: %1 Host not found! Neeksistē šis domēns! Timeout error! Taimauta kļūda! Undefined error number (#%1)... Nedefinēts kļūdas numurs (#%1)... We have received an undefined error from eQSL (%1) Mēs esam saņēmuši nedefinētu kļūdu no 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. Lūdzu, pārbaudiet savu konfigurāciju iestatījumos un sazinieties ar KLog izstrādes komandu, ja nevarat to labot. eQSL augšupielāde tiks atspējota. eQSL Error: User or password incorrect eQSL kļūda: nepareizs lietotājs vai parole eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL Brīdinājums: Vismaz viens no augšupielādētajiem QSO ir dublēts. eQSL: All the QSOs were properly uploaded. eQSL: visi QSO tika pareizi augšupielādēti. KLog - eQSL.cc password needed KLog — nepieciešama eQSL.cc parole Please enter your eQSL.cc password: Lūdzu, ievadiet savu eQSL.cc paroli: klog-2.4.1/translations/klog_uk.ts0000644000175000017500000153145715003153303016167 0ustar develdevel AboutDialog About KLog Про KLog By Від KLog is a free logbook for hamradio operators. 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. Починаючи з версії 0.6.2, KLog було повністю переписано, щоб забезпечити крос-платформну програму, яка працює на всіх основних операційних системах (GNU/Linux, macOS і Windows), та підтримувати нові функції. Please provide your review in KLog's eHam review page: Будь ласка, надайте свій відгук про KLog, на сторінці eHam.net: 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! KLog розробляє дуже невелика команда, і Вас запрошують приєднатися! 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>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Ви також можете допомогти нам, надіславши звіти про помилки. Невеликі внески коду, ідеї чи будь-що, що на вашу думку, може покращити KLog. Authors Автори Translators bring KLog into your language. They are really an important part of the KLog development team. Перекладачі - передають KLog на вашу мову. Вони є справді, важливою частиною команди розробників 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>! Якщо KLog все ще не на вашій мові, і Ви хочете нам допомогти, зв'яжіться з нами через <a href="https://groups.io/g/klog"> поштову розсилку KLog</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. Розробники KLog включили функцію, яка повідомляє деякі дані користувача на сервер KLog, з єдиною метою, визначити кількість встановлених версій, щоб зосередити розробку в тому чи іншому напрямку з урахуванням потреб користувачів. At present, the data that is provided is the following: Наразі дані, які надаються, такі: Callsign Кличний KLog version Версія KLog 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. Виберіть початкову дату для експорту 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 Кличний станції My Locator Мій Локатор Start date Початкова дата End date Кінцева дата Ok Cancel Скасувати DX Date/Time Дата/Час Band Діапазон Mode Вид Not defined Не визначено ALL Всі QSOs: %1/%2 QSO: %1/%2 KLog Warning There are no queued QSOs. KLog - QSOs to be uploaded to LoTW. KLog - QSO, які будуть передані до LoTW. This table shows the QSOs that will be sent to LoTW. Ця таблиця показує QSO, які будуть надіслані до LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO, які будуть передані до ClubLog. This table shows the QSOs that will be sent to ClubLog. Ця таблиця показує QSO, які будуть надіслані до ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO, які будуть передані до eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Ця таблиця показує QSO, які будуть надіслані до eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO, які будуть передані до QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Ця таблиця показує QSO, які будуть надіслані до QRZ.com. This table shows the QSOs that will be exported to ADIF. Ця таблиця показує QSO, які будуть експортовані до ADIF. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Відпрацьовано C Confirmed, please try to keep the C Confirmed Підтверджено U Unknown Unknown AwardsWidget Recalculate Перерахувати Click to recalculate the award status. Натисніть, щоб перерахувати статус дипломів. Select the year you want to check. Виберіть рік, який потрібно перевірити. QSOs QSO DXCC 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. Оцінка за DX-Марафон у вибраному році. DX-Marathon DX-Марафон CTYPage Country data download Завантаження даних країн KLog needs country data... KLog потребує даних про країни ... &Download &Завантажити &Ignore &Ігнорувати Country data needed Необхідні дані про країни KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog використовує файл cty.csv з https://www.country-files.com/ для отримання інформації 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. Вам потрібно завантажити файл: cty.csv. Якщо Ви хочете, щоб KLog показував Вам країни, локатор, тощо. 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 Оновити 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. Схоже статус DXCC, у вашій базі не оновлено. KLog не може знайти жодної інформації про DXCC. Ви можете виправити це, оновивши журнал. Do you want to update your DXCC status? Ви бажаєте оновити свій статус DXCC? Prefix Префікс Entity Об'єкт Pref: Преф: CQ: ITU: Beam: Entity not worked in this band. Суб'єкт не працював у цьому діапазоні. DXClusterAssistant DX Freq Част. Status DXClusterWidget Click on Connect to connect to the DX-Cluster server Натисніть «Підключитися», щоб підключитися до сервера DX-Кластер Connect Підключитися Clear Очистити Check in QRZ.com Перевірити на QRZ.com Check this callsign in QRZ.com Перевірити цей кличний на QRZ.com Click on connect to connect to the DX-Cluster Натисніть «Підключитися», для підключення до DX-Кластер Trying to connect to the server Підключення до сервера ... KLog DXCluster The host was not found. Please check: Хост не знайдено. Будь ласка, перевірте: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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. Підключення - відхилено. Переконайтеся, що сервер DX-Кластер запущено, а також , що ім’я хосту та параметри порту правильні. The following error occurred: %1. Виникла наступна помилка: %1. Connected to server Підключений до сервера KLog message KLog повідомлення Enter your callsign to connect to the cluster: Введіть свій кличний, для підключення до кластера: Enter your password to connect to the cluster: (Just hit enter for no password) Введіть пароль для підключення до кластера: (Просто натисніть Enter, якщо немає пароля) Disconnect Відключитися Enter here the commands to be sent to the DX-Cluster server. Введіть тут команди, які будуть надіслані на сервер DX-Кластер. Connection closed by the server Сервер закрив з'єднання Click on Connect to connect to the DX-Cluster server. Натисніть «Підключитися», для підключення до сервера DX-Кластер. Send Надіслати It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Не вдалося відкрити файл, щоб зберегти DX-Споти. Дані з DX-Cluster не буде збережено! 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 Менеджер All QSOs have been updated with a DXCC and the Continent. Всі QSO були оновлені, за допомогою DXCC та Континенту. KLog - Invalid call detected KLog - виявлено недійсний кличний 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> KLog - %1 FileManager KLog - Error KLog - Помилка The selected callsign (%1) is not valid, please check it again to export the log. Вибраний кличний (%1) недійсний, перевірте його ще раз, щоб експортувати журнал. The selected log does not exist, please check it again. Вибраний журнал не існує, перевірте його ще раз. The file %1 can't be opened. Не вдається відкрити файл %1. There are no QSOs pending to be exported with that station callsign. Немає QSO, що очікують на експорт з цим кличним станції. Writing ADIF file... Запис файлу ADIF... Abort writing Скасувати запис Export Експорт Exporting ADIF file... QSO: %1 / %2 Експорт файла ADIF... QSO: %1 / %2 KLog - User cancelled KLog - користувача скасовано 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: Запис файлу ADIF... QSO: 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 до локального журналу? 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. Процес буде зупинено, а ваш журнал, може бути не повністю оновлений. Reading LoTW file... Читання файлу LoTW... Abort reading Скасувати читання Importing LoTW ADIF file... Імпорт файлу LoTW ADIF... QSO: You have canceled the file import. The file will be removed and no data will be imported. Ви скасували імпорт файлу. Файл буде видалено, а дані не імпортовані. KLog - Log selection KLog - Вибір журналу 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... Читання файлу ADIF... 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 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 не містить мінімальних даних для того, щоб вважати його дійсним! Please edit the ADIF file and make sure that it include at least: Будь ласка, відредагуйте файл ADIF та переконайтеся, що він містить принаймні: and та This QSO had: У цьому QSO: - 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! KLog: Не всі необхідні дані знайдено! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. У деяких QSO цього журналу (напр.: %1), схоже, бракує інформації RST-TX. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Натисніть «Так», щоб додати стандартний %1 для режиму %2 до всіх QSO з подібною проблемою. If you select NO, maybe the QSO will not be imported. Якщо вибрати «Ні» можливо, QSO не буде імпортовано. KLog: No RST TX found! KLog: RST TX не знайдено! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. У деяких QSO цього журналу (напр.: %1), схоже, бракує інформації RST-RX. KLog: No RST RX found! KLog: RST RX не знайдено! KLog - No Station callsign entered. KLog - Кличний станції не введено! KLog - Apply to all QSOs in this log? KLog - Застосувати до всіх QSO у цьому журналі? 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 без визначеного кличного. Введіть кличний станції, який використовувався для проведення QSO з %1 на %2: KLog - QSO without Station Callsign KLog - QSO без Кличного станції! KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog знайшов одне QSO без визначеного кличного. Введіть кличний станції, який використовувався для проведення QSO з %1: KLog - Don't ask again KLog - Більше не питати 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> %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? Ми знайшли QSO з LoTW, якого немає у вашому локальному журналі. Ви бажаєте, щоб KLog додав це QSO до журналу? KLog - Invalid call detected KLog - виявлено недійсний кличний 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 після завершення процесу експорту. 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. 1 bit 1.5 bits 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 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 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. 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. Він призначений для реєстрації загальних QSO, DX та для змагань. It supports QSL management, import and export of ADIF Він підтримує керування QSL, імпорт та експорт ADIF and Cabrillo file formats and many other features... та файлів у форматі Cabrillo, а також багато інших функцій... 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 Double click on the date that you want to use as the start date for downloading QSOs. Двічі клацніть дату, яку Ви бажаєте використовувати як дату початку для завантаження QSO. KLog - LoTW password needed KLog - Потрібен пароль для LoTW Please enter your LoTW password: Будь ласка, введіть Ваш пароль LoTW: KLog - LoTW Station callsign KLog - Кличний станції LoTW There is not a single QSO in the log with that station callsign. В журналі немає жодного QSO з цим кличним станцією. Are you sure that you want to use that station callsign (%1)? Ви впевнені, що бажаєте використовувати цей кличний станції (%1)? KLog - LoTW File already exists KLog - Файл LoTW вже існує! 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 - LoTW Can't write the file KLog - LoTW Неможливо записати файл KLog was not able to save the file %1. Error returned: %2 KLog не вдалося зберегти файл %1. Виникла помилка: %2 The file %1 already exists. Файл %1 вже існує! Downloading data to file: %1. Завантаження даних у файл: %1. KLog - LoTW download KLog - LoTW завантаження KLog - LoTW Start date selection 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. Це перша дата QSO з кличним %1 у цьому журналі. Якщо Ви думаєте, що в LoTW у Вас можуть бути попередні QSO, дайте відповідь «Ні». Do you want to use this date (%1) as start date? Чи бажаєте Ви використати цю дату (%1), як дату початку? 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 Знайдено перенаправлення The remote server redirected our connection to %1 Віддалений сервер перенаправив підключення до %1 Do you want to follow the redirection? Ви бажаєте слідкувати за перенаправленням? KLog - LoTW File not found KLog - LoTW Файл не знайдено KLog can't find the downloaded file. KLog не може знайти завантажений файл. It was not possible for find the file %1 that has been just downloaded. Не вдалося знайти файл %1, який щойно було завантажено. KLog - LoTW user/password error KLog - LoTW Помилка user/pass LoTW server did not recognized your user/password Сервер LoTW не розпізнає Ваш user/pass Check your user and password and ensure your are using the right one before trying again. Перш ніж повторити спробу, переконайтеся, що Ви використовуєте правильний user/pass. KLog - LoTW No QSOs KLog - LoTW Немає QSO LoTW sent no QSOs LoTW не надсилав QSO It seems that LoTW has no QSO with the Station Callsign you are using (%1). Схоже, LoTW не має QSO з кличним станції, який Ви використовуєте (%1). KLog - LoTW Unknown error KLog - LoTW Невідома помилка KLog can't recognize the file that has been downloaded from LoTW. KLog не може розпізнати файл, який було завантажено з 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. Бажаєте оновити свій журнал завантаженими даними? Now KLog will process the downloaded QSO and update your local log. Тепер KLog обробить завантажені QSO та оновить ваш локальний журнал. LogWindow There was a problem with the log, please restart KLog and contact the development team if the error persist. QSL Send QSL Надіслана QSL Rcvd QSL Отримана &Delete &Видалити Delete a QSO Видалити QSO &Edit QSO &Правка QSO Edit this QSO Правка цього QSO Via &bureau Через &Бюро Send this QSL via bureau Надіслати цю QSL - через Бюро D&irect &Дірект Send this QSL via direct Надіслати цю QSL - Дірект Via bureau Через Бюро QSL &received via bureau QSL отримана - через Бюро Direct Дірект QSL received via direc&t QSL отримана - Дірект 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 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 Передати до 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 отримані - Дірект Select none Скасувати вибране Remove all selections Видалити все виділене Select all Вибрати все Select all the QSOs Вибрати всі QSO MainQSOEntryWidget &Add &Додати &Clear &Очистити 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. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog відображатиме реальний час, якщо його ввімкнено. Real time Реальний час Stop wsjt-x and hamlib from automatically updating QSO information. Зупинити wsjt-x та hamlib для автоматичного оновлення інформації QSO. Manual Mode Ручний режим Callsign Кличний &Save &Зберегти &Cancel &Скасувати DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Ви використовуєте Український Кличний. Будь ласка, бережіть себе та свою родину. Розробники KLog бажають Вам удачі в цю дуже важку хвилину. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. Check always the current callsign in QRZ.com Завжди перевіряти поточний кличний на QRZ.com Status bar ... Панель стану... DX Entity DX Території Starting KLog Запуск KLog &Log Window &Вікно журналу Upload the queued QSOs to LoTW Передати QSO з черги до LoTW KLog - KLog folder not found KLog - Тека KLog не знайдена It was not possible to define the KLog folder. Some functions may not work properly! Не вдалося визначити теку KLog. Деякі функції можуть працювати неправильно! KLog - File not open KLog - Файл не відкрито It was not possible to open the debug file for writing. No debug log will be saved! Не вдалося відкрити файл відладки для запису. Журнал відладки не буде збережено! KLog - CTY.dat update KLog - Оновлення CTY.dat KLog needs to update the Entities database. KLog необхідно оновлення бази даних. You can update the entities database in Tools->Update cty.csv Ви можете оновити базу даних у Інструменти->Оновити cty.csv Do you want to do it now? Ви бажаєте зробити це зараз? KLog - Settings update KLog - Оновлення налаштувань The settings system has been changed and KLog will update your settings file. Систему налаштувань було змінено. KLog оновить ваш файл налаштувань. It seems that you have never done a backup or exported your log to ADIF. Схоже, Ви ніколи не робили резервну копію або експортували свій журнал до 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. Рекомендується регулярно створювати резервні копії, щоб уникнути втрати даних у разі виникнення проблем. Після того, як Ви експортуєте свій журнал у файл ADIF, Вам слід скопіювати цей файл у безпечне місце, як-от USB-накопичувач, хмарний диск, інший комп'ютер, ... KLog щомісяця нагадуватиме Вам про створення резервної копії. KLog - Backup KLog - резервне копіювання The backup was done successfully Резервне копіювання виконано успішно! KLog will remind you to backup your data again in aprox one month. KLog нагадає Вам, знову створити резервну копію даних приблизно через місяць. 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! KLog - Виявлено нову версію! This version of KLog requires that the DXCC database is updated. Ця версія KLog потребує оновлення бази даних DXCC. The database will be updated. База даних буде оновлюватись. 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. Налаштування буде відкрито, щоб Ви могли виконати будь-яке нове налаштування, яке може знадобитися. Ready Готово KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Журнал %2 - QSO: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Апаратний журнал %2 - Кличний: %3 - QSO: %4 KLog KLog - Unexpected error KLog - Неочікувана помилка 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 - Кличний недійсний! The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Кличний %1 - недійсний! Ви справді бажаєте додати цей кличний до журналу? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Додавання недійсних кличних до журналу, може створити проблеми під час подання заявки на дипломи, експортування файлів ADIF до інших систем або програм. KLog - Select correct entity KLog - Виберіть правильну країну 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 знову. 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 - недійсний! Ви справді бажаєте додати цей кличний до журналу? None Немає Click on the prefix of the right entity or Cancel to correct. Щоб виправити, натисніть префікс потрібної країни або Скасувати. Save ADIF File Зберегти файл ADIF You have requested to delete several QSOs Ви подали запит на видалення кількох QSO This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Ця операція, обов'язково видалить усі вибрані QSO та пов'язані дані. Ви не зможете відновити їх знову. Are you sure? Ви впевнені? You have requested to delete the QSO with: %1 Ви подали запит на видалення QSO з: %1 KLog - ClubLog error KLog - помилка ClubLog The ClubLog upload process has finished with an error and the log was possibly not uploaded. Процес завантаження на ClubLog завершився з помилкою. Можливо, журнал не було завантажено. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Будь ласка, перевірте свої облікові дані, підключення до Інтернету та обліковий запис ClubLog. Отриманий код помилки: %1 KLog - ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Бажаєте позначити як завантажені, Всі QSO, завантажені до ClubLog? 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. Ви бажаєте, щоб KLog видалив цей файл? 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 видалити файл Ви можете видалити його вручну. KLog - eQSL error KLog - помилка eQSL 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 KLog - eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Ви бажаєте позначити як завантажені всі QSO, завантажені на eQSL? 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 створив файл (%1) у вашій теці KLog. Ви бажаєте, щоб KLog видалив цей файл? KLog - QRZ.com warning KLog - Попередження QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com повернув помилку без підписки. Запити до QRZ.com будуть вимкнені. Please check your QRZ.com subcription or credentials. Перевірте свою підписку на QRZ.com або облікові дані. KLog - QRZ.com error KLog - помилка QRZ.com The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Процес завантаження на QRZ.com завершився з помилкою. Можливо, журнал не було завантажено. KLog - QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Ви бажаєте позначити як завантажені всі QSO, завантажені на QRZ.com? There was an error while updating to Yes the QRZ.com QSO upload information. Під час оновлення інформації про передачу до QRZ.com QSO виникла помилка. The QRZ.com upload process has finished successfully Процес завантаження на QRZ.com успішно завершено Call not found in QRZ.com Кличний не знайдено на QRZ.com KLog has received an error from QRZ.com. KLog отримав повідомлення про помилку від QRZ.com. KLog - %1 You need to activate the %1 service in the eLog preferences. Вам потрібно активувати службу %1 у налаштуваннях eLog. KLog - Exit KLog - Вихід Do you really want to exit KLog? Ви справді бажаєте вийти з KLog? 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 виконано неправильно! &File &Файл &Import from ADIF ... &Імпорт з ADIF... Import an ADIF file into the current log. Імпорт файлу ADIF у поточний журнал. Export to ADIF ... Експорт до ADIF... Export the current log to an ADIF logfile. Експорт поточного журнал до ADIF файлу. Export all logs to ADIF ... Експорт увсі журналів до ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Експортувати ВСІ QSO в один файл ADIF, об'єднавши QSO з усіх журналів. &Print Log ... &Друк журналу... Print your log. Друк ващого журналу. KLog folder Тека KLog Opens the data folder of KLog. Відкриває теку з даними KLog. Settings ... Налаштування... E&xit &Вийти &Tools Ін&струменти Fill in QSO data Заповнити дані QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Перегляньте журнал, повторно використовуючи попередні QSO, щоб заповнити інформацію, відсутню в інших QSO. QSL tools ... Інструменти QSL... Find QSO to QSL Знайти QSO для надсилання QSL Shows QSOs for which you should send your QSL and request the DX QSL. Показує QSO, для яких Ви можете надіслати свою QSL та запросити DX QSL. Find My-QSLs pending to send Знайти Мої QSL, які очікують на відправку Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Показує QSO із запитами на надсилання QSL, які очікують на розгляд. Ви маєте залишити цю чергу порожньою! Find DX-QSLs pending to receive Знайти DX QSL, що очікують на отримання 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 QSOs from this log to be sent Поставте в чергу всі QSO з цього журналу для відправки 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 in this log as sent to LoTW. Позначити всі QSO з черги в цьому журналі як надіслані на LoTW. Mark all queued QSOs as sent Позначити всі QSO в черзі як надіслані Mark all queued QSOs as sent to LoTW. Позначити всі QSO в черзі як надіслані до LoTW. Download from LoTW ... Завантажити з LoTW... Download the full log from LoTW ... Завантажити весь журнал з LoTW... ClubLog tools ... Інструменти ClubLog... Queue all the QSOs to be uploaded Поставте в чергу всі QSO, які потрібно передати 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... Check the current callsign in QRZ.com Перевірте поточний кличний на QRZ.com Queue all the QSO to be uploaded Поставте в чергу всі QSO, які потрібно передати Upload the queued QSOs to QRZ.com ... Передати QSO з черги до QRZ.com... Update cty.csv Оновлення cty.csv For updated DX-Entity data, update cty.csv. Щоб отримати оновлені дані DX-Entity, оновіть cty.csv. Update Satellite Data Оновити дані супутника Stats Статистика Show the statistics of your radio activity. Показати статистику вашої активності. Show Map Показати карту &Help &Довідка Online manual (F1) ... Онлайн посібник (F1)... &Tips ... &Поради... &Debug ... &Відладка... &About ... &Про... About Qt ... Про QT... Check updates ... Перевірити оновленя... KLog - LoTW 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. 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 been updated with the LoTW downloaded QSOs. Ваш журнал оновлено, за допомогою завантажених QSO з LoTW. KLog has updated %1 QSOs from LoTW. KLog оновив %1 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. Жодна QSO не оновлена даними, що надходять від 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. Ви дійсно хочете позначити ВСІ незавершені QSO як ПЕРЕДАНІ? Це потрібно зробити, ТІЛЬКИ ЯКЩО ЦЕ ВАШ ПЕРШИЙ РАЗ коли Ви передаєте QSO в LoTW. All pending QSOs has been marked as queued for LoTW! Всі незавершені QSO позначено як поставлені в чергу на LoTW! There was a problem to mark all pending QSOs as queued for LoTW! Виникла проблема з позначенням незавершених QSO які поставлені в чергу для LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL не встановлено або KLog не може його знайти. Будь ласка, перевірте конфігурацію. 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 були оброблені, тому що вони були дублікатами або поза діапазоном дат. 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. Журнал, який Ви вибрали, містить більше ніж один кличний станції. Please select the station callsign you want to mark as sent to LoTW: Будь ласка, виберіть кличний станції, який потрібно позначити як надісланий на LoTW: Station Callsign: Кличний станції: Define Station Callsign Визначте кличний станції 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 без визначеного кличного станції та з кличним, який Ви вводите. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Введіть кличний станції для використання в цьому журналі або залиште його порожнім для QSO без визначеного кличного станції: KLog - No station selected KLog - Станцію не вибрано No station callsign has been selected and therefore no log will be marked Жоден кличнтй станції не вибрано, тому журнал не буде позначений All queued QSOs of this log 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! All queued QSOs has been marked as sent to LoTW! Всі QSO в черзі, позначено як надіслані на LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Виникла проблема позначити всі QSO в черзі, як надіслані на LoTW! About ... Про... KLog - Update checking result KLog - результат перевірки оновлення Congratulations! Вітаємо! You already have the latest version. Ви вже маєте найновішу версію. You can find the KLog data folder here: Теку даних KLog можна знайти тут: start старт UDP Server error The UDP server failed to %1. start or stop Помилка сервера UDP UDP-серверу не вдалося %1. stop стоп Status of the DX entity. Статус об'єкта DX. Name of the DX entity. Назва об'єкта DX. QSO QSL eQSL Comment Коментар Others Інше My Data Мої дані Satellite Супутники Info Інфо Awards Дипломи Search Пошук Log Журнал DX-Cluster DX-Кластер DXCC No QSOs have been exported to ADIF. Жодна QSO не була експортована до ADIF. 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. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL завершено без помилок. Бажаєте позначити як надіслані всі QSO, завантажені до LoTW? There was an error while updating to Yes the LoTW QSL sent information. Під час оновлення інформації про передачу до LoTW QSL виникла помилка. 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. Ви бажаєте, щоб KLog видалив цей файл? You need to select one station callsign to be able to send your log to ClubLog. Вам потрібно вибрати один кличний станції, щоб мати можливість надіслати свій журнал до ClubLog. The selection you have done does not include any QSO. Зроблений вами вибір не містить QSO.( Do you want to add this QSOs to your ClubLog existing log? Ви бажаєте додати ці QSO до вже існуючого журналу ClubLog? The selection you have done does not include any QSO If you don't agree, this upload will overwrite your current ClubLog existing log. Якщо Ви не згодні, ця передача, перезапише ваш поточний журнал ClubLog. You need to select one station callsign to be able to send your log to eQSL.cc. Вам потрібно вибрати кличний станції, щоб мати можливість надіслати свій журнал до eQSL.cc. KLog - Select the Station Callsign. KLog - Виберіть кличний станції. 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 або відповідний кличний станції. Відкрийте вкладку LoTW у Налаштуваннях та налаштуйте підключення до 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 Ви дійсно бажаєте позначити ВСІ свої QSO як ПЕРЕДАНІ? Це потрібно зробити, ТІЛЬКИ ЯКЩО ЦЕ ПЕРШИЙ РАЗ, коли Ви передаєте QSO до %1 ClubLog 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 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 в цьому журналі були позначені як Змінені. В полі статусу ClubLog KLog could not mark the full log to be sent to eQSL KLog не зміг позначити весь журнал для надсилання на eQSL KLog - QRZ.COM QRZ.COM 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 KLog could not mark the full log to be sent to QRZ.com KLog не може позначити весь журнал для надсилання на QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Щоб завантажити QSO, Вам потрібна підписка на QRZ.com. Якщо вона є, перейдіть на вкладку Налаштування->QRZ.com, щоб увімкнути його. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Вам потрібно визначити API ключ для свого журналу QRZ.com у налаштуваннях eLog. Open File Відкрити файл - Needed for DXMarathon - Потрібен для DX-марафону Filling QSOs ... Заповнення QSO... Abort filling Скасувати заповнення Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Заповнення DXCC, CQz, ITUz, Continent в QSO... QSO: Number Номер Date/Time Дата/Час Callsign Кличний RSTtx RST tx RSTrx RST rx Band Діапазон Mode Вид Print Log Друк журналу Printing the log ... Друк журналу... Abort printing Скасувати друк Printing the log... QSO: Друк журналу... The following QSO data has been received from WSJT-X to be logged: Наступні дані QSO були отримані від WSJT-X для логу: Freq Част. Time On Час почат. Time Off Час завер. Station Callsign Кличний станції Operator Callsign Кличний оператора KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Схоже, це QSO дублюється. Бажаєте зберегти чи відкинути? 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: QSO записано з WSJT-X: The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> KLog - Non-supported mode KLog - Режим не підтримується A new mode not supported by KLog has been received from an external program or radio: Новий режим, який не підтримується KLog, отримано від зовнішньої програми або радіостанції: If the received mode is correct, please contact KLog development team and request support for that mode Якщо отриманий режим правильний, зв'яжіться з командою розробників KLog та подайте запит на підтримку для цього режиму Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Чи бажаєте Ви й надалі отримувати ці сповіщення? (вимкнення цих сповіщень запобігатиме виявленню недійсних режимів) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Дубльований супутник 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 Native Error Error text Failed query Recommendation: Рекомендація: Periodically export your data to ADIF to prevent a potential data loss. KLog - Show errors KLog - Показати помилки Do you want to keep showing errors? Бажаєте продовжити показувати помилки? It seems that there are no QSOs in the database. В базі даних, 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. Якщо Ви впевнені, що база даних містить QSO, а KLog не може їх знайти, зверніться до розробників по допомогу. MainWindowInputComment Comment Коментар Add a comment for this QSO. Додати коментар до цього 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 ClubLog. Статус на ClubLog. Status on QRZ.com. Статус на QRZ.com. Status of the eQSL sending. Статус відправлення на eQSL. Status of the eQSL reception. Статус отримання з eQSL. Status of the LoTW sending. Статус відправлення на LoTW. Status of the LoTW reception. Статус отримання з LoTW. ClubLog QRZ.com eQSL Sent eQSL Над. eQSL Rec eQSL Отр. LoTW Sent LoTW Над. LoTW Rec LoTW Отр. MainWindowInputOthers Primary Div Первинна група Secondary Div Вторинна група IOTA Entity Об'єкт Propagation mode Розповсюдження Others Інші Keep propagation mode Зберігати режим розповсюдження Show All Select the primary division for this QSO. Виберіть первинну групу для цього QSO. Select the secondary division for this QSO. Виберіть вторинну групу для цього QSO. Select the entity for this QSO. Виберіть об'єкт для цього QSO. Select the propagation mode for this QSO. Виберіть режим розповсюдження для цього QSO. Select the IOTA continent for this QSO. Виберіть континент IOTA для цього QSO. Select the IOTA reference number for this QSO. Введіть номер групи IOTA для цього QSO. Keeps the same propagation mode for next QSO. Зберегти той самий режим розповсюдження, для наступного QSO. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Виберіть відповідне поле ADIF для цього QSO. Value for the selected ADIF field. Значення для вибраного поля ADIF. Not Identified Not - Not Identified None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance MainWindowInputQSL QSL Sent QSL Над. QSL Rec QSL Отр. QSL Via QSL Через QSL Msg QSL Пов. 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 DX Локатор Power(rx) Потужність (Rx) RST TX RX Frequency Частота DX QTH locator. DX QTH Локатор DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH локатор. Формат має бути: IN70AA Та містити, до 10 символів. TX Frequency in MHz. Frequency is not in a hamradio band! Частота передачі, в MHz. Частота, не в діапазоні HamRadio! RX Frequency in MHz. Frequency is not in a hamradio band! Частота прийому, в MHz. Частота, не в діапазоні HamRadio! MainWindowMyDataTab Watts Вт. Keep this data Зберегти дані Power Потужність Operator callsign Кличний оператора Station Callsign Кличний Станції My Locator Мій Локатор My QTH locator. Мій QTH Локатор. My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Мій QTH локатор. Формат має бути: IN70AA Та містити, до 10 символів. My Rig Мій TRX My Antenna Моя Антена My POTA Ref My SIG My SIG Info My SOTA Ref My WWFF Ref My VUCC_GRIDS MainWindowSatTab Keep this data Зберегти дані Data entered in this tab will be copied into the next QSO. Дані, введені на цій вкладці, будуть скопійовані до наступного 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). Назва супутника. Якщо його немає в списку, виберіть: "%1", щоб увімкнути це поле. (формат типу АО-51). Satellite mode used. Режим роботи супутника. Select the satellite you are using. Виберіть супутник, який Ви використовуєте. UpLink band. UpLink діапазон. DownLink band. DownLink діапазон. UpLink DownLink Satellite Супутник Mode Режим Other 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. KLog виявив назву супутника, яку він не розпізнає. Якщо замість нього має використовуватися одна з назв відомих супутників, будь ласка, виберіть її зі списку. Крім того, зв’яжіться з командою розробників, щоб додати назву нового супутника. The satellite you have in your QSO is: Супутник у вашому QSO: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Будь ласка, майте на увазі, назва супутника не буде збережена, якщо її немає у списку. Тому інформація може бути втрачена! MapWindowWidget Select QSOs in this band. Виберіть QSO в цьому діапазоні. Select QSOs in this mode. Виберіть QSO в цьому режимі. Select QSOs in this propagation mode. Виберіть QSO в цьому режимі поширення. Select QSOs using this Satellite. Виберіть QSO з використанням цього супутника. Only confirmed Тільки підтверджені Select only confirmed QSOs. Вибрати лише підтверджені QSO. All bands Всі діапазони Show nothing Нічого не показувати All modes Всі види All propagation modes Всі режими розповсюдження All satellites Всі супутники OnlineMessageWidget The server returned the following error: %1 Сервер повернув повідомлення про помилку: %1 Not identified Не ідентифіковано QObject New One, work it! Новий, працюй! Needed, work it! Потрібен, працюй! Worked but not confirmed Працював, але не підтверджено Confirmed Підтверджено Not identified Не ідентифіковано Database Error Помилка бази даних KLog DB needs to be upgraded. KLog БД потрібно оновити. Do you want to upgrade it now? Бажаєте оновити її зараз? If DB is not upgraded KLog may not work properly. Якщо БД не оновлено, KLog може працювати некоректно. 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 Резервну копію можна знайти у цьому файлі: %1 The backup was not properly done. Резервне копіювання виконано неправильно! You will be sent back to the starting point. Ви повернетеся до початкової точки. KLog - DB can't be updated automatically KLog - БД не можна оновлювати автоматично You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Ви оновлюєте надто стару версію KLog. Це оновлення не можна оновити автоматично з цієї версії. 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. - Видаліть файл logbook.dat з папки KLog. - Встановіть нову версію KLog. - Імпортуйте файл ADIF. KLog завершить роботу, коли Ви натиснете кнопку OK. KLog - DB update KLog - оновлення БД KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog виявив попередній журнал у БД. Всі дані буде перенесено до щойно створеного журналу типу DX. KLog: Enter Station callsign KLog: Введіть кличний станції 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... Оновлення інформації про діапазони в статусі %1... Progress: Поступ: Updating mode information in %1 status... Оновлення інформації про режим у статусі %1... Updating DXCC award information... Оновлення інформації про диплом DXCC... Updating DXCC Award information... Оновлення інформації про Диплом DXCC... Updating WAZ award information... Оновлення інформації про Диплом WAZ... Updating WAZ Award information... Оновлення інформації про Диплом WAZ... Updating information... Оновлення інформації... Updating DXCC and Continent information... Оновлення DXCC та Контест інформації... KLog is already running. KLog вже працює. It is allowed to run only one instance. Дозволено запускати тільки один екземпляр. 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 - Знайдено недійсний кличний Altitude Date Дата Call Кличний RSTtx RST tx RSTrx RST rx Band Діапазон Comment Коментар Mode Вид CQz ITUz DXCC Address Адреса Age Вік County Графство A_Index Ant_Az Ант_Аз Ant_El Ант_Ел Ant_Path Ант_Шлях ARRL_SECT Award_Submitted Award_granted Band_RX Діапазон_RX CheckContest Class Клас ClubLog status Статус ClubLog Continent Континент Contacted_Op Contest Id Country Графство Credit Submitted Credit granted Distance Відстань Email EQ_Call eQSL RDate eQSL Отр.дата eQSL SDate eQSL Над.дата eQSL Rcvd eQSL Отр. eQSL Sent eQSL Над. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. Force Init Freq Freq RX Gridsquare HRDLog status IOTA IOTA Island id IOTA ID острова K Index K індекс Lat Шир. Lon Дов. LoTW RDate LoTW Rcvd LoTW Sent Max Bursts MS Shower My Antenna Моя Антена My City Моє Місто My Cnty My Country Моя Країна My CQz Моя CQ зона My DXCC Мій DXCC My Fists Do not translate if unsure, common hamradio term. My Gridsquare Мій Локатор My IOTA Моя IOTA My IOTA island id Мій IOTA ID острова My ITUz Моя ITU зона My Lat Моя Шир. My Lon Моя Дов. My Name Моє Ім'я My Postal code Мій Пошт. код My Rig Мій TRX My Sig My Sig Info ClubLog SDate Date when it was sent Darc Dok Do not translate if unsure, common hamradio term. eQSL SDate Date when it was sent eQSL Над.дата Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street Моя Вулиця My USACA counties My VUCC grids My WWFF Name Ім'я Notes Нотатки Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Operator Оператор Owner Callsign Клич. Власника POTA Pfx 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 завершено QSO random Випадкові QSO QTH Region Регіон Rig TRX RX Pwr Sat mode 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 SWL Do not translate if unsure, common hamradio term. UKSMG USACA counties VE prov VUCC grids Ten-Ten Do not translate, it is a hamradio group name. TX Pwr Web WWFF QSO Date off Log number SearchWidget &Clear &Очистити &Export Highlighted &Експортувати виділене &Select All &Вибрати все &Search &Пошук 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. Пошук у всіх журналах. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Введіть кличний для пошуку. Введіть '*', щоб показати всі QSO... у великих журналах це може бути повільно! Select the Station Callsign used to do this QSO. Виберіть кличний станції, використаний для проведення цього QSO. You have requested to delete the QSO with: %1 Ви подали запит на видалення QSO з: %1 Are you sure? Ви впевнені? All in log Все в журналі Not defined Не визначено &Clear selection &Скасувати вибране Save File Зберегти файл SearchWindow Call Кличний Date/Time Дата/Час Band Діап. Mode Вид QSL Sent QSL Відп. QSL Rcvd QSL Отр. Station Callsign Кличний станції ID Date/time Дата/час Station callsign Кличний станції QSL Send QSL Надіслана &Delete &Видалити Delete a QSO Видалити QSO &Edit QSO &Правка QSO Edit this QSO Правка цього QSO Via &bureau Через &бюро Send this QSL via bureau Надіслати цю QSL - через Бюро D&irect &Дірект Send this QSL via direct Надіслати цю QSL - Дірект Via bureau Через Бюро QSL &received via bureau QSL отримана - через Бюро Direct Дірект QSL received via direc&t QSL отримана - Дірект 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 Mark my QSL as requested Позначити мою QSO в черзі як надіслані Via Direct and mark DX QSL as requested Через Дірект та позчити DX QSL як запит Send this QSL via direct and mark DX QSL as requested Надіслати цю QSL через Дірект та позначити DX QSL як запит Via Bureau and mark DX QSL as requested Через Бюро та позначити DX QSL як запит Send this QSL via bureau and mark DX QSL as requested Надіслати цю QSL через Бюро та позначити DX QSL як запит &Request the QSL &Запросити QSL Mark the QSL as requested Позначити QSL як надіслану Via bureau and mark my QSL as requested Через бюро та позначити мою QSL як запитану QSL received via bureau and mark my QSL as requested QSL отримано через бюро та позначте мю QSL як запит Direc&t and mark as my QSL requested Дірект та позначено запит мою QSL QSL received via direct and mark my QSL as requested QSL отримано через дірект та позначено мою QSL як запитану Needed QSO to send the QSL Щоб надіслати QSL, потрібне QSO My QSL requested to be sent Моя QSL, запит на надсилання DX QSL pending to be received DX QSL очікує на отримання SetupDialog User data Дані користувача Bands/Modes Діап./Реж. Log widget Поля журналу D&X-Cluster DX-Кластер 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) Ви бажаєте додати журнал на вкладці «Журнали» чи вийти з KLog? (Натисніть Так, щоб додати журнал, або Ні, щоб вийти з KLog) DX-Cluster DX-Кластер 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. CQ зона. ITU ITU zone. ITU зона. Latitude Широта Longitude of the Entity. Longitude Довгота UTC Local time difference to UTC. Різниця між місцевим часом та UTC. Main prefix Основний префікс Main prefix of the entity. ARRL ID ARRL ID. Prefixes Префікси Comma separated possible prefixes, e.g. EA1, EA2, ... Можливі префікси, розділені комами, напр. UR1, UR2, ... 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 Палітра WSJT-X Default palette Палітра за замовчуванням Dark Mode Темний Режим Color when the DXCC is an ATNO (All Time New One). ! Колір, коли DXCC є 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, ... Цей DXCC відпрацьовано раніше. У іншому, але, не у вибраному діапазоні. Це може знадобитися до CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Відпрацьовано DXCC, але не підтверджено, в цьому діапазоні. DXCC is confirmed in this band. DXCC підтверджено у цьому діапазоні. Default color. Колір за замовчуванням. Sets a palette of colors similar to the one used in WSJT-X. Встановлює палітру кольорів, подібну до тієї, що використовується в WSJT-X. Sets the default palette. Встановити палітру. за замовченням Sets the Dark Mode Встановити Темний Режим Choose a color Виберіть колір Light Mode Світлий Режим SetupPageDxCluster Add Додати Delete Видалити Show &HF spots Показати &HF споти Show V/&UHF spots Показати V/&UHF споти Show W&ARC spots Показати W&ARC споти Show &worked spots Показати &опрацьовані споти Show &confirmed spots Показати &підтверджені споти Show ANN/&FULL messages Показати ANN/&FULL повідомлення Show WW&V messages Показати WW&V повідомлення Show WC&Y messages Показати WC&Y повідомлення Save DX Cluster activity Зберегти активність DX Кластер Saves all the DX-Cluster activity to a file in the KLog folder Зберігає всю активність DX-Кластер до файлу у теці KLog Send DX Spots to the map Надсилати DX Споти на карту Sends the received DX Spots to the map to know where is the activity. Надсилає отримані DX споти на карту, щоб знати, де відбувається активність. 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 App password ClubLog email Enter the email you used to register in ClubLog. Введіть email, який Ви використовували, для реєстрації на 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.) Введіть Ваш пароль користувача, ClubLog. Попередження: Пароль буде збережено під час очищення, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає Вас, коли він знадобиться.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Введіть Ваш пароль, для програми ClubLog. Його можна отримати в ClubLog (меню «Параметри» > «Паролі додатків»).Попередження: Пароль програми буде збережено під час очищення, у конфігураційному файлі 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. Надсилає кожне QSO до ClubLog, у режимі реального часу, коли вони додаються (або змінюються) у KLog. Starts the ClubLog support in KLog. Запускає підтримку ClubLog у KLog. 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 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. Введіть Ваш логін, користувача 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 Активація QRZ.com Check automatically Перевіряти автоматично Check in Qrz.com all Calls as they are entered Перевіряти на Qrz.com всі кличні, як були введені Paying Subscriber Платна підписка Check it if you are paying for a qrz.com subscription Позначте, якщо Ви платите за підписку на QRZ.com LogBook 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. Ключ для відвантаження QSO. Ви можете отримати цей ключ на веб-сторінці свого журналу QRZ.com. Пам’ятайте, що для використання цієї функції Вам потрібна підписка на QRZ.com. LoTW Upload Передати Download Завантажити TQSL path Шлях до TQSL Use TQSL Використати TQSL LoTW password LoTW user Enter your LoTW user. Введіть Ваш логін, користувача 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.) Введіть Ваш пароль користувача, LoTW. Попередження: Пароль буде збережено під час очищення, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає Вас, коли він знадобиться.) Path to the TQSL software. Шлях до ПЗ TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Ввімкнути інтеграцію LoTW з TQSL. Вам також, буде потрібно встановити TQSL Select File Виберіть файл SetupPageHamLib Test: OK Test: NOK Test: NotOK 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 читатиме Частоту/Режим з трансивера. Але ніколи, не надсилатиме жодних команд на трансивер. Test Click to test the connection to the radio Натисніть, щоб перевірити з’єднання з трансивером Defines the interval to poll the radio in msecs. Визначає інтервал для опитування трансивера в мсек. Poll interval Інтервал опитувань Radio Трансивер Select your rig. Введіть ваш TRX. Serial Серійний Network Мережа SetupPageLogView Fields Поля 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... Всі QSO з цього журналу, також будуть видалені... Log has not been removed. (#3) Журнал не видалено. (#3) Log has not been removed. (#2) Журнал не видалено. (#2) Log has not been removed. (#1) Журнал не видалено. (#1) ID Date Дата Station Callsign Кличний станції Operators Оператори Comments Коментарі QSOs QSO 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 &Ok &Cancel &Скасувати Callsign used for this log. Кличний, використаний у цьому журналі Comma separated list of operators: callsign1, callsign2. Список операторів, розділених комами: Кличний1, Кличний2. 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. Вам необхідно ввести дійсний кличний у полі Кличний Станції. Журнал не буде відкритий. SetupPageMisc Check non-valid calls Перевірити недійсні кличні &Imperial system &Імперська система &Log in real time &Журнал в реальному часі Show seconds Показати секунди &Time in UTC &Час в UTC &Save ADIF on exit &Зберегти ADIF при виході Use this &default filename Файл за замовченням Mark &QSO to send QSL when QSL is received Позначте &QSO, щоб надіслати QSL, коли QSL отримано Complete QSO with previous data Завершити QSO з попередніми даними Show the Station &Callsign used in the search box Показати &Кличний Станції, який використовується у вікні пошуку &Check for new versions automatically &Автоматично перевіряти наявність нових версій Manage DX-Marathon Керування DX-Марафоном Mark sent eQSL && LoTW in new QSO as queued Позначити надіслані eQSL та LoTW. У новому QSO, як у черзі &Delete always temp ADIF file after uploading QSOs &Завжди видаляти тимчасовий файл ADIF, після відвантаження QSO Browse Огляд Move DB Перемістити БД In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. В секундах введіть часовий діапазон для розгляду дублікату. Якщо введено той самий кличний, діапазон та режим. Show seconds in the QSO editor Відображати секунди, в редакторі QSO If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Якщо Ви вимкнете цей прапорець. KLog не перевірятиме кличні, на ідентифікацію неправильних кличних. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO буде позначено, в очікуванні на надсилання QSL. Якщо Ви отримали DX QSL але, не надіслали свою. The search box will also show the callsign on the air to do the QSO. В полі пошуку, також буде відображено кличний в ефірі. Для проведення QSO. Check if there is a new release of KLog available every time you start KLog. Щоразу, коли Ви запускаєте KLog, перевіряти наявність нової версії KLog. Check it for Imperial system (Miles instead of Kilometers). Перевіряти за Імперською системою (Милі, замість Кілометрів). Select to use real time. Виберіть режим реального часу. Select to use UTC time. Виберіть час UTC. Select if you want to save to ADIF on exit. Виберіть, чи потрібно зберегти в ADIF після виходу. Select to use the following name for the logfile without being asked for it again. Виберіть, щоб використовувати наступне ім’я для файлу журналу, без повторного запиту. Complete the current QSO with previous QSO data. Завершити поточне QSO, з даними попередніх QSO. Select if you want to manage DX-Marathon. Виберіть, якщо Ви хочете керувати DX-Марафон. This is the default file where ADIF data will be saved. Файл за замовчуванням, у якому будуть збережені дані ADIF. This is the directory where the database (logbook.dat) will be saved. Каталог, де зберігатиметься база даних (logbook.dat). Click to change the default ADIF file. Натисніть, щоб змінити файл ADIF за замовчуванням. Click to change the path of the database. Натисніть, щоб змінити шлях до бази даних. Click to move the DB to the new directory. Натисніть, щоб перемістити базу даних до нового каталогу. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Виберіть рівень журналу відладки програми. Це може бути корисно, коли щось не працює, як очікувалося. Файл логу відладки, буде створено в каталозі KLog та показано через меню: Довідка->Відладка. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Натисніть, щоб позначити всі eQSL (LoTW і eQSL) у черзі (для надсилання), у всіх нових QSO за замовчуванням. Delete Always the adif file created after uploading QSOs Завжди Видаляти файл ADIF, створений після відвантаження QSO Log level Рівень логу відладки Dupe time range: Час дублювання: Open File Відкрити файл Select Directory Виберіть Каталог This is the directory where DB (logbook.dat) will be saved. В цьому каталозі буде збережено база даних (logbook.dat). Please specify an existing directory where the database (logbook.dat) will be saved. Будь ласка, вкажіть існуючий каталог, де буде збережено базу даних (logbook.dat). KLog - Move DB KLog - Перемістити БД 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. Файл призначення вже існує. KLog не замінить його. Будь ласка, видаліть файл із теки призначення перед переміщенням файлу за допомогою KLog. Щоб переконатися, що KLog зможе скопіювати файл. 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) Супутник не видалено. (#3) Sat has not been removed. (#2) Супутник не видалено. (#2) Sat has not been removed. (#1) Супутник не видалено. (#1) ID Short Скорочено Name Назва Uplink Downlink Modes Режими An error has occurred showing the following error code: Виникла помилка з таким кодом: KLog - SetupPageSats Open Satellites File Відкрийте файл супутників KLog warning Попередження 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. Під час імпортування даних супутника, сталася неочікувана помилка. Це може бути спричинено тим, що файл, який Ви намагаєтесь імпортувати, має неналежний формат. 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 &Ok &Cancel &Скасувати Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Введіть коротку назву. Спробуйте використовувати коротку назву у LoTW, щоб потім Ви могли передати свої QSO до LoTW. Enter the name of the satellite. Введіть назву супутника. Enter the uplink frequencies in this format: 144.300 Введіть частоти uplink, в такому форматі: 144.300 Enter the downlink frequencies in this format: 144.300 Введіть частоти downlink, в такому форматі: 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 &Дата &Station Callsign &Кличний станції &Operators &Оператори Comm&ent &Коментар &Ok &Ok &Cancel &Скасувати Callsign used for this log. Кличний, використаний у цьому журналі Comma separated list of operators: callsign1, callsign2. Список операторів, розділених комами: Кличний1, Кличний2. 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 &Видалити Import new Новий Імпорт Import an AWA file with the subdivision details. Імпортуйте файл AWA з інформацією про підрозділ. 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) Журнал не видалено. (#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 An error has occurred showing the following error code: Виникла помилка з таким кодом: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Запуск UDP Сервера Automatically log QSOs from WSJT-X Автоматична реєстрація QSO від WSJT-X 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 QSO, зареєстровані в WSJT-X, будуть надіслані до KLog. KLog запитуватиме перед запуском. Якщо не вибрано "%1". KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog автоматично реєструватиме будь-які QSO, що надходять із WSJT-X, без підтвердження вручну. 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 Сервер прийматиме QSO, надіслані з інших програм. Наприклад WSJT-X. Що дозволить Вам автоматично входити в KLog із цих програм. UDP Port UDP Порт Select the interface to listen for UDP datagrams coming from WSJT-X. Виберіть інтерфейс для прослуховування UDP даних, що надходять від WSJT-X. Network interface Мережевий інтерфейс QSOs notification timeout (milisecs) Тайм-аут сповіщення QSO (мілісекуди) Miliseconds that the notification of QSOs received from WSJTX will be shown. Мілісекунди, протягом яких, відображатиметься сповіщення. Якщо QSO отримано, від WSJT X. SetupPageUserDataPage &Personal data Персональні дані Station &data Дані станції 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. Введіть свою країну. &Name &Ім'я &Address &Адреса Cit&y &Місто &Zip Code &Поштовий індекс Pro&v/State Регіон Countr&y Країна Enter your information for rig Введіть свою інформацію про TRX ( RIG, радіо-аматорське обладнання). Enter your information for antenna Введіть свою інформацію про антену Enter your power information. Введіть свою інформацію про потужність &Rig 1 &TRX 1 R&ig 2 T&RX 2 Ri&g 3 TR&X 3 Antenna &1 Антена 1 Antenna &2 Антена 2 Antenna &3 Антена 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. Введіть локатор вашої станції. Як альтернатива, KLog може використати приблизний локатор, на основі вашого кличного. &Callsign &Кличний &Operators &Оператори &CQ Zone &CQ зона &ITU Zone &ITU зона &Locator &Локатор &Locator (not valid) &Локатор (недійсний) 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. Інформаційний файл об’єктів (cty.csv) знайдено у Вашій теці KLog і буде завантажено. No entities information file (cty.csv) has been detected in your KLog folder. Інформаційний файл об’єктів (cty.csv) не знайдено у Вашій теці KLog. KLog will not be able to show entities information. KLog не зможе відобразити інформацію про об’єкти. 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. Інформацію про об’єкти оновлено. Entities information has not been updated. Інформацію про об’єкти не оновлено. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Наступні QSO - це ті QSO, для яких Ви отримали підтвердження LoTW. Ok DX Date/Time Дата/Час Band Діапазон Mode Вид ShowErrorDialog KLog Message Повідомлення KLog SoftwareUpdateDialog 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><a href=https://www.klog.xyz>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 QSO по DXCC 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 Статус: DXCC Супутники Grids per band status DXCC per band status Статус: DXCC по діапазонах StatsCQZPerYearBarChartWidget CQ Zones per year Зони CQ за рік Reading data ... Зчитування даних ... Abort reading Скасувати читання CQ zones Зони CQ CQ zones per year Зони CQ за рік Reading data ... Зчитування даних... Years: %1/%2 Роки: %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 DXCC Entities DXCC за рік Chart title Заголовок діаграми Reading data ... Зчитування даних ... Abort reading Скасувати читання 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 QSO по діапазонах 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 QSO по DXCC Reading data ... Зчитування даних ... Abort reading Скасувати читання Reading data... Зчитування даних... DXCC Top ten DXCC per QSO Топ десять QSO по DXCC StatsQSOsPerHourBarChartWidget QSOs per hour QSO по годинах Reading data ... Зчитування даних ... Abort reading Скасувати читання Hours Години QSOs at hour QSO за годину 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 Січ. Feb Лют. Mar Берез. Apr Квіт. May Трав. Jun Черв. Jul Лип. Aug Серп. Sep Верес. Oct Жовт. Nov Листоп. Dec Груд. Months Місяці QSOs at Month QSO за місяць Reading data ... Зчитування даних... Months: Місяці: StatsQSOsPerYearBarChartWidget QSOs QSO QSOs per year QSO за рік Reading data ... Зчитування даних ... Abort reading Скасувати читання Reading data ... Зчитування даних... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Надіслано - %1 Confirmed - %2 Підтверджено - %2 Sent / Confirmed status Статус: Надіслано / Підтверджено StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Працював, не підтверджено - %1 Confirmed - %2 Підтверджено - %2 Worked / Confirmed status Статус: Відпрацьовано / Підтверджено StatsWorkedSentPieChartWidget Worked - %1 Відпрацьовано - %1 Sent - %2 Надіслано - %2 Worked / Sent status Статус: Відпрацьовано / Надіслано TipsDialog KLog tips Поради KLog 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 зон та Континенту? <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>Ви можете знайти QSL, які Вам ще потрібно надіслати<a href="#ToolsSendPendingQSL">Інструменти->Інструменти QSL->Знайти QSO для надсилання QSL</a>.<bR>Цей інструмент перерахує у вікні пошуку всі QSO позначеними як QSL-Sent, <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 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 Скасувати читання The Satellites information has been updated. Інформація про супутники оновлена! Open File Відкрити файл Sat Data UpdateSettings KLog - Settings update KLog - Оновлення налаштувань The settings system has been changed and KLog will update your settings file. Систему налаштувань було змінено. KLog оновить ваш файл налаштувань. World Reading cty.csv... Читання cty.csv... Abort reading Скасувати читання KLog DXCC All QSOs have been updated with a DXCC and the Continent. Всі QSO були оновлені, за допомогою DXCC та Континенту. eLogClubLog Host not found! Хост не знайдено! Timeout error! Помилка тайм-ауту! It seems to be a CREDENTIALS ERROR; check your email and password. Схоже, це ПОМИЛКА ОБЛІКОВИХ ДАНИХ; перевірте свою електронну пошту та пароль. KLog - ClubLog It seems that your ClubLog credentials are not correct. Схоже, Ваші облікові дані ClubLog неправильні. Please check your credentials in the setup. ClubLog uploads will be disabled. Перевірте свої облікові дані в налаштуваннях. Відвантаження до ClubLog буде вимкнено. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Ми отримали невизначену помилку від ClubLog (%1) 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)... 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 буде вимкнено. 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 Тестовий режим - параметри в нормі, жодних дій не виконано 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 Login rejected Логін відхилено Rejected: Callsign is your own call Відхилено: Кличний - це ваш власний виклик eLogQrzLog Host not found! Хост не знайдено! Timeout error! Помилка тайм-ауту! Undefined error number (#%1) Невизначена помилка номер (#%1) KLog - QRZ.com We have received the following error from QRZ.com (%1) Ми отримали від QRZ.com таку помилку (%1) You are not subscribed to QRZ.com. Ви не підписані на 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. Будь ласка, налаштуйте ключ від API QRZ.com. Ви знайдете його на веб-сторінці QRZ.com. Для використання цієї функції, Вам потрібна підписка на QRZ.com. KLog - QRZ.com password needed KLog - Потрібен пароль для QRZ.com Please enter your QRZ.com password: Будь ласка, введіть Ваш пароль QRZ.com: Callsign missing Кличний відсутній eQSLUtilities KLog - eQSL eQSL has sent the following message: %1 eQSL надіслав таке повідомлення: %1 Host not found! Хост не знайдено! Timeout error! Помилка тайм-ауту! Undefined error number (#%1)... Невизначена помилка номер (#%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 дублюється. 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-2.4.1/translations/klog_fr.ts0000644000175000017500000140023515003153303016144 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 My Locator Mon Locator Start date End date Ok Ok Cancel Annuler DX Date/Time Date/Heure Band Bande Mode Mode Not defined ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Tout 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Réalisé C Confirmed, please try to keep the C Confirmed Confirmé U Unknown Unknown 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 DXClusterAssistant DX Freq Fréq Status 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 Check in QRZ.com Check this callsign in QRZ.com 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 : Clears the DXCluster command line. The DXCluster server desconnected the session. - 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 Reading LoTW file... Lecture en cours du fichier LoTW... Abort reading Lecture interrompue 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... Importing ADIF file... Importation du fichier ADIF en cours... 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) 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 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 : - 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 - 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é 1 bit 1 bit 1.5 bits 1,5 bits 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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 Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Indicatif &Save &Cancel &Annuler DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DOUBLON MainWindow Starting KLog Démarrage de Klog DX Entity Entité DX &Log Window Fenêtre de &log KLog KLog Log backup recommended! 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 It was not possible to define the KLog folder. Some functions may not work properly! KLog needs to update the Entities database. KLog - Backup KLog - New version detected! KLog - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent 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 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. 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. 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 ? 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 Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 ... 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 Show Map &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? The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 ... You can update the entities database in Tools->Update cty.csv 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. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Select correct entity 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. 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 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) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 - 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 Show All 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. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Non Identifié Not - Not Identified Non - Non Identifié None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF 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 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 MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 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 Altitude 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 status Continent Continent Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL Env. Force Init Freq Fréq Freq RX Fréq RX Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW Env. Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Nom Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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 Show seconds &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. Show seconds in the QSO editor 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 Log level 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. UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entité Continent Continent Reading cty.csv... En cours de lecture de cty.csv... Abort reading Lecture annulée 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. 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)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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-2.4.1/translations/klog_ja.ts0000644000175000017500000152344015003153303016133 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 無線局のコールサイン My Locator 自局のグリッドロケーター Start date 開始日 End date 終了日 Ok OK Cancel キャンセル DX DX Date/Time 日付/時刻 Band バンド Mode モード Not defined 定義されていません ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. 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を示しています。 Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked C Confirmed, please try to keep the C Confirmed コンファーム済 U Unknown Unknown 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. このバンドでは活動していないエンティティー。 DXClusterAssistant DX DX Freq 周波数 Status DXClusterWidget Click on Connect to connect to the DX-Cluster server 接続ボタンをクリックするとDXクラスターに接続します Connect 接続 Clear クリア Check in QRZ.com QRZ.comでチェック Check this callsign in QRZ.com Clears the DXCluster command line. Click on connect to connect to the DX-Cluster 接続ボタンをクリックするとDXクラスターに接続します Trying to connect to the server サーバーに接続しています The DXCluster server desconnected the session. 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 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がインポートされないかもしれません。 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を有効とみなすための最低限のデータが含まれていません! 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. 1 bit 1.5 bits 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で動作するフリーのハムラジオログプログラムです。 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. 一般的な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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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 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エントリーをクリアします。 Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLogが有効になっていれば、リアルタイムで表示されます。 Real time リアルタイム Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign コールサイン &Save &Cancel キャンセル(&C) 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 ... ステータスバー ... It was not possible to define the KLog folder. Some functions may not work properly! 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 ... 設定 ... Queue all QSOs from this log to be sent Download from LoTW ... LoTWからのダウンロード ... Download the full log from LoTW ... LoTWからフルログをダウンロード ... ClubLog tools ... Clublogツール ... 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に送信するフルログをマークできませんでした。 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. 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への送信としてマークします。 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 ストップ The selection you have done does not include any QSO The selection you have done does not include any QSO. KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 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. Clublogのアップロード処理がエラーで終了し、ログがアップロードされなかった可能性があります。 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 Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 衛星データの更新 Show Map 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が登録されていないようです。 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 周波数 If the received mode is correct, please contact KLog development team and request support for that mode 受信したモードが正しい場合は、KLog開発チームに連絡し、そのモードのサポートを要求してください。 KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 Show All 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でも同じ伝搬モードを維持します。 Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. このQSOに適したADIFフィールドを選択します。 Value for the selected ADIF field. 選択されたADIFフィールドの値。 Not Identified 不明 Not - Not Identified Not - 不明 None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF Ref 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 モード Other その他 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情報に記録された衛星の名称は以下のものです: MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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 - 有効なコールサインが見つかりません。 Altitude 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 status Continent 大陸名 Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL送付 Force Init Freq 周波数 Freq RX Gridsquare HRDLog status IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent LoTW送信 Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name 名前 Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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フォルダ内のファイルに保存する Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App password 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が聞いてきます) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 Show seconds Show seconds in the QSO editor Click to move the DB to the new directory. DBを新しいディレクトリーに移動するにはクリックしてください. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Log level 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. (#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 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 衛星データ UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity エンティティ Continent 大陸名 Abort reading 読込みの中止 Reading cty.csv... cty.csvを読みこんでいます… KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. 全てのQSOはDXCCと大陸が更新されています。 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のアップロードができなくなります。 It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. 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-2.4.1/translations/klog_nl.ts0000644000175000017500000153341015003153303016150 0ustar develdevel AboutDialog About KLog Over KLog By Door KLog is a free logbook for hamradio operators. KLog is een open source logboek voor zendamateurs. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Wees je ervan bewust dat dit een ontwikkel versie is en dat deze fouten kan bevatten. <br>Maak een backup van je data voordat je deze software gebruikt! 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. Sinds versie 0.6.2 is KLog helemaal herschreven om een multiplatform applicatie te creëren die op de belangrijkste operating systemen (Linux, macOS en Windows) draait en om nieuwe functionaliteiten te ondersteunen. Please provide your review in KLog's eHam review page: Geef je feedback op de KLog eHam review pagina: Find more information and the latest release at Vind meer informatie en de laatste versie op Author Auteur today vandaag Main developer Hoofdontwikkelaar KLog is developed by a very small team and you are invited to join! KLog is ontwikkeld door een klein team en je wordt uitgenodigd om hieraan deel te nemen! 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>! Als je ondersteuning wil bieden dan ben je van harte welkom om aan te sluiten <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog ontwikkel mailing lijst</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Je kunt ons ook helpen door het sturen van bug rapporten of kleine programmeer bijdragen of alles wat Klog kan verbeteren. Authors Auteurs Translators bring KLog into your language. They are really an important part of the KLog development team. Vertalers maken Klog beschikbaar in jouw taal. Zij vormen een belangrijk onderdeel van het KLog ontwikkel 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>! Als KLog nog niet in jouw taal beschikbaar is en jij wil ons helpen, dan wordt je uitgenodigd om contact met ons op te nemen via de <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog ontwikkel mailing lijst</a>! 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 Vertalers Privacy advisory Privacy adviezen 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 ontwikkelaars hebben een functie opgenomen die enige gebruikersdata naar de Klog server stuurt met als doel het aantal geïnstaleerde versies te registreren zodat ontwikkelaars zich kunnen richten op de behoefte van gebruikers. At present, the data that is provided is the following: Op dit moment is de data die wordt uitgewisseld als volgt: Callsign Roepnaam KLog version KLog versie Operating system Operating systeem Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Je kunt deze functionaliteit aan- of uitzetten via de tab Misc in het setup scherm. KLog KLog Privacy Privacy AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Selecteer de station roepnaam van het station voor het uploaden van het logboek. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Selecteer de startdatum voor de export van QSOs. De standaard datum is de datum van het eerste QSO met de station roepnaam. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Selecteer de einddatum voor de export van QSOs. De standaard datum is de laatste datum met de station roepnaam. Station callsign Station roepnaam My Locator Mijn Locator Start date Start datum End date Eind datum Ok Ok Cancel Annuleren DX DX Date/Time Datum/Tijd Band Band Mode Modulatie Not defined Niet gedefinieerd ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Alle QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - QSOs om te uploaden naar LoTW. This table shows the QSOs that will be sent to LoTW. Deze tabel toont de QSOs die worden verzonden naar LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSOs die worden verzonden naar ClubLog. This table shows the QSOs that will be sent to ClubLog. Deze tabel toont de QSOs die worden verzonden naar ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSOs die worden verzonden naar eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Deze tabel toont de QSOs die worden verzonden naar eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSOs die worden verzonden naar QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Deze tabel toont de QSOs die worden verzonden naar QRZ.com. This table shows the QSOs that will be exported to ADIF. Deze tabel toont de QSOs die worden geëxporteerd naar ADIF. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked Gewerkt C Confirmed, please try to keep the C Confirmed Bevestigd U Unknown Unknown AwardsWidget Recalculate Opnieuw berekenen Click to recalculate the award status. Klik voor het opnieuw berekenen van de award status. Select the year you want to check. Selecteer het jaar dat je wil controleren. QSOs QSOs DXCC DXCC CQ CQ Award Award Confirmed Bevestigd Worked Gewerkt WAZ WAZ Score Score Annual Jaarlijks Number of confirmed DXCC entities. Aantal bevestigde DXCC entiteiten. Number of worked DXCC entities. Aantal gewerkte DXCC entiteiten. Number of confirmed WAZ zones. Aantal bevestigde WAZ zones. Number of worked WAZ zones. Aantal gewerkte WAZ zones. Number of confirmed QSOs. Aantal bevestigde QSOs. Number of worked QSOs. Aantal gewerkte QSOs. Number of QSOs worked in the selected year. Aantal gewerkte QSOs in geselecteerd jaar. Number of DXCCs worked in the selected year. Aantal gewerkte DXCCs in geselecteerd jaar. Number of CQ Zones worked in the selected year. Aantal gewerkte CQ Zones in geselecteerd jaar. Score for the DXMarathon in the selected year. Score van de DXMarathon in het geselecteerde jaar. DX-Marathon DX-Marathon CTYPage Country data download Land gegevens download KLog needs country data... KLog heeft land gegevens nodig... &Download &Download &Ignore &Negeren Country data needed Land gegevens nodig KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. Klog maakt gebruik van het cty.csv bestand van https://www.country-files.com/ voor het verkrijgen van DXCC informatie. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Je moet het bestand cty.csv downloaden zodat KLog landen, locator, enz. van je QSOs kan tonen. Click on Download to download now. Klik op Download om het downloaden te starten. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Ik kan de computer niet vinden. Controleer je netwerk en probeer het opnieuw Wil je het opnieuw proberen? DXCCStatusWidget Update 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? Prefix Prefix Entity Entiteit Pref: Pref: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Entiteit nog niet gewerkt in deze band. DXClusterAssistant DX DX Freq Freq Status DXClusterWidget Click on Connect to connect to the DX-Cluster server Klik op verbinden om verbinding te maken met het DX-Cluster Connect Verbinden Clear Wissen Click on connect to connect to the DX-Cluster Klik op verbinden om verbinding te maken met het DX-Cluster Trying to connect to the server Probeer verbinding te maken met de server KLog DXCluster KLog DXCluster The host was not found. Please check: De server werd niet gevonden. Controleer: Check in QRZ.com Check this callsign in QRZ.com Clears the DXCluster command line. The DXCluster server desconnected the session. - your network connection; - the host name and port settings. - je netwerkverbinding; - de computernaam en poort nummer. 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. De verbinding werd geweigerd door de server. Controleer of het DXCluster beschikbaar is en of de computernaam en het poortnummer juist zijn. The following error occurred: %1. De volgende fout is opgetreden: %1. Connected to server Verbonden met de server KLog message KLog melding Enter your callsign to connect to the cluster: Voer je roepnaam in voor de verbinding met het cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Voer je wachtwoord in voor de verbinding met het cluster: (Druk op enter om zonder wachtwoord door te gaan) Disconnect Verbreken Not logged on, you may need to enter your callsign again. Niet aangemeld, misschien moet je roepnaam opnieuw ingevoerd worden. Enter here the commands to be sent to the DX-Cluster server. Voer hier het commando in dat naar het DX-Cluster verzonden moet worden. Connection closed by the server De verbinding is door de server gesloten Click on Connect to connect to the DX-Cluster server. Klik op verbinden om verbinding te maken met de server van het DX-Cluster. Send Verzenden It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Het was niet mogelijk om een bestand te openen voor het opslaan van de DX-Spots. DX-Cluster activiteit wordt niet bewaard! DataProxy_SQLite Software version in DB is null Software versie in de DB is null Query didn't failed Zoekvraag mislukte niet Aircraft Scatter Common term in hamradio, do not translate if not sure Vliegtuig-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-ondersteuning 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 Satelliet 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 Ja No Nee Requested Verzocht Ignore/Invalid Negeer/Ongeldig Validated Bevestigd Queued In de wachtrij Uploaded Geupload Do not upload Niet uploaden Modified Aangepast Bureau Common term in hamradio, do not translate if not sure Bureau Direct Rechtstreeks Electronic Electronisch 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 QSOs zijn bijgewerkt met een DXCC en Continent. KLog - Invalid call detected KLog - Ongeldige roepnaam gedetecteerd 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? Een lege roepnaam is gedetecteerd. Wil je dit QSO ook exporteren (klik op Ja) of wil je het niet opnemen in het export ADIF bestand? 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? Een ongeldige roepnaam is gedetecteerd %1. Wil je deze roepnaam ook exporteren (klik op Ja) of wil je hem verwijderen uit de export van het logboek? 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. Het exporteren van onjuiste roepnamen kan problemen veroorzaken in het programma waarin je het logbestand gaat importeren, de kans bestaat echter dat een juiste roepnaam door KLog als onjuist wordt aangemerkt. DownLoadCTY Download of cty.csv failed with the following error code: Het downloaden van cty.csv is mislukt met de volgende foutcode: Download of cty.csv done. Het downloaden van cty.csv is klaar. There is already a cty.csv file in the folder but it will be replaced with the new one. Er is al een cty.csv file aanwezig maar deze zal vervangen worden door een nieuwe versie. Could not open %1 for writing Kon bestand %1 niet beschijven FileAwardManager Open Award file Open Award bestand Award files (*.awa) Award bestanden (*.awa) Award file not opened Award bestand niet geopend KLog was not able to read the award file KLog kon het award bestand niet inlezen It was not possible to open the file %1 for reading. Het was niet mogelijk het bestand %1 te openen. AWA wrong format AWA verkeerd formaat The AWA file does not have the right format Het AWA bestand heeft niet het juiste formaat AWA file does not have an <EOH> field AWA bestand heeft geen <EOH> veld KLog - %1 KLog - %1 FileManager KLog - Error Klog - Fout The selected log does not exist, please check it again. Het geselecteerde logboek bestaat niet, controleer opnieuw. The selected callsign (%1) is not valid, please check it again to export the log. De geselecteerde roepnaam (%1) is niet geldig, controleer opnieuw voor export van het logboek. The file %1 can't be opened. het bestand %1 kan niet geopend worden. There are no QSOs pending to be exported with that station callsign. Er zijn geen QSOs met deze station roepnaam aanwezig om te exporteren. Writing ADIF file... Opslaan van ADIF bestand... Abort writing Annuleer opslaan Export Exporteer Exporting ADIF file... QSO: %1 / %2 Exporteer ADIF bestand... QSO: %1 / %2 KLog - User cancelled Klog - Door gebruiker geannuleerd You have canceled the file export. The file will be removed and no data will be exported. Je het de export naar het bestand geannuleerd. Het bestand zal verwijderd worden en er zijn geen gegevens gexporteerd. Do you still want to cancel? Weet je zeker dat je dit wil annuleren? Export progress Export wordt uitgevoerd Writing ADIF file... QSO: Opslaan ADIF bestand... QSO: KLog - File not opened KLog - Bestand niet geopend It was not possible to open the file %1 for reading. Het was niet mogelijk om het bestand %1 te openen. KLog was not able to read the LoTW file KLog was niet in staat het LoTW bestand in te lezen Processing LoTW ADIF file... Verwerken LoTW ADIG bestand... Abort processing Annuleer de verwerking LoTW reading LoTW inlezen KLog - Add new QSOs? KLog - Toevoegen nieuwe QSOs? Do you want to add non existing QSOs to your local log? Wil je een nog niet bestaand QSO toevoegen aan je lokale logboek? There are some QSOs in the LoTW log that are not in your local log. Er zijn een aantal QSOs in de LoTW logging die niet aanwezig zijn in je lokale logboek. Processing LoTW ADIF file...... QSO: %1 / %2 Verwerken LoTW ADIF bestand..... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Je hebt de LoTW verwerking geannuleerd. De verwerking stopt en je logboek is mogelijk niet compleet bijgewerkt. Reading LoTW file... Inlezen LoTW bestand... Abort reading Annuleer inlezen Importing LoTW ADIF file... Importeer LoTW ADIF bestand... QSO: QSO: You have canceled the file import. The file will be removed and no data will be imported. Je hebt het importeren van het bestand geannuleerd. Het bestand wordt verwijderd en er worden geen gegevens geïmporteerd. KLog - Log selection KLog - Log selectie There is more than one log in this logfile. Er zijn meerdere logboeken in het logbestand. All logs will be imported into the current log. Alle logboeken worden geïmporteerd in het huidige logboek. Do you want to continue? Wil je doorgaan? Reading ADIF file... Inlezen ADIF bestand... Do you want to add dupe QSOs to your local log? Wil je dubbele QSOs toevoegen aan je lokale logboek? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Er zijn enkele QSOs in dit logbestand die mogelijk dubbel zijn omdat zij dezelfde roepnaam, band & modulatie en nagenoeg dezelfde datum hebben. Importing ADIF file... Importeer ADIF bestand... KLog - Duplicated QSOs KLog - Duplikaat 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) Waarschijnlijk zijn er enkele dubbele QSOs in het ADIF bestand dat je nu importeert. Wil je doorgaan? (Duplikaat QSOs worden niet geïmporteerd) This QSO is not including the minimum data to consider a QSO as valid! Dit QSO heeft geen datum en is daardoor niet geldig! Please edit the ADIF file and make sure that it include at least: Wijzig het ADIF bestand en zorg ervoor dat het in iedergeval het volgende bevat: and en This QSO had: Dit QSO had: - The band missing and the following call: - De band ontbreekt en de volgende roepnaam: - The mode missing and the following call: - De modulatie ontbreekt en de volgende roepnaam: - The date missing and the following call: - De datum ontbreekt en de volgende roepnaam: - The time missing and the following call: - De tijd ontbreekt en de volgende roepnaam: Do you want to continue with the current file? Wil je doorgaan met het huidige bestand? KLog: Not all required data found! KLog: Niet alle benodigde gegevens werden gevonden! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Bij enkele QSOs in dit logboek, (n.l.: %1) lijkt de RST-TX informatie te ontbreken. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Klik op Ja voor het toevoegen van standaard %1 voor modulatie %2 bij alle QSOs met het zelfde probleem. If you select NO, maybe the QSO will not be imported. Als je NEE selecteerd, wordt het QSO mogelijk niet geïmporteerd. KLog: No RST TX found! KLog: Geen RST TX gevonden! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Bij enkele QSO's van dit logboek, (n.l.: %1) lijkt de RST-RX informatie te ontbreken. KLog: No RST RX found! KLog: Geen RST RX gevonden! KLog - No Station callsign entered. Klog - Geen station roepnaam ingevoerd. KLog - Apply to all QSOs in this log? KLog - Toevoegen aan alle QSOs van dit logboek? 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 heeft een QSO gevonden waarbij geen station roepnaam is gedefinieerd. Voer de roepnaam in die gebruikt is om het QSO met %1 op %2 te maken: KLog - QSO without Station Callsign KLog - QSO zonder station roepnaam KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog heeft een QSO gevonden waarbij de station roepnaam niet is gedefinieerd. Voer de station roepnaam in die werd gebruikt voor het maken van het QSO op %1: KLog - Don't ask again KLog - Niet opnieuw vragen Do you want to reuse your answer? Wil je dit antwoord opnieuw toepassen? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog zal zonder te vragen je laatste antwoord automatisch opnieuw gebruiken voor soortgelijke situaties als deze zich weer voordoen. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Datum/Tijd:</i> %1</li><li>Roepnaam: %2</li><li>Band: %3</li><li>Modulatie: %4</li></ul> KLog - QSO not found KLog - QSO niet gevonden Do you want to add this QSO to the log?: Wil je dit QSO toevoegen aan het logboek?: 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? Er is een QSO gevonden afkomstig van LoTW dat niet in je lokale logboek aanwezig is. Wil je dat KLog dit toevoegd aan je logboek? KLog - Invalid call detected KLog - Ongeldige roepnaam gedetecteerd 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? Een lege roepnaam is gedetecteerd. Wil je dit QSO alsnog exporteren (klik op Ja) of wil je het verwijderen uit het export log bestand? 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? Een ongeldige roepnaam is gedetecteerd %1. Wil je deze roepnaam alsnog exporteren (klik op Ja) of wil je het verwijderen uit het export log bestand? 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. Het exporteren van ongeldige roepnamen kan problemen veroorzaken voor programma´s waarin deze worden geïmporteerd, alhoewel een juiste roepnaam door KLog als ongeldig kan worden aangeduid. Je kunt de ADIF file wijzigen op het moment dat het export bestand is aangemaakt. HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Poort Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Selecteer de snelheid van de seriele poort. Port Poort Select the serial port. Only the serial ports that are detected are shown. Selecteer de seriele poort. Alleen de seriele poorten die zijn gedetecteerd worden getoond. Scan Scannen Click to identify the serial ports available in your computer. Klik voor het identificeren van de seriele poorten die aanwezig zijn in je computer. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Data bits Select the serial data bits. Selecteer het aantal seriele data bits. None Geen Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Flow Control Select the serial flow control Selecteer de seriele flow control No parity Geen pariteit Even Even Odd Oneven Space Space Mark Mark Parity Pariteit Select the serial parity. Selecteer de seriele pariteit. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Stop bits Select the serial stop bits. Selecteer de seriele 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 Continent Prefix Prefix CQ CQ ITU ITU Short Path Korte pad Long Path Lange pad Deg Graden Miles Mijlen Km Km IntroPage Welcome to KLog! Welkom bij KLog! Welcome to KLog! - brought to you under the terms of the GPL! Welkom bij KLog! - Waarop de regels van de GPL van toepassing zijn! Welcome to KLog Welkom bij KLog This looks like it's the first time you've run KLog on this computer. Het lijkt erop dat dit de eerste keer is dat je KLog hebt gestart op deze computer. KLog is a free hamradio logging program that can run on Linux, macOS, and Windows. KLog is een open source hamradio logboek programma dat gebruikt kan worden onder Linus, maxOS, en Windows. 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. Het is ontworpen om de basis DX en contect logboek functies te bieden. It supports QSL management, import and export of ADIF Het ondersteund QSL management, import en export naar ADIF and Cabrillo file formats and many other features... en Cabillo bestand formaat en vele andere functies... Before you can start using KLog, you will be asked to: Voordat je kunt starten met KLog, word je gevraagd om: Acknowledge to the terms of the license. Het aanvaarden van de licentievoorwaarden. Download the DX entities information. Download de DX entiteiten informatie. Enter your callsign, CQ zone, etc. and main configuration. Voer je roepnaam, CQ zone, enz. in en de basis configuratie. Enjoy KLog and contact the development team if you have any suggestions! Geniet van het gebruik van KLog en neem contact op met het ontwikkelteam als je suggesties hebt! LicPage KLog License information Klog Licentie informatie Welcome to KLog!- brought to you under the terms of the GPL! Welkom bij Klog! Geleverd onder de afspraken van de GPL! Acknowledge Bevestigen Be aware that KLog is free software. Wees je ervan bewust dat Klog open source software is. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Dubbel klik op de datum die je als startdatum wil gebruiken voor het downloaden van QSOs. KLog - LoTW password needed KLog - LoTW wachtwoord noodzakelijk Please enter your LoTW password: Voer je LoTW wachtwoord in: KLog - LoTW Station callsign KLog - LoTW station roepnaam There is not a single QSO in the log with that station callsign. Er is geen enkel QSO in het logboek met deze roepnaam. Are you sure that you want to use that station callsign (%1)? Weet je zeker dat je deze station roepnaam wil gebruiken (%1)? KLog - LoTW File already exists KLog - LoTW bestand bestaat al There is a file already existing with the name that will be used. Er is al een bestand met deze naam aanwezig. The file %1 already exist. Do you want to overwrite? Het bestand %1 bestaat al. Wil je het overschrijven? KLog - LoTW Can't write the file KLog - LoTW kan het bestand niet aanmaken KLog was not able to save the file %1. Error returned: %2 KLog was niet in staat het bestand %1 op te slaan. Foutmelding: %2 The file %1 already exists. Het bestand %1 is al aanwezig. Downloading data to file: %1. Downloaden van gegevens naar bestand %1. KLog - LoTW download KLog - LoTW download KLog - LoTW Start date selection KLog - LoTW start datum selectie 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. Dit is de eerste datum van een QSO met de roepnaam %1 in dit logboek bestand. Als je denkt dat er in LoTW eerdere QSOs aanwezig zijn, antwoord dan Nee. Do you want to used this date (%1) as start date? Wil je deze datum (%1) als start datum gebruiken? Do you want to use this date (%1) as start date? KLog - LoTW Download error KLog - LoTW Download foutmelding There was an error (%1) while downloading the file from LoTW. Er is een fout opgetreden (%1) tijdens het downloaden van het bestand van LoTW. The downloading error details are: %1 De details van de download foutmelding zijn: %1 KLog - LoTW Redirection found KLog - LoTW omleiding gevonden The remote server redirected our connection to %1 De server heeft onze connectie omgeleid naar %1 Do you want to follow the redirection? Wil je de omleiding volgen? KLog - LoTW File not found KLog - LoTW bestand niet gevonden KLog can't find the downloaded file. KLog kan het gedownloade bestand niet vinden. It was not possible for find the file %1 that has been just downloaded. Het was niet mogelijk om het zojuist gedownloade bestand %1 te vinden. KLog - LoTW user/password error KLog - LoTW gebruikersnaam/wachtwoord fout LoTW server did not recognized your user/password LoTW server herkende je gebruikersnaam/wachtwoord niet Check your user and password and ensure your are using the right one before trying again. Controleer gebruikersnaam en wachtwoord en verzeker je ervan dat deze juist zijn voordat je het opnieuw probeert. KLog - LoTW No QSOs KLog - LoTW geen QSOs LoTW sent no QSOs LoTW heeft geen QSOs verzonden It seems that LoTW has no QSO with the Station Callsign you are using (%1). Het lijkt erop dat LoTW geen QSOs bevat met de station roepnaam die jij gebruikt (%1). KLog - LoTW Unknown error KLog - LoTW onbekende fout KLog can't recognize the file that has been downloaded from LoTW. KLog herkent het bestand niet dat is gedownload van LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. Probeer het opnieuw en verstuur het gedownloade bestand (%1) naar de ontwikkelaars voor nadere analyse. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog heeft %1 QSOs succesvol gedownload. Wil je het logboek bijwerken met het gedownloade gegevens? Now KLog will process the downloaded QSO and update your local log. KLog zal nu het gedownloade QSO verwerken en je lokale logboek bijwerken. LogModel Date Datum Call Roepnaam Band Band Mode Modulatie RSTtx RSTtx RSTrx RSTrx Comment Commentaar LogWindow There was a problem with the log, please restart KLog and contact the development team if the error persist. QSL Send QSL Verz QSL Rcvd QSL Ontv &Delete &Verwijder Delete a QSO Verwijder een QSO &Edit QSO B&ewerken Edit this QSO Bewerk een QSO Via &bureau Via &bureau Send this QSL via bureau Verzend deze QSL via bureau D&irect D&irect Send this QSL via direct Verzend deze QSL rechtstreeks Via bureau Via bureau QSL &received via bureau QSL &ontvangen via bureau Direct Rechtstreeks QSL received via direc&t QSL rechstreek&s ontvangen Check in QRZ.com Controleer in QRZ.com Check this callsign in QRZ.com Controleer roepnaam in QRZ.com Check in DXHeat.com Controleer in DXHeat.com Check this callsign in DXHeat.com Controleer roepnaam in DXHeat.com Delete selected QSOs Verwijder geselecteerd QSOs Delete the selected QSOs Verwijder de geselecteerde QSOs Export to ADIF Exporteer naar ADIF Export the selected QSOs to an ADIF file. Exporteer geselecteerde QSOs naar een ADIF bestand. Upload to LoTW Upload naar LoTW Upload the selected QSOs to LoTW Upload de geselecteerde QSOs naar loTW Upload to ClubLog Upload naar ClubLog Upload the selected QSOs to ClubLog Upload de geselecteerde QSOs naar ClubLog Upload to eQSL.cc Upload naar eQSL.cc Upload the selected QSOs to eQSL.cc Upload de geselecteerde QSOs naar eQSL.cc Send these QSLs via bureau Verzend deze QSLs via bureau Send these QSLs via direct Verzend deze QSLs rechtstreeks QSLs received via bureau QSLs ontvangen via bureau QSLs received via direc&t QSLs ontvangen rechstreek&s Select none Selecteer geen Remove all selections Verwijder alle geselecteerden Select all Selecteer alles Select all the QSOs Selecteer alle QSOs MainQSOEntryWidget &Add &Toevoegen &Clear &Wissen Callsign of the QSO. Roepnaam van het QSO. Band of the QSO. Band van het QSO. Mode of the QSO. Modulatie van het QSO. Date of the QSO. Datum van het QSO. Time of the QSO. Tijd van het QSO. Add the QSO to the log. Voeg het QSO toe aan het logboek. Clears the QSO entry. Wist de QSO invoer. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog toont real time als die geactiveerd is. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Roepnaam &Save &Cancel &Annuleren &Modify &Wijzigen 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 Controleer altijd de huidige roepnaam in QRZ.com KLog - File not open KLog - Bestand niet geopend It was not possible to open the debug file for writing. No debug log will be saved! Het was niet mogelijk het debug bestand te openen. Er wordt geen debug log bewaard! Status bar ... Status balk ... DX Entity DX Entiteit Starting KLog KLog wordt gestart &Log Window &Log Window Upload the queued QSOs to LoTW Upload de QSOs in de wachtrij naar LoTW Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split KLog CTY.dat update KLog CTY.dat update KLog needs to update the Entities database. KLog moet de Entiteiten database updaten. You can update the entities database in Tools->Update cty.csv Je kunt de entiteiten database updaten in Tools->Update cty.csv Do you want to do it now? Wil je dat nu doen? It seems that you have never done a backup or exported your log to ADIF. Het lijkt erop dat je nog nooit een backup van je logboek naar ADIF export bestand hebt gemaakt. It seems that the latest backup you did is older than one month. Het lijkt erop dat de laatste backup die je hebt gemaakt ouder is dan één maand. Log backup recommended! Logboek backup aanbevolen! 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. Het is aan te raden om regelmatig een volledige backup van je logboek te maken om verlies van gegevens te voorkomen. Nadat je een export van je logboek naar een ADIF bestand hebt gemaakt, wordt aangeraden om dit bestand op een veilige plaats te bewaren zoals een USB stick, een cloud omgeving, een andere computer, .... KLog zal je maandelijke herinneren aan het maken van een backup. KLog backup Klog backup The backup was done successfully De backup is succesvol uitgevoerd KLog will remind you to backup your data again in aprox one month. KLog zal je eraan herinneren om iedere maand een backup te maken. The backup was not properly done. De backup is niet goed uitgevoerd. It is recommended to backup your data periodically to prevent lose or corruption of your log. Het wordt aanbevolen om je gegevens periodiek te backuppen om verlies en corruptie van je logboek te voorkomen. KLog new version detected! KLog nieuwe versie gedetecteerd! It seems that you are running this version of KLog for the first time. Het lijkt erop dat je deze versie van KLog voor het eerst gebruikt. The setup will be open to allow you to do any new setup you may need. De instellingen worden geopend om deze aan te passen als dat nodig is. Ready Klaar KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSOs: %2 KLog - %1 - QSOs: %2 KLog KLog KLog - Unexpected error KLog - Onverwachte fout An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Een onverwachte fout is opgetreden bij het toevoegen van het QSO in je logboek. Als dit probleem blijft optreden neem dan contact op met de ontwikkelaar voor een nadere analyse: KLog - Not valid call KLog - Geen geldige roepnaam The callsign %1 is not a valid call. Do you really want to add this callsign to the log? De roepnaam %1 is niet geldig. Wil je deze roepnaam inderdaad toevoegen aan je logboek? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Het toevoegen van een ongeldige roepnaam kan problemen veroorzaken bij de aanvraag van awards of bij het exporteren van ADIF bestanden naar andere programma's. KLog - Select correct entity KLog - Selecteer de juiste entiteit You have selected an entity: Je hebt een entiteit geselecteerd: that is different from the KLog proposed entity: die afwijkend is van de door KLog voorgestelde entiteit: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klik op de prefix van de juiste entiteit of Annuleer om het QSO opnieuw te bewerken. KLog - Not valid callsign KLog - Geen geldige roepnaam The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? De roepnaam %1 is niet geldig. Wil je deze roepnaam inderdaad toevoegen an je logboek? No DXCC Geen DXCC None Geen Click on the prefix of the right entity or Cancel to correct. Klik op de prefix van de juiste entiteit of Annuleer om te wijzigen. Save ADIF File Bewaar ADIF bestand You have requested to delete several QSOs Je hebt verzocht om bepaalde QSOs te verwijderen This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Deze actie zal de geselcteerde QSOs definitief verwijderen en deze verwijdering kan niet meer hersteld worden. Are you sure? Weet je het zeker? You have requested to delete the QSO with: %1 Je hebt verzocht om de QSOs te verwijderen met: %1 KLog ClubLog error KLog ClubLog fout The ClubLog upload process has finished with an error and the log was possibly not uploaded. De upload naar ClubLog is beëindigd met een foutmelding en het logboek is mogelijk niet verstuurd. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Controleer je inloggegevens, je internet verbinding en je ClubLog account. De ontvangen foutcode was: %1 KLog ClubLog KLog ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Wil je de naar ClubLog verstuurde gegevens aanmerken als geupload? KLog - ClubLog KLog - ClubLog Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. KLog - Backup Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. KLog - ClubLog error There was an error while updating to Yes the ClubLog QSO upload information. Er was een fout opgetreden tijdens het op Ja zetten van de ClubLog QSO upload informatie. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Het ClubLog upload proces is afgerond en KLog heeft een bestand (%1) gecreëerd in de KLog directory. Wil je dat KLog dit bestand verwijderd? The file has been removed. Het bestand is verwijderd. The file has not been removed. Het bestand is niet verwijderd. It seems that there was something that prevented KLog from removing the file You can remove it manually. Het lijkt erop dat het KLog niet gelukt is om het bestand te verwijderen Je kunt het handmatig verwijderen. KLog eQSL error KLog eQSL fout The eQSL upload process has finished with an error and the log was possibly not uploaded. Het eQSL upload proces is afgerond met een foutmelding en het logboek is mogelijk niet verzonden. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Controleer je inloggegevens, je internet verbinding en je eQSL account. De ontvangen foutmelding was: %1 KLog eQSL KLog eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Wil je de naar eQSL geuploade QSOs markeren als verzonden? KLog - eQSL KLog - eQSL There was an error while updating to Yes the eQSL QSO upload information. Er is een fout opgetreden tijdens het op ja zetten van de eQSL QSO upload informatie. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Het eQSL upload proces is afgerond en KLog heeft een bestand (%1) gecreëerd in de KLog directory. Wil je dat KLog dit bestand verwijderd? KLog QRZ.com error KLog QRZ.com fout The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Het QRZ.com upload proces is afgerond met een foutmelding en het logboek is mogelijk niet verzonden. KLog QRZ.com KLog QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Wil je de naar QRZ.com geuploade QSOs markeren als verzonden? KLog - QRZ.com KLog - QRZ.com 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. There was an error while updating to Yes the QRZ.com QSO upload information. Er is een fout opgetreden tijdens het op ja zetten van de QRZ.com QSO upload informatie. The QRZ.com upload process has finished successfully Het upload proces naar QRZ.com is succesvol afgerond Call not found in QRZ.com Roepnaam niet gevonden in QRZ.com KLog - QRZ.com error KLog - QRZ.com fout KLog has received an error from QRZ.com. KLog heeft een foutmelding ontvangen van QRZ.com. KLog %1 KLog %1 You need to activate the %1 service in the eLog preferences. Je moet de %1 service in de eLog instellingen activeren. KLog - Exit KLog - Afsluiten Do you really want to exit KLog? Wil je KLog inderdaad afsluiten? The logfile has been modified. Het logboek is aangepast. Do you want to save your changes? Wil je de wijzigingen bewaren? KLog ADIF export KLog ADIF export It is important to export to ADIF and save a copy as a backup. Het is belangrijk een export naar ADIF te maken en een copie als backup te bewaren. Saving the log was done successfully. Het bewaren van het logboek is succesvol verlopen. The ADIF export was not properly done. De ADIF export is niet juist verlopen. &File &Bestand &Import from ADIF ... &Import van ADIF ... Import an ADIF file into the current log. Importeer een ADIF bestand in het huidige logboek. Export to ADIF ... Export naar ADIF ... Export the current log to an ADIF logfile. Exporteer het huidige logboek naar een ADIF bestand. Export all logs to ADIF ... Exporteer alle logboeken naar ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporteer ALLE QSOs naar één ADIF bestand, voeg QSOs samen vanuit alle logboeken. &Print Log ... &Print Log ... Print your log. Print je logboek. KLog folder KLog directory Opens the data folder of KLog. Open de gegevens directory van KLog. Settings ... E&xit E&xit &Tools &Tools Fill in QSO data Vul de QSO gegevens in Go through the log reusing previous QSOs to fill missing information in other QSOs. Doorzoek het logboek en hergebruik vorige QSOs om ontbrekende informatie in andere QSOs aan te vullen. QSL tools ... QSL tools ... Find QSO to QSL Zoek QSO voor QSL Shows QSOs for which you should send your QSL and request the DX QSL. Toon QSOs waarvoor een QSL verzonden moet worden met een verzoek voor de DX QSL. Find My-QSLs pending to send Zoek mijn-QSLs in afwachting van verzenden Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Toon de QSOs die in afwachting van het verzenden van QSLs zijn. Zorg ervoor dat deze wachtrij leeg blijft! Find DX-QSLs pending to receive Zoek DX-QSLs in afwachting van ontvangst Shows DX-QSLs for which requests or QSLs have been sent with no answer. Toon DX-QSls waarvoor een verzoek of QSLs zijn verzonden zonder antwoord. Find requested pending to receive Zoek aanvragen die in afwachting van ontvangst zijn Shows the DX-QSLs that have been requested. Toon de DX-QSLs waarvoor een verzoek is geplaatst. LoTW tools ... LoTW tools ... Queue all QSLs from this log to be sent Maak een wachtrij voor alle QSLs uit die logboek die verzonden moeten worden Mark all non-sent QSOs in this log as queued to be uploaded. Plaats alle niet verzonden QSOs van dit logboek in een wachtrij om verzonden te worden. Queue all QSLs to be sent Plaats alle QSLs in een wachtrij voor verzending Put all the non-sent QSOs in the queue to be uploaded. Plaats alle niet verzonden QSOs in een wachtrij voor verzending. Mark all queued QSOs from this log as sent Markeer alle QSOs in de wachtrij van dit logboek als verzonden Mark all queued QSOs in this log as sent to LoTW. Markeer alls QSOs in de wachtrij van dit logboek als verzonden naar LoTW. Mark all queued QSOs as sent Markeer alle QSOs in de wachtrij als verzonden Mark all queued QSOs as sent to LoTW. Markeer alle QSOs in de wachtrij als verzonden naar LoTW. Download from LoTW ... Download vanaf LoTW ... Download the full log from LoTW ... Download het complets logboek van LoTW ... ClubLog tools ... ClubLog tools ... Queue all the QSOs to be uploaded Plaats alle QSOs in een wachtrij om te verzenden Upload the queued QSOs to ClubLog ... Verzend de QSOs in de wachtrij naar ClubLog ... eQSL tools ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... Verzend alle QSOs in de wachtrij naar eQSL.cc ... QRZ.com tools ... QRZ.com tools ... Check the current callsign in QRZ.com Controleer de huidige roepnaam in QRZ.com Queue all the QSO to be uploaded Plaats alle QSOs in een wachtrij om te verzenden Upload the queued QSOs to QRZ.com ... Verzend de QSOs in de wachtrij naar QRZ.com ... Update cty.csv cty.csv bijwerken For updated DX-Entity data, update cty.csv. Voor bijwerken DX-Entity gegevens, update cty.csv. Update Satellite Data Bijwerken Satelliet gegevens Stats Statistieken Show the statistics of your radio activity. Toon de statestieken van je radioactiviteit. Setup Instellingen Setup ... Instellingen ... &Help &Help Online manual (F1) ... &Tips ... &Tips ... &Debug ... &Debug ... &About ... &Over ... About Qt ... Over QT ... Check updates ... Controleer updates ... KLog LoTW KLog LoTW All pending QSOs of this log has been marked as queued for LoTW! Alle QSOs van dit logboek zijn gemarkeerd voor de wachtrij van LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. Ga nu naar het Bestand menu voor het exporteren van het LoTW bestand en upload het naar LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Er was een probleem bij het markeren van de QSOs in dewachtrij voor LoTW! Your log has been updated with the LoTW downloaded QSOs. Je logboek is bijgewerkt met de QSOs vanuit de LoTW download. KLog has updated %1 QSOs from LoTW. KLog is bijgewerkt met %1 QSOs vanuit LoTW. Your log has not been updated. Je logboek is niet bijgewerkt. 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. Er is geen QSO bijgewerkt met de gegevens afkomstig van LoTW. Dit kan veroorzaakt zijn door fouten in het logbestand of omdat je logboek al was bijgewerkt. 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. All pending QSOs has been marked as queued for LoTW! Alle QSOs in de wachtrij zijn gemarkeerd voor LoTW! There was a problem to mark all pending QSOs as queued for LoTW! KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL is niet geïnstalleerd of KLog kan het niet vinden. Controleer de configuratie. TQSL finished with no error. TQSL is afgesloten zonder fouten. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Fout #1: Het proces werd geannuleerd door de gebruiker of TQSL was niet geconfigureerd. Er zijn geen QSOs verstuurd. Error #2: Upload was rejected by LoTW, please check your data. Fout #2: De upload werd geweigerd door LoTW, controleer je gegevens. Error #3: The TQSL server returned an unexpected response. Fout #3: De TQSL server gaf een onverwachte reactie. Error #4: There was a TQSL error. Fout #4: Er is een TQSL fout opgetreden. Error #5: There was a TQSLLib error. Fout #5: Er is een TQSLLib fout opgetreden. Error #6: It was not possible to open the input file. Fout #6: Het was niet mogelijk om het input bestand te openen. Error #7: It was not possible to open the ouput file. Fout #7: Het was niet mogelijk om het output bestand te openen. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Fout #8: Er zijn geen QSOs verwerkt aangezien enkele QSOs duplikaat of buiten het datum bereik waren. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Fout #9: Enkele QSOs werden verwerkt en enkele QSOs werden genegeerd omdat zij duplikaat of buiten het datum bereik waren. Error #10: Command syntax error. KLog sent a bad syntax command. Fout #10: Commando syntax fout. KLog heeft een verkeerd commando gestuurd. Error #11: LoTW Connection error (no network or LoTW is unreachable). Fout #11: LoTW verbindingsfout (geen netwerk of LoTW is onbereikbaar). Error #00: Unexpected error. Please contact the development team. Fout #00: Onverwachte fout. Neem contact op met het ontwikkel team. The log that you have selected contains more than just one station callsign. Het logboek dat je hebt geselecteerd bevat meer dat één station roepnaam. Please select the station callsign you want to mark as sent to LoTW: Selcteer de station roepnaam die gemarkeerd moet worden voor verzending naar LoTW: Station Callsign: Station Roepnaam: Define Station Callsign Definieer Station Roepnaam You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the callsign you are entering here. Je hebt geen roepnaam geselecteerd. KLog markeert QSOs zonder gedefinieerde station roepnaam en die met de roepnaam die je hier invoert. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Voer de station roepnaam in voor gebruik in dit logboek of laat het leeg voor QSO zonder gedefinieerde station roepnaam: KLog - No station selected KLog - Geen station geselecteerd No station callsign has been selected and therefore no log will be marked Er is geen station roepnaam geselecteerd en daarom wordt er geen log gemarkeerd 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 Weet je zeker dat je ALLE QSOs wil markeren om te UPLOADEN? Dit moet ALLEEN DE EERSTE KEER PLAATSVINDEN bij het uploaden naar LoTW All queued QSOs of this log has been marked as sent for LoTW! Alle QSOs in de wachtwij zijn gemarkeerd om te verzenden naar LoTW! There was a problem to mark all queued QSOs of this log as sent for LoTW! Er was een probleem bij het markeren van de QSOs in de wachtrij van dit logboek voor verzending naar LoTW! All queued QSOs has been marked as sent to LoTW! Alle QSOs in de wachtrij zijn gemarkeerd voor verzending naar LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Er was een probleem bij het markeren van de QSOs in de wachtrij voor verzending naar LoTW! KLog - %1 KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent Show Map 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. Now you can upload them to 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 ... Over ... KLog update checking result KLog update controle resultaat Congratulations! Gefeliciteerd! You already have the latest version. Je maakt al gebruik van de laatste versie. You can find the KLog data folder here: Je kunt de KLog directory hier vinden: start starten UDP Server error The UDP server failed to %1. start or stop UPD server fout De UPD server kon niet %1. stop stoppen TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. Native Error It seems that there are no QSOs in the database. Het lijkt erop dat er geen QSOs in de database aanwezig zijn. 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. ALs je er zeker van bent dat er QSOs in de database aanwezig zijn en KLog kan deze niet vinden, neem dan contact op met de ontwikkelaars (Zie Over KLog) voor hulp. Sends the log to LoTW calling TQSL. Verstuur het logboek naar LoTW door aanroepen TQSL. This function is disabled. Go to the Setup->LoTW tab to enable it. Deze functie is uitgeschakeld. Ga naar Instellingen-> LoTW tabblad om deze in te schakelen. TX Frequency in MHz. TX frequentie in MHz. RX Frequency in MHz. RX frequentie in MHz. Power used by the contacted station. Vermogen gebruikt door het verbonden station. Logging operator's callsign. Logging operator roepnaam. Callsign used over the air. Roepnaam gebruikt in de ether. Name of the contacted operator. Naam van de verbonden operator. QTH of the contacted station. QTH van het verbonden station. Locator of the contacted station. Locator van het verbonden station. TX RST. TX RST. RX RST. RX RST. Status of the DX entity. Status van de DX entiteit. Name of the DX entity. Naam van de DX entiteit. Name Naam QTH QTH DX Locator DX Locator Power(rx) Vermogen(rx) RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX QSO QSO QSL QSL eQSL eQSL Comment Commentaar Others Overig My Data Mijn Gegevens Satellite Satelliet Info Info Awards Award Search Zoeken Log Log DX-Cluster DX-Cluster DXCC DXCC No QSOs have been exported to ADIF. Er zijn geen QSOs geëxporteerd naar ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog heeft %1 QSOs geëxporteerd naar ADIF bestand: %2 KLog - LoTW KLog - LoTW KLog - Update checking result You need to select one station callsign to be able to send your log to LoTW. Je moet een station roepnaam selecteren om je logboek te verzenden naar 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? Als je enig QSO hebt verzonden naar LoTW terwijl je TQSL gebruikt dat kun je deze nu markeren als verzonden door KLog. Wil je alle verzonden QSOs markeren als verzonden naar LoTW? There was an error while updating to Yes the LoTW QSL sent information. Er was een fout opgetreden tijdens het op Ja zetten van de LoTW QSL verzend informatie. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Het LoTW verzend proces is afgerond en KLog heeft een bestand (%1) aangemaakt in de KLog directory. Wil je dat KLog dit bestand verwijderd? You need to select one station callsign to be able to send your log to ClubLog. Je moet een station roepnaam selecteren om je logboek naar ClubLog te kunnen verzenden. Do you want to add this QSOs to your ClubLog existing log? Wil je deze QSOs toevoegen aan je bestaande ClubLog logboek? If you don't agree, this upload will overwrite your current ClubLog existing log. Als je niet akkoord gaat, dan zal je huidige bestaande ClubLog logboek overschreven worden. You need to select one station callsign to be able to send your log to eQSL.cc. Je moet een station roepnaam selecteren om je logboek naar eQSL.cc te kunnen verzenden. KLog - Select the Station Callsign. KLog - Selecteer de Station Roepnaam. Select the Station Callsign to use when quering LoTW: Selecteer de Station Roepnaam die gebruikt zal worden voor het bevragen van LoTW: Please check the LoTW setup Controleer de LoTW instellingen You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Je hebt geen LoTW gebruiker of geldige Station Roepnaam ingesteld. Open het LoTW tabblad bij de Instellingen en configureer je LoTW verbinding. 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 Weet je zeker dat je ALLE QSOs wil markeren om deze te verzenden? Dit is ALLEEN NODIG ALS DIT DE EERSTE KEER IS dat QSOs naar ClubLog worden geupload The log is ready to be uploaded to ClubLog. Het logboek staat klaar om verzonden te worden naar ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Alle QSOs in dit logboek zijn gemarkeerd als Gewijzigd in het ClubLog status veld KLog could not mark the full log to be sent to ClubLog KLog was niet in staat om het complete logboek te markeren voor verzending naar ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Iets heeft voorkomen dat KLog de QSOs als gewijzigd heeft gemarkeerd. Herstart KLog en probeer het opnieuw voordat je contact opneemt met de KLog ontwikkelaars. 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 Weet je zeker dat je ALLE QSOs wil markeren als VERZONDEN? Dit is ALLEEN NODIG ALS DIT DE EERSTE KEER IS dat QSOs naar eQSL worden geupload The log is ready to be uploaded to eQSL.cc. Het logboek is klaar om naar eQSL.cc te worden verzonden. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Alle QSOs in dit logboek zijn gemarkeerd als Gewijzigd in het eQSL.cc status veld KLog could not mark the full log to be sent to eQSL KLog was niet in staat om het complete logboek te markeren voor verzending naar eQSL KLog QRZ.COM 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 Weet je zeker dat je ALLE QSOs wil markeren als VERZONDEN? Dit is ALLEEN NODIG ALS DIT DE EERSTE KEER IS dat QSOs naar QRZ.COM worden geupload The log is ready to be uploaded to QRZ.com. Het logboek is klaar om naar QRZ.com te worden verzonden. All the QSOs in this log has been marked as Modified in the QRZ.com status field Alle QSOs in dit logboek zijn gemarkeerd als Gewijzigd in het QRZ.com status veld KLog could not mark the full log to be sent to QRZ.com KLog was niet in staat om het complete logboek te markeren voor verzending naar QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Je moet een juiste API key definieren voor je QRZ.com logboek in de eLog instellingen. Open File Open bestand DX QTH locator. DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH locator. Het formaat moet Maidenhead zijn zoals b.v. JO23VE tot maximaal 10 karakters. - Needed for DXMarathon - Nodig voor DXMarathon Filling QSOs ... Aanvullen QSOs ... Abort filling Annuleer aanvullen Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Aanvullen DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Nummer Date/Time Datum/Tijd Callsign Roepnaam RSTtx RSTtx RSTrx RSTrx Band Band Mode Modulatie Print Log Print Logboek Printing the log ... Printen van het logboek ... Abort printing Annuleer printen Printing the log... QSO: Printen van het logboek... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! TX Frequentie in MHz. Frequentie valt niet binnen een zendamateur band! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frequentie in MHz. Frequentie valt niet binnen een zendamateur band! KLog QSO received KLog QSO ontvangen The following QSO data has been received from WSJT-X to be logged: De volgende QSO gegevens werden ontvangen van WSJT-X om te loggen: Freq Freq Time On Tijd aan Time Off Tijd uit RST TX RST TX RST RX RST RX DX-Grid DX-Vak Local-Grid Lokaal Vak Station Callsign Station Roepnaam Operator Callsign Operator Roepnaam KLog - WSJTX Dupe QSO KLog - WSJTX duplikaat QSO This QSO seems to be duplicated. Do you want to save or discard it? Dit QSO lijkt een duplikaat te zijn. Wil je het bewaren of annuleren? 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. Duplikaat QSOs moeten overeenkomen met een ander bestaand QSO met dezelfde roepnaam, band, mode, datum en tijd, rekening houdend met de periode die gedefinieerd kan worden bij de instellingen. QSO logged from WSJT-X: QSO gelogd vanaf WSJY-X: KLog - Non-supported mode KLog - Niet ondersteunde modulatie A new mode not supported by KLog has been received from an external program or radio: Een nieuwe modulatie die niet door KLog wordt ondersteund is ontvangen vanaf een extern programma of vanaf de radio: If the received mode is correct, please contact KLog development team and request support for that mode Als de ontvangen modulatie correct is, neem dan contact op met het KLog ontwikkel team met het verzoek de modulatie toe te voegen aan KLog Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Wil je deze meldingen blijven ontvangen? (Uitschakelen van deze meldingen voorkomt dat niet gelding modulatie wordt gedetecteerd) KLog - Duplicated satellite KLog - Duplikaat satelliet A duplicated satellite has been detected in the file and will not be imported. Een duplikaat satelliet is in het bestand gedetecteerd en zal niet worden geïmporteerd. Please check the satellite information file and ensure it is properly populated. Controleer het satelliet informatie bestand en verzeker je ervan dat het juist is samengesteld. Now you will see a more detailed error that can be used for debugging... Nu zul je meer gedetaileerde foutmeldingen zien die kunnen worden gebruikt voor debugging... An unexpected error ocurred!! Een onverwachte fout is opgetreden!! If the problem persists, please contact the developers Als het probleem blijft bestaan, neem dan contact op met de ontwikkelaars for analysis: voor analyse: Error in function Fout in functionaliteit Error code Fout code Error text Fout tekst Failed query Foutieve zoekvraag Recommendation: Aanbeveling: Periodically export your data to ADIF to prevent a potential data loss. Periodieke export van je gegevens naar ADIF voorkomt het verlies van gegevens. KLog - Show errors KLog - Toon fouten Do you want to keep showing errors? Wil je dat fouten getoond blijven worden? MainWindowInputComment Comment Commentaar Add a comment for this QSO. Voeg commentaar toe aan dit QSO. Keep this data Gebruik deze gegevens Data entered in this tab will be copied into the next QSO. Ingevoerde data in dit scherm wordt gekopieerd naar het volgende QSO. MainWindowInputEQSL Date of the ClubLog upload. Datum van ClubLog upload. Date of the QRZ.com upload. Datum van QRZ.com upload. Date of the eQSL sending. Datum van eQSL verzonden. Date of the eQSL reception. Datum van eQSL ontvangen. Date of the LoTW sending. Datum van LoTW verzonden. Date of the LoTW reception. Datum van LoTW ontvangen. Status on ClubLog. Status van ClubLog. Status on QRZ.com. Status van QRZ.com. Status of the eQSL sending. Status van eQSL verzonden. Status of the eQSL reception. Status van eQSL ontvangen. Status of the LoTW sending. Status van LoTW verzenden. Status of the LoTW reception. Status van LoTW ontvangen. ClubLog ClubLog QRZ.com QRZ.com eQSL Sent eQSL Verz eQSL Rec eQSL ontv LoTW Sent LoTW verz LoTW Rec LoTW ontv MainWindowInputOthers Primary Div Primaire Div Secondary Div Secundaire Div IOTA IOTA Entity Entiteit Propagation mode Propagatie mode Others Keep propagation mode Bewaar propagatie mode Show All Select the primary division for this QSO. Selecteer de primaire afdeling van dir QSO. Select the secondary division for this QSO. Selecteer de secundaire afdeling van dit QSO. Select the entity for this QSO. Selecteer de entiteit van dit QSO. Select the propagation mode for this QSO. Selecteer de propagatie mode van dit QSO. Select the IOTA continent for this QSO. Selecteer het IOTA continent van dit QSO. Select the IOTA reference number for this QSO. Selecteer het IOTA referentienummer van dit QSO. Keeps the same propagation mode for next QSO. Bewaar dezelfde propagatie mode voor het volgende QSO. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Niet geïdentificeerd Not - Not Identified Niet - Niet geidentificeerd None Identified SOTA Ref Age Distance POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected MainWindowInputQSL QSL Sent QSL Verz QSL Rec QSL Ontv QSL Via QSL Via QSL Msg QSL Manager Status of the QSL sending. Status van QSL verzenden. Status of the QSL reception. Status van QSL ontvangen. QSL sending information. QSL verzenden informatie. QSL reception information. QSL ontvangen informatie. Date of the QSL sending. Datum van QSL verzenden. Date of the QSL reception. Datum van QSL ontvangen. Message of the QSL. Melding over QSL. QSL via information. QSL via informatie. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Vermogen gebruikt door het verbonden station. Name of the contacted operator. Naam van de verbonden operator. QTH of the contacted station. QTH van het verbonden station. Locator of the contacted station. Locator van het verbonden station. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Naam QTH QTH DX Locator DX Locator Power(rx) Vermogen(rx) RST TX RX Frequency DX QTH locator. DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH locator. Het formaat moet Maidenhead zijn zoals b.v. JO23VE tot maximaal 10 karakters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Watts Keep this data Gebruik deze gegevens Data entered in this tab will be copied into the next QSO. De ingevoerde gegevens in dit tabblad worden gekopieerd naar het volgende QSO. Power used for the QSO in watts. Gebruikt vermogen voor dit QSO in Watts. Logging operator's callsign. Operator roepnaam logger. Callsign used over the air. Roepnaam station. My QTH locator. Mijn QTH locator. Power Vermogen Operator callsign Operator roepnaam Station Callsign Station Roepnaam My Locator Mijn Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Mijn QTH locator. Formaat in Maidenhead bijvoorbeeld JO22AA tot maximaal 10 karakters. My Rig My Antenna My POTA Ref My SIG My SIG Info My SOTA Ref My VUCC_GRIDS My WWFF Ref MainWindowSatTab Keep this data Gebruik deze gegevens Data entered in this tab will be copied into the next QSO. Ingevoerde gegevens in dit tabblad worden gecopieerd naar het volgende QSO. Other - Sat not in the list Anders - Sat niet in de lijst Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Naam van de Satelliet als deze niet in de lijst staat: "%1" om dit veld te activeren (formaat zoals AO-51). Satellite mode used. Satelliet gebruikte modulatie. Select the satellite you are using. Selecteer de satelliet die je gebruikt. UpLink band. UpLink band. DownLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator van het DX station. Dit veld wordt gesynchroniseerd met het Locator veld in het QSO tabblad. UpLink UpLink DownLink DownLink Satellite Satelliet Mode Modulatie DX Locator DX Locator Other Ander MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Locator van het DX station. Formaat is Maidenhead zoals JO23VE tot maximaal 10 karakters. Not Sat QSO Geen 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 heeft een satelliet naam gedetecteerd die het niet herkent. Als het één van de bekende namen van satellieten moet gebruiken selecteerd die dan uit de lijst. Het alternatief is om contact op te nemen met het ontwikkel team om de nieuwe satelliet toe te voegen. The satellite you have in your QSO is: De satelliet in je 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! Wees je ervan bewust dat de satelliet naam niet bewaard wordt als deze niet in de lijst voorkomt, deze informatie kan dan verloren gaan! RX Frequency in MHz. Frequency is not in a hamradio band! RX frequentie in MHz. Frequentie valt niet in een zendamateur band! RX Frequency in MHz. RX Frequentie in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX frequentie in MHz. Frequentie valt niet in een zendamateur band! TX Frequency in MHz. TX Frequentie in MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Niet geïdentificeerd QObject New One, work it! Nieuw station, werk het! Needed, work it! Nodig, werk het! Worked but not confirmed Gewerkt maar niet bevestigd Confirmed Bevestigd Not identified Niet geïdentificeerd Database Error Darabase fout KLog DB needs to be upgraded. KLog DB moet worden geupgrade. Do you want to upgrade it now? Wil je het nu upgraden? If DB is not upgraded KLog may not work properly. Als de DB niet is geupgrade kan KLog mogelijk niet goed werken. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Het upgraden van de software kan problemen veroorzaken. Een backup maken van je DB voordat de upgrade wordt gestart is altijd een goed idee. Do you want to backup your DB now? Wil je nu een backup maken van je DB? The backup finished successfully. De backup is succesvol afgerond. You can find the backup in this file: %1 Je kunt het backup bestand vinden in deze file: %1 The backup was not properly done. De backup is niet goed uitgevoerd. You will be sent back to the starting point. Je keert terug naar het begin punt. KLog - DB can't be updated automatically KLog - DB kan niet automatisch geupdate worden You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Je voert een upgrade uit op een te oude versie van KLog en deze upgrade kan niet automatisch worden uitgevoerd op die versie. 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. Het proces voor upgrade is: - Bij de oude versie van KLog exporteer je logboek naar ADIF. - Verwijder het logboek data bestand in de KLog directory. - Installeer de nieuwe versie van KLog. - Importeer je ADIF bestand. KLog zal afronden als je op OK klikt. KLog - DB update 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 heeft een vorig log gevonden in de DB. Alle gegevens worden voor je gemigreerd naar een nieuw gecreëerd DX-type logboek. KLog: Enter Station callsign KLog: Voer station roepnaam in Enter the station callsign used in this log Voer de station roepnaam die in dit logboek gebruikt wordt in Station Callsign Station Roepnaam All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Alle gegevens zijn juist gemigreerd. Ga nu naar Instellingen->Voorkeuren->Logs om te controleren of alles is goed gegaan. Updating mode information... Bijwerken van modulatie informatie... Abort updating Annuleer bijwerken QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annuleren van deze update zorgt voor onjuiste en mogelijk verlies van gegevens. Weet je zeker dat je wil annuleren? Updating bands information... Bijwerken van band informatie... Updating bands information in %1 status... Bijwerken van band informatie in %1 status... Progress: Voortgang: Updating mode information in %1 status... Bijwerken van modulatie informatie in %1 status... Updating information... Bijwerken informatie... Updating DXCC and Continent information... Bijwerken van DXCC en Continent informatie... Install wizard was canceled before completing... Het installatie proces werd afgebroken voordat het gereed was... Do you want to remove the KLog dir from your disk? Wil je de KLog directory van de schijf verwijderen? Your KLog dir has been removed Je KLog directory is verwijderd Thank you for running KLog! Bedankt voor het gebruik van KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Ik kon je KLog directory niet verwijderen. Je moet dit handmatig uitvoeren als je het van je schijf wil verwijderen. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Je KLog directory kon niet worden verwijderd. Je moet dit handmatig uitvoeren als je het van je schijf wil verwijderen. Remember that your KLog dir is on your system... Onthoudt dat je KLog directory aanwezig is op je systeem... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Een foutieve roepnaam is gevonden: %1 Voer een nieuwe roepnaam in of bevestig dat de huidige roepnaam juist is. An empty callsign has been detected. If it is possible, please enter the right call. Een lege roepnaam werd gedetecteerd. Voer als het mogelijk is een juiste roepnaam in. KLog - Not valid callsign found KLog - Geen geldige roepnaam gevonden Altitude Date Datum Call Roepnaam RSTtx RSTtx RSTrx RSTrx Band Band Comment Commentaar Mode Modulatie 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 Date when it was sent ClubLog status Continent Continent Contacted_Op Contest Id Country Credit Submitted Credit granted Darc Dok Do not translate if unsure, common hamradio term. Distance Email EQ_Call eQSL RDate eQSL SDate Date when it was sent eQSL Rcvd eQSL Sent eQSL Verz Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. Force Init Freq Freq Freq RX Freq RX Gridsquare Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HRDLog status HamQTH status HamQTH SDate Date when it was sent IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate Date when it was sent LoTW Rcvd LoTW Sent LoTW verz Marcado Max Bursts MS Shower My Altitude My Antenna My ARRL Sect My City My Cnty My Country My CQz My DXCC My Fists Do not translate if unsure, common hamradio term. My Gridsquare My Gridsquare Ext My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My POTA My Rig My Sig My Sig Info My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Naam Notes Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Operator Owner Callsign POTA Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Ontv QSL Sent QSL Verz QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat mode Sat name Sat naam SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode SWL Do not translate if unsure, common hamradio term. UKSMG USACA counties VE prov VUCC grids Ten-Ten Do not translate, it is a hamradio group name. TX Pwr Web WWFF QSO Date off Log number KLog is already running. It is allowed to run only one instance. SearchWidget &Clear &Wissen &Export Highlighted &Exporteer geselecteerden &Select All &Selecteer Alle &Search &Zoeken All logs Alle logs Clear the searches. Wis de zoekopdrachten. Export the search result to an ADIF file. Exporteer de zoek resultaten naar een ADIF bestand. Select/Unselect all the QSOs shown. Selecteer/Deselecteer alle getoonde QSOs. Search in the log. Zoeken in het logboek. Search in all logs. Zoeken in alle logboeken. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Voer de roepnaam in om te zoeken. Invoer van '*'toont alle QSOs... dit kan vertraging veroorzaken bij een groot logboek! Select the Station Callsign used to do this QSO. Selecteer een Station Roepnaam voor dit QSO. You have requested to delete the QSO with: %1 Je hebt verzocht het QSO te verwijderen met: %1 Are you sure? Weet je het zeker? All in log Alles in het logboek Not defined Niet gedefinieerd &Clear selection &Wis selectie Save File Bewaar bestand SearchWindow Call Roepnaam Date/Time Datum/Tijd Band Band Mode Modulatie QSL Sent QSL Verz QSL Rcvd QSL Ontv Station Callsign Station Roepnaam ID ID Date/time Datum/Tijd Station callsign Station roepnaam QSL Send QSL Verzonden &Delete &Verwijderen Delete a QSO Verwijder een QSO &Edit QSO &Bewerken QSO Edit this QSO Bewerk dit QSO Via &bureau Via &bureau Send this QSL via bureau Verzend deze QSL via bureau D&irect D&irect Send this QSL via direct Verzend deze QSL rechtstreeks Via bureau Via bureau QSL &received via bureau QSL &ontvangen via bureau Direct Rechtstreeks QSL received via direc&t QSL direc&t ontvangen Check in QRZ.com Controleren in QRZ.com Check this callsign in QRZ.com Controleer deze roepnaam in QRZ.com Check in DXHeat.com Controleren in DXHeat.com Check this callsign in DXHeat.com Controleer deze roepnaam in DXHeat.com &Request my QSL &Aanvraag van mijn QSL Mark my QSL as requested Markeer mijn QSL als aangevraagd Via Direct and mark DX QSL as requested Via Rechtstreeks en markeer DX-QSL als aangevraagd Send this QSL via direct and mark DX QSL as requested Verstuur deze QSL rechtstreeks en markeer DX QSL als aangevraagd Via Bureau and mark DX QSL as requested Via Bureau en markeer de DX QSL als aangevraagd Send this QSL via bureau and mark DX QSL as requested Verzend deze QSL via het bureau en markeer de DX QSL als aangevraagd &Request the QSL &Aanvraag van QSL Mark the QSL as requested Markeer QSL als aangevraagd Via bureau and mark my QSL as requested Via bureau en markeer QSL als aangevraagd QSL received via bureau and mark my QSL as requested QSL ontvangen via bureau en markeer mijn QSL als aangevraagd Direc&t and mark as my QSL requested Direc&t en markeer mijn QSL als aangevraagd QSL received via direct and mark my QSL as requested QSL rechtstreeks ontvangen en markeer mijn QSL als aangevraagd Needed QSO to send the QSL QSO nodig voor verzenden van QSL My QSL requested to be sent Mijn QSL aanvraag om te verzenden DX QSL pending to be received DX-QSL in afwachting van ontvangst SetupDialog User data Gebruiker gegevens Bands/Modes Banden/Modulatie Log widget D&X-Cluster D&X-Cluster Colors Kleur Misc Diversen World Editor Wereld Editor Logs Logboeken eLog eLog WSJT-X WSJT-X Satellites Satellieten HamLib HamLib Cancel Annuleer OK OK Settings Instellingen You need to enter at least one log in the Logs tab. Je moet minstens één logboek invoeren in het Log tabblad. 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) Wil je een logboek toevoegen in het Logs tabblad of KLog afsluiten? (Klik Ja om een logboek toe te voegen of Nee om KLog af te sluiten) DX-Cluster DX-Cluster World Wereld DB has not been moved to new path. DB is verplaatst naar de nieuwe directory. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Ga naar het Diversen tabblad en klik op Verplaats DB of de DB zal verplaatst worden naar de nieuwe locatie. You need to enter at least a valid callsign. Je moet minstens één geldige roepnaam invoeren. Go to the User tab and enter valid callsign. Ga naar het Gebruiker tabblad en voer een geldige roepnaam in. You have not selected the kind of log you want. Je hebt nog het soort logboek nog niet aangegeven. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Je wordt omgeleid naar het Log tabblad. Voer hier het log in en kies welke type log je wil gebruiken. SetupEntityDialog Entity Entiteit Name of the Entity. Naam van de Entiteit. CQ CQ CQ zone. CQ zone. ITU ITU ITU zone. ITU zone. Latitude Breedtegraad Longitude of the Entity. Lengtegraad van de Entiteit. Longitude Lengtegraad UTC UTC Local time difference to UTC. Lokale tijdsverschil t.o.v. UTC. Main prefix Hoofd prefix Main prefix of the entity. Hoofd prefix van de entiteit. ARRL ID ARRL ID ARRL ID. ARRL ID. Prefixes Prefixes Comma separated possible prefixes, e.g. EA1, EA2, ... Komma gescheiden mogelijke prefixes zoals: EA1, EA2, ... Date of the deletion. Datum van verwijdering. Deleted Verwijderd Cancel Annuleer Ok Ok Entity Dialog Entiteit venster SetupPageBandMode Bands Banden Modes Modulatie SetupPageColors New One Nieuwe Needed in this band Nodig in deze band Worked in this band Gewerkt in deze band Confirmed in this band Bevestigd in deze band Default Standaard WSJT-X palette WSJT-X kleurpatroon Default palette Standaard kleurpatroon Dark Mode Color when the DXCC is an ATNO (All Time New One). Kleur als DXCC een ATNO is (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, ... Deze DXCC is eerder gewerkt in een ander band maar niet in de geselecteerde band. Het kan nodig zijn i.v.m. de CQ, ITU, Vak, ... Worked DXCC, but not confirmed in this band. Gewerkt DXCC, maar niet bevestigd in deze band. DXCC is confirmed in this band. DXCC is bevestigd in deze band. Default color. Standaard kleur. Sets a palette of colors similar to the one used in WSJT-X. Stel een kleurenpatroon in gelijk aan dat van WSJT-X. Sets the default palette. Stel het standaard kleurenpatroon in. Sets the Dark Mode Choose a color Kies een kleur Light Mode SetupPageDxCluster Add Toevoegen Delete Verwijderen Show &HF spots Toon &HF spots Show V/&UHF spots Toon V/&HF spots Show W&ARC spots Toon W&ARC spots Show &worked spots Toon &gewerkte spots Show &confirmed spots Toon &bevestigde spots Show ANN/&FULL messages Toon ANN/&FULL berichten Show WW&V messages Toon WW&V berichten Show WC&Y messages Toon WC&Y berichten Save DX Cluster activity Bewaar DX Cluster activiteit Saves all the DX-Cluster activity to a file in the KLog folder Bewaar alle DX-Cluster activiteit in een bestand in de KLog directory Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX spots Others Diversen Messages Berichten KLog: Add a DXCluster server KLog: Voeg een DXCluster server toe Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Voeg het adres toe gevolgd door het :poortnummer Voorbeeld: dxfun.com:8000 Als er geen poortnummer wordt gespecificeerd, dan zal 41112 als standaard worden gebruikt: SetupPageELog ClubLog password ClubLog wachtwoord ClubLog App password ClubLog email ClubLog email Enter the email you used to register in ClubLog. Voer het email adres in dat je gebruikt hebt voor de registratie van 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.) Voer hier je ClubLog wachtwoord in. Waarschuwing: Het wachtwoord wordt als leesbare tekst opgeslagen in het KLog config bestand! (Als je het wachtwoord hier niet invoert, dan zal KLog het wachtwoord vragen als dat nodig is.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Verzend QSL real time Activate ClubLog Activeer ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Verzend ieder QSO real time naar ClubLog, op het moment dat deze wordt toegevoegd (of gewijzigd) in KLog. Starts the ClubLog support in KLog. Start de ClubLog ondersteuning in KLog. Activate eQSL.cc Activeer eQSL.cc Enter your username of eQSL.cc. Voer je gebruikersnaam in voor 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.) Voer hier je eQSL.cc wachtwoord in. Waarschuwing: Het wachtwoord wordt als leesbare tekst opgeslagen in het KLog config bestand! (Als je het wachtwoord hier niet invoert, dan zal KLog het wachtwoord vragen als dat nodig is.) eQSL.cc password eQSL.cc wachtwoord eQSL.cc user eQSL gebruiker 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. Voer je gebruikersnaam van QRZ.com in. Je moet geabonneerd zijn op QRZ.com om deze dienst te kunnen gebruiken. User Gebruiker 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.) Voer hier je QRZ.com wachtwoord in. Waarschuwing: Het wachtwoord wordt als leesbare tekst opgeslagen in het KLog config bestand! (Als je het wachtwoord hier niet invoert, dan zal KLog het wachtwoord vragen als dat nodig is.) Password Wachtwoord Activate QRZ.com Activeer QRZ.com Check automatically Controleer automatisch Check in Qrz.com all Calls as they are entered Controleer alle Roepnamen in QRZ.com terwijl deze worden ingevoerd Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key Logboek Sleutel 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. Logboek Sleutel voor het uploaden van QSOs. Je kunt deze sleutel via je logboek webpagina van QRZ.com verkrijgen. Denk erom dat je geabonneerd moet zijn op QRZ.com om deze functie te kunnen gebruiken. LoTW LoTW Upload Upload Download Download TQSL path TQSL-directory Use TQSL Gebruik TQSL LoTW password LoTW wachtwoord LoTW user LoTW gebruiker Enter your LoTW user. Voer je LoTW gebruikersnaam in. 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.) Voer hier je LoTW wachtwoord in. Waarschuwing: Het wachtwoord wordt als leesbare tekst opgeslagen in het KLog config bestand! (Als je het wachtwoord hier niet invoert, dan zal KLog het wachtwoord vragen als dat nodig is.) Path to the TQSL software. Directory van de TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Schakel de integratie van LoTW met TQSL in. TQSL moet hiervoor geïnstalleerd zijn Select File Selecteer Bestand SetupPageHamLib Activate HamLib Activeer HamLib Activates the hamlib support that will enable the connection to a radio. Activeert de ondersteuning van hamlib die de verbinding met de radio mogelijk maakt. Read-Only mode Alleen Lezen mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Bij activeren zal KLog de Frequentie/Modulatie van de radio uitlezen, maar geen commando naar de radio versturen. Test Click to test the connection to the radio Radio Radio Select your rig. Selecteer de radio. Serial Network Defines the interval to poll the radio in msecs. Definieer het interval voor het controleren van de radio in msec. Test: OK Test: NOK Poll interval Coltroleer interval Port Poort Select the serial port. Only the serial ports that are detected are shown. Selecteer de seriele poort. Alleen de seriele poorten die zijn gedetecteerd worden getoond. Scan Scannen Click to identify the serial ports available in your computer. Klik voor het identificeren van de seriele poorten die aanwezig zijn in je computer. Bauds Bauds Select the serial port speed. Selecteer de snelheid van de seriele poort. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Data bits Select the serial data bits. Selecteer het aantal seriele data bits. None Geen Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Flow Control Select the serial flow control Selecteer de seriele flow control No parity Geen pariteit Even Even Odd Oneven Space Space Mark Mark Parity Pariteit Select the serial parity. Selecteer de seriele pariteit. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Stop bits Select the serial stop bits. Selecteer de seriele stop bits. SetupPageLogView Fields SetupPageLogs &New &Nieuw &Edit B&ewerken &Remove Ve&rwijderen Add a new log. Nieuw logboek toevoegen. Edit the selected log. Bewerk het geselecteerde logboek. Remove the selected log. Verwijder het geselecteerde logboek. KLog KLog Do you really want to remove this log? Weet je zeker dat je dit logboek wil verwijderen? All the QSOs from this log will also be deleted... Alle QSOs van dit logboek worden verwijderd... Log has not been removed. (#3) Logboek is niet verwijderd. (#3) Log has not been removed. (#2) Logboek is niet verwijderd. (#2) Log has not been removed. (#1) Logboek is niet verwijderd. (#1) ID ID Date Datum Station Callsign Station Roepnaam Operators Operator Comments Commentaar QSOs QSOs The new log could not be created. Het nieuwe logboek kon niet worden aangemaakt. An error has occurred showing the following error code: Er is een fout opgetreden met de volgende fout code: KLog - SetupPageLogs KLog - SetupPageLogs SetupPageLogsNew &Date &Datum &Station Callsign &Station Roepnaam &Operators &Operators Comm&ent Comm&entaar &Ok &Ok &Cancel &Annuleren Callsign used for this log. Roepnaam in gebruik bij dit station. Comma separated list of operators: callsign1, callsign2. Komma gescheiden lijst van operators: roepnaam1, roepnaam2. Start date of this log. Start datum van dit logboek. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Voeg commentaar toe over die logboek. Als dit is ingevuld, dan zal het voor herkenning getoond worden in de KLog titelbalk. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je moet een geldige Roepnaam invoeren in het Station Roepnaam veld. Het logboek wordt niet geopend. SetupPageMisc &Imperial system &Imperial systeem &Log in real time &Log in real time &Time in UTC &Tijd in UTC &Save ADIF on exit &Bewaar ADIF bij afsluiten Use this &default filename Gebruik deze &standaard bestandsnaam Mark &QSO to send QSL when QSL is received Markeer &QSO voor verzenden QSL als QSL is ontvangen Complete QSO with previous data Vul het QSO aan met de vorige gegevens Show the Station &Callsign used in the search box Toon de Station &Roepnaam die gebruikt is in het zoekveld &Check for new versions automatically &Controleer automatisch op nieuwe versies &Provide Info for statistics &Lever informatie voor statistieken aan Manage DX-Marathon Beheer DX-Marathon Activate the application debug log Activeer het programma debug log Mark sent eQSL && LoTW in new QSO as queued Markeer verzend eQSL && LoTW voor een nieuw QSO in de wachtrij &Delete always temp ADIF file after uploading QSOs &Verwijder de tijdelijke ADIF bestanden altijd na het uploaden van QSOs Browse Bladeren Move DB Verplaats DB QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSOs worden gemarkeerd om QSL te verzenden als je de DX QSL ontvangt en jouw QSL nog niet is verstuurd. The search box will also show the callsign on the air to do the QSO. Het zoekveld zal ook de roepnaam van aanwezige stations tonen om een QSO mee te maken. Check if there is a new release of KLog available every time you start KLog. Controleer of er een nieuwe versie van KLog beschikbaar is iedere keer dat KLog wordt gestart. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Als controleren op nieuwe versie is geselecteerd, dan zal KLog je roepnaam aan de ontwikkelaar sturen, de gegevens over de Klog versie en het Operating systeem helpen bij het verbeteren van KLog. Check it for Imperial system (Miles instead of Kilometers). Selecteer dit voor Imperial systeem (Miles i.p.v. Kilometers). Select to use real time. Selecteer om real time te gebruiken. Select to use UTC time. Selecteer om UTC te gebruiken. Select if you want to save to ADIF on exit. Selecteer voor opslaan naar ADIF bij afsluiten. Select to use the following name for the logfile without being asked for it again. Selecteer om de volgende naam voor het logbestand te gebruiken zonder dat hier steeds om gevraagd wordt. Complete the current QSO with previous QSO data. Vul het huidige QSO aan met de gegevens van het vorige QSO. Select if you want to manage DX-Marathon. Selecteer als je DX-Marathon wil beheren. This is the default file where ADIF data will be saved. Dit is het standaard bestand waarin de ADIF gegevens worden opgeslagen. This is the directory where the database (logbook.dat) will be saved. Dit is de directory waar de database (logbook.dat) wordt opgeslagen. Click to change the default ADIF file. Klik voor het wijzigen van het standaard ADIF bestand. Click to change the path of the database. Klik voor het wijzigen van de locatie van de database. Click to move the DB to the new directory. Klik voor het verplaatsen van de DB naar een nieuwe 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. Activeer het programma debug log. Dit kan bruikbaar zijn als iets niet werkt zoals was te verwachten. Een debug bestand wordt aangemaakt in de KLog directory. Check non-valid calls Show seconds In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Klik voor het plaatsen in de wachtrij (te verzenden) van alle eQSL (LoTW en eQSL) als standaard voor alle nieuwe QSO. Delete Always the adif file created after uploading QSOs Verwijder altijd het adif bestand na het uploaden van QSOs Log level Dupe time range: Duplikaat tijdsbereik: Open File Open Bestand Select Directory Selecteer Directory This is the directory where DB (logbook.dat) will be saved. Dit is de directory waar de DB (logbook.dat) wordt opgeslagen. Please specify an existing directory where the database (logbook.dat) will be saved. Specificeer een bestaande directory waar de database (logbook.dat) zal worden opgeslagen. KLog - Move DB KLog - Verplaats DB File moved Bestand verplaatst File copied Bestand gekopieerd File already exist. Bestand bestaat al. 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. Het bestand in de directory bestaat al en KLog zal het niet vervangen. Verwijder het bestand in de directory voordat het bestand verplaatst wordt zodat KLog het bestand kan kopiëren. File NOT copied Bestand NIET gekopieerd The file was not copied due to an unknown problem. Het bestand werd niet gekopieerd vanwege een onbekend probleem. The target directory does not exist. Please select an existing directory. De doel directory bestaat niet. Selecteer een bestaande directory. SetupPageSats &New &Nieuw &Edit B&ewerk &Remove Ve&rwijderen &Import &Importeer E&xport E&xporteer Add a new satellite. Voeg een nieuwe satelliet toe. Edit the selected satellite. Bewerkt de geselecteerde satelliet. Remove the selected satellite. Verwijder de geselecteerde satelliet. Import a satellites file. It will replace the satellites you have in the current list. Importeer een satellieten bestand. Het zal de huisige lijst van satellieten vervangen. Export your current satellites to a file. Exporteer de huidige satellieten naar een bestand. Select the sat you want to open. Selecteer de sat die je wil openen. KLog Klog Do you really want to remove this satellite? Weet je zeker dat deze satelliet wil verwijderen? This satellite will no be longer available to be selected ... Deze satelliet zal niet langer selecteerbaar zijn ... Sat has not been removed. (#3) Sat is verwijderd. (#3) Sat has not been removed. (#2) Sat is verwijderd. (#2) Sat has not been removed. (#1) Sat is verwijderd. (#1) ID ID Short Kort Name Naam Uplink Uplink Downlink Downlink Modes Modulatie An error has occurred showing the following error code: Er is een fout opgetreden met de volgende fout code: KLog - SetupPageSats Klog - SetPageSats Open Satellites File Open satelliet bestand KLog warning KLog waarschuwing 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. Een onverwachte fout is opgetreden bij het importeren van de satelliet data. Dit kan veroorzaakt zijn omdat het bestand dat je probeert te importeren niet het juiste formaat heeft. Please check the format or contact the developer for analysis with the error code: Controleer het formaat of neem contact op met de ontwikkelaars voor nadere analyse van de fout code: Save Satellites File Bewaar het Satelliet bestand SetupPageSatsNew Short name Korte naam Sat name Sat naam UpLink UpLink DownLink DownLink Modes Modulatie &Ok &Ok &Cancel &Annuleren Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Voer de korte naam in. Gebruik de LoTW korte namen zodat je QSOs na afloop geupload kunnen worden naar LoTW. Enter the name of the satellite. Voer de naam van de satelliet is. Enter the uplink frequencies in this format: 144.300 Voer de uplink frequentie in volgens dit formaat: 144.300 Enter the downlink frequencies in this format: 144.300 Voer de downlink frequentie in volgens dit formaat: 144.300 Enter the modes in this format: USB Voer de modulatie in volgens dit formaat: USB Some of the data you have entered is not correct; the satellite can't be added. Sommige gegevens die je hebt ingevoerd zijn niet correct; de satelliet kan niet worden toegevoegd. SetupPageSubdivisionNew &Date &Datum &Station Callsign &Station Roepnaam &Operators &Operators Comm&ent Comm&entaar &Ok &Ok &Cancel &Annuleren Callsign used for this log. Roepnaam voor gebruik in dit logboek. Comma separated list of operators: callsign1, callsign2. Komma gescheiden lijst van operators: roepnaam1, roepnaam2. Start date of this log. Start datum van dit logboek. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Voeg commentaar toe over dit logboek. Als dit is ingevuld, dan wordt dit getoond in de KLog titelbalk voor de herkenning van dit logboek. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je moet een geldige Roepnaam invoeren in het Station Roepnaam veld. Het logboek wordt niet geopend. You need to enter a valid Call in the Station Callsign box. The log will not be opened. Je moet een geldige Roepnaam in het Station Roepnaam veld invoeren. Het logboek wordt niet geopend. SetupPageSubdivisions &Remove Ve&rwijderen Import new Importeer nieuw Import an AWA file with the subdivision details. Importeer een AWA bestand met subdivisie details. Remove the selected references. Verwijder de geselecteerde referenties. Select the references you want to open. Selecteer de referenties die je wil openen. KLog KLog Do you really want to remove the data of this entity? Weet je zeker dat je de gegevens van deze entiteit wil verwijderen? All the subdivision information for this entity will be deleted... Alle subdivisie informatie van deze entiteit zal worden verwijderd... Log has not been removed. (#3) Logboek is niet verwijderd. (#3) Log has not been removed. (#2) Logboek is niet verwijderd. (#2) Log has not been removed. (#1) Logboek is niet verwijderd. (#1) ID ID Name Naam Short Name Korte Naam CQ Zone CQ Zone ITU Zone ITU Zone Deleted Verwijderd Start Date Start Datum End Date Eind Datum DXCC DXCC An error has occurred showing the following error code: Er is een fout opgetreden met de volgende fout code: KLog - SetupPageSubdivisions KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Start UDP Server Automatically log QSOs from WSJT-X Automatisch loggen QSO vanaf WSJT-X Allow WSJT-X to send logged QSOs to KLog WSJT-X mag gelogde QSOs verzenden naar KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSOs gelogd door WSJT-X worden naar KLOg verstuurd en KLog zal voor logging om bevestiging vragen tenzij "%1" is geselecteerd KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Klog zal ieder QSO vanaf WSJT-X automatisch loggen zonder handmatige bevestiging. Update status information from WSJT-X Update status van QSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog zal automatisch de gegevens vanaf WSJT-X tonen en bijwerken (DX roepnaam, Rapport, modulatie, ...) UDP port number where the UDP Server will listen for packets. UDP poort nummer waar de UDP Server luistert voor packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Wees er zeker van dat het dezelfde poort is waar andere programmas hun gegevens heensturen. Standaard poort is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UPD Server zal QSOs ontvangen die vanaf andere programmas zoals WSJT-X worden verzonden zodat automatisch loggen vanuit die programmas in KLog mogelijk is. UDP Port UDP Poort Select the interface to listen for UDP datagrams coming from WSJT-X. Selecteer de interface waarop geluisterd moet worden naar de UDP datagrammen afkomstig van WSJT-X. Network interface Netwerk interface QSOs notification timeout (milisecs) QSO notificatie timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. Milliseconden waarna de notificatie van ontvangen QSOs vanaf WSJT-X zal worden getoond. SetupPageUserDataPage &Personal data &Persoonlijke gegevens Station &data Station &gegevens Enter your name. Voer je naam in. Enter your address - 1st line. Voer je adres in - 1ste regel. Enter your address - 2nd line. Voer je adres in - 2de regel. Enter your address - 3rd line. Voer je adres in - 3de regel. Enter your address - 4th line. Voer je adres in - 4de regel. Enter your city. Voer je woonplaats in. Enter your zip code. Voer je postcode in. Enter your province or state. Voer je provincie in. Enter your country. Voer je land in. &Name &Naam &Address &Adres Cit&y &Woonplaats &Zip Code &Postcode Pro&v/State Pro&vincie Countr&y &Land Enter your information for rig Voer de informatie van je transceiver in Enter your information for antenna Voer de informatie van je antenne in Enter your power information. Voer de informatie van je vermogen in. &Rig 1 &Transceiver 1 R&ig 2 T&ransceiver 2 Ri&g 3 Tr&ansceiver 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer Ver&mogen Enter the station callsign that will be used for logging. Voer de station roepnaam in die voor het logboek wordt gebruikt. Enter the operators (comma separated if more than one). Voer de operators in (komma gescheiden als er meer dan één zijn). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Voer de locator van je station in. Als alternatief kan KLog je locator bij benadering bepalen op basis van je roepnaam. &Callsign &Roepnaam &Operators &Operators &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Locator &Locator (not valid) &Locator (niet geldig) SetupPageWorldEditor Add Toevoegen Delete Verwijderen Edit Bewerken Export World Exporteer Wereld Import World Importeer Wereld Still not implemented. Nog niet geïmplementeerd. Import a new cty.csv file Importeer een nieuw cty.csv bestand An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Een entiteiten informatie bestand (cty.csv) is gevonden in je KLog directory en zal worden geladen. No entities information file (cty.csv) has been detected in your KLog folder. Er is geen entiteiten informatie bestand (cty.csv) gevonden in je KLog directory. KLog will not be able to show entities information. KLog zal niet in staat zijn om entiteiten informatie te tonen. Prefix Prefix Entity Entiteit ARRL ID ARRL ID Continent Continent CQ Zone CQ Zone ITU Zone ITU Zone UTC UTC Latitude Breedtegraad Longitude Lengtegraad Deleted Verwijderd Since Date Sinds Datum To Date Tot Datum Open File Open Bestand BigCTY (*.csv) GrootCTY (*.csv) Entities information has been updated. De entiteiten informatie is bijgewerkt. Entities information has not been updated. De entiteiten informatie is niet bijgewerkt. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. De volgende QSOs zijn de QSOs waarvoor een LoTW bevestiging is ontvangen. Ok Ok DX DX Date/Time Datum/Tijd Band Band Mode Modulatie ShowErrorDialog KLog Message Klog melding SoftwareUpdateDialog Ok Ok KLog update KLog update <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! Gefeliciteerd! Your KLog has been updated. Je KLog is bijgewerkt. You already have the latest version. Je maakt reeds gebruik van de laatste versie. StartWizard KLog - The free hamradio logging program Klog - Het open source zendamateur logging programma Quit Setup Sluit Setup Setup is not complete yet. Are you sure you want to quit setup? Setup is nog niet volledig afgerond. Weet je zeker dat je setup wil afsluiten? StatisticsWidget QSO per year QSOs per jaar DXCC per year DXCC per jaar CQ zones per year CQ zones per jaar QSO per band QSO per band QSO per mode QSO per modulatie QSO per DXCC QSO per DXCC QSO per Continent QSO per continent QSO per hour QSO per uur QSO per month QSO per maand Worked / Confirmed status Gewerkt / Bevestigd ststus Worked / Sent status Gewerkt / Verzonden status Sent / Confirmed status Verzonden / Bevestigd status Satellite grid status Satelliet vak status Satellite DXCC status Satelliet DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year ZQ zones per jaar Reading data ... Inlezen gegevens ... Abort reading Lezen afbreken CQ zones CQ zones CQ zones per year CQ zones per jaar Reading data ... Inlezen gegevens ... Years: %1/%2 Jaren:%1/%2 StatsDXCCOnSatsWidget Show confirmed only Toon alleen bevestigd Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Alleen LEO sats Number Nummer Callsign Roepnaam Date Datum Band Band Mode Modulatie DXCC DXCC Satellite Satelliet Confirmed Bevestigd No Nee StatsEntitiesPerYearBarChartWidget Chart title Kaart titel Reading data ... Inlezen gegevens ... Abort reading Inlezen afbreken DXCC Entities DXCC Entiteiten DXCC Entities per year DXCC Entiteiten per jaar Reading data ... Inlezen gegevens ... Entities: Entiteiten: StatsFieldPerBandWidget All Alle Mode: Band Band Worked Gewerkt Confirmed Bevestigd StatsGridsOnSatsWidget Show confirmed only Toon alleen bevestigd Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Alleen LEO sats Number Nummer Callsign Roepnaam Date Datum Band Band Mode Modulatie Grid Vak Satellite Satelliet Confirmed Bevestigd No Nee StatsQSOsPerBandBarChartWidget QSOs per band QSOs per band Reading data ... Inlezen gegevens ... Abort reading Annuleer inlezen Bands Banden QSOs per band distribution QSOs ingedeeld per band Reading data ... Inlezen gegevens ... Bands: Banden: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs per continent Reading data ... Inlezen gegevens ... Abort reading Annuleer inlezen Continents Continenten Reading data ... Inlezen gegevens ... Hours: Uren: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs per DXCC Reading data ... Inlezen gegevens ... Abort reading Annuleer inlezen Reading data... Inlezen gegevens ... DXCC DXCC Top ten DXCC per QSO Top tien DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs per uur Reading data ... Inlezen gegevens ... Abort reading Anuleer inlezen Hours Uren QSOs at hour QSOs per uur Reading data ... Inlezen gegevens ... Hours: Uren: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs per modulatie Reading data ... Inlezen gegevens ... Abort reading Anuleer inlezen Modes Modulatie QSOs per mode distribution QSOs ingedeeld per modulatie Reading data ... Inlezen gegevend ... Modes: Modulatie: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs per maand Reading data ... Inlezen gegevens ... Abort reading Annuleer inlezen Jan Jan Feb Feb Mar Mar Apr Apr May Mei Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dec Months Maanden QSOs at Month QSOs in maand Reading data ... Inlezen gegevens ... Months: Maanden: StatsQSOsPerYearBarChartWidget QSOs per year QSOs per jaar Reading data ... Inlezen gegevens ... Abort reading Anuleer inlezen QSOs QSOs Reading data ... Inlezen gegevens ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Verzonden - %1 Confirmed - %2 Bevestigd - %2 Sent / Confirmed status Verzonden / Bevestigd status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Gewerkt, niet bevestigd - %1 Confirmed - %2 Bevestigd - %2 Worked / Confirmed status Gewerkt / Bevestigd status StatsWorkedSentPieChartWidget Worked - %1 Gewerkt - %1 Sent - %2 Verzonden - %2 Worked / Sent status Gewerkt / Verzonden status TipsDialog KLog tips KLog tips Next Volgende Previous Vorige <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>Wist je dat...<br>Je gebruik kunt maken van<a href="#ToolsFillInQSO">Tools->Vul de QSO gegevens in</a> om automatisch het hele logboek in te lezen en de DXCC, CQ, ITU zones en continent aan te vullen? <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 #2:</b><br>Wist je dat...<br>Je gebruik kunt maken van <a href="#ToolsFillInDXCC">Tools->Vul DXCC gegevens in</a> om automatisch het hele logboek in te lezen en de DXCC QSO gegevens aan te vullen? <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>Wist je dat...<br>Je gebruik kunt maken van <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Zoek QSO voor QSL</a> om alle QSOs te zoeken waarvoor je nog een QSL moet verzenden omdat je die DXCC nog moet bevestigen en je nog geen QSL kaart hebt verzonden? <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 #4:</b><br>Wist je dat...<br>Je een export kunt maken van de QSOs waarvoor QSL is verzocht met behulp van <a href="#FileExportQSLADIFToPrint">Bestand->Exporteer verzoek om QSL naar ADIF...</a> om een ADIF bestand te ceëren dat geimporteerd kan worden in een programma dat labels print voor de QSL kaarten? <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 #5:</b><br>Wist je dat...<br>Je een '*' in het zoekveld in het zoekvenster kunt gebruiken om te zoeken naar alle QSO die gemaakt zijn met een specifieke station roepnaam? <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 #6:</b><br>Wiste je dat...<br>Je de gegevens van je logboeken en andere informatie, opgeslagen in het logbook.dat bestand en het klogrc bestand met daarin de configuratie van KLog kunt vinden in de KLog directory door deze te openen via <a href="#FileOpenKLogFolder">Bestand->KLog directory</a> menu? <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 #7:</b><br>Wist je dat...<br>Je de QSLs kunt vinden die nog verzonden moeten worden met behulp van <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Zoek mijn QSLs in afwachting van verzending</a>.<bR>Deze tool toont een lijst in het zoekvenster van alle QSOs waarbij QSL Verzenden is gemarkeerd als <i>Aangevraagd</i>. <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>Wist je dat...<br>Je QSLs kunt vinden waar je nog op wacht met behulp van <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Zoek DX-QSLs in afwachting van ontvangst</a>.<bR>Deze tool toont een lijst in het zoekvenster van alle QSOs waarbij QSL-Verzonden is gemarkeerd als <i>Verzonden</i> maar waar je nog geen QSL kaart van de DX hebt ontvangen. <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>Wist je dat...<br>Je de QSLs waar je nog op zit te wachten kunt vinden met behulp van <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Zoek aanvragen die in afwachting zijn van ontvangst</a>.<bR>Deze tool toont een lijst in het zoekvenster van alle QSOs waarbij QSL-Ontvangen gemarkeerd is als <i>Aangevraagd</i> maar waar je nog geen QSL kaart van de DX hebt ontvangen. <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>Wist je dat...<br>Je deel kunt nemen aan de <a href=https://t.me/klogchat>English KLog Telegram group</a> om in het Engels mee te discussiëren over 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>Tip #11:</b><br>Wist je dat...<br>Je deel kunt nemen aan de <a href=https://t.me/KLogES>Spanish Telegram group</a> om in het Spaans mee de discussiëren over KLog? <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 #12:</b><br>Wist je dat...<br>Je deel kunt nemen aan de <a href=https://lists.nongnu.org/mailman/listinfo/klog-users>KLog-users mailing list</a> om in het Engels over KLog via email mee te discussiëren? <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 #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 #13:</b><br>Wist je dat...<br>Je via <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> informatie over KLog kunt krijgen? <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>Wist je dat...<br>Je een bericht kunt schrijven op <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> om andere gebruiker te helpen bij hun keuze voor 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>Wist je dat...<br>Je het ontwikkel team kunt versterken via <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 #16:</b><br>Wist je dat...<br>Er vele mogelijkheden zijn om een bijdrage aan KLog te leveren, sommige zijn weergegeven op de <a href=https://www.klog.xyz/contrib>KLog Contribute</a> pagina? <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>Wist je dat...<br>Je ondersteuning kunt leveren door KLog te vertalen naar jouw taal? Kijk hiervoor opr <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 #18:</b><br>Wist je dat...<br>Je kunt dubbel klikken op een entiteiten naam in de DXCC tabel waardoor alle QSOs met die DXCC in het zoekvenster worden getoond? <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>Wist je dat...<br>Je met de rechter muisknop kunt klikken op een QSO en kunt kiezen voor <i>Controleer bij QRZ.com</i> om de roepnaam te controleren via 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 #20:</b><br>Wist je dat...<br>Je de QSOs kunt tonen die een specifieke DXCC entiteit in een specific band bevestigen door je muis te plaatsen op die band van het DXCC onderdeel? <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... <b>Tip #21:</b><br>Wist je dat...<br>Je een QSO dat gemarkeerd is in de wachtrij voor LoTW met behulp van TQSL met <a href="#ToolsUploadLoTW">Tools->LoTW Tools.../Upload QSOs in de wachtrij naar LoTW...</a> ?<br><br>Je moet TQSL configureren in het instellingen tablad om deze functionaliteit te kunnen gebruiken. TIP-Default: Text TIP-Standaard: Tekst UpdateSatsData Reading Satellites data file... Inlezen Satelliet gegevensbestand... Abort reading Inlezen afbreken The Satellites information has been updated. De Satelliet gegevens zijn bijgewerkt. Open File Open bestand Sat Data Sat Gegevens UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entiteit Continent Continent Reading cty.csv... Inlezen cty.csv... Abort reading Inlezen afbreken KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Alle QSOs zijn bijgewerkt met een DXCC en Continent. WorldMapWidget World map Wereldkaart View Toon Zoom In(25%) Zoom in(25%) Zoom Out(25%) Zoom uit(25%) Normal Size Normale omvang Fit to window Passend in window eLogClubLog Host not found! Host niet gevonden! Timeout error! Timeout fout! QSO dupe or not existing (#%1)... QSO duplikaat of bestaant niet (#%1)... KLog - ClubLog KLog - ClubLog It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. We have received an undefined error from Clublog (%1) We hebben een niet gedefinieerde fout van ClubLog ontvangen (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Deze fout wordt mogelijk veroorzaakt door een duplikaat QSO, of door het verwijderen van een niet bestaand QSO. Undefined error number (#%1)... Ongedefinieerde fout nummer (#%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. Controleer je configuratie bij instellingen en neem contact op met het ontwikkel team als je dit niet op kunt lossen. ClubLog uploads wordt uitgeschakeld. Undefined error... Ongedefinieerde fout... Callsign missing Roepnaam ontbreekt Invalid callsign Ongelding roepnaam Skipping SWL callsign Overslaan SWL roepnaam Callsign is your own call Roepnaam is je eigen roepnaam Invalid callsign with no DXCC mapping Ongeldige roepnaam zonder DXCC mapping Updated QSO QSO bijgewerkt Invalid ADIF record Ongeldige ADIF regel Missing ADIF record Ontbrekende ADIF regel Test mode - parameters ok, no action taken Test mode - parameters ok, geen actie genomen Excessive API Usage Excessief API gebruik Internal Error Interne fout Rejected Afgewezen QSO Duplicate QSO Duplikaat QSO Modified QSO gewijzigd Missing Login Ontbrekende Login QSO OK QSO OK Upload denied Upload geweigerd No callsign selected Geen roepnaam geselecteerd No match found Geen overeenkomst gevonden Dropped QSO Vervallen QSO OK OK Login rejected Login afgewezen Rejected: Callsign is your own call Niet toegestaan: Roepnaam is je eigen roepnaam eLogQrzLog Host not found! Host niet gevonden! Timeout error! Timeout fout! Undefined error number (#%1) Ongedefinieerde fout nummer (#%1) KLog - QRZ.com KLog - QRZ.com We have received the following error from QRZ.com (%1) We hebben de volgende fout ontvangen van QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Geen geldige SLEUTEL gevonden 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. Configureer je QRZ.com API sleutel. Je vindt deze in de webpaging van je QRZ.com logboek instellingen. Een abonnement op QRZ.com is noodzakelijk om deze functionaliteit te kunnen gebruiken. KLog - QRZ.com password needed KLog - QRZ.com wachtwoord noodzakelijk Please enter your QRZ.com password: Voer je QRZ.com wachtwoord in: Callsign missing Roepnaam ontbreekt eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL stuurt de volgende melding: %1 Host not found! Host niet gevonden! Timeout error! Timeout fout! Undefined error number (#%1)... Ongedefineerde fout nummer (#%1)... We have received an undefined error from eQSL (%1) We hebben een ongedefinieerde fout van eQSL ontvangen (%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. Controleer je configuratie bij de instellingen en neem contact op het het KLog ontwikkel team als je dit niet op kunt lossen. eQSL upload wordt uitgeschakeld. eQSL Error: User or password incorrect eQSL Fout: Gebruikersnaam of wachtwoord onjuist eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL Waarschuwing: In iedergeval één van de geuploade QSOs is een duplikaat. eQSL: All the QSOs were properly uploaded. eQSL: Alle QSOs zijn goed verzonden. KLog - eQSL.cc password needed KLog - eQSL.cc wachtwoord noodzakelijk Please enter your eQSL.cc password: Voer je eQSL.cc wachtwoord in: klog-2.4.1/translations/klog_pl.ts0000644000175000017500000134364415003153303016162 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 My Locator Mój lokator Start date End date Ok OK Cancel Anuluj DX Date/Time Data/Czas Band Pasmo Mode Emisja Not defined ALL QSOs: %1/%2 KLog Warning There are no queued QSOs. All Wszystko 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. Awards A Do not translate ATNO All Time New One, Do not translate N Needed, please try to keep the N Needed W Worked, please try to keep the W Worked C Confirmed, please try to keep the C Confirmed Potwierdzone U Unknown Unknown 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. DXClusterAssistant DX Freq Status 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ść Check in QRZ.com Check this callsign in QRZ.com 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ć: Clears the DXCluster command line. The DXCluster server desconnected the session. - 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 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. 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 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 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 - 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! KLog: No RST TX found! Klog: Nie znaleziono RST-TX! KLog: No RST RX found! Klog: Nie znaleziono odebranych raportów RST-RX! 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. 1 bit 1.5 bits 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 There was a problem with the log, please restart KLog and contact the development team if the error persist. 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. Look up info about the current callsign on qrz.com 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 &Save &Cancel &Cancel 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 was not possible to open the debug file for writing. No debug log will be saved! Status bar ... It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update Log backup recommended! KLog - Backup KLog - New version detected! Ready 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 - ClubLog error KLog - eQSL error KLog - %1 Settings ... Queue all QSOs from this log to be sent 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. The selection you have done does not include any QSO The selection you have done does not include any QSO. 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 To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? KLog - File not open 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. For updated DX-Entity data, update cty.csv. Stats Show the statistics of your radio activity. &Help 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 KLog - QSO received - NEW <HTML><body>ASK-The following QSO data has been received from to be logged: <table><tr><TH>Callsign:</TH><TD>%1</TD></TR><TR><TH>Freq:</TH><TD>%2</TD></TR><TR><TH>Mode:</TH><TD>%3</TD></TR><TR><TH>Time On:</TH><TD>%4</TD></TR><TR><TH>Time Off:</TH><TD>%5</TD></TR><TR><TH>RST TX:</TH><TD>%6</TD></TR><TR><TH>RST RX:</TH><TD>%7</TD></TR><TR><TH>Comment:</TH><TD>%8</TD></TR><TR><TH>DX-Grid:</TH><TD>%9</TD></TR><TR><TH>Local-Grid:</TH><TD>%10</TD></TR><TR><TH>Station Callsign:</TH><TD>%11</TD></TR><TR><TH>Operator Callsign:</TH><TD>%12</TD></TR></table></body></html> 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 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. 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 The callsign %1 is not a valid call. 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 Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 The entity that is selected is different from the one proposed by KLog: Unknown Keep it short, its a button text - There is no selected DXCC. - KLog couldn't find a DXCC Please select the one you want to keep for this QSO. 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 ... 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 Show Map 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. 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 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 ... 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: If the received mode is correct, please contact KLog development team and request support for that mode KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. 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 Show All 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. Show all subdivisions for the current DXCC Entity. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Not - Not Identified None Identified SOTA Ref Age POTA Ref SIG SIG Info VUCC grids WWFF Ref Not selected Distance 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 RX Frequency 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 POTA Ref My SIG My SIG Info My SOTA Ref My WWFF 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. UpLink UpLink DownLink DownLink Satellite Satelita Mode Emisja Other Inne MHz MHz 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! MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites 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... 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 Altitude 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 status Continent Kontynent Contest Id Country Credit Submitted Credit granted 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 ClubLog SDate Date when it was sent Contacted_Op Darc Dok Do not translate if unsure, common hamradio term. Email EQ_Call eQSL RDate eQSL Rcvd eQSL Sent eQSL Wysłane Force Init Freq Freq RX Gridsquare HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW Rcvd LoTW Sent Max Bursts 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 eQSL SDate Date when it was sent Gridsquare ext Extended gridsquare HamLog status HamLog SDate Date when it was sent HRDLog SDate Date when it was sent HamQTH status HamQTH SDate Date when it was sent LoTW SDate Date when it was sent Marcado My Altitude My ARRL Sect My Gridsquare Ext My POTA My SOTA My State My Street My USACA counties My VUCC grids My WWFF Name Notes Operator Owner Callsign POTA Pfx 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 WWFF QSO Date off 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 Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. 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 App 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.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! 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 Show seconds &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 &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. Show seconds in the QSO editor 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. Delete Always the adif file created after uploading QSOs Log level 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. Click to move the DB to the new directory. Kliknij aby przenieść DB do nowego katalogu. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. 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. (#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 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 UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Jednostka Continent Kontynent Reading cty.csv... Wczytywanie cty.csv... Abort reading Przerwij wczytywanie KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. 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. It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. 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-2.4.1/dxccstatuswidget.cpp0000644000175000017500000006162015003153303015525 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 // Include this header to use std::as_const //#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(Awards *awards, QWidget *parent) : QWidget(parent), awards(awards) // Initialize Awards reference { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << " - from: " << _parentFunction; #else #endif //qDebug() << Q_FUNC_INFO << " - Start"; dataProxy = awards->dataProxy; locator = new Locator(); //wards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - -1"; world = new World(dataProxy,Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - -2"; dxccView = new QTableWidget; //qDebug() << Q_FUNC_INFO << " - -3"; 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() << Q_FUNC_INFO << " - -4"; //setDefaultBands(); //qDebug() << Q_FUNC_INFO << " - -5"; createUI(); //qDebug() << Q_FUNC_INFO << " - - END"; } DXCCStatusWidget::~DXCCStatusWidget() { delete(locator); delete(world); //delete(awards); } void DXCCStatusWidget::createUI() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start"; // We remove the vertical header hv = dxccView->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = dxccView->horizontalHeader(); //qDebug() << Q_FUNC_INFO << " - 10"; refreshButton->setText(tr("Update")); //qDebug() << Q_FUNC_INFO << " - 11"; dxccView->setContextMenuPolicy(Qt::CustomContextMenu); //qDebug << Q_FUNC_INFO << " - 12 - setting column count: " << QString::number(numberOfColumns); dxccView->setColumnCount(numberOfColumns); //qDebug() << Q_FUNC_INFO << " - 13"; dxccView->horizontalHeader()->setStretchLastSection(true); //qDebug() << Q_FUNC_INFO << " - 14"; dxccView->setRowCount(0); //qDebug() << Q_FUNC_INFO << " - 20"; 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() << Q_FUNC_INFO << " - 30"; dxccView->resizeColumnsToContents(); dxccView->resizeRowsToContents(); //qDebug() << Q_FUNC_INFO << " - 90"; connect(refreshButton, SIGNAL(clicked()), this, SLOT(slotRefreshButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << " - 91"; connect(dxccView, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(slotItemDoubleClicked(QTableWidgetItem *) ) ); //qDebug() << Q_FUNC_INFO << " - 92"; connect(dxccView, SIGNAL(itemEntered(QTableWidgetItem *)), this, SLOT(slotItemEntered(QTableWidgetItem *) ) ); //connect(dxccView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButton( const QPoint& ) ) ); //qDebug() << Q_FUNC_INFO << " - 93"; //dxccView->setSortingEnabled(false); //qDebug() << Q_FUNC_INFO << " - END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::handleDXCCStatusUpdateFailure() { //qDebug() << Q_FUNC_INFO << " - Start"; 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(); break; case QMessageBox::No: break; default: break; } } void DXCCStatusWidget::processEntities() //TODO: Update the definition if the list of entities can be obtained from dataproxy { // entities just has the number of entities (aprox 350) //qDebug() << Q_FUNC_INFO << " - Start"; QList bandIds = getBandIds(); QList entitiesIDs = dataProxy->getListOfDXCCIds(); if (dxccView->columnCount() > 0) dxccView->clearContents(); int i; // Now we create a list where the first number is the entity and the rest are bands. foreach (i, entitiesIDs) { QList list = { i }; // Firt int is the Entity, the rest are the bands. list.append(bandIds); addEntity(list); } } QList DXCCStatusWidget::getBandIds() { //qDebug() << Q_FUNC_INFO << " - Start"; QList bandIds; bandIds.clear(); for (const QString &bandName : std::as_const(bandNames)) { bandIds.append(dataProxy->getIdFromBandName(bandName)); } return bandIds; } void DXCCStatusWidget::update() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug()() << Q_FUNC_INFO << " - Start"; //int entities = dataProxy->getMaxEntityID(false); // REMOVE IF processEntities does not need it if (!awards->updateDXCCStatus (-1)) // We update all { //qDebug() << Q_FUNC_INFO << "awards->updateDXCCStatus returned FALSE"; // It may be the case that DXCC field in the table is not defined. // It should be updated. handleDXCCStatusUpdateFailure(); return; } //qDebug() << Q_FUNC_INFO << "awards->updateDXCCStatus returned TRUE"; processEntities(); //qDebug() << Q_FUNC_INFO << "AFTER awards->updateDXCCStatus returned"; emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "DXCCStatusWidget::update END" << QTime::currentTime().toString("HH:mm:ss"); } QIcon DXCCStatusWidget::getFlagIcon(const QString _isoName) { //qDebug() << Q_FUNC_INFO << " - Start"; QString flagSt; flagSt.clear(); if (_isoName.length()>1) { flagSt = ":/flags/" + _isoName + ".png"; } else { flagSt.clear(); } return QIcon(flagSt); } void DXCCStatusWidget::addEntity(const QList &_ent) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start - " << QString::number(_ent.at(0)); // _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 << QString::number(_ent.at(0)) << "/" <getEntityDataFromDXCC(_dxcc); //qDebug() << Q_FUNC_INFO << " Processing Entity: " << entity.name; if (entity.name.length()<3) return; //qDebug() << Q_FUNC_INFO << " - rowCount: " << QString::number(dxccView->rowCount()); dxccView->insertRow(dxccView->rowCount()); QTableWidgetItem *newItemID = new QTableWidgetItem(entity.mainprefix); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); //qDebug() << Q_FUNC_INFO << " - 040"; for (int i=0; i < _ent.length()-1; i++) { //qDebug() << Q_FUNC_INFO << ": " << entity.mainprefix << " - i = " << QString::number(i) << "/" << _ent.at(i); int bandid = _ent.at(i); QSOStatus qsoStatus = awards->getDXCCStatusBand(_dxcc, bandid); QString qsoStatusString = awards->status2String(qsoStatus); if ((qsoStatus != QSOStatus::confirmed) && (qsoStatus != QSOStatus::worked)) qsoStatusString = "-"; QTableWidgetItem *newItem = new QTableWidgetItem(qsoStatusString); newItem->setTextAlignment(Qt::AlignCenter); newItem->setFlags(Qt::ItemIsEnabled); //qDebug() << Q_FUNC_INFO << " - 042"; if (qsoStatus == QSOStatus::confirmed) { //qDebug() << Q_FUNC_INFO << " - 043"; newItem->setForeground (QBrush(Qt::blue)); //newItem->setTextColor(Qt::blue); newItem->setBackground(QBrush(Qt::green)); status = 1; } else if (qsoStatus == QSOStatus::worked) { //qDebug() << Q_FUNC_INFO << " - 045"; if (status < 0) { status = 0; } newItem->setForeground (QBrush(Qt::red)); newItem->setBackground(QBrush(Qt::yellow)); } //qDebug() << Q_FUNC_INFO << " - 048"; dxccView->setItem(dxccView->rowCount()-1, i+1, newItem); //qDebug() << Q_FUNC_INFO << " - 049"; //qDebug() << Q_FUNC_INFO << " rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << QTime::currentTime().toString("HH:mm:ss"); } //qDebug() << Q_FUNC_INFO << " - 050"; QTableWidgetItem *newItemPref = new QTableWidgetItem(entity.mainprefix); newItemPref->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemPref->setFlags(Qt::ItemIsEnabled); QTableWidgetItem *newItemName = new QTableWidgetItem(entity.name); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(getFlagIcon(entity.isoname)); //qDebug() << Q_FUNC_INFO << " - 060" ; if (status == 1) { //qDebug() << Q_FUNC_INFO << " - 061" ; newItemName->setForeground (QBrush(Qt::blue)); newItemName->setBackground(QBrush(Qt::green)); } else if (status == 0) { //qDebug() << Q_FUNC_INFO << " - 062" ; newItemName->setForeground(QBrush(Qt::darkRed)); newItemPref->setForeground(QBrush(Qt::darkRed)); newItemName->setBackground(QBrush(Qt::yellow)); } else { //qDebug() << Q_FUNC_INFO << " - 063" ; newItemName->setForeground(QBrush(Qt::red)); newItemPref->setForeground(QBrush(Qt::red)); } //qDebug() << Q_FUNC_INFO << " - 070" ; dxccView->setItem(dxccView->rowCount()-1, 0, newItemPref); //qDebug() << Q_FUNC_INFO << " - 071" ; dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << Q_FUNC_INFO << " - END"; //qDebug() << Q_FUNC_INFO << " END" << QTime::currentTime().toString("HH:mm:ss"); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::updateDXCCViewHeaders() { numberOfColumns = 2 + bandNames.length(); dxccView->setColumnCount(numberOfColumns); dxccView->setRowCount(0); QStringList headers; headers << tr("Prefix") << tr("Entity") << bandNames; dxccView->setHorizontalHeaderLabels(headers); } QStringList DXCCStatusWidget::filterValidBands(const QStringList &sortedBands) { QStringList validBands; QStringList allValidBands = dataProxy->getBandNames(); foreach (const QString &band, sortedBands) { if (allValidBands.contains(band)) { validBands.append(band); } } return validBands; } void DXCCStatusWidget::setBands(const QString &_callingFunc, const QStringList &_listOfNewBands, bool _creating) { //qDebug() << Q_FUNC_INFO << " - Start (" << _callingFunc <<")"; Q_UNUSED(_callingFunc); emit debugLog(Q_FUNC_INFO, "Start", Debug); if (_listOfNewBands.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - ERROR: List of bands Empty"; return; } QStringList sortedBands = dataProxy->sortBandNamesBottonUp(_listOfNewBands); if (sortedBands.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - ERROR: List of bands Empty-2"; emit debugLog(Q_FUNC_INFO, "No bands received", Debug); return; } Utilities util(Q_FUNC_INFO); if (util.areThoseListsTheSame(bandNames, _listOfNewBands)) { emit debugLog(Q_FUNC_INFO, "Bands are the same", Debug); //qDebug() << Q_FUNC_INFO << " - ERROR: List of bands Not changed"; return; } bandNames = filterValidBands(sortedBands); //qDebug() << Q_FUNC_INFO << " - 100"; fillData(); return; resetDXCCView(); updateDXCCViewHeaders(); //qDebug() << Q_FUNC_INFO << " - 120"; if (_creating) { //qDebug() << Q_FUNC_INFO << " - 121"; update(); } //qDebug() << Q_FUNC_INFO << " - END"; emit debugLog(Q_FUNC_INFO, "End", Debug); } void DXCCStatusWidget::fillData() { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " - 100"; resetDXCCView(); updateDXCCViewHeaders(); //qDebug() << Q_FUNC_INFO << " - 120"; //if (_creating) //{ //qDebug() << Q_FUNC_INFO << " - 121"; update(); //} //qDebug() << Q_FUNC_INFO << " - END"; } void DXCCStatusWidget::resetDXCCView() { //qDebug() << Q_FUNC_INFO << " - Start"; dxccView->clearSelection(); dxccView->clear(); while (dxccView->columnCount() > 0) { dxccView->removeColumn(0); } } void DXCCStatusWidget::setDefaultBands() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << "DXCCStatusWidget::setDefaultBands"; /* 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); //fillData(); //qDebug << "DXCCStatusWidget::setDefaultBands - END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotRefreshButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start"; //TODO: Define a way to show the status of the selected log or all the logs in the DB if (dxccView->rowCount()<1) { //qDebug() << Q_FUNC_INFO << " - rowcount <1"; return; } //QStringList _bands = bandNames; setBands(Q_FUNC_INFO, bandNames, true); fillData(); //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() << Q_FUNC_INFO << " - Start"; //update(); slotRefreshButtonClicked(); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::setCurrentLog(const int _logN) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - " << QString::number(_logN); if (dataProxy->doesThisLogExist(_logN)) { logNumber = _logN; } else { logNumber = -1; } emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotItemEntered(QTableWidgetItem * item ) { // For the time being, this function just defines the tooltip for the item. //qDebug << Q_FUNC_INFO << " - " << ((item->data(0)).toString()).simplified(); //qDebug << Q_FUNC_INFO << " - " << item->text(); //qDebug() << Q_FUNC_INFO << " - Start"; 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() << Q_FUNC_INFO << " - row: " << QString::number(row); //qDebug() << Q_FUNC_INFO << " - hrow: " << dxccView->verticalHeaderItem(row)->text(); // 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() << Q_FUNC_INFO << " - entiID: " << QString::number(entiID); if ((column == 0) || (column == 1)) { //tip = tr("Pref: ") + (dxccView->item(row, 1))->text() + " - "; tip = tr("Pref: ") + world->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() << Q_FUNC_INFO << " - band: " << band; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << Q_FUNC_INFO << " - band: " << QString::number(bandi); if (item->text() == "C") { tip = awards->getQSOofAward(entiID, bandi, logNumber, true); } else { tip = awards->getQSOofAward(entiID, bandi, logNumber, false); } //qDebug() << Q_FUNC_INFO << " - tip: " << tip; 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() << Q_FUNC_INFO << " - tip: " << tip; } //qDebug() << Q_FUNC_INFO << " - END "; 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(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << item->text(); //qDebug() << Q_FUNC_INFO << " - Start"; 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) ; if (item) { row = dxccView->row(item); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - row: " << QString::number(row); _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); for (int i = 2; i < columns; ++i) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column: " << QString::number(i); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column header: " << (dxccView->horizontalHeaderItem(i))->text(); //entityName = (dxccView->item(row,i))->text() ; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - item: " ; it->setText(dxccView->item(row,i)->text()); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column-txt: " << it->text(); QString band = dxccView->horizontalHeaderItem(i)->text(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << band; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << QString::number(bandi); 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); if (qsoId>0) { qsos.append(qsoId); } } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of for" ; if (qsos.length()>0) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - qsos.length = " << QString::number(qsos.length()) ; emit showQsos(qsos); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of column == 1" ; } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: END "; } void DXCCStatusWidget::setMyLocator(const QString &_loc) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - " << _loc; QString l = _loc; if ( locator->isValidLocator(l.toUpper()) ) { loc = l.toUpper(); } } void DXCCStatusWidget::setColors (const QColor &_newOne, const QColor &_needed, const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << ": " << _newOne.name(QColor::HexRgb) << "/" << _needed.name(QColor::HexRgb) << "/" << _worked.name(QColor::HexRgb) << "/" << _confirmed.name(QColor::HexRgb) << "/" << _default.name(QColor::HexRgb); // Just to pass the colors to the awards class //qDebug() << Q_FUNC_INFO << " - Start"; awards->setColors(_newOne, _needed, _worked, _confirmed, _default); } klog-2.4.1/Changelog0000644000175000017500000021524515003153303013246 0ustar develdevelApr 2025 - 2.4.1 - BugFix: Qt6 Can't Import Adif File (Closes #787) - Translations: Catalan (TNX Txema), Rusian (YL3GBC,RA3TYL). Apr 2025 - 2.4.0 - Enhancement: Button without text label in message box. (Closes #641) - Enhancement: Refactor DataProxy_SQLite::addSatellite (Closes #690) - Enhancement: New DXCluster UI - Enhancement: Ported from Qt5 to Qt6. - Enhancement: Refactoring of several classes. - Enhancement: SQLi protection of some queries. - Enhancement: Improve how the cty.csv file (countries file) is read. - Enhancement: Update the entities table to make UTC real instead of int (e.g. India is -5.5 UTC) - Enhancement: Function to import QSOs from WSJTX. - Enhancement: Added all the modes/submodes of ADIF 3.1.4 - Enhancement: Added many tests to test code before releasing. - Enhancement: ADIF Added SUBMM band. - Enhancement: Completed the names of the fields in the log view widget. - Enhancement: Added several ADIF fields (Closes #396, #507, #508, #719) - Bugfix: Not connecting to new dxcluster servers (Closes #760) - Bugfix: (macOS) KLog returns an error if windows is closed instead of closing the app (Closes #786) - Bugfix: 2.4.0-RC1 Dates missing 'day' digits when editing a record in the eQSL tab (Closes #783) - Bugfix: On start it shows the message no translations are found (Closes #774) - Bugfix: QSO tab: If editing and cancelling, it shows red freq (Closes #776) - Bugfix: Edit QSO does not recover the comment so info is lost (Closes #779) - Bugfix: LOTW upload using VARA-HF mode fails. (Closes #735) - Bugfix: Map shows a missing API message (Closes #675)WIP: - Bugfix: LoTW upload station callsign "Not defined" (Closes #657) - Bugfix: KLog 2.3.4 on OS/X always report an error when exiting the application (Closes #743) - Bugfix: Click on disconnect whe you have just connected shows a message with no words (Closes #770) - Bugfix: Cancel does not restart the status (Closes #769) - Bugfix: Clicking Cancel in the DXCluster call when connecting does not stop the connecting secuence. (Closes #684) - Bugfix: ADIF import: Do not add 0 as default iota_id & my_iota_id (Closes #768) - Bugfix: ADIF import: Do not add a 0 as default k_index (Closes #767) - Bugfix: ALTITUDE gets a wrong data on ADIF import if no ALTITUDE is present in the ADIF file (Closes #765) - Bugfix: Default mode for 60m band is USB. (Closes #596) - BugFix: Data loss: Data not managed by the UI may be lost if eddited (Closes #722) - BugFix: Fixed the ISO name for Togo. - BugFix: Distance was not exported to ADIF and DARC_DOK included the distance instead of the right DARC_DOK. - BugFix: Country fix read failed with complex prefixes. - Bugfix: CQ & ITU zones may be wrong for callsigns from specific DXCC if coming from WSJTX. - Bugfix: ClubLog date was not properly managed. - Translations: Dutch (TNX PA3FNT), Spanish (EA4K), Italian (TNX IU5HIU), Latvian (TNX YL3GBC), Rusian (YL3GBC,RA3TYL). - Removed the message against the Russian invasion of Ukraine. No specific reason for this removal. Just I don't feel that it is useful any more. Mar 2024 - 2.3.4 - BugFix: After Editing a QSO, lotw_qsl_rcvd is emptied (Closes #656, #659) (TNX N6PAZ, EA5WA) - Bugfix: Keep data of SAT tab when entering a QSO stopped working. (TNX EA5WA) - BugFix: When editing a split QSO, if TX Frequency is modified, split is disabled and frequencies made equal. (EA5WA) - BugFix: Incorrect CQ zone saved to DataBase (Closes #666) (EA5WA) - BugFix: FO/x calls are not properly identified/stored (Closes #677) (EA5WA) - BugFix: Minor CQz & ITUz bugfixes that could, potentially accept CQ or ITU zones being 0. - Bugfix: Several fields do not meet ADIF specification (Closes #669) - Bugfix: DX-Cluster activity file can't be edit with normal txt file. (Closes #682) - Bugfix: QSO_COMPLETE field in database needs to be redefined (Closes #680) - Bugfix: QRZ.com QSO status was not properly working. (Closes #664) - Bugfix: Alternative location for logbook.dat was not working properly (Closes #653) - Bugfix: Clarify how to use mode / submode in the DB (Closes #650) - Bugfix: Cleared some warning errors about the DB notbeing created in the console. - Enhancement: Refactored the getADIFQSO/getADIFFromQSOQuery to have just one single point of ADIF creation. - Translations: Danish (TNX Peter), Russian (YL3GBC), Spanish (EA4K) Dec 2023 - 2.3.3 - WIP: Started to reduce the possibility of SQLi with the use of prepared statements. - Bugfix: Sat QSO edit was not showing the worked SAT (Closes #645) - Bugfix: After editing a QSO, the restore was not working properly. (Closes #649) - Bugfix: In Sat QSO, still not selected band may make the QSO unusable. (Closes #651) - Bugfix: All Gridsquares are now listed when Export to ADIF is used. (Closes #514) - Bugfix: Selecting a sat with a new band made the bandcombobox unusable. #613 - Bugfix: F1 (online manual link fixed (Closes #627) (TNX ikbenkous) - Bugfix: 'Usage' does not properly handle arguments, print newlines or return status codes (Closes #625) (TNX ikbenkous) - Enhancement: Improved the Frequency entry. (Closes #622) (TNX ikbenkous) - Enhancement: Use a good discriminator in header guards (Closes #624) (TNX ikbenkous) Jun 2023 - 2.3.2 - Bugfix: KLog was not starting when started in clean installations.(Closes #599)(TNX cwross) Jun 2023 - 2.3.1 - Bugfix: When exporting a log, selecting the stationcallsign has no efect on the qsos shown - Bugfix: When no validating callsigns, some ADIF fields were exported even if they were empty. - Bugfix: In some conditions, not identified propagation modes were exported as "NO". (Closes #518) - Bugfix: VUCC_GRIDS validation was not properly done. - Bugfix: It was not possible to select the second pair of freqs of a Sat (Closes #483) - Bugfix: Export/Upload lists of QSOs where not properly created due to call validation issues. (Closes #528) - Bugfix: Fixed the ClubLog URLs that were changed by ClubLog. (Closes #502) - Bugfix: QSOs confirmed with LoTW were not properly shown in DXCC Status. (Closes #551)(EA5WA) - Bugfix: In some conditions, not identified propagation modes were exported as "NO". - Bugfix: In some conditions QRZ.com log upload was not working. (Closes #542) - Bugfix: In some conditions eQSL.cc log upload was not working. (Closes #526)# - Bugfix: VUCC_GRIDS validation was not properly done. - Bugfix: It was not possible to select the second pair of freqs of a Sat (Closes #483) - Bugfix: LoTW export was not using the selected grid when exporting (Closes #539) - Bugfix: Some statistic widgets had a broken layout (Closes #491) - Bugfix: When a new QSO is added, the numbers in awardswidget were not updated. - Bugfix: Distance/beam is shown when editing. (Closes #330) - Improvement: Inclusive search and submodes in LoTW download and WSJTX import. (TNX AG5UR) - Improvement: Code improvement in the MainWindowInputQSO class. - Improvement: Log export widget shows now only QSOs in the current log. - Improvement: Code improvement in the MainWindowInputQSO class. - Improvement: Warning of unused parameters removed. - Improvement: Some SQL queries optimized for speed. - Improvement: Optimized the way log files are exported to online services. - UI: Added QRZ Lookup Button (Closes #390) (EA5WA). - UI: Removed the locator, TX Freq and RX freq widgets from the Satellite tab. (Closes #534, 535, #536) - UI: Shows the total number of QSOs when exporting. - UI: Added a Right-click menu in the DXCluster widget to send a spot to QRZ.com. - UI: Columns in LogView are now movable with the mouse. - Removed the user callsign from the http header when checking for a new version for increased privacy. - Translations: Catalan (TNX Txema), Latvian (TNX YL3GBC), Spanish (EA4K), Ukrainian (UR6QV & UR3QJW). Oct 2022 - 2.3 - Improvement: Code optimization (TNX JohnS0819) https://github.com/ea4k/klog/pull/485 - Bugfix: Calls like EA4K/P were not identified as EA. - Bugfix: Adding DXCluster servers was failing. (Closes #492) (TNX EA7IXM) - Bugfix: When accepting changes on Settings, the settings were being readed twice, causing errors an delays. (Closes #495) - Bugfix: QSOS with a lotw_qsl_sent status as NULL where not identified when queuing QSOs for LoTW. (closes #514) - Improvement: Added the modes and propagation modes of ADIF 3.1.3 (Closes #509, #510) - Improvement UI: Freq & RST labels have been reorganized for clarity. - Improvement: Windows package updated to hamlib 4.4. - Improvement: Minor UI changes in the Setup->misc tab. - Improvement: Showing seconds in the QSO edit can be selected by the user. - Improvement: LoTW upload process allows the user to select a specific locator to be uploaded to be matched with TQSL locations. - Improvement: Changed how hamlib is initialized to speed-up the setup widget exit, specially for non-hamlib users. - Improvement: Some code cleaning. Aug 2022 - 2.2.1 - Bugfix: Temporary bugfix for Setup eLog Page preventing crash on start. (Closes #489) - Bugfix: Temporary quick fix to prevent call validation in some classes that may cause errors. (Opens #490) - Bugfix: Config for real time for clublog was not properly managed. - Bugfix: Calls like EA4K/MM were identified like Scotland, not maritime. - Improvement: Code improvement in the Setup of eLogs. - Tests: Tests for SetupPageElog added. Aug 2022 - 2.2 - Bugfix: DL was not properly shown in the DXCC status table (Closes #460) (TNX N6PAZ) - Bugfix: Clublog QSO status export to file was not properly done. - Bugfix: Removing first char in the callsign caused a crash. (Closes #455) (TNX G4MKT) - Bugfix: Database was not beig properly created in first start. - Bugfix: Changing the statistic widget crashed KLog. (Closes #484) - Bugfix: Some prefixes were not properly identified. - Bugfix: Fixed some database column name typos. - Improvement: Callsign identification optimized. - Improvement: The Debug logging has been improved, still much work TBD. - Improvement: General code cleaning (coveralls.io) - Improvement: General code cleaning (lgtm.com alerts) - Improvement Distance is now stored for new QSO added or modified QSOs from the UI. (Closes #459). - Map back to OSM to recover the map for raspberry & linux - Translations: Spanish (EA4K). Feb 2022 - 2.1 - Improvement: Changed the map provider to ESRI to be able to get Map legends in English. - Improvement: Added two buttons to the map to change the zoom level. - New feature: DX Spots coming from DXCluster can be sent to the map. - Bugfix: Longitude was not properly calculated from a callsign. - Translations: Spanish (EA4K). Feb 2022 - 2.0 - Stop the Ukranian war release. This KLog release is showing my request to stop the war in Ukraine. No other feature of bugfix will be done in this release. Feb 2022 - 1.9 - New feature: Map showing locators. (Closes #168) - Bugfix: Mark QSL to be sent is not shown if QSL is sent on right click menu in the search widget. (Closes #387). - Improvement: Query the radio after leaving manual mode (Closes #416). - Improvement: Grids are now sorted on Grid stats for satellites. (Closes #424). - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Japanese (TNX JJ1TGT) & Spanish (EA4K). Jan 2022 - 1.8.7 - Bugfix: Removed the hamlib test from the KLog start that was causing big delays. - Bugfix: Serial speed was not saved to config file. - Bugfix: eQSL Uploads problem solved (Closes #406). - Bugfix: Connection to the radios were not being done properly (Closes #407) (Closes #379). - Bugfix: SplitCheckBox was checked when coming from Setup (Closes #377). - Bugfix: Entering a QRZ cleared the DX Gridsquare if it was previously entered (Closes #357). - Bugfix: Imported QSOs add the default electronic QSL send info if configured. - Bugfix: DXCC widget shows last Entity status after modifying a QSO (Closes #412). - Bugfix: Hamlib is now stopped while editing a QSO (Closes #414). - Bugfix: Hamlib on serial devices works ok. (Closes #355). - Bugfix: RST is not changed on mode change when editing. (Closes #423). - New feature: Added a Manual Mode checkbox to disable quickly hamlib & wsjtx integration. - New feature: Added "Save" and "Cancel" button when editing a recorded QSO. - Update: Developers mailing list address changed to klog@groups.io (Closes #421). Jan 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 2020 - 1.3.2 - Bugfix: Data comming from WSJT-X, when several WSJT-X instances were running was not properly parsed. (TNX 2E0WJW) October 2020 - 1.3.1 - Translations: Croatian (TNX M0NKC). October 2020 - 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). Nov 2016 - 0.9.2.5 - BugFix: ADIF export function was not exporting the correct BAND & MODE data. Sep 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. Jan 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. Nov 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. Sep 2015 - 0.9.2.1 -BugFix: Band & Mode information was not properly stored. Aug 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. Apr 2015 - 0.9.1.1 - Bugfix: Editing a QSO with satellite data was not properly done and caused some errors. Apr 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. Jan 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. Nov 2014 - 0.9.0.2 - Bugfix: Right-click on search result sometimes caused KLog to crash. Nov 2014 - 0.9.0.1 - Bugfix: Selected DX-Cluster servers were not used to connect. (TNX DL6FBS) Nov 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. Apr 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. Apr 2014 - 0.7.0 - Full rewritten software based only in Qt. NO KDE dependency. - KLog can now run on Linux, OSX and Windows. Nov 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. Jun 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. Jan 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. Jan 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) Dec 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). Nov 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. Jul 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) Mar 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) Feb 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. Feb 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. Jan 2010 - 0.5.1 - Fixed a bug with the display of the Date. Dec 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! Apr 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. Dec 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. 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). 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. Jan 2008 - 0.4.3.1 - Package fix: Distributed with the language (po) files. 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. 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. 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) 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) 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) 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. 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. 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. 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. 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, ... 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. 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. 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. 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. 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. 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. 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. 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). 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. 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.