mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-07-12 14:45:18 -04:00
------------------------------------------------------------------------ r7990 | bsomervi | 2017-08-03 00:20:35 +0100 (Thu, 03 Aug 2017) | 5 lines Add a rule to deal with KG4 calls not in Gitmo The AD1C cty.dat file does not resolve KG4 2x1 and 2x3 calls correctly, any that map to Gitmo are really mainland U.S. and this change does that. ------------------------------------------------------------------------ git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx-1.8@7991 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
220 lines
7.1 KiB
C++
220 lines
7.1 KiB
C++
#include "displaytext.h"
|
|
|
|
#include <QMouseEvent>
|
|
#include <QDateTime>
|
|
#include <QTextCharFormat>
|
|
#include <QFont>
|
|
#include <QTextCursor>
|
|
|
|
#include "qt_helpers.hpp"
|
|
|
|
#include "moc_displaytext.cpp"
|
|
|
|
DisplayText::DisplayText(QWidget *parent) :
|
|
QTextEdit(parent)
|
|
{
|
|
setReadOnly (true);
|
|
viewport ()->setCursor (Qt::ArrowCursor);
|
|
setWordWrapMode (QTextOption::NoWrap);
|
|
setStyleSheet ("");
|
|
}
|
|
|
|
void DisplayText::setContentFont(QFont const& font)
|
|
{
|
|
setFont (font);
|
|
m_charFormat.setFont (font);
|
|
selectAll ();
|
|
auto cursor = textCursor ();
|
|
cursor.mergeCharFormat (m_charFormat);
|
|
cursor.clearSelection ();
|
|
cursor.movePosition (QTextCursor::End);
|
|
|
|
// position so viewport scrolled to left
|
|
cursor.movePosition (QTextCursor::Up);
|
|
cursor.movePosition (QTextCursor::StartOfLine);
|
|
|
|
setTextCursor (cursor);
|
|
ensureCursorVisible ();
|
|
}
|
|
|
|
void DisplayText::mouseDoubleClickEvent(QMouseEvent *e)
|
|
{
|
|
bool ctrl = (e->modifiers() & Qt::ControlModifier);
|
|
bool shift = (e->modifiers() & Qt::ShiftModifier);
|
|
emit(selectCallsign(shift,ctrl));
|
|
QTextEdit::mouseDoubleClickEvent(e);
|
|
}
|
|
|
|
void DisplayText::insertLineSpacer(QString const& line)
|
|
{
|
|
appendText (line, "#d3d3d3");
|
|
}
|
|
|
|
void DisplayText::appendText(QString const& text, QString const& bg)
|
|
{
|
|
QString escaped {text.trimmed().replace('<',"<").replace('>',">").replace(' ', " ")};
|
|
QString s = "<table border=0 cellspacing=0 width=100%><tr><td bgcolor=\"" +
|
|
bg + "\">" + escaped + "</td></tr></table>";
|
|
auto cursor = textCursor ();
|
|
cursor.movePosition (QTextCursor::End);
|
|
auto pos = cursor.position ();
|
|
cursor.insertHtml (s);
|
|
cursor.setPosition (pos, QTextCursor::MoveAnchor);
|
|
cursor.movePosition (QTextCursor::End, QTextCursor::KeepAnchor);
|
|
cursor.mergeCharFormat (m_charFormat);
|
|
cursor.clearSelection ();
|
|
|
|
// position so viewport scrolled to left
|
|
cursor.movePosition (QTextCursor::Up);
|
|
cursor.movePosition (QTextCursor::StartOfLine);
|
|
setTextCursor (cursor);
|
|
ensureCursorVisible ();
|
|
}
|
|
|
|
|
|
void DisplayText::_appendDXCCWorkedB4(DecodedText& t1, QString& bg,
|
|
LogBook logBook, QColor color_CQ,
|
|
QColor color_DXCC,
|
|
QColor color_NewCall)
|
|
{
|
|
QString call = t1.CQersCall ();
|
|
QString countryName;
|
|
bool callWorkedBefore;
|
|
bool countryWorkedBefore;
|
|
|
|
if(call.length()==2) {
|
|
int i0=t1.indexOf("CQ "+call);
|
|
call=t1.mid(i0+6,-1);
|
|
i0=call.indexOf(" ");
|
|
call=call.mid(0,i0);
|
|
}
|
|
if(call.length()<3) return;
|
|
if(!call.contains(QRegExp("[0-9]|[A-Z]"))) return;
|
|
|
|
logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore);
|
|
int charsAvail = 48;
|
|
|
|
// the decoder (seems) to always generate 41 chars. For a normal CQ call, the last five are spaces
|
|
// TODO this magic 37 characters is also referenced in MainWindow::doubleClickOnCall()
|
|
int nmin=37;
|
|
int i=t1.indexOf(" CQ ");
|
|
int k=t1.string().mid(i+4,3).toInt();
|
|
if(k>0 and k<999) nmin += 4;
|
|
int s3 = t1.indexOf(" ",nmin);
|
|
if (s3 < nmin) s3 = nmin; // 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=color_DXCC.name();
|
|
}
|
|
else
|
|
if (!callWorkedBefore) // but have worked the country
|
|
{
|
|
t1 += "~";
|
|
bg=color_NewCall.name();
|
|
}
|
|
else
|
|
{
|
|
t1 += " "; // have worked this call before
|
|
bg=color_CQ.name();
|
|
}
|
|
charsAvail -= 1;
|
|
|
|
// do some obvious abbreviations
|
|
countryName.replace ("Islands", "Is.");
|
|
countryName.replace ("Island", "Is.");
|
|
countryName.replace ("North ", "N. ");
|
|
countryName.replace ("Northern ", "N. ");
|
|
countryName.replace ("South ", "S. ");
|
|
countryName.replace ("East ", "E. ");
|
|
countryName.replace ("Eastern ", "E. ");
|
|
countryName.replace ("West ", "W. ");
|
|
countryName.replace ("Western ", "W. ");
|
|
countryName.replace ("Central ", "C. ");
|
|
countryName.replace (" and ", " & ");
|
|
countryName.replace ("Republic", "Rep.");
|
|
countryName.replace ("United States", "U.S.A.");
|
|
countryName.replace ("Fed. Rep. of ", "");
|
|
countryName.replace ("French ", "Fr.");
|
|
countryName.replace ("Asiatic", "AS");
|
|
countryName.replace ("European", "EU");
|
|
countryName.replace ("African", "AF");
|
|
|
|
//
|
|
// deal with special rules that cty.dat does not cope with
|
|
//
|
|
|
|
// KG4 2x1 and 2x3 calls that map to Gitmo are mainland US not Gitmo
|
|
if (call.startsWith ("KG4") && call.size () != 5)
|
|
{
|
|
countryName.replace ("Guantanamo Bay", "U.S.A.");
|
|
}
|
|
|
|
t1 += countryName;
|
|
}
|
|
}
|
|
|
|
void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall,
|
|
bool displayDXCCEntity, LogBook logBook,
|
|
QColor color_CQ, QColor color_MyCall,
|
|
QColor color_DXCC, QColor color_NewCall)
|
|
{
|
|
QString bg="white";
|
|
bool CQcall = false;
|
|
if (decodedText.string ().contains (" CQ ")
|
|
|| decodedText.string ().contains (" CQDX ")
|
|
|| decodedText.string ().contains (" QRZ "))
|
|
{
|
|
CQcall = true;
|
|
bg=color_CQ.name();
|
|
}
|
|
if (myCall != "" and (
|
|
decodedText.indexOf (" " + myCall + " ") >= 0
|
|
or decodedText.indexOf (" " + myCall + "/") >= 0
|
|
or decodedText.indexOf ("/" + myCall + " ") >= 0
|
|
or decodedText.indexOf ("<" + myCall + " ") >= 0
|
|
or decodedText.indexOf (" " + myCall + ">") >= 0)) {
|
|
bg=color_MyCall.name();
|
|
}
|
|
// 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,color_CQ,
|
|
color_DXCC,color_NewCall);
|
|
appendText(decodedText.string(),bg);
|
|
}
|
|
|
|
|
|
void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq,
|
|
QColor color_TxMsg, bool bFastMode)
|
|
{
|
|
QString bg=color_TxMsg.name();
|
|
QString t1=" @ ";
|
|
if(modeTx=="FT8") t1=" ~ ";
|
|
if(modeTx=="JT4") t1=" $ ";
|
|
if(modeTx=="JT65") t1=" # ";
|
|
if(modeTx=="MSK144") t1=" & ";
|
|
QString t2;
|
|
t2.sprintf("%4d",txFreq);
|
|
QString t;
|
|
if(bFastMode or modeTx=="FT8") {
|
|
t = QDateTime::currentDateTimeUtc().toString("hhmmss") + \
|
|
" Tx " + t2 + t1 + text;
|
|
} else {
|
|
t = QDateTime::currentDateTimeUtc().toString("hhmm") + \
|
|
" Tx " + t2 + t1 + text;
|
|
}
|
|
appendText(t,bg);
|
|
}
|
|
|
|
void DisplayText::displayQSY(QString text)
|
|
{
|
|
QString t = QDateTime::currentDateTimeUtc().toString("hhmmss") + " " + text;
|
|
QString bg="hot pink";
|
|
appendText(t,bg);
|
|
}
|