diff --git a/displaytext.cpp b/displaytext.cpp index 51039f7e3..8c029ead9 100644 --- a/displaytext.cpp +++ b/displaytext.cpp @@ -32,3 +32,92 @@ void DisplayText::resizeEvent(QResizeEvent * event) _maxDisplayedCharacters = width()/_fontWidth; QTextBrowser::resizeEvent(event); } + + + +void DisplayText::insertLineSpacer() +{ + QTextCursor cursor; + QTextBlockFormat bf; + QString bg="#d3d3d3"; + bf.setBackground(QBrush(QColor(bg))); + QString tt="----------------------------------------"; + QString s = "
" + tt + "
"; + cursor = this->textCursor(); + cursor.movePosition(QTextCursor::End); + bf = cursor.blockFormat(); + bf.setBackground(QBrush(QColor(bg))); + cursor.insertHtml(s); +} + + +void DisplayText::_appendDXCCWorkedB4(/*mod*/QString& t1, QString& bg, /*uses*/LogBook logBook) +{ + // extract the CQer's call TODO: does this work with all call formats? What about 'CQ DX'? + int s1 = 4 + t1.indexOf(" CQ "); + int s2 = t1.indexOf(" ",s1); + QString call = t1.mid(s1,s2-s1); + QString countryName; + bool callWorkedBefore; + bool countryWorkedBefore; + logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore); + + int charsAvail = _maxDisplayedCharacters; + + // the decoder (seems) to always generate 40 chars. For a normal CQ call, the last five are spaces + t1 = t1.left(36); // reduce trailing white space TODO this magic 36 is also referenced in MainWindow::doubleClickOnCall() + charsAvail -= 36; + if (charsAvail > 4) + { + if (!countryWorkedBefore) // therefore not worked call either + { + t1 += "!"; + bg = "#66ff66"; // strong green + } + else + if (!callWorkedBefore) // but have worked the country + { + t1 += "~"; + bg = "#76cd76"; // mid green + } + else + { + t1 += " "; // have worked this call before + bg="#9cc79c"; // pale green + } + charsAvail -= 1; + + if (countryName.length()>charsAvail) + countryName = countryName.left(1)+"."+countryName.right(charsAvail-2); //abreviate the first word to the first letter, show remaining right most chars + t1 += countryName; + } +} + +void DisplayText::displayDecodedText(QString decodedText, QString myCall, bool displayDXCCEntity, LogBook logBook) +{ + QString bg="white"; + bool CQcall = false; + if (decodedText.indexOf(" CQ ") > 0) + { + CQcall = true; + bg="#66ff66"; //green + } + if (myCall != "" and decodedText.indexOf(" " + myCall + " ") > 0) + bg="#ff6666"; //red + + // if enabled add the DXCC entity and B4 status to the end of the preformated text line t1 + if (displayDXCCEntity && CQcall) + _appendDXCCWorkedB4(/*mod*/decodedText,bg,logBook); + + + QString s = "
" + decodedText + "
"; + + QTextCursor cursor = textCursor(); + cursor.movePosition(QTextCursor::End); + QTextBlockFormat bf = cursor.blockFormat(); + bf.setBackground(QBrush(QColor(bg))); + cursor.insertHtml(s); + this->setTextCursor(cursor); +} diff --git a/displaytext.h b/displaytext.h index bb1c9edf4..a2a6e937f 100644 --- a/displaytext.h +++ b/displaytext.h @@ -2,30 +2,33 @@ #define DISPLAYTEXT_H #include +#include "logbook/logbook.h" class DisplayText : public QTextBrowser { Q_OBJECT public: - explicit DisplayText(QWidget *parent = 0); + explicit DisplayText(QWidget *parent = 0); - void setFont(QFont font); - int getMaxDisplayedCharacters() { return _maxDisplayedCharacters; } + void setFont(QFont font); + void insertLineSpacer(); + void displayDecodedText(QString decodedText, QString myCall, bool displayDXCCEntity, LogBook logBook); signals: - void selectCallsign(bool shift, bool ctrl); + void selectCallsign(bool shift, bool ctrl); public slots: protected: - void mouseDoubleClickEvent(QMouseEvent *e); - void resizeEvent(QResizeEvent * event); + void mouseDoubleClickEvent(QMouseEvent *e); + void resizeEvent(QResizeEvent * event); private: - int _fontWidth; - int _maxDisplayedCharacters; + int _fontWidth; + int _maxDisplayedCharacters; + void _appendDXCCWorkedB4(/*mod*/QString& t1, QString &bg, LogBook logBook); }; diff --git a/logbook/countrydat.cpp b/logbook/countrydat.cpp index cc71ab184..1d88e059e 100644 --- a/logbook/countrydat.cpp +++ b/logbook/countrydat.cpp @@ -117,16 +117,17 @@ void CountryDat::load() } // return country name else "" -QString CountryDat::find(QString prefix) +QString CountryDat::find(const QString prefix) { - while(prefix.length() >= 1) + QString pf = prefix.toUpper(); + while(pf.length() >= 1) { - if (_data.contains(prefix)) + if (_data.contains(pf)) { - QString country = _data.value(prefix); + QString country = _data.value(pf); return country; } - prefix = prefix.left(prefix.length()-1); + pf = pf.left(pf.length()-1); } return ""; } diff --git a/logbook/countrydat.h b/logbook/countrydat.h index 968bc6a77..cd550cf1b 100644 --- a/logbook/countrydat.h +++ b/logbook/countrydat.h @@ -19,7 +19,7 @@ class CountryDat public: void init(const QString filename); void load(); - QString find(QString prefix); // return country name or "" + QString find(const QString prefix); // return country name or "" QStringList getCountryNames() { return _countryNames; }; private: diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index a328540a6..5ec6ff959 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -23,6 +23,13 @@ void LogBook::init() int count = _worked.getWorkedCount(); qDebug() << QSOcount << "QSOs and" << count << "countries worked in file" << logFilename; */ + +// QString call = "ok1ct"; +// QString countryName; +// bool callWorkedBefore,countryWorkedBefore; +// match(/*in*/call, /*out*/ countryName,callWorkedBefore,countryWorkedBefore); +// qDebug() << countryName; + } diff --git a/mainwindow.cpp b/mainwindow.cpp index 9465274e5..1fbb8b381 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1406,100 +1406,30 @@ void MainWindow::readFromStdout() //readFromStdout out << t.mid(0,n-2) << endl; f.close(); - QTextCursor cursor; - QTextBlockFormat bf; - if(m_insertBlank and m_blankLine and jt9com_.nagain==0) { - QString bg="#d3d3d3"; - bf.setBackground(QBrush(QColor(bg))); - QString tt="----------------------------------------"; - QString s = "
" + tt + "
"; - cursor = ui->decodedTextBrowser->textCursor(); - cursor.movePosition(QTextCursor::End); - bf = cursor.blockFormat(); - bf.setBackground(QBrush(QColor(bg))); - cursor.insertHtml(s); - m_blankLine=false; + + if(m_insertBlank and m_blankLine and jt9com_.nagain==0) + { + ui->decodedTextBrowser->insertLineSpacer(); + m_blankLine=false; } - QString bg="white"; - if(t.indexOf(" CQ ")>0) bg="#66ff66"; //green - if(m_myCall!="" and t.indexOf(" "+m_myCall+" ")>0) bg="#ff6666"; //red - bool bQSO=abs(t.mid(14,4).toInt() - m_wideGraph->rxFreq()) <= 10; QString t1=t.replace("\n","").mid(0,t.length()-4); - // if enabled add the DXCC entity and B4 status to the end of the preformated text line t1 - int cqi = t.indexOf(" CQ "); - if (m_displayDXCCEntity && (cqi >= 0)) + // the left band display + ui->decodedTextBrowser->displayDecodedText(t1,m_myCall,m_displayDXCCEntity,m_logBook); + + if (abs(t1.mid(14,4).toInt() - m_wideGraph->rxFreq()) <= 10) // this msg is within 10 hertz of our tuned frequency { - // extract the CQer's call TODO: does this work with all call formats? What about 'CQ DX'? - int s1 = 4 + t.indexOf(" CQ "); - int s2 = t.indexOf(" ",s1); - QString call = t.mid(s1,s2-s1); - QString countryName; - bool callWorkedBefore; - bool countryWorkedBefore; - m_logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore); + // the right QSO window + ui->decodedTextBrowser2->displayDecodedText(t1,m_myCall,false,m_logBook); - int charsAvail = ui->decodedTextBrowser->getMaxDisplayedCharacters(); - - // the decoder (seems) to always generate 40 chars. For a normal CQ call, the last five are spaces - t1 = t1.left(36); // reduce trailing white space - charsAvail -= 36; - if (charsAvail > 4) - { - if (!countryWorkedBefore) // therefore not worked call either - { - t1 += "!"; - bg = "#66ff66"; // strong green - } - else - if (!callWorkedBefore) // but have worked the country - { - t1 += "~"; - bg = "#76cd76"; // mid green - } - else - { - t1 += " "; // have worked this call before - bg="#9cc79c"; // pale green - } - charsAvail -= 1; - - if (countryName.length()>charsAvail) - countryName = countryName.left(1)+"."+countryName.right(charsAvail-2); //abreviate the first word to the first letter, show remaining right most chars - t1 += countryName; - } - } - - - QString s = "
" + t1 + "
"; - bool b65=t1.indexOf("#")==19; - if(bQSO) { - cursor = ui->decodedTextBrowser2->textCursor(); - cursor.movePosition(QTextCursor::End); - bf = cursor.blockFormat(); - bf.setBackground(QBrush(QColor(bg))); - cursor.insertHtml(s); - ui->decodedTextBrowser2->setTextCursor(cursor); - m_QSOmsg=t1; - if(b65 and m_modeTx!="JT65") on_pbTxMode_clicked(); - if(!b65 and m_modeTx=="JT65") on_pbTxMode_clicked(); - } - - if(jt9com_.nagain==0) { - if(m_myCall!="" and t.indexOf(" "+m_myCall+" ")>0) bg="#ff6666"; //red - QString s = "
" + t1 + "
"; - cursor = ui->decodedTextBrowser->textCursor(); - cursor.movePosition(QTextCursor::End); - bf = cursor.blockFormat(); - bf.setBackground(QBrush(QColor(bg))); - cursor.insertHtml(s); - ui->decodedTextBrowser->setTextCursor(cursor); + bool b65=t1.indexOf("#")==19; + if(b65 and m_modeTx!="JT65") on_pbTxMode_clicked(); + if(!b65 and m_modeTx=="JT65") on_pbTxMode_clicked(); + m_QSOmsg=t1; } + // find and extract any report QString msg=t.mid(21); int i1=msg.indexOf("\r"); if(i1>0) msg=msg.mid(0,i1-1) + " "; @@ -1522,9 +1452,11 @@ void MainWindow::readFromStdout() //readFromStdout } } + // extract details and send to PSKreporter int nsec=QDateTime::currentMSecsSinceEpoch()/1000-m_secBandChanged; bool okToPost=(nsec>50); QString msgmode="JT9"; + bool b65=t1.indexOf("#")==19; if(b65) msgmode="JT65"; i1=msg.indexOf(" "); QString c2=msg.mid(i1+1); @@ -2021,6 +1953,10 @@ void MainWindow::doubleClickOnCall(bool shift, bool ctrl) QString t1 = t.mid(0,i2); //contents up to \n on selected line int i1=t1.lastIndexOf("\n") + 1; //points to first char of line QString t2 = t1.mid(i1,i2-i1); //selected line + + if (t2.indexOf(" CQ ") > 0) + t2 = t2.left(36); // to remove DXCC entity and worked B4 status. TODO need a better way to do this + // if(t2.indexOf("Tx")==6) return; //Ignore Tx line int i4=t.mid(i1).length(); if(i4>55) i4=55;