#include "displaytext.h" #include #include #include #include "moc_displaytext.cpp" DisplayText::DisplayText(QWidget *parent) : QTextBrowser(parent) { _fontWidth = 8; // typical _maxDisplayedCharacters = 48; // a nominal safe(?) value } void DisplayText::mouseDoubleClickEvent(QMouseEvent *e) { bool ctrl = (e->modifiers() & Qt::ControlModifier); bool shift = (e->modifiers() & Qt::ShiftModifier); emit(selectCallsign(shift,ctrl)); QTextBrowser::mouseDoubleClickEvent(e); } void DisplayText::setFont(QFont const& font) { QFontMetrics qfm(font); _fontWidth = qfm.averageCharWidth()+1; // the plus one is emperical QTextBrowser::setFont(font); } void DisplayText::resizeEvent(QResizeEvent * event) { if (_fontWidth > 0 && _fontWidth < 999) _maxDisplayedCharacters = width()/_fontWidth; QTextBrowser::resizeEvent(event); } void DisplayText::insertLineSpacer() { QString tt="----------------------------------------"; QString bg="#d3d3d3"; _insertText(tt,bg); } void DisplayText::_insertText(const QString text, const QString bg) { QString tt = text.mid(0,_maxDisplayedCharacters); //truncate to max display chars QString s = "
" + tt + "
"; QTextCursor cursor = textCursor(); cursor.movePosition(QTextCursor::End); QTextBlockFormat bf = cursor.blockFormat(); bf.setBackground(QBrush(QColor(bg))); cursor.insertHtml(s); this->setTextCursor(cursor); } void DisplayText::_appendDXCCWorkedB4(/*mod*/DecodedText& 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 // TODO this magic 36 characters is also referenced in MainWindow::doubleClickOnCall() int s3 = t1.indexOf(" ",35); if (s3 < 35) s3 = 35; // we always want at least the characters to position 35 s3 += 1; // convert the index into a character count t1 = t1.left(s3); // reduce trailing white space charsAvail -= s3; 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(DecodedText 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); _insertText(decodedText.string(),bg); } void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq) { QString bg="yellow"; QString t1=" @ "; if(modeTx=="JT65") t1=" # "; QString t2; t2.sprintf("%4d",txFreq); QString t = QDateTime::currentDateTimeUtc().toString("hhmm") + \ " Tx " + t2 + t1 + text; // The position of the 'Tx' is searched for in DecodedText and in MainWindow. Not sure if thats required anymore? VK3ACF _insertText(t,bg); }