8 #include <QScopedPointer>
9 #include <QStringBuilder>
10 #include <QTextDocument>
11 #include <QTextOption>
20 using namespace swift::misc::network;
24 CTextMessageTextEdit::CTextMessageTextEdit(QWidget *parent) : QTextEdit(parent)
26 this->setDocument(&m_textDocument);
27 this->setReadOnly(
true);
28 this->setWordWrap(
true);
31 this->setContextMenuPolicy(Qt::CustomContextMenu);
32 m_actionClearTextEdit =
new QAction(CIcon::iconByIndex(CIcons::StandardIconDelete16).toQIcon(),
"Clear",
this);
33 m_actionLast10 =
new QAction(
"Keep last 10 messages",
this);
34 m_actionLast25 =
new QAction(
"Keep last 25 messages",
this);
35 m_actionAll =
new QAction(
"Keep all messages",
this);
36 m_actionWithRecipient =
new QAction(
"With recipient",
this);
37 m_actionWithSender =
new QAction(
"With sender",
this);
38 m_actionWordWrap =
new QAction(
"Word wrap",
this);
39 m_actionWithRecipient->setCheckable(
true);
40 m_actionWithSender->setCheckable(
true);
41 m_actionWordWrap->setCheckable(
true);
44 connect(m_actionAll, &QAction::triggered,
this, &CTextMessageTextEdit::keepLastNMessages);
45 connect(m_actionLast10, &QAction::triggered,
this, &CTextMessageTextEdit::keepLastNMessages);
46 connect(m_actionLast25, &QAction::triggered,
this, &CTextMessageTextEdit::keepLastNMessages);
47 connect(m_actionWithSender, &QAction::triggered,
this, &CTextMessageTextEdit::setVisibleFields);
48 connect(m_actionWithRecipient, &QAction::triggered,
this, &CTextMessageTextEdit::setVisibleFields);
49 connect(m_actionWordWrap, &QAction::triggered,
this, &CTextMessageTextEdit::setWordWrap);
51 connect(
this, &QTextEdit::customContextMenuRequested,
this, &CTextMessageTextEdit::showContextMenuForTextEdit);
58 if (maxMessages < 0 && m_keepMaxMessages >= 0) { maxMessages = m_keepMaxMessages; }
60 else { m_messages.
push_back(textMessage); }
75 this->toHtml(m_latestFirst ? m_messages.
reversed() : m_messages, m_withSender, m_withRecipient));
76 m_textDocument.setHtml(html);
77 this->moveCursor(m_latestFirst ? QTextCursor::Start : QTextCursor::End);
82 m_textDocument.setDefaultStyleSheet(styleSheet);
86 QString CTextMessageTextEdit::toHtml(
const CTextMessageList &messages,
bool withFrom,
bool withTo)
88 if (messages.
isEmpty()) {
return {}; }
89 QString html(
"<table>");
90 for (
const CTextMessage &msg : messages) { html += CTextMessageTextEdit::toHtml(msg, withFrom, withTo); }
95 QString CTextMessageTextEdit::toHtml(
const CTextMessage &message,
bool withFrom,
bool withTo)
97 QString rowClass(message.
wasSent() ?
"sent" :
"received");
100 QString html(u
"<tr class=\"" % rowClass.trimmed() % u
"\"><td class=\"timestamp\">" %
111 void CTextMessageTextEdit::showContextMenuForTextEdit(
const QPoint &pt)
113 m_actionWithRecipient->setChecked(m_withRecipient);
114 m_actionWithSender->setChecked(m_withSender);
115 m_actionWordWrap->setChecked(m_wordWrap);
117 QScopedPointer<QMenu> menu(this->createStandardContextMenu());
118 menu->setObjectName(this->objectName().append(
"_contextMenu"));
119 menu->addSeparator();
120 menu->addAction(m_actionWordWrap);
121 QMenu *subMenu = menu->addMenu(
"Max.messages");
122 subMenu->addAction(m_actionLast10);
123 subMenu->addAction(m_actionLast25);
124 subMenu->addAction(m_actionAll);
125 subMenu = menu->addMenu(
"Fields");
126 subMenu->addAction(m_actionWithSender);
127 subMenu->addAction(m_actionWithRecipient);
128 menu->addAction(m_actionClearTextEdit);
129 menu->exec(this->mapToGlobal(pt));
132 void CTextMessageTextEdit::keepLastNMessages()
134 QObject *sender = QObject::sender();
135 if (sender == m_actionAll) { m_keepMaxMessages = -1; }
136 else if (sender == m_actionLast10) { m_keepMaxMessages = 10; }
137 else if (sender == m_actionLast25) { m_keepMaxMessages = 25; }
140 void CTextMessageTextEdit::setVisibleFields()
142 QObject *sender = QObject::sender();
143 if (sender == m_actionWithRecipient) { m_withRecipient = m_actionWithRecipient->isChecked(); }
144 else if (sender == m_actionWithSender) { m_withSender = m_actionWithSender->isChecked(); }
147 void CTextMessageTextEdit::setWordWrap(
bool wordWrap)
149 m_wordWrap = wordWrap;
150 if (m_wordWrap) { this->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); }
151 else { this->setWordWrapMode(QTextOption::NoWrap); }
void insertTextMessage(const swift::misc::network::CTextMessage &textMessage, int maxMessages=-1)
Insert a message.
virtual ~CTextMessageTextEdit()
Destructor.
void redrawHtml()
Redraw HTML.
void setStyleSheetForContent(const QString &styleSheet)
Stylesheet for content.
int count() const
Number of displayed messages.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
void clear()
Removes all elements in the sequence.
Q_REQUIRED_RESULT CSequence reversed() const
Reversed order.
void push_backMaxElements(const T &value, int maxElements)
Insert as last element by keep maxElements.
bool isEmpty() const
Synonym for empty.
QString getFormattedUtcTimestampHms() const
As hh:mm:ss.
const QString & asString() const
Get callsign (normalized)
Value object encapsulating information of a text message.
QString getHtmlEncodedMessage() const
Get HTML escaped message.
QString getRecipientCallsignOrFrequency() const
Get recipient or frequency.
bool wasSent() const
Was sent?
const aviation::CCallsign & getSenderCallsign() const
Get callsign (from)
bool isSupervisorMessage() const
Supervisor message?
Value object encapsulating a list of text messages.
Free functions in swift::misc.