Browse Source

Vehicle: fix html escaping for events & rich text rendering

Also removes unused getLatestError()
QGC4.4
Beat Küng 2 years ago committed by Don Gagne
parent
commit
dfcf25a576
  1. 3
      src/Vehicle/EventHandler.cc
  2. 20
      src/Vehicle/Vehicle.cc
  3. 6
      src/Vehicle/Vehicle.h
  4. 16
      src/uas/UASMessageHandler.cc
  5. 12
      src/uas/UASMessageHandler.h
  6. 1
      src/ui/MainRootWindow.qml

3
src/Vehicle/EventHandler.cc

@ -45,6 +45,9 @@ EventHandler::EventHandler(QObject* parent, const QString& profile, handle_event
_parser.formatters().param = [](const std::string& content) { _parser.formatters().param = [](const std::string& content) {
return "<a href=\"param://"+content+"\">"+content+"</a>"; }; return "<a href=\"param://"+content+"\">"+content+"</a>"; };
_parser.formatters().escape = [](const std::string& str) {
return QString::fromStdString(str).toHtmlEscaped().toStdString(); };
events::ReceiveProtocol::Callbacks callbacks{error_cb, _sendRequestCB, events::ReceiveProtocol::Callbacks callbacks{error_cb, _sendRequestCB,
std::bind(&EventHandler::gotEvent, this, std::placeholders::_1), timeout_cb}; std::bind(&EventHandler::gotEvent, this, std::placeholders::_1), timeout_cb};
_protocol = new events::ReceiveProtocol(callbacks, ourSystemId, ourComponentId, systemId, componentId); _protocol = new events::ReceiveProtocol(callbacks, ourSystemId, ourComponentId, systemId, componentId);

20
src/Vehicle/Vehicle.cc

@ -925,7 +925,7 @@ void Vehicle::_chunkedStatusTextCompleted(uint8_t compId)
qgcApp()->toolbox()->audioOutput()->say(messageText); qgcApp()->toolbox()->audioOutput()->say(messageText);
} }
} }
emit textMessageReceived(id(), compId, severity, messageText); emit textMessageReceived(id(), compId, severity, messageText.toHtmlEscaped(), "");
} }
void Vehicle::_handleStatusText(mavlink_message_t& message) void Vehicle::_handleStatusText(mavlink_message_t& message)
@ -1605,24 +1605,19 @@ void Vehicle::_handleEvent(uint8_t comp_id, std::unique_ptr<events::parser::Pars
} }
} }
if (!message.empty() && !messageChecks.empty()) { if (!message.empty() && !messageChecks.empty()) {
message += "<br/>"; message += "\n";
} }
if (messageChecks.size() == 1) { if (messageChecks.size() == 1) {
message += messageChecks[0]; message += messageChecks[0];
} else { } else {
for (const auto& messageCheck : messageChecks) { for (const auto& messageCheck : messageChecks) {
message += "- " + messageCheck + "<br/>"; message += "- " + messageCheck + "\n";
} }
} }
} }
if (message.size() > 0) { if (!message.empty()) {
// TODO: handle this properly in the UI (e.g. with an expand button to display the description, clickable URL's + params)... emit textMessageReceived(id(), comp_id, severity, QString::fromStdString(message), QString::fromStdString(description));
QString msg = QString::fromStdString(message);
if (description.size() > 0) {
msg += "<br/><small><small>" + QString::fromStdString(description).replace("\n", "<br/>") + "</small></small>";
}
emit textMessageReceived(id(), comp_id, severity, msg);
} }
} }
} }
@ -2030,11 +2025,6 @@ void Vehicle::_handleTextMessage(int newCount)
_messageCount = newCount; _messageCount = newCount;
emit messageCountChanged(); emit messageCountChanged();
} }
QString errMsg = pMh->getLatestError();
if(errMsg != _latestError) {
_latestError = errMsg;
emit latestErrorChanged();
}
} }
void Vehicle::resetAllMessages() void Vehicle::resetAllMessages()

6
src/Vehicle/Vehicle.h

@ -177,7 +177,6 @@ public:
Q_PROPERTY(int newMessageCount READ newMessageCount NOTIFY newMessageCountChanged) Q_PROPERTY(int newMessageCount READ newMessageCount NOTIFY newMessageCountChanged)
Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged) Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged)
Q_PROPERTY(QString formattedMessages READ formattedMessages NOTIFY formattedMessagesChanged) Q_PROPERTY(QString formattedMessages READ formattedMessages NOTIFY formattedMessagesChanged)
Q_PROPERTY(QString latestError READ latestError NOTIFY latestErrorChanged)
Q_PROPERTY(bool joystickEnabled READ joystickEnabled WRITE setJoystickEnabled NOTIFY joystickEnabledChanged) Q_PROPERTY(bool joystickEnabled READ joystickEnabled WRITE setJoystickEnabled NOTIFY joystickEnabledChanged)
Q_PROPERTY(int flowImageIndex READ flowImageIndex NOTIFY flowImageIndexChanged) Q_PROPERTY(int flowImageIndex READ flowImageIndex NOTIFY flowImageIndexChanged)
Q_PROPERTY(int rcRSSI READ rcRSSI NOTIFY rcRSSIChanged) Q_PROPERTY(int rcRSSI READ rcRSSI NOTIFY rcRSSIChanged)
@ -595,7 +594,6 @@ public:
int newMessageCount () const{ return _currentMessageCount; } int newMessageCount () const{ return _currentMessageCount; }
int messageCount () const{ return _messageCount; } int messageCount () const{ return _messageCount; }
QString formattedMessages (); QString formattedMessages ();
QString latestError () { return _latestError; }
float latitude () { return static_cast<float>(_coordinate.latitude()); } float latitude () { return static_cast<float>(_coordinate.latitude()); }
float longitude () { return static_cast<float>(_coordinate.longitude()); } float longitude () { return static_cast<float>(_coordinate.longitude()); }
bool mavPresent () { return _mav != nullptr; } bool mavPresent () { return _mav != nullptr; }
@ -919,7 +917,7 @@ signals:
void capabilityBitsChanged (uint64_t capabilityBits); void capabilityBitsChanged (uint64_t capabilityBits);
void toolIndicatorsChanged (); void toolIndicatorsChanged ();
void modeIndicatorsChanged (); void modeIndicatorsChanged ();
void textMessageReceived (int uasid, int componentid, int severity, QString text); void textMessageReceived (int uasid, int componentid, int severity, QString text, QString description);
void calibrationEventReceived (int uasid, int componentid, int severity, QSharedPointer<events::parser::ParsedEvent> event); void calibrationEventReceived (int uasid, int componentid, int severity, QSharedPointer<events::parser::ParsedEvent> event);
void checkListStateChanged (); void checkListStateChanged ();
void messagesReceivedChanged (); void messagesReceivedChanged ();
@ -930,7 +928,6 @@ signals:
void messageCountChanged (); void messageCountChanged ();
void formattedMessagesChanged (); void formattedMessagesChanged ();
void newFormattedMessage (QString formattedMessage); void newFormattedMessage (QString formattedMessage);
void latestErrorChanged ();
void longitudeChanged (); void longitudeChanged ();
void currentConfigChanged (); void currentConfigChanged ();
void flowImageIndexChanged (); void flowImageIndexChanged ();
@ -1129,7 +1126,6 @@ private:
int _currentWarningCount = 0; int _currentWarningCount = 0;
int _currentNormalCount = 0; int _currentNormalCount = 0;
MessageType_t _currentMessageType = MessageNone; MessageType_t _currentMessageType = MessageNone;
QString _latestError;
int _updateCount = 0; int _updateCount = 0;
int _rcRSSI = 255; int _rcRSSI = 255;
double _rcRSSIstore = 255; double _rcRSSIstore = 255;

16
src/uas/UASMessageHandler.cc

@ -103,13 +103,19 @@ void UASMessageHandler::_activeVehicleChanged(Vehicle* vehicle)
} }
} }
void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString text) void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString text, QString description)
{ {
// Hack to prevent calibration messages from cluttering things up // Hack to prevent calibration messages from cluttering things up
if (_activeVehicle->px4Firmware() && text.startsWith(QStringLiteral("[cal] "))) { if (_activeVehicle->px4Firmware() && text.startsWith(QStringLiteral("[cal] "))) {
return; return;
} }
text = text.replace("\n", "<br/>");
// TODO: handle text + description separately in the UI
if (!description.isEmpty()) {
text += "<br/><small><small>" + description.replace("\n", "<br/>") + "</small></small>";
}
// Color the output depending on the message severity. We have 3 distinct cases: // Color the output depending on the message severity. We have 3 distinct cases:
// 1: If we have an ERROR or worse, make it bigger, bolder, and highlight it red. // 1: If we have an ERROR or worse, make it bigger, bolder, and highlight it red.
// 2: If we have a warning or notice, just make it bold and color it orange. // 2: If we have a warning or notice, just make it bold and color it orange.
@ -187,11 +193,7 @@ void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString
if (_multiComp) { if (_multiComp) {
compString = QString(" COMP:%1").arg(compId); compString = QString(" COMP:%1").arg(compId);
} }
message->_setFormatedText(QString("<font style=\"%1\">[%2%3]%4 %5</font><br/>").arg(style).arg(dateString).arg(compString).arg(severityText).arg(text.toHtmlEscaped())); message->_setFormatedText(QString("<font style=\"%1\">[%2%3]%4 %5</font><br/>").arg(style).arg(dateString).arg(compString).arg(severityText).arg(text));
if (message->severityIsError()) {
_latestError = severityText + " " + text;
}
_mutex.unlock(); _mutex.unlock();
@ -202,7 +204,7 @@ void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString
emit textMessageCountChanged(count); emit textMessageCountChanged(count);
if (_showErrorsInToolbar && message->severityIsError()) { if (_showErrorsInToolbar && message->severityIsError()) {
_app->showCriticalVehicleMessage(message->getText().toHtmlEscaped()); _app->showCriticalVehicleMessage(message->getText());
} }
} }

12
src/uas/UASMessageHandler.h

@ -37,7 +37,7 @@ public:
*/ */
int getSeverity() const { return _severity; } int getSeverity() const { return _severity; }
/** /**
* @brief Get message text (e.g. "[pm] sending list") * @brief Get (html escaped) message text (e.g. "[pm] sending list")
*/ */
QString getText() { return _text; } QString getText() { return _text; }
/** /**
@ -98,10 +98,6 @@ public:
* @brief Get normal message count (Resets count once read) * @brief Get normal message count (Resets count once read)
*/ */
int getNormalCount(); int getNormalCount();
/**
* @brief Get latest error message
*/
QString getLatestError() { return _latestError; }
/// Begin to show message which are errors in the toolbar /// Begin to show message which are errors in the toolbar
void showErrorsInToolbar(void) { _showErrorsInToolbar = true; } void showErrorsInToolbar(void) { _showErrorsInToolbar = true; }
@ -115,9 +111,10 @@ public slots:
* @param uasid UAS Id * @param uasid UAS Id
* @param componentid Component Id * @param componentid Component Id
* @param severity Message severity * @param severity Message severity
* @param text Message Text * @param text Message Text (html escaped)
* @param description Optional detailed description (html escaped)
*/ */
void handleTextMessage(int uasid, int componentid, int severity, QString text); void handleTextMessage(int uasid, int componentid, int severity, QString text, QString description);
signals: signals:
/** /**
@ -144,7 +141,6 @@ private:
int _errorCountTotal; int _errorCountTotal;
int _warningCount; int _warningCount;
int _normalCount; int _normalCount;
QString _latestError;
bool _showErrorsInToolbar; bool _showErrorsInToolbar;
MultiVehicleManager* _multiVehicleManager; MultiVehicleManager* _multiVehicleManager;
}; };

1
src/ui/MainRootWindow.qml

@ -617,6 +617,7 @@ ApplicationWindow {
anchors.centerIn: parent anchors.centerIn: parent
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: qgcPal.alertText color: qgcPal.alertText
textFormat: TextEdit.RichText
} }
MouseArea { MouseArea {

Loading…
Cancel
Save