3 changed files with 126 additions and 80 deletions
@ -1,95 +1,154 @@
@@ -1,95 +1,154 @@
|
||||
#include "QGCMessageView.h" |
||||
|
||||
#include <QMenu> |
||||
#include <QScrollBar> |
||||
|
||||
|
||||
#include "QGCMessageView.h" |
||||
#include "GAudioOutput.h" |
||||
#include "QGCUnconnectedInfoWidget.h" |
||||
#include "UASManager.h" |
||||
#include "ui_QGCMessageView.h" |
||||
|
||||
|
||||
QGCMessageView::QGCMessageView(QWidget *parent) : |
||||
QWidget(parent), |
||||
activeUAS(NULL), |
||||
clearAction(new QAction(tr("Clear Text"), this)), |
||||
ui(new Ui::QGCMessageView) |
||||
{ |
||||
setObjectName("QUICKVIEW_MESSAGE_CONSOLE"); |
||||
setObjectName("QUICKVIEW_MESSAGE_CONSOLE") ; |
||||
|
||||
ui->setupUi(this); |
||||
setStyleSheet("QScrollArea { border: 0px; } QPlainTextEdit { border: 0px }"); |
||||
setStyleSheet("QPlainTextEdit { border: 0px }"); |
||||
|
||||
// Construct initial widget
|
||||
connectWidget = new QGCUnconnectedInfoWidget(this); |
||||
ui->horizontalLayout->addWidget(connectWidget); |
||||
ui->plainTextEdit->hide(); |
||||
|
||||
// Enable the right-click menu for the text editor. This works because the plainTextEdit
|
||||
// widget has its context menu policy set to its actions list. So any actions we add
|
||||
// to this widget's action list will be automatically displayed.
|
||||
// We only have the clear action right now.
|
||||
QAction* clearAction = new QAction(tr("Clear Text"), this); |
||||
connect(clearAction, SIGNAL(triggered()), ui->plainTextEdit, SLOT(clear())); |
||||
ui->plainTextEdit->addAction(clearAction); |
||||
|
||||
// Connect to the currently active UAS.
|
||||
setActiveUAS(UASManager::instance()->getActiveUAS()); |
||||
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); |
||||
} |
||||
|
||||
QGCMessageView::~QGCMessageView() |
||||
{ |
||||
// The only thing we need to delete is the ui because it's the only thing not cleaned up automatically
|
||||
// by the deletion of its parent.
|
||||
delete ui; |
||||
} |
||||
|
||||
void QGCMessageView::setActiveUAS(UASInterface* uas) |
||||
{ |
||||
if (!uas) |
||||
return; |
||||
|
||||
if (activeUAS) { |
||||
disconnect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
||||
// If we were already attached to an autopilot, disconnect it, restoring
|
||||
// the widget to its initial state as needed.
|
||||
if (activeUAS) |
||||
{ |
||||
disconnect(activeUAS, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
||||
ui->plainTextEdit->clear(); |
||||
} else { |
||||
|
||||
// First time UI setup, clear layout
|
||||
ui->horizontalLayout->removeWidget(connectWidget); |
||||
connectWidget->deleteLater(); |
||||
ui->plainTextEdit->show(); |
||||
|
||||
connect(clearAction, SIGNAL(triggered()), ui->plainTextEdit, SLOT(clear())); |
||||
activeUAS = NULL; |
||||
} |
||||
|
||||
connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
||||
activeUAS = uas; |
||||
// And now if there's an autopilot to follow, set up the UI.
|
||||
if (uas) |
||||
{ |
||||
// Make sure the UI is configured for showing messages.
|
||||
// Note that this call is NOT equivalent to `connectWidget->isVisible()`.
|
||||
if (!connectWidget->isHidden()) |
||||
{ |
||||
connectWidget->hide(); |
||||
ui->plainTextEdit->show(); |
||||
} |
||||
|
||||
// And connect to the new UAS.
|
||||
connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString))); |
||||
activeUAS = uas; |
||||
} |
||||
// But if there's no new autopilot, restore the connect button.
|
||||
else |
||||
{ |
||||
connectWidget->show(); |
||||
ui->plainTextEdit->hide(); |
||||
} |
||||
} |
||||
|
||||
void QGCMessageView::handleTextMessage(int uasid, int compId, int severity, QString text) |
||||
{ |
||||
// XXX color messages according to severity
|
||||
|
||||
QPlainTextEdit *msgWidget = ui->plainTextEdit; |
||||
|
||||
//turn off updates while we're appending content to avoid breaking the autoscroll behavior
|
||||
(void)uasid; // Unused variable voided.
|
||||
// Turn off updates while we're appending content to avoid breaking the autoscroll behavior
|
||||
msgWidget->setUpdatesEnabled(false); |
||||
QScrollBar *scroller = msgWidget->verticalScrollBar(); |
||||
|
||||
UASInterface *uas = UASManager::instance()->getUASForId(uasid); |
||||
QString uasName(uas->getUASName()); |
||||
QString colorName(uas->getColor().name()); |
||||
//change styling based on severity
|
||||
if (160 == severity ) { //TODO where is the constant for "critical" severity?
|
||||
// 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.
|
||||
// 2: If we have a warning or notice, just make it bold and color it orange.
|
||||
// 3: Otherwise color it the standard color, white.
|
||||
|
||||
// So first deteremine the styling based on the severity.
|
||||
QString style; |
||||
switch (severity) |
||||
{ |
||||
case MAV_SEVERITY_EMERGENCY: |
||||
case MAV_SEVERITY_ALERT: |
||||
case MAV_SEVERITY_CRITICAL: |
||||
case MAV_SEVERITY_ERROR: |
||||
// TODO: Move this audio output to UAS.cc, as it doesn't make sense to put audio output in a message logger widget.
|
||||
GAudioOutput::instance()->say(text.toLower()); |
||||
msgWidget->appendHtml(QString("<p style=\"color:#DC143C;background-color:#FFFACD;font-size:large;font-weight:bold\">[%1:%2] %3</p>").arg(uasName).arg(compId).arg(text)); |
||||
//Use set RGB values from given color from QGC
|
||||
style = QString("color: rgb(%1, %2, %3); font-weight:bold").arg(QGC::colorRed.red()).arg(QGC::colorRed.green()).arg(QGC::colorRed.blue()); |
||||
break; |
||||
case MAV_SEVERITY_NOTICE: |
||||
case MAV_SEVERITY_WARNING: |
||||
style = QString("color: rgb(%1, %2, %3); font-weight:bold").arg(QGC::colorOrange.red()).arg(QGC::colorOrange.green()).arg(QGC::colorOrange.blue()); |
||||
break; |
||||
default: |
||||
style = QString("color:white; font-weight:bold"); |
||||
break; |
||||
} |
||||
else { |
||||
msgWidget->appendHtml(QString("<p style=\"color:%1;font-size:smaller\">[%2:%3] %4</p>").arg(colorName).arg(uasName).arg(compId).arg(text)); |
||||
|
||||
// And determine the text for the severitie
|
||||
QString severityText(""); |
||||
switch (severity) |
||||
{ |
||||
case MAV_SEVERITY_EMERGENCY: |
||||
severityText = QString(tr(" EMERGENCY:")); |
||||
break; |
||||
case MAV_SEVERITY_ALERT: |
||||
severityText = QString(tr(" ALERT:")); |
||||
break; |
||||
case MAV_SEVERITY_CRITICAL: |
||||
severityText = QString(tr(" Critical:")); |
||||
break; |
||||
case MAV_SEVERITY_ERROR: |
||||
severityText = QString(tr(" Error:")); |
||||
break; |
||||
case MAV_SEVERITY_WARNING: |
||||
severityText = QString(tr(" Warning:")); |
||||
break; |
||||
case MAV_SEVERITY_NOTICE: |
||||
severityText = QString(tr(" Notice:")); |
||||
break; |
||||
case MAV_SEVERITY_INFO: |
||||
severityText = QString(tr(" Info:")); |
||||
break; |
||||
case MAV_SEVERITY_DEBUG: |
||||
severityText = QString(tr(" Debug:")); |
||||
break; |
||||
default: |
||||
severityText = QString(tr("")); |
||||
break; |
||||
} |
||||
|
||||
// Finally append the properly-styled text with a timestamp.
|
||||
QString dateString = QDateTime::currentDateTime().toString("hh:mm:ss.zzz"); |
||||
msgWidget->appendHtml(QString("<p style=\"color:#CCCCCC\">[%2 - COMP:%3]<font style=\"%1\">%4 %5</font></p>").arg(style).arg(dateString).arg(compId).arg(severityText).arg(text)); |
||||
|
||||
// Ensure text area scrolls correctly
|
||||
scroller->setValue(scroller->maximum()); |
||||
msgWidget->setUpdatesEnabled(true); |
||||
|
||||
} |
||||
|
||||
void QGCMessageView::contextMenuEvent(QContextMenuEvent* event) |
||||
{ |
||||
if(activeUAS) { |
||||
QMenu menu(this); |
||||
menu.addAction(clearAction); |
||||
menu.exec(event->globalPos()); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue