Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
34a4ed83
Commit
34a4ed83
authored
Mar 16, 2014
by
Lorenz Meier
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #584 from VArdulov/message_view
Message view
parents
6fb31afe
c57da0aa
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
126 additions
and
80 deletions
+126
-80
QGCMessageView.cc
src/ui/uas/QGCMessageView.cc
+103
-44
QGCMessageView.h
src/ui/uas/QGCMessageView.h
+3
-9
QGCMessageView.ui
src/ui/uas/QGCMessageView.ui
+20
-27
No files found.
src/ui/uas/QGCMessageView.cc
View file @
34a4ed83
#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
(
"Q
ScrollArea { border: 0px; } Q
PlainTextEdit { 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
;
//
t
urn off updates while we're appending content to avoid breaking the autoscroll behavior
(
void
)
uasid
;
// Unused variable voided.
//
T
urn 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
());
}
}
src/ui/uas/QGCMessageView.h
View file @
34a4ed83
...
...
@@ -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
;
...
...
src/ui/uas/QGCMessageView.ui
View file @
34a4ed83
...
...
@@ -6,14 +6,17 @@
<rect>
<x>
0
</x>
<y>
0
</y>
<width>
305
</width>
<height>
2
83
</height>
<width>
248
</width>
<height>
2
49
</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>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment