Commit 34a4ed83 authored by Lorenz Meier's avatar Lorenz Meier

Merge pull request #584 from VArdulov/message_view

Message view
parents 6fb31afe c57da0aa
#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());
}
}
......@@ -34,17 +34,11 @@ public slots:
*/
void handleTextMessage(int uasid, int componentid, int severity, QString text);
/**
* @brief Hand context menu event
* @param event
*/
virtual void contextMenuEvent(QContextMenuEvent* event);
protected:
// Stores the UAS that we're currently receiving messages from.
UASInterface* activeUAS;
QVBoxLayout* initialLayout;
QGCUnconnectedInfoWidget *connectWidget;
QAction* clearAction;
// Stores the connect widget that is displayed when no UAS is active.
QGCUnconnectedInfoWidget* connectWidget;
private:
Ui::QGCMessageView *ui;
......
......@@ -6,14 +6,17 @@
<rect>
<x>0</x>
<y>0</y>
<width>305</width>
<height>283</height>
<width>248</width>
<height>249</height>
</rect>
</property>
<property name="contextMenuPolicy">
<enum>Qt::NoContextMenu</enum>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
......@@ -27,32 +30,22 @@
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<widget class="QPlainTextEdit" name="plainTextEdit">
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>303</width>
<height>273</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<property name="plainText">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment