Improve handling of country/prefix information appended to decoded CQ messages

The  use  of  QTextEdit::toPlainText() converts  non-break  spaces  to
normal spaces so  was breaking the use of that  character to delineate
appended info. Since using  QTextEdit::toPlainText() is an unnecessary
operation as  the decoded text  can be more amenably  accessed through
the QDocument  and QTextBlock interface without  any translation, this
is an improvement which should  have some performance impact when many
decodes are stored in the decodes windows.
This commit is contained in:
Bill Somerville 2018-09-28 16:12:09 +01:00
parent c2c977976c
commit da643fa43e
3 changed files with 23 additions and 27 deletions

View File

@ -20,6 +20,7 @@ DecodedText::DecodedText (QString const& the_string)
, message_ {string_.mid (column_qsoText + padding_).trimmed ()} , message_ {string_.mid (column_qsoText + padding_).trimmed ()}
, is_standard_ {false} , is_standard_ {false}
{ {
qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
if (message_.length() >= 1) if (message_.length() >= 1)
{ {
message0_ = message_.left(36); message0_ = message_.left(36);

View File

@ -76,6 +76,7 @@ void DisplayText::insertLineSpacer(QString const& line)
void DisplayText::appendText(QString const& text, QColor bg, void DisplayText::appendText(QString const& text, QColor bg,
QString const& call1, QString const& call2) QString const& call1, QString const& call2)
{ {
qDebug () << "DisplayText::appendText: text:" << text << "Nbsp pos:" << text.indexOf (QChar::Nbsp);
auto cursor = textCursor (); auto cursor = textCursor ();
cursor.movePosition (QTextCursor::End); cursor.movePosition (QTextCursor::End);
auto block_format = cursor.blockFormat (); auto block_format = cursor.blockFormat ();

View File

@ -6903,27 +6903,28 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
QString format_string {"%1 %2 %3 %4 %5 %6"}; QString format_string {"%1 %2 %3 %4 %5 %6"};
auto const& time_string = time.toString ("~" == mode || "&" == mode ? "hhmmss" : "hhmm"); auto const& time_string = time.toString ("~" == mode || "&" == mode ? "hhmmss" : "hhmm");
auto cqtext = format_string auto message_line = format_string
.arg (time_string) .arg (time_string)
.arg (snr, 3) .arg (snr, 3)
.arg (delta_time, 4, 'f', 1) .arg (delta_time, 4, 'f', 1)
.arg (delta_frequency, 4) .arg (delta_frequency, 4)
.arg (mode, -2) .arg (mode, -2)
.arg (message_text); .arg (message_text);
auto messages = ui->decodedTextBrowser->toPlainText (); QTextCursor start {ui->decodedTextBrowser->document ()};
auto position = messages.lastIndexOf (cqtext); start.movePosition (QTextCursor::End);
if (position < 0) auto cursor = ui->decodedTextBrowser->document ()->find (message_line, start, QTextDocument::FindBackward);
if (cursor.isNull ())
{ {
// try again with with -0.0 delta time // try again with with -0.0 delta time
position = messages.lastIndexOf (format_string cursor = ui->decodedTextBrowser->document ()->find (format_string
.arg (time_string) .arg (time_string)
.arg (snr, 3) .arg (snr, 3)
.arg ('-' + QString::number (delta_time, 'f', 1), 4) .arg ('-' + QString::number (delta_time, 'f', 1), 4)
.arg (delta_frequency, 4) .arg (delta_frequency, 4)
.arg (mode, -2) .arg (mode, -2)
.arg (message_text)); .arg (message_text), start, QTextDocument::FindBackward);
} }
if (position >= 0) if (!cursor.isNull ())
{ {
if (m_config.udpWindowToFront ()) if (m_config.udpWindowToFront ())
{ {
@ -6936,14 +6937,11 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
showNormal (); showNormal ();
raise (); raise ();
} }
// find the linefeed at the end of the line
position = ui->decodedTextBrowser->toPlainText().indexOf(QChar::LineFeed,position);
if (message_text.contains (QRegularExpression {R"(^(CQ |CQDX |QRZ ))"})) { if (message_text.contains (QRegularExpression {R"(^(CQ |CQDX |QRZ ))"})) {
// a message we are willing to accept and auto reply to // a message we are willing to accept and auto reply to
m_bDoubleClicked = true; m_bDoubleClicked = true;
} }
auto start = messages.left (position).lastIndexOf (QChar::LineFeed) + 1; DecodedText message {message_line};
DecodedText message {messages.mid (start, position - start)};
Qt::KeyboardModifiers kbmod {modifiers << 24}; Qt::KeyboardModifiers kbmod {modifiers << 24};
processMessage (message, kbmod); processMessage (message, kbmod);
tx_watchdog (false); tx_watchdog (false);
@ -6951,7 +6949,7 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
} }
else else
{ {
qDebug () << "process reply message ignored, decode not found:" << cqtext; qDebug () << "process reply message ignored, decode not found:" << message_line;
} }
} }
@ -6988,10 +6986,12 @@ void MainWindow::replayDecodes ()
// is not checked // is not checked
// attempt to parse the decoded text // attempt to parse the decoded text
Q_FOREACH (auto const& message for (QTextBlock block = ui->decodedTextBrowser->document ()->firstBlock (); block.isValid (); block = block.next ())
, ui->decodedTextBrowser->toPlainText ().split (QChar::LineFeed,
QString::SkipEmptyParts))
{ {
auto message = block.text ();
message = message.left (message.indexOf (QChar::Nbsp)); // discard
// any
// appended info
if (message.size() >= 4 && message.left (4) != "----") if (message.size() >= 4 && message.left (4) != "----")
{ {
auto const& parts = message.split (' ', QString::SkipEmptyParts); auto const& parts = message.split (' ', QString::SkipEmptyParts);
@ -7001,14 +7001,8 @@ void MainWindow::replayDecodes ()
} }
else else
{ {
auto eom_pos = message.indexOf (' ', 35);
// we always want at least the characters to position 35
if (eom_pos < 35)
{
eom_pos = message.size () - 1;
}
// TODO - how to skip ISCAT decodes // TODO - how to skip ISCAT decodes
postDecode (false, message.left (eom_pos + 1)); postDecode (false, message);
} }
} }
} }