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
16e40be2
Commit
16e40be2
authored
Feb 17, 2015
by
dogmaphobic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added drop down message widget
parent
4de3a940
Changes
11
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
533 additions
and
154 deletions
+533
-154
qgroundcontrol.pro
qgroundcontrol.pro
+4
-2
QGCApplication.cc
src/QGCApplication.cc
+7
-0
QGCMessageHandler.cc
src/uas/QGCMessageHandler.cc
+156
-0
QGCMessageHandler.h
src/uas/QGCMessageHandler.h
+122
-0
QGCTabbedInfoView.cpp
src/ui/QGCTabbedInfoView.cpp
+1
-1
QGCTabbedInfoView.h
src/ui/QGCTabbedInfoView.h
+1
-1
QGCToolBar.cc
src/ui/QGCToolBar.cc
+47
-11
QGCToolBar.h
src/ui/QGCToolBar.h
+12
-2
QGCMessageView.cc
src/ui/uas/QGCMessageView.cc
+120
-114
QGCMessageView.h
src/ui/uas/QGCMessageView.h
+54
-20
QGCMessageView.ui
src/ui/uas/QGCMessageView.ui
+9
-3
No files found.
qgroundcontrol.pro
View file @
16e40be2
...
...
@@ -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
...
...
src/QGCApplication.cc
View file @
16e40be2
...
...
@@ -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
();
...
...
src/uas/QGCMessageHandler.cc
0 → 100644
View file @
16e40be2
/*=====================================================================
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
);
}
src/uas/QGCMessageHandler.h
0 → 100644
View file @
16e40be2
/*=====================================================================
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
src/ui/QGCTabbedInfoView.cpp
View file @
16e40be2
...
...
@@ -3,7 +3,7 @@
QGCTabbedInfoView
::
QGCTabbedInfoView
(
QWidget
*
parent
)
:
QWidget
(
parent
)
{
ui
.
setupUi
(
this
);
messageView
=
new
QGCMessageView
(
this
);
messageView
=
new
QGCMessageView
Widget
(
this
);
//actionsWidget = new UASActionsWidget(this);
quickView
=
new
UASQuickView
(
this
);
//rawView = new UASRawStatusView(this);
...
...
src/ui/QGCTabbedInfoView.h
View file @
16e40be2
...
...
@@ -18,7 +18,7 @@ public:
private:
MAVLinkDecoder
*
m_decoder
;
Ui
::
QGCTabbedInfoView
ui
;
QGCMessageView
*
messageView
;
QGCMessageView
Widget
*
messageView
;
UASQuickView
*
quickView
;
UASRawStatusView
*
rawView
;
};
...
...
src/ui/QGCToolBar.cc
View file @
16e40be2
...
...
@@ -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
Q
CGHover
Label
(
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
;
}
src/ui/QGCToolBar.h
View file @
16e40be2
...
...
@@ -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.
...
...
src/ui/uas/QGCMessageView.cc
View file @
16e40be2
This diff is collapsed.
Click to expand it.
src/ui/uas/QGCMessageView.h
View file @
16e40be2
/*=====================================================================
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
src/ui/uas/QGCMessageView.ui
View file @
16e40be2
...
...
@@ -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>
...
...
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