From 17bd43017ef55da5610bb67b31d46353a9c11818 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 4 Aug 2017 18:03:54 +0000 Subject: [PATCH] Optimize decoded text display to limit heap usage Decoded text line now use considerably less heap memory as they accumulate. This change also limits the maximum number of decode lines saved per session to 5000. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7998 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- displaytext.cpp | 89 ++++++++++++++++++++++++++----------------------- displaytext.h | 40 +++++++++++----------- 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/displaytext.cpp b/displaytext.cpp index 8cd763a56..6708705d1 100644 --- a/displaytext.cpp +++ b/displaytext.cpp @@ -3,8 +3,8 @@ #include #include #include -#include #include +#include #include "qt_helpers.hpp" @@ -13,25 +13,28 @@ DisplayText::DisplayText(QWidget *parent) : QTextEdit(parent) { - setReadOnly (true); - viewport ()->setCursor (Qt::ArrowCursor); - setWordWrapMode (QTextOption::NoWrap); - setStyleSheet (""); + setReadOnly (true); + viewport ()->setCursor (Qt::ArrowCursor); + setWordWrapMode (QTextOption::NoWrap); + document ()->setMaximumBlockCount (5000); // max lines to limit heap usage } void DisplayText::setContentFont(QFont const& font) { - setFont (font); - m_charFormat.setFont (font); + char_font_ = font; selectAll (); auto cursor = textCursor (); - cursor.mergeCharFormat (m_charFormat); + cursor.beginEditBlock (); + auto char_format = cursor.charFormat (); + char_format.setFont (char_font_); + cursor.mergeCharFormat (char_format); cursor.clearSelection (); cursor.movePosition (QTextCursor::End); // position so viewport scrolled to left cursor.movePosition (QTextCursor::Up); cursor.movePosition (QTextCursor::StartOfLine); + cursor.endEditBlock (); setTextCursor (cursor); ensureCursorVisible (); @@ -50,32 +53,38 @@ void DisplayText::insertLineSpacer(QString const& line) appendText (line, "#d3d3d3"); } -void DisplayText::appendText(QString const& text, QString const& bg) +void DisplayText::appendText(QString const& text, QColor bg) { - QString escaped {text.trimmed().replace('<',"<").replace('>',">").replace(' ', " ")}; - QString s = "
" + escaped + "
"; - 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 (); + auto cursor = textCursor (); + cursor.movePosition (QTextCursor::End); + auto block_format = cursor.blockFormat (); + block_format.setBackground (bg); + if (0 == cursor.position ()) + { + cursor.setBlockFormat (block_format); + auto char_format = cursor.charFormat (); + char_format.setFont (char_font_); + cursor.setCharFormat (char_format); + } + else + { + cursor.insertBlock (block_format); + } + cursor.insertText (text); - // position so viewport scrolled to left - cursor.movePosition (QTextCursor::Up); - cursor.movePosition (QTextCursor::StartOfLine); - setTextCursor (cursor); - ensureCursorVisible (); + // position so viewport scrolled to left + cursor.movePosition (QTextCursor::Up); + cursor.movePosition (QTextCursor::StartOfLine); + setTextCursor (cursor); + ensureCursorVisible (); + document ()->setMaximumBlockCount (document ()->maximumBlockCount ()); } -QString DisplayText::_appendDXCCWorkedB4(QString message, QString const& callsign, QString * bg, - LogBook logBook, QColor color_CQ, - QColor color_DXCC, - QColor color_NewCall) +QString DisplayText::appendDXCCWorkedB4(QString message, QString const& callsign, QColor * bg, + LogBook logBook, QColor color_CQ, + QColor color_DXCC, + QColor color_NewCall) { QString call = callsign; QString countryName; @@ -110,18 +119,18 @@ QString DisplayText::_appendDXCCWorkedB4(QString message, QString const& callsig if (!countryWorkedBefore) // therefore not worked call either { message += "!"; - *bg = color_DXCC.name(); + *bg = color_DXCC; } else if (!callWorkedBefore) // but have worked the country { message += "~"; - *bg = color_NewCall.name(); + *bg = color_NewCall; } else { message += " "; // have worked this call before - *bg = color_CQ.name(); + *bg = color_CQ; } charsAvail -= 1; @@ -165,14 +174,14 @@ void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall, QColor color_CQ, QColor color_MyCall, QColor color_DXCC, QColor color_NewCall) { - QString bg="white"; + QColor bg {Qt::white}; bool CQcall = false; if (decodedText.string ().contains (" CQ ") || decodedText.string ().contains (" CQDX ") || decodedText.string ().contains (" QRZ ")) { CQcall = true; - bg=color_CQ.name(); + bg = color_CQ; } if (myCall != "" and ( decodedText.indexOf (" " + myCall + " ") >= 0 @@ -180,14 +189,14 @@ void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall, or decodedText.indexOf ("/" + myCall + " ") >= 0 or decodedText.indexOf ("<" + myCall + " ") >= 0 or decodedText.indexOf (" " + myCall + ">") >= 0)) { - bg=color_MyCall.name(); + bg = color_MyCall; } // if enabled add the DXCC entity and B4 status to the end of the // preformated text line t1 auto message = decodedText.string (); if (displayDXCCEntity && CQcall) - message = _appendDXCCWorkedB4 (message, decodedText.CQersCall (), &bg, logBook, color_CQ, - color_DXCC, color_NewCall); + message = appendDXCCWorkedB4 (message, decodedText.CQersCall (), &bg, logBook, color_CQ, + color_DXCC, color_NewCall); appendText (message, bg); } @@ -195,7 +204,6 @@ void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall, 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=" $ "; @@ -211,12 +219,11 @@ void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 tx t = QDateTime::currentDateTimeUtc().toString("hhmm") + \ " Tx " + t2 + t1 + text; } - appendText(t,bg); + appendText (t, color_TxMsg); } void DisplayText::displayQSY(QString text) { QString t = QDateTime::currentDateTimeUtc().toString("hhmmss") + " " + text; - QString bg="hot pink"; - appendText(t,bg); + appendText (t, "hotpink"); } diff --git a/displaytext.h b/displaytext.h index 65e8bfbb5..b6c0dd01c 100644 --- a/displaytext.h +++ b/displaytext.h @@ -3,39 +3,39 @@ #define DISPLAYTEXT_H #include +#include + #include "logbook/logbook.h" #include "decodedtext.h" - -class DisplayText : public QTextEdit +class DisplayText + : public QTextEdit { - Q_OBJECT + Q_OBJECT public: - explicit DisplayText(QWidget *parent = 0); + explicit DisplayText(QWidget *parent = 0); - void setContentFont (QFont const&); - void insertLineSpacer(QString const&); - void displayDecodedText(DecodedText decodedText, QString myCall, bool displayDXCCEntity, - LogBook logBook, QColor color_CQ, QColor color_MyCall, - QColor color_DXCC, QColor color_NewCall); - void displayTransmittedText(QString text, QString modeTx, qint32 txFreq, - QColor color_TxMsg, bool bFastMode); - void displayQSY(QString text); + void setContentFont (QFont const&); + void insertLineSpacer(QString const&); + void displayDecodedText(DecodedText decodedText, QString myCall, bool displayDXCCEntity, + LogBook logBook, QColor color_CQ, QColor color_MyCall, + QColor color_DXCC, QColor color_NewCall); + void displayTransmittedText(QString text, QString modeTx, qint32 txFreq, + QColor color_TxMsg, bool bFastMode); + void displayQSY(QString text); -signals: - void selectCallsign(bool alt, bool ctrl); + Q_SIGNAL void selectCallsign (bool alt, bool ctrl); -public slots: - void appendText(QString const& text, QString const& bg = "white"); + Q_SLOT void appendText (QString const& text, QColor bg = Qt::white); protected: - void mouseDoubleClickEvent(QMouseEvent *e); + void mouseDoubleClickEvent(QMouseEvent *e); private: - QString _appendDXCCWorkedB4(QString message, QString const& callsign, QString * bg, LogBook logBook, - QColor color_CQ, QColor color_DXCC, QColor color_NewCall); + QString appendDXCCWorkedB4(QString message, QString const& callsign, QColor * bg, LogBook logBook, + QColor color_CQ, QColor color_DXCC, QColor color_NewCall); - QTextCharFormat m_charFormat; + QFont char_font_; }; #endif // DISPLAYTEXT_H