@ -0,0 +1,216 @@
@@ -0,0 +1,216 @@
|
||||
/*===================================================================== |
||||
|
||||
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 |
||||
* @brief QGC Main Map Display |
||||
* @author Gus Grubba <mavlink@grubba.com> |
||||
*/ |
||||
|
||||
import QtQuick 2.3 |
||||
import QtQuick.Controls 1.2 |
||||
import QtQuick.Controls.Styles 1.2 |
||||
import QtQuick.Layouts 1.1 |
||||
|
||||
import QGroundControl.Palette 1.0 |
||||
import QGroundControl.FlightControls 1.0 |
||||
|
||||
Rectangle { |
||||
QGCPalette { id: __palette; colorGroupEnabled: true } |
||||
id: root |
||||
color: Qt.rgba(0,0,0,0); |
||||
|
||||
property real roll: isNaN(mapEngine.roll) ? 0 : mapEngine.roll |
||||
property real pitch: isNaN(mapEngine.pitch) ? 0 : mapEngine.pitch |
||||
property bool showWaypointEditor: true |
||||
|
||||
function getBool(value) { |
||||
return value === '0' ? false : true; |
||||
} |
||||
|
||||
function setBool(value) { |
||||
return value ? "1" : "0"; |
||||
} |
||||
|
||||
Component.onCompleted: |
||||
{ |
||||
mapTypeMenu.update(); |
||||
} |
||||
|
||||
Menu { |
||||
id: mapTypeMenu |
||||
title: "Map Type..." |
||||
ExclusiveGroup { id: currentMapType } |
||||
function setCurrentMap(map) { |
||||
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) { |
||||
if (map === mapBackground.mapItem.supportedMapTypes[i].name) { |
||||
mapBackground.mapItem.activeMapType = mapBackground.mapItem.supportedMapTypes[i] |
||||
mapEngine.saveSetting("currentMapType", map); |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
function addMap(map, checked) { |
||||
var mItem = mapTypeMenu.addItem(map); |
||||
mItem.checkable = true |
||||
mItem.checked = checked |
||||
mItem.exclusiveGroup = currentMapType |
||||
var menuSlot = function() {setCurrentMap(map);}; |
||||
mItem.triggered.connect(menuSlot); |
||||
} |
||||
function update() { |
||||
clear() |
||||
var map = '' |
||||
if (mapBackground.mapItem.supportedMapTypes.length > 0) |
||||
map = mapBackground.mapItem.activeMapType.name; |
||||
map = mapEngine.loadSetting("currentMapType", map); |
||||
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) { |
||||
var name = mapBackground.mapItem.supportedMapTypes[i].name; |
||||
addMap(name, map === name); |
||||
} |
||||
if(map != '') |
||||
setCurrentMap(map); |
||||
} |
||||
|
||||
} |
||||
|
||||
SplitView { |
||||
id: splitView |
||||
anchors.fill: parent |
||||
orientation: Qt.Horizontal |
||||
z: 10 |
||||
|
||||
// This sets the color of the splitter line |
||||
handleDelegate: Rectangle { |
||||
width: 1 |
||||
height: 1 |
||||
color: __palette.window |
||||
} |
||||
|
||||
//---------------------------------------------------------------------------------------- |
||||
// Map View |
||||
QGCMapBackground { |
||||
id: mapBackground |
||||
Layout.fillWidth: true |
||||
Layout.minimumWidth: 300 |
||||
heading: isNaN(mapEngine.heading) ? 0 : mapEngine.heading |
||||
latitude: 37.803784 // mapEngine.latitude |
||||
longitude: -122.462276 // mapEngine.longitude |
||||
// Chevron button at upper right corner of Map Display |
||||
Item { |
||||
id: openWaypoints |
||||
anchors.top: mapBackground.top |
||||
anchors.right: mapBackground.right |
||||
width: 30 |
||||
height: 30 |
||||
opacity: 0.85 |
||||
z: splitView.z + 10 |
||||
Image { |
||||
id: buttomImg |
||||
anchors.fill: parent |
||||
source: showWaypointEditor ? "/qml/buttonRight.svg" : "/qml/buttonLeft.svg" |
||||
mipmap: true |
||||
smooth: true |
||||
antialiasing: true |
||||
fillMode: Image.PreserveAspectFit |
||||
} |
||||
MouseArea { |
||||
anchors.fill: parent |
||||
acceptedButtons: Qt.LeftButton |
||||
onClicked: { |
||||
if (mouse.button == Qt.LeftButton) |
||||
{ |
||||
showWaypointEditor = !showWaypointEditor |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
//---------------------------------------------------------------------------------------- |
||||
// Waypoint Editor |
||||
QGCWaypointEditor { |
||||
id: waypointEditor |
||||
Layout.minimumWidth: 200 |
||||
visible: showWaypointEditor |
||||
} |
||||
} |
||||
|
||||
//-------------------------------------------------------------------------------------------- |
||||
// Right click anywhere on the map for a context menu |
||||
MouseArea { |
||||
anchors.fill: parent |
||||
acceptedButtons: Qt.RightButton |
||||
onClicked: { |
||||
if (mouse.button == Qt.RightButton) |
||||
{ |
||||
mapTypeMenu.popup() |
||||
} |
||||
} |
||||
z: splitView.z + 5 |
||||
} |
||||
|
||||
//-------------------------------------------------------------------------------------------- |
||||
// Tool Bar |
||||
Rectangle { |
||||
id: toolBar |
||||
color: Qt.rgba(0,0,0,0) |
||||
height: buttonColumn.height |
||||
visible: showWaypointEditor |
||||
anchors.top: parent.top |
||||
anchors.left: parent.left |
||||
anchors.topMargin: 40 |
||||
anchors.leftMargin: 4 |
||||
z: splitView.z + 10 |
||||
|
||||
ExclusiveGroup { id: mainActionGroup } |
||||
|
||||
Column { |
||||
id: buttonColumn |
||||
spacing: 4 |
||||
QGCMapToolButton { |
||||
width: 50 |
||||
height: 50 |
||||
imageSource: "/qml/buttonHome.svg" |
||||
exclusiveGroup: mainActionGroup |
||||
} |
||||
QGCMapToolButton { |
||||
width: 50 |
||||
height: 50 |
||||
imageSource: "/qml/buttonHome.svg" |
||||
exclusiveGroup: mainActionGroup |
||||
} |
||||
QGCMapToolButton { |
||||
width: 50 |
||||
height: 50 |
||||
imageSource: "/qml/buttonHome.svg" |
||||
exclusiveGroup: mainActionGroup |
||||
} |
||||
QGCMapToolButton { |
||||
width: 50 |
||||
height: 50 |
||||
imageSource: "/qml/buttonHome.svg" |
||||
exclusiveGroup: mainActionGroup |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,91 @@
@@ -0,0 +1,91 @@
|
||||
/*=====================================================================
|
||||
|
||||
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 |
||||
* @brief QGC Main Map Display |
||||
* @author Gus Grubba <mavlink@grubba.com> |
||||
*/ |
||||
|
||||
#include <QQmlContext> |
||||
#include <QQmlEngine> |
||||
#include <QSettings> |
||||
|
||||
#include "QGCMapDisplay.h" |
||||
#include "UASManager.h" |
||||
|
||||
const char* kMainMapDisplayGroup = "MainMapDisplay"; |
||||
|
||||
QGCMapDisplay::QGCMapDisplay(QWidget *parent) |
||||
: QGCQmlWidgetHolder(parent) |
||||
{ |
||||
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); |
||||
setObjectName("MainMapDisplay"); |
||||
// Get rid of layout default margins
|
||||
QLayout* pl = layout(); |
||||
if(pl) { |
||||
pl->setContentsMargins(0,0,0,0); |
||||
} |
||||
setMinimumWidth(270); |
||||
setMinimumHeight(300); |
||||
setContextPropertyObject("mapEngine", this); |
||||
setSource(QUrl::fromUserInput("qrc:/qml/MapDisplay.qml")); |
||||
setVisible(true); |
||||
} |
||||
|
||||
QGCMapDisplay::~QGCMapDisplay() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void QGCMapDisplay::saveSetting(const QString &name, const QString& value) |
||||
{ |
||||
QSettings settings; |
||||
QString key(kMainMapDisplayGroup); |
||||
key += "/" + name; |
||||
settings.setValue(key, value); |
||||
} |
||||
|
||||
QString QGCMapDisplay::loadSetting(const QString &name, const QString& defaultValue) |
||||
{ |
||||
QSettings settings; |
||||
QString key(kMainMapDisplayGroup); |
||||
key += "/" + name; |
||||
return settings.value(key, defaultValue).toString(); |
||||
} |
||||
|
||||
/*
|
||||
* Internal |
||||
*/ |
||||
|
||||
void QGCMapDisplay::showEvent(QShowEvent* event) |
||||
{ |
||||
// React only to internal (pre-display) events
|
||||
QWidget::showEvent(event); |
||||
} |
||||
|
||||
void QGCMapDisplay::hideEvent(QHideEvent* event) |
||||
{ |
||||
// React only to internal (pre-display) events
|
||||
QWidget::hideEvent(event); |
||||
} |
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
/*=====================================================================
|
||||
|
||||
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 |
||||
* @brief QGC Main Map Display |
||||
* @author Gus Grubba <mavlink@grubba.com> |
||||
*/ |
||||
|
||||
#ifndef QGCMAPDISPLAY_H |
||||
#define QGCMAPDISPLAY_H |
||||
|
||||
#include "QGCQmlWidgetHolder.h" |
||||
|
||||
class UASInterface; |
||||
class UASWaypointManager; |
||||
|
||||
class QGCMapDisplay : public QGCQmlWidgetHolder |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
QGCMapDisplay(QWidget* parent = NULL); |
||||
~QGCMapDisplay(); |
||||
|
||||
Q_INVOKABLE void saveSetting (const QString &key, const QString& value); |
||||
Q_INVOKABLE QString loadSetting (const QString &key, const QString& defaultValue); |
||||
|
||||
/** @brief Start updating widget */ |
||||
void showEvent(QShowEvent* event); |
||||
/** @brief Stop updating widget */ |
||||
void hideEvent(QHideEvent* event); |
||||
|
||||
signals: |
||||
|
||||
private slots: |
||||
|
||||
private: |
||||
|
||||
private: |
||||
UASWaypointManager* WPM; |
||||
|
||||
}; |
||||
|
||||
|
||||
#endif // QGCFLIGHTDISPLAY_H
|
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
import QtQuick 2.2 |
||||
import QtQuick.Controls 1.2 |
||||
import QtQuick.Controls.Styles 1.2 |
||||
import QtQuick.Controls.Private 1.0 |
||||
|
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.Palette 1.0 |
||||
import QGroundControl.ScreenTools 1.0 |
||||
|
||||
Button { |
||||
property var imageSource: undefined |
||||
property var __qgcPal: QGCPalette { colorGroupEnabled: enabled } |
||||
property bool __showHighlight: (pressed | hovered | checked) && !__forceHoverOff |
||||
property ScreenTools __screenTools: ScreenTools { } |
||||
|
||||
// This fixes the issue with button hover where if a Button is near the edge oa QQuickWidget you can |
||||
// move the mouse fast enough such that the MouseArea does not trigger an onExited. This is turn |
||||
// cause the hover property to not be cleared correctly. |
||||
|
||||
property bool __forceHoverOff: false |
||||
property int __lastGlobalMouseX: 0 |
||||
property int __lastGlobalMouseY: 0 |
||||
|
||||
Connections { |
||||
target: __behavior |
||||
onMouseXChanged: { |
||||
__lastGlobalMouseX = __screenTools.mouseX |
||||
__lastGlobalMouseY = __screenTools.mouseY |
||||
} |
||||
onMouseYChanged: { |
||||
__lastGlobalMouseX = __screenTools.mouseX |
||||
__lastGlobalMouseY = __screenTools.mouseY |
||||
} |
||||
onEntered: { __forceHoverOff; false; hoverTimer.start() } |
||||
onExited: { __forceHoverOff; false; hoverTimer.stop() } |
||||
} |
||||
|
||||
Timer { |
||||
id: hoverTimer |
||||
interval: 250 |
||||
repeat: true |
||||
onTriggered: { |
||||
if (__lastGlobalMouseX != __screenTools.mouseX || __lastGlobalMouseY != __screenTools.mouseY) { |
||||
__forceHoverOff = true |
||||
} else { |
||||
__forceHoverOff = false |
||||
} |
||||
} |
||||
} |
||||
|
||||
style: ButtonStyle { |
||||
/*! This defines the background of the button. */ |
||||
background: Item { |
||||
property bool __checked: (control.checkable && control.checked) |
||||
|
||||
Rectangle { |
||||
id: backgroundRectangle |
||||
anchors.fill: parent |
||||
color: __showHighlight ? __qgcPal.buttonHighlight : (__checked ? __qgcPal.buttonHighlight : __qgcPal.window); |
||||
} |
||||
|
||||
QGCColoredImage { |
||||
id: image |
||||
anchors.fill: parent |
||||
opacity: control.enabled ? 0.6 : 0.5 |
||||
source: imageSource |
||||
color: __showHighlight ? __qgcPal.buttonHighlightText : (__checked ? __qgcPal.primaryButtonText : __qgcPal.buttonText) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
/*===================================================================== |
||||
|
||||
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 |
||||
* @brief QGC Waypoint Editor |
||||
* @author Gus Grubba <mavlink@grubba.com> |
||||
*/ |
||||
|
||||
import QtQuick 2.4 |
||||
|
||||
import QGroundControl.Palette 1.0 |
||||
|
||||
Rectangle { |
||||
QGCPalette { id: palette; colorGroupEnabled: true } |
||||
id: root |
||||
color: palette.window |
||||
|
||||
} |
Before Width: | Height: | Size: 939 KiB After Width: | Height: | Size: 939 KiB |
Before Width: | Height: | Size: 404 B After Width: | Height: | Size: 404 B |
Before Width: | Height: | Size: 789 B After Width: | Height: | Size: 789 B |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |