Commit 16e40be2 authored by dogmaphobic's avatar dogmaphobic

Added drop down message widget

parent 4de3a940
......@@ -494,7 +494,8 @@ HEADERS += \
src/ui/QGCLinkConfiguration.h \
src/comm/LinkConfiguration.h \
src/ui/QGCCommConfiguration.h \
src/ui/QGCUDPLinkConfiguration.h
src/ui/QGCUDPLinkConfiguration.h \
src/uas/QGCMessageHandler.h
SOURCES += \
src/main.cc \
......@@ -635,7 +636,8 @@ SOURCES += \
src/ui/QGCLinkConfiguration.cc \
src/comm/LinkConfiguration.cc \
src/ui/QGCCommConfiguration.cc \
src/ui/QGCUDPLinkConfiguration.cc
src/ui/QGCUDPLinkConfiguration.cc \
src/uas/QGCMessageHandler.cc
#
# Unit Test specific configuration goes here
......
......@@ -54,6 +54,7 @@
#include "QGCSingleton.h"
#include "LinkManager.h"
#include "UASManager.h"
#include "QGCMessageHandler.h"
#include "AutoPilotPluginManager.h"
#include "QGCTemporaryFile.h"
#include "QGCFileDialog.h"
......@@ -426,6 +427,11 @@ void QGCApplication::_createSingletons(void)
Q_UNUSED(pluginManager);
Q_ASSERT(pluginManager);
// Need UASManager
QGCMessageHandler* messageHandler = QGCMessageHandler::_createSingleton();
Q_UNUSED(messageHandler);
Q_ASSERT(messageHandler);
// Needs UASManager
FactSystem* factSystem = FactSystem::_createSingleton();
Q_UNUSED(factSystem);
......@@ -460,6 +466,7 @@ void QGCApplication::_destroySingletons(void)
MAVLinkProtocol::_deleteSingleton();
FactSystem::_deleteSingleton();
QGCMessageHandler::_deleteSingleton();
AutoPilotPluginManager::_deleteSingleton();
UASManager::_deleteSingleton();
LinkManager::_deleteSingleton();
......
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/*!
* @file
* @brief Message Handler
* @author Gus Grubba <mavlink@grubba.com>
*/
#include "QGCApplication.h"
#include "QGCMessageHandler.h"
#include "UASManager.h"
QGCUasMessage::QGCUasMessage(int componentid, int severity, QString text)
{
_compId = componentid;
_severity = severity;
_text = text;
}
IMPLEMENT_QGC_SINGLETON(QGCMessageHandler, QGCMessageHandler)
QGCMessageHandler::QGCMessageHandler(QObject *parent)
: QGCSingleton(parent)
, _activeUAS(NULL)
{
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*)));
emit textMessageReceived(NULL);
}
QGCMessageHandler::~QGCMessageHandler()
{
_clearMessages();
}
void QGCMessageHandler::_clearMessages()
{
_mutex.lock();
while(_messages.count()) {
delete _messages.last();
_messages.pop_back();
}
_mutex.unlock();
}
void QGCMessageHandler::setActiveUAS(UASInterface* uas)
{
// If we were already attached to an autopilot, disconnect it.
if (_activeUAS && _activeUAS != uas)
{
disconnect(_activeUAS, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString)));
_activeUAS = NULL;
_clearMessages();
emit textMessageReceived(NULL);
}
// And now if there's an autopilot to follow, set up the UI.
if (uas)
{
// Connect to the new UAS.
_clearMessages();
_activeUAS = uas;
connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(handleTextMessage(int,int,int,QString)));
}
}
void QGCMessageHandler::handleTextMessage(int uasid, int compId, int severity, QString text)
{
Q_UNUSED(uasid);
// 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 determine 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:
//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;
}
// 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 preppend the properly-styled text with a timestamp.
QString dateString = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
QGCUasMessage* message = new QGCUasMessage(compId, severity, text);
message->_setFormatedText(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));
_mutex.lock();
_messages.append(message);
_mutex.unlock();
emit textMessageReceived(message);
}
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/*!
* @file
* @brief Message Handler
* @author Gus Grubba <mavlink@grubba.com>
*/
#ifndef QGCMESSAGEHANDLER_H
#define QGCMESSAGEHANDLER_H
#include <QObject>
#include <QVector>
#include <QMutex>
#include "QGCSingleton.h"
class UASInterface;
class QGCMessageHandler;
/*!
* @class QGCUasMessage
* @brief Message element
*/
class QGCUasMessage
{
friend class QGCMessageHandler;
public:
/**
* @brief Get message source component ID
*/
int getComponentID() { return _compId; }
/**
* @brief Get message severity (from MAV_SEVERITY_XXX enum)
*/
int getSeverity() { return _severity; }
/**
* @brief Get message text (e.g. "[pm] sending list")
*/
QString getText() { return _text; }
/**
* @brief Get (html) formatted text (in the form: "[11:44:21.137 - COMP:50] Info: [pm] sending list")
*/
QString getFormatedText() { return _formatedText; }
private:
QGCUasMessage(int componentid, int severity, QString text);
void _setFormatedText(const QString formatedText) { _formatedText = formatedText; }
int _compId;
int _severity;
QString _text;
QString _formatedText;
};
class QGCMessageHandler : public QGCSingleton
{
Q_OBJECT
DECLARE_QGC_SINGLETON(QGCMessageHandler, QGCMessageHandler)
public:
explicit QGCMessageHandler(QObject *parent = 0);
~QGCMessageHandler();
/**
* @brief Locks access to the message list
*/
void lockAccess() {_mutex.lock(); }
/**
* @brief Unlocks access to the message list
*/
void unlockAccess() {_mutex.unlock(); }
/**
* @brief Access to the message list
*/
const QVector<QGCUasMessage*>& messages() { return _messages; }
public slots:
/**
* @brief Set currently active UAS
* @param uas The current active UAS
*/
void setActiveUAS(UASInterface* uas);
/**
* @brief Handle text message from current active UAS
* @param uasid UAS Id
* @param componentid Component Id
* @param severity Message severity
* @param text Message Text
*/
void handleTextMessage(int uasid, int componentid, int severity, QString text);
signals:
/**
* @brief Sent out when new message arrives
* @param message A pointer to the message. NULL if resetting (new UAS assigned)
*/
void textMessageReceived(QGCUasMessage* message);
private:
void _clearMessages();
// Stores the UAS that we're currently receiving messages from.
UASInterface* _activeUAS;
QVector<QGCUasMessage*> _messages;
QMutex _mutex;
};
#endif // QGCMESSAGEHANDLER_H
......@@ -3,7 +3,7 @@
QGCTabbedInfoView::QGCTabbedInfoView(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
messageView = new QGCMessageView(this);
messageView = new QGCMessageViewWidget(this);
//actionsWidget = new UASActionsWidget(this);
quickView = new UASQuickView(this);
//rawView = new UASRawStatusView(this);
......
......@@ -18,7 +18,7 @@ public:
private:
MAVLinkDecoder *m_decoder;
Ui::QGCTabbedInfoView ui;
QGCMessageView *messageView;
QGCMessageViewWidget *messageView;
UASQuickView *quickView;
UASRawStatusView *rawView;
};
......
......@@ -31,6 +31,26 @@ This file is part of the QGROUNDCONTROL project
#include "UASManager.h"
#include "MainWindow.h"
#include "QGCApplication.h"
#include "QGCMessageView.h"
// Label class that sends mouse hover events
class QCGHoverLabel : public QLabel
{
public:
QCGHoverLabel(QGCToolBar* toolBar) : QLabel(toolBar)
{
_toolBar = toolBar;
}
protected:
void enterEvent(QEvent* event)
{
Q_UNUSED(event);
_toolBar->enterMessageLabel();
}
private:
QGCToolBar* _toolBar;
};
QGCToolBar::QGCToolBar(QWidget *parent) :
QToolBar(parent),
......@@ -47,6 +67,7 @@ QGCToolBar::QGCToolBar(QWidget *parent) :
_linkMgr(LinkManager::instance()),
_linkCombo(NULL),
_linkComboAction(NULL),
_rollDownMessages(NULL),
_linksConnected(false),
_linkSelected(false)
{
......@@ -148,7 +169,7 @@ void QGCToolBar::createUI()
toolBarWpLabel->setAlignment(Qt::AlignCenter);
toolBarWpAction = addWidget(toolBarWpLabel);
toolBarMessageLabel = new QLabel(this);
toolBarMessageLabel = new QCGHoverLabel(this);
toolBarMessageLabel->setToolTip(tr("Most recent system message"));
toolBarMessageLabel->setObjectName("toolBarMessageLabel");
toolBarMessageAction = addWidget(toolBarMessageLabel);
......@@ -413,7 +434,7 @@ void QGCToolBar::updateView()
if (QGC::groundTimeMilliseconds() - lastSystemMessageTimeMs < 15000) {
toolBarMessageLabel->setText(QString("%1").arg(lastSystemMessage));
} else {
toolBarMessageLabel->clear();
toolBarMessageLabel->setText(tr("Messages"));
}
}
......@@ -677,15 +698,6 @@ void QGCToolBar::_disconnectFromMenu(bool checked)
_linkMgr->disconnectLink(link);
}
void QGCToolBar::clearStatusString()
{
if (toolBarMessageLabel->text().length() > 0)
{
lastSystemMessage = "";
changed = true;
}
}
void QGCToolBar::_linkComboActivated(int index)
{
int type = _linkCombo->itemData(index).toInt();
......@@ -721,3 +733,27 @@ void QGCToolBar::_updateConfigurations()
_linkSelected = false;
}
}
/**
* @brief Mouse entered Message label area
*/
void QGCToolBar::enterMessageLabel()
{
if(!_rollDownMessages)
{
QPoint p = toolBarMessageLabel->mapToGlobal(QPoint(0,0));
_rollDownMessages = new QGCMessageViewRollDown(MainWindow::instance(),this);
_rollDownMessages->setAttribute(Qt::WA_DeleteOnClose);
_rollDownMessages->move(mapFromGlobal(p));
_rollDownMessages->setMinimumSize(400,300);
_rollDownMessages->show();
}
}
/**
* @brief Mouse left message drop down list area (and closed it)
*/
void QGCToolBar::leaveMessageView()
{
_rollDownMessages = NULL;
}
......@@ -37,6 +37,8 @@ This file is part of the QGROUNDCONTROL project
#include "SerialLink.h"
#include "LinkManager.h"
class QGCMessageViewRollDown;
class QGCToolBar : public QToolBar
{
Q_OBJECT
......@@ -45,6 +47,14 @@ public:
explicit QGCToolBar(QWidget* parent = 0);
void setPerspectiveChangeActions(const QList<QAction*> &action);
void setPerspectiveChangeAdvancedActions(const QList<QAction*> &action);
/**
* @brief Mouse entered Message label area
*/
void enterMessageLabel();
/**
* @brief Mouse left message drop down list area (and closed it)
*/
void leaveMessageView();
public slots:
/** @brief Set the system that is currently displayed by this widget */
......@@ -71,8 +81,6 @@ public slots:
void updateView();
/** @brief Update connection timeout time */
void heartbeatTimeout(bool timeout, unsigned int ms);
/** @brief Clear status string */
void clearStatusString();
/** @brief Set an activity action as checked in menu */
void advancedActivityTriggered(QAction* action);
......@@ -130,6 +138,8 @@ private:
QComboBox* _linkCombo;
QAction* _linkComboAction;
QGCMessageViewRollDown* _rollDownMessages;
QPushButton* _connectButton;
bool _linksConnected;
bool _linkSelected; // User selected a link. Stop autoselecting it.
......
This diff is collapsed.
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
#ifndef QGCMESSAGEVIEW_H
#define QGCMESSAGEVIEW_H
......@@ -7,41 +30,52 @@
#include <QAction>
#include "QGCUnconnectedInfoWidget.h"
class QGCUasMessage;
class QGCToolBar;
namespace Ui {
class QGCMessageView;
}
// Message View base class
class QGCMessageView : public QWidget
{
Q_OBJECT
public:
explicit QGCMessageView(QWidget *parent = 0);
~QGCMessageView();
virtual ~QGCMessageView();
Ui::QGCMessageView* ui() { return _ui; }
private:
Ui::QGCMessageView* _ui;
};
// Message View Widget (used in the Info View tabbed Widget)
class QGCMessageViewWidget : public QGCMessageView
{
Q_OBJECT
public:
explicit QGCMessageViewWidget(QWidget *parent = 0);
~QGCMessageViewWidget();
public slots:
/**
* @brief Set currently active UAS
* @param uas the current active UAS
*/
void setActiveUAS(UASInterface* uas);
/**
* @brief Handle text message from current active UAS
* @param uasid
* @param componentid
* @param severity
* @param text
*/
void handleTextMessage(int uasid, int componentid, int severity, QString text);
void handleTextMessage(QGCUasMessage* message);
private:
QGCUnconnectedInfoWidget* _unconnectedWidget;
};
// Roll down Message View
class QGCMessageViewRollDown : public QGCMessageView
{
Q_OBJECT
public:
explicit QGCMessageViewRollDown(QWidget *parent, QGCToolBar* toolBar);
~QGCMessageViewRollDown();
public slots:
void handleTextMessage(QGCUasMessage* message);
protected:
// Stores the UAS that we're currently receiving messages from.
UASInterface* activeUAS;
// Stores the connect widget that is displayed when no UAS is active.
QGCUnconnectedInfoWidget* connectWidget;
void leaveEvent(QEvent* event);
private:
Ui::QGCMessageView *ui;
QGCToolBar* _toolBar;
};
#endif // QGCMESSAGEVIEW_H
......@@ -18,19 +18,25 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
<number>4</number>
</property>
<property name="topMargin">
<number>8</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>4</number>
</property>
<property name="bottomMargin">
<number>0</number>
<number>4</number>
</property>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
......
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