Commit e26e1af3 authored by Gus Grubba's avatar Gus Grubba

Merge pull request #2318 from dogmaphobic/linkSettings

Link Settings (WIP)
parents 73b18544 1a419660
......@@ -135,6 +135,9 @@ LinkConfiguration* LinkConfiguration::duplicateSettings(LinkConfiguration* sourc
dupe = new MockConfiguration(dynamic_cast<MockConfiguration*>(source));
break;
#endif
case TypeLast:
default:
break;
}
return dupe;
}
......
......@@ -33,14 +33,16 @@ class LinkInterface;
class LinkConfiguration : public QObject
{
Q_OBJECT
Q_ENUMS(LinkType)
public:
LinkConfiguration(const QString& name);
LinkConfiguration(LinkConfiguration* copy);
virtual ~LinkConfiguration() {}
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(LinkInterface* link READ link WRITE setLink NOTIFY linkChanged)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(LinkInterface* link READ link WRITE setLink NOTIFY linkChanged)
Q_PROPERTY(LinkType linkType READ type CONSTANT)
// Property accessors
......@@ -51,7 +53,7 @@ public:
void setLink(LinkInterface* link);
/// The link types supported by QGC
enum {
enum LinkType {
#ifndef __ios__
TypeSerial, ///< Serial Link
#endif
......@@ -88,7 +90,7 @@ public:
* Pure virtual method returning one of the -TypeXxx types above.
* @return The type of links these settings belong to.
*/
virtual int type() = 0;
virtual LinkType type() = 0;
/*!
* @brief Load settings
......
......@@ -97,7 +97,7 @@ void LinkManager::setToolbox(QGCToolbox *toolbox)
connect(&_portListTimer, &QTimer::timeout, this, &LinkManager::_updateAutoConnectLinks);
_portListTimer.start(6000); // timeout must be long enough to get past bootloader on second pass
}
LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config)
......@@ -124,6 +124,9 @@ LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config)
pLink = new MockLink(dynamic_cast<MockConfiguration*>(config));
break;
#endif
case LinkConfiguration::TypeLast:
default:
break;
}
if(pLink) {
_addLink(pLink);
......@@ -164,7 +167,7 @@ void LinkManager::_addLink(LinkInterface* link)
break;
}
}
_links.append(link);
emit newLink(link);
}
......@@ -367,7 +370,7 @@ void LinkManager::loadLinkConfigurationList()
}
}
}
// Debug buids always add MockLink automatically
#ifdef QT_DEBUG
MockConfiguration* pMock = new MockConfiguration("Mock Link PX4");
......@@ -454,7 +457,7 @@ void LinkManager::_updateAutoConnectLinks(void)
qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation();
continue;
}
if (_autoconnectConfigurationsContainsPort(portInfo.systemLocation())) {
qCDebug(LinkManagerVerboseLog) << "Skipping existing autoconnect" << portInfo.systemLocation();
} else if (!_autoconnectWaitList.contains(portInfo.systemLocation())) {
......@@ -661,3 +664,46 @@ void LinkManager::setAutoconnectPX4Flow(bool autoconnect)
}
}
QStringList LinkManager::linkTypeStrings(void) const
{
//-- Must follow same order as enum LinkType in LinkConfiguration.h
static QStringList list;
if(!list.size())
{
#ifndef __ios__
list += "Serial";
#endif
list += "UDP";
list += "TCP";
list += "Mock Link";
list += "Log Replay";
}
return list;
}
QStringList LinkManager::serialPortStrings(void)
{
#ifndef __ios__
if(!_commPortList.size())
{
QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &info, portList)
{
QString name = info.portName();
_commPortList += name;
}
}
#endif
return _commPortList;
}
QStringList LinkManager::serialBaudRates(void)
{
#ifdef __ios__
QStringList foo;
return foo;
#else
return SerialConfiguration::supportedBaudRates();
#endif
}
......@@ -78,10 +78,17 @@ public:
Q_PROPERTY(bool autoconnectPixhawk READ autoconnectPixhawk WRITE setAutoconnectPixhawk NOTIFY autoconnectPixhawkChanged)
Q_PROPERTY(bool autoconnect3DRRadio READ autoconnect3DRRadio WRITE setAutoconnect3DRRadio NOTIFY autoconnect3DRRadioChanged)
Q_PROPERTY(bool autoconnectPX4Flow READ autoconnectPX4Flow WRITE setAutoconnectPX4Flow NOTIFY autoconnectPX4FlowChanged)
//-- LinkInterface
Q_PROPERTY(QmlObjectListModel* links READ links CONSTANT)
//-- LinkConfiguration
Q_PROPERTY(QmlObjectListModel* linkConfigurations READ linkConfigurations CONSTANT)
/// LinkInterface Accessor
Q_PROPERTY(QmlObjectListModel* links READ links CONSTANT)
/// LinkConfiguration Accessor
Q_PROPERTY(QmlObjectListModel* linkConfigurations READ linkConfigurations CONSTANT)
/// List of comm type strings
Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT)
/// List of supported baud rates for serial links
Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT)
/// List of comm ports
Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged)
// Property accessors
......@@ -92,14 +99,16 @@ public:
bool autoconnect3DRRadio(void) { return _autoconnect3DRRadio; }
bool autoconnectPX4Flow(void) { return _autoconnectPX4Flow; }
QmlObjectListModel* links(void) { return &_links; }
QmlObjectListModel* linkConfigurations(void) { return &_linkConfigurations; }
void setAutoconnectUDP(bool autoconnect);
void setAutoconnectPixhawk(bool autoconnect);
void setAutoconnect3DRRadio(bool autoconnect);
void setAutoconnectPX4Flow(bool autoconnect);
QmlObjectListModel* links (void) { return &_links; }
QmlObjectListModel* linkConfigurations (void) { return &_linkConfigurations; }
QStringList linkTypeStrings (void) const;
QStringList serialBaudRates (void);
QStringList serialPortStrings (void);
void setAutoconnectUDP (bool autoconnect);
void setAutoconnectPixhawk (bool autoconnect);
void setAutoconnect3DRRadio (bool autoconnect);
void setAutoconnectPX4Flow (bool autoconnect);
/// Load list of link configurations from disk
void loadLinkConfigurationList();
......@@ -178,6 +187,7 @@ signals:
void linkInactive(LinkInterface* link);
void linkConfigurationChanged();
void commPortStringsChanged();
private slots:
void _linkConnected(void);
......@@ -207,6 +217,7 @@ private:
QmlObjectListModel _autoconnectConfigurations;
QStringList _autoconnectWaitList;
QStringList _commPortList;
bool _autoconnectUDP;
bool _autoconnectPixhawk;
......
......@@ -38,14 +38,14 @@ class LogReplayLinkConfiguration : public LinkConfiguration
public:
LogReplayLinkConfiguration(const QString& name);
LogReplayLinkConfiguration(LogReplayLinkConfiguration* copy);
QString logFilename(void) { return _logFilename; }
void setLogFilename(const QString& logFilename) { _logFilename = logFilename; }
QString logFilenameShort(void);
// Virtuals from LinkConfiguration
virtual int type() { return LinkConfiguration::TypeLogReplay; }
virtual LinkType type() { return LinkConfiguration::TypeLogReplay; }
virtual void copyFrom(LinkConfiguration* source);
virtual void loadSettings(QSettings& settings, const QString& root);
virtual void saveSettings(QSettings& settings, const QString& root);
......@@ -61,23 +61,23 @@ class LogReplayLink : public LinkInterface
Q_OBJECT
friend class LinkManager;
public:
/// @return true: log is currently playing, false: log playback is paused
bool isPlaying(void) { return _readTickTimer.isActive(); }
/// Start replay at current position
void play(void) { emit _playOnThread(); }
/// Pause replay
void pause(void) { emit _pauseOnThread(); }
/// Move the playhead to the specified percent complete
void movePlayhead(int percentComplete);
/// Sets the acceleration factor: -100: 0.01X, 0: 1.0X, 100: 100.0X
void setAccelerationFactor(int factor) { emit _setAccelerationFactorOnThread(factor); }
// Virtuals from LinkInterface
virtual QString getName(void) const { return _config->name(); }
virtual void requestReset(void){ }
......@@ -93,7 +93,7 @@ public:
public slots:
virtual void writeBytes(const char *bytes, qint64 cBytes);
signals:
void logFileStats(bool logTimestamped, int logDurationSecs, int binaryBaudRate);
void playbackStarted(void);
......@@ -101,7 +101,7 @@ signals:
void playbackAtEnd(void);
void playbackError(void);
void playbackPercentCompleteChanged(int percentComplete);
// Internal signals
void _playOnThread(void);
void _pauseOnThread(void);
......@@ -110,7 +110,7 @@ signals:
protected slots:
// FIXME: This should not be part of LinkInterface. It is an internal link implementation detail.
virtual void readBytes(void);
private slots:
void _readNextLogEntry(void);
void _play(void);
......@@ -121,7 +121,7 @@ private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
LogReplayLink(LogReplayLinkConfiguration* config);
~LogReplayLink();
void _replayError(const QString& errorMsg);
quint64 _parseTimestamp(const QByteArray& bytes);
quint64 _seekToNextMavlinkMessage(mavlink_message_t* nextMsg);
......@@ -129,37 +129,37 @@ private:
void _finishPlayback(void);
void _playbackError(void);
void _resetPlaybackToBeginning(void);
// Virtuals from LinkInterface
virtual bool _connect(void);
virtual void _disconnect(void);
// Virtuals from QThread
virtual void run(void);
LogReplayLinkConfiguration* _config;
bool _connected;
QTimer _readTickTimer; ///< Timer which signals a read of next log record
static const char* _errorTitle; ///< Title for communicatorError signals
quint64 _logCurrentTimeUSecs; ///< The timestamp of the next message in the log file.
quint64 _logStartTimeUSecs; ///< The first timestamp in the current log file.
quint64 _logEndTimeUSecs; ///< The last timestamp in the current log file.
quint64 _logDurationUSecs;
static const int _defaultBinaryBaudRate = 57600;
int _binaryBaudRate; ///< Playback rate for binary log format
float _replayAccelerationFactor; ///< Factor to apply to playback rate
quint64 _playbackStartTimeMSecs; ///< The time when the logfile was first played back. This is used to pace out replaying the messages to fix long-term drift/skew. 0 indicates that the player hasn't initiated playback of this log file.
MAVLinkProtocol* _mavlink;
QFile _logFile;
quint64 _logFileSize;
bool _logTimestamped; ///< true: Timestamped log format, false: no timestamps
static const int cbTimestamp = sizeof(quint64);
};
......
......@@ -54,7 +54,7 @@ public:
bool sendStatusText(void) { return _sendStatusText; }
// Overrides from LinkConfiguration
int type(void) { return LinkConfiguration::TypeMock; }
LinkType type(void) { return LinkConfiguration::TypeMock; }
void copyFrom(LinkConfiguration* source);
void loadSettings(QSettings& settings, const QString& root);
void saveSettings(QSettings& settings, const QString& root);
......@@ -92,10 +92,10 @@ public:
void setAPMMissionResponseMode(bool sendHomePositionOnEmptyList) { _apmSendHomePositionOnEmptyList = sendHomePositionOnEmptyList; }
void emitRemoteControlChannelRawChanged(int channel, uint16_t raw);
/// Sends the specified mavlink message to QGC
void respondWithMavlinkMessage(const mavlink_message_t& msg);
MockLinkFileServer* getFileServer(void) { return _fileServer; }
// Virtuals from LinkInterface
......@@ -111,21 +111,21 @@ public:
bool disconnect(void);
LinkConfiguration* getLinkConfiguration() { return _config; }
/// Sets a failure mode for unit testing
/// @param failureMode Type of failure to simulate
/// @param firstTimeOnly true: fail first call, success subsequent calls, false: fail all calls
void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, bool firstTimeOnly);
/// Called to send a MISSION_ACK message while the MissionManager is in idle state
void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) { _missionItemHandler.sendUnexpectedMissionAck(ackType); }
/// Called to send a MISSION_ITEM message while the MissionManager is in idle state
void sendUnexpectedMissionItem(void) { _missionItemHandler.sendUnexpectedMissionItem(); }
/// Called to send a MISSION_REQUEST message while the MissionManager is in idle state
void sendUnexpectedMissionRequest(void) { _missionItemHandler.sendUnexpectedMissionRequest(); }
/// Reset the state of the MissionItemHandler to no items, no transactions in progress.
void resetMissionItemHandler(void) { _missionItemHandler.reset(); }
......@@ -193,7 +193,7 @@ private:
MockConfiguration* _config;
MAV_AUTOPILOT _firmwareType;
MAV_TYPE _vehicleType;
MockLinkFileServer* _fileServer;
bool _sendStatusText;
......
......@@ -28,6 +28,8 @@
QGC_LOGGING_CATEGORY(SerialLinkLog, "SerialLinkLog")
static QStringList kSupportedBaudRates;
SerialLink::SerialLink(SerialConfiguration* config)
{
_bytesRead = 0;
......@@ -110,7 +112,7 @@ void SerialLink::readBytes()
if(maxLength < numBytes) numBytes = maxLength;
_logInputDataRate(numBytes, QDateTime::currentMSecsSinceEpoch());
_port->read(data, numBytes);
QByteArray b(data, numBytes);
emit bytesReceived(this, b);
......@@ -131,7 +133,7 @@ void SerialLink::_disconnect(void)
delete _port;
_port = NULL;
}
#ifdef __android__
qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(false);
#endif
......@@ -147,11 +149,11 @@ bool SerialLink::_connect(void)
qCDebug(SerialLinkLog) << "CONNECT CALLED";
_disconnect();
#ifdef __android__
qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(true);
#endif
// Initialize the connection
if (!_hardwareConnect(_type)) {
// Need to error out here.
......@@ -291,7 +293,7 @@ bool SerialLink::isConnected() const
if (_port) {
isConnected = _port->isOpen();
}
return isConnected;
}
......@@ -481,3 +483,60 @@ void SerialConfiguration::loadSettings(QSettings& settings, const QString& root)
if(settings.contains("portName")) _portName = settings.value("portName").toString();
settings.endGroup();
}
QStringList SerialConfiguration::supportedBaudRates()
{
if(!kSupportedBaudRates.size())
_initBaudRates();
return kSupportedBaudRates;
}
void SerialConfiguration::_initBaudRates()
{
kSupportedBaudRates.clear();
#if USE_ANCIENT_RATES
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN)
kSupportedBaudRates << "50";
kSupportedBaudRates << "75";
#endif
kSupportedBaudRates << "110";
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN)
kSupportedBaudRates << "134";
kSupportedBaudRates << "150";
kSupportedBaudRates << "200";
#endif
kSupportedBaudRates << "300";
kSupportedBaudRates << "600";
kSupportedBaudRates << "1200";
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN)
kSupportedBaudRates << "1800";
#endif
#endif
kSupportedBaudRates << "2400";
kSupportedBaudRates << "4800";
kSupportedBaudRates << "9600";
#if defined(Q_OS_WIN)
kSupportedBaudRates << "14400";
#endif
kSupportedBaudRates << "19200";
kSupportedBaudRates << "38400";
#if defined(Q_OS_WIN)
kSupportedBaudRates << "56000";
#endif
kSupportedBaudRates << "57600";
kSupportedBaudRates << "115200";
#if defined(Q_OS_WIN)
kSupportedBaudRates << "128000";
#endif
kSupportedBaudRates << "230400";
#if defined(Q_OS_WIN)
kSupportedBaudRates << "256000";
#endif
kSupportedBaudRates << "460800";
#if defined(Q_OS_LINUX)
kSupportedBaudRates << "500000";
kSupportedBaudRates << "576000";
#endif
kSupportedBaudRates << "921600";
}
......@@ -81,13 +81,18 @@ public:
void setParity (int parity); ///< QSerialPort Enums
void setPortName (const QString& portName);
static QStringList supportedBaudRates();
/// From LinkConfiguration
int type() { return LinkConfiguration::TypeSerial; }
LinkType type() { return LinkConfiguration::TypeSerial; }
void copyFrom(LinkConfiguration* source);
void loadSettings(QSettings& settings, const QString& root);
void saveSettings(QSettings& settings, const QString& root);
void updateSettings();
private:
static void _initBaudRates();
private:
int _baud;
int _dataBits;
......@@ -109,10 +114,10 @@ private:
class SerialLink : public LinkInterface
{
Q_OBJECT
friend class SerialConfiguration;
friend class LinkManager;
public:
// LinkInterface
......@@ -156,7 +161,7 @@ private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
SerialLink(SerialConfiguration* config);
~SerialLink();
// From LinkInterface
virtual bool _connect(void);
virtual void _disconnect(void);
......
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2015 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
......@@ -103,7 +103,7 @@ public:
void setAddress (const QHostAddress& address);
/// From LinkConfiguration
int type() { return LinkConfiguration::TypeTcp; }
LinkType type() { return LinkConfiguration::TypeTcp; }
void copyFrom(LinkConfiguration* source);
void loadSettings(QSettings& settings, const QString& root);
void saveSettings(QSettings& settings, const QString& root);
......@@ -117,14 +117,14 @@ private:
class TCPLink : public LinkInterface
{
Q_OBJECT
friend class TCPLinkUnitTest;
friend class TCPConfiguration;
friend class LinkManager;
public:
QTcpSocket* getSocket(void) { return _socket; }
void signalBytesWritten(void);
// LinkInterface methods
......@@ -136,14 +136,14 @@ public:
qint64 getConnectionSpeed() const;
qint64 getCurrentInDataRate() const;
qint64 getCurrentOutDataRate() const;
// These are left unimplemented in order to cause linker errors which indicate incorrect usage of
// connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager.
bool connect(void);
bool disconnect(void);
public slots:
// From LinkInterface
void writeBytes(const char* data, qint64 length);
void waitForBytesWritten(int msecs);
......@@ -158,12 +158,12 @@ protected slots:
protected:
// From LinkInterface->QThread
virtual void run(void);
private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
TCPLink(TCPConfiguration* config);
~TCPLink();
// From LinkInterface
virtual bool _connect(void);
virtual void _disconnect(void);
......@@ -178,7 +178,7 @@ private:
TCPConfiguration* _config;
QTcpSocket* _socket;
bool _socketIsConnected;
quint64 _bitsSentTotal;
quint64 _bitsSentCurrent;
quint64 _bitsSentMax;
......
......@@ -136,7 +136,7 @@ public:
void setLocalPort (quint16 port);
/// From LinkConfiguration
int type() { return LinkConfiguration::TypeUdp; }
LinkType type() { return LinkConfiguration::TypeUdp; }
void copyFrom(LinkConfiguration* source);
void loadSettings(QSettings& settings, const QString& root);
void saveSettings(QSettings& settings, const QString& root);
......@@ -152,10 +152,10 @@ private:
class UDPLink : public LinkInterface
{
Q_OBJECT
friend class UDPConfiguration;
friend class LinkManager;
public:
void requestReset() { }
bool isConnected() const;
......@@ -202,7 +202,7 @@ private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
UDPLink(UDPConfiguration* config);
~UDPLink();
// From LinkInterface
virtual bool _connect(void);
virtual void _disconnect(void);
......
......@@ -178,6 +178,9 @@ void QGCLinkConfiguration::_fixUnnamed(LinkConfiguration* config)
QString("Mock Link"));
break;
#endif
case LinkConfiguration::TypeLast:
default:
break;
}
}
}
......
......@@ -63,57 +63,11 @@ SerialConfigurationWindow::SerialConfigurationWindow(SerialConfiguration *config
// Keep track of all desired baud rates by OS. These are iterated through
// later and added to _ui.baudRate.
QList<int> supportedBaudRates;
#if USE_ANCIENT_RATES
// Baud rates supported only by POSIX systems
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN)
supportedBaudRates << 50;
supportedBaudRates << 75;
supportedBaudRates << 134;
supportedBaudRates << 150;
supportedBaudRates << 200;
supportedBaudRates << 1800;
#endif
#endif //USE_ANCIENT_RATES
// Baud rates supported only by Windows
#if defined(Q_OS_WIN)
supportedBaudRates << 14400;
supportedBaudRates << 56000;
supportedBaudRates << 128000;
supportedBaudRates << 256000;
#endif
// Baud rates supported by everyone
#if USE_ANCIENT_RATES
supportedBaudRates << 110;
supportedBaudRates << 300;
supportedBaudRates << 600;
supportedBaudRates << 1200;
#endif //USE_ANCIENT_RATES
supportedBaudRates << 2400;
supportedBaudRates << 4800;
supportedBaudRates << 9600;
supportedBaudRates << 19200;
supportedBaudRates << 38400;
supportedBaudRates << 57600;
supportedBaudRates << 115200;
supportedBaudRates << 230400;
supportedBaudRates << 460800;
#if defined(Q_OS_LINUX)
// Baud rates supported only by Linux
supportedBaudRates << 500000;
supportedBaudRates << 576000;
#endif
supportedBaudRates << 921600;
QStringList supportedBaudRates = SerialConfiguration::supportedBaudRates();
// Now actually add all of our supported baud rates to the ui.
qSort(supportedBaudRates.begin(), supportedBaudRates.end());
for (int i = 0; i < supportedBaudRates.size(); ++i) {
_ui.baudRate->addItem(QString::number(supportedBaudRates.at(i)), supportedBaudRates.at(i));
_ui.baudRate->addItem(supportedBaudRates.at(i), supportedBaudRates.at(i).toInt());
}
// Connect the individual user interface inputs
......
......@@ -34,8 +34,10 @@ import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Palette 1.0
Rectangle {
id: _generalRoot
color: __qgcPal.window
id: _generalRoot
color: __qgcPal.window
anchors.fill: parent
anchors.margins: ScreenTools.defaultFontPixelWidth
QGCPalette {
id: qgcPal
......@@ -45,7 +47,6 @@ Rectangle {
Flickable {
clip: true
anchors.fill: parent
anchors.margins: ScreenTools.defaultFontPixelWidth
contentHeight: settingsColumn.height
contentWidth: _generalRoot.width
flickableDirection: Flickable.VerticalFlick
......@@ -56,12 +57,15 @@ Rectangle {
width: _generalRoot.width
anchors.margins: ScreenTools.defaultFontPixelWidth
spacing: ScreenTools.defaultFontPixelHeight / 2
QGCLabel {
text: "General Settings"
font.pixelSize: ScreenTools.mediumFontPixelSize
}
Rectangle {
height: 1
width: parent.width
color: qgcPal.button
}
Item {
height: ScreenTools.defaultFontPixelHeight / 2
width: parent.width
......
This diff is collapsed.
......@@ -34,8 +34,9 @@ import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Palette 1.0
Rectangle {
id: __mavlinkRoot
color: __qgcPal.window
id: __mavlinkRoot
color: __qgcPal.window
anchors.fill: parent
QGCPalette {
id: qgcPal
......
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