Add groundwork for #44

This commit is contained in:
Alex Spataru 2021-03-12 00:19:54 -05:00
parent 21d0caa321
commit 5b71b86179
6 changed files with 167 additions and 10 deletions

View File

@ -95,5 +95,7 @@
<file>qml/PlatformDependent/Menubar.qml</file>
<file>qml/PlatformDependent/DecentMenuItem.qml</file>
<file>qml/SetupPanes/MQTT.qml</file>
<file>qml/Widgets/CompassDelegate.qml</file>
<file>icons/compass.svg</file>
</qresource>
</RCC>

1
assets/icons/compass.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm2.19 12.19L6 18l3.81-8.19L18 6l-3.81 8.19z"/></svg>

After

Width:  |  Height:  |  Size: 333 B

View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2020-2021 Alex Spataru <https://github.com/alex-spataru>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
import QtQuick 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import SerialStudio 1.0
import "."
Window {
id: root
//
// Window properties
//
spacing: -1
gradient: true
implicitWidth: 260
visible: opacity > 0
opacity: enabled ? 1 : 0
backgroundColor: "#09090c"
implicitHeight: implicitWidth + 96
icon.source: "qrc:/icons/compass.svg"
//
// Custom properties
//
property int datasetIndex: 0
}

View File

@ -59,6 +59,10 @@ Control {
barGenerator.model = 0
barGenerator.model = Cpp_UI_WidgetProvider.barDatasetCount()
// Generate compass widgets
compassGenerator.model = 0
compassGenerator.model = Cpp_UI_WidgetProvider.compassDatasetCount()
// Generate map widgets
mapGenerator.model = 0
mapGenerator.model = Cpp_UI_WidgetProvider.mapGroupCount()
@ -261,9 +265,52 @@ Control {
}
}
Item {
Layout.minimumHeight: 10
Repeater {
id: compassGenerator
delegate: Item {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.minimumWidth: root.minimumWidgetSize
Layout.minimumHeight: root.minimumWidgetSize
Widgets.CompassDelegate {
datasetIndex: index
anchors.fill: parent
onHeaderDoubleClicked: windowCompass.show()
}
QtWindow.Window {
id: windowCompass
width: 640
height: 480
minimumWidth: root.minimumWidgetSize * 1.2
minimumHeight: root.minimumWidgetSize * 1.2
title: compass.title
Rectangle {
anchors.fill: parent
color: compass.backgroundColor
}
Widgets.CompassDelegate {
id: compass
showIcon: true
gradient: false
headerHeight: 48
datasetIndex: index
anchors.margins: 0
anchors.fill: parent
borderColor: backgroundColor
headerDoubleClickEnabled: false
}
}
}
}
}
Item {
Layout.minimumHeight: 10
}
}
}

View File

@ -74,6 +74,14 @@ QList<JSON::Dataset *> WidgetProvider::barDatasets() const
return m_barDatasets;
}
/**
* Returns a list with all the JSON datasets that implement a compass widget
*/
QList<JSON::Dataset *> WidgetProvider::compassDatasets() const
{
return m_compassDatasets;
}
/**
* Returns a list with all the JSON groups that implement a map widget
*/
@ -106,9 +114,10 @@ int WidgetProvider::totalWidgetCount() const
{
// clang-format off
return mapGroupCount() +
gyroGroupCount() +
barDatasetCount() +
accelerometerGroupCount();
gyroGroupCount() +
barDatasetCount() +
compassDatasetCount() +
accelerometerGroupCount();
// clang-format on
}
@ -136,6 +145,14 @@ int WidgetProvider::gyroGroupCount() const
return gyroGroup().count();
}
/**
* Returns the number of JSON datasets that implement a compass widget
*/
int WidgetProvider::compassDatasetCount() const
{
return compassDatasets().count();
}
/**
* Returns the number of JSON groups that implement an accelerometer widget
*/
@ -156,6 +173,18 @@ JSON::Dataset *WidgetProvider::barDatasetAt(const int index)
return Q_NULLPTR;
}
/**
* Returns a pointer to the JSON dataset that implements a compass widget
* with the given @a index.
*/
JSON::Dataset *WidgetProvider::compassDatasetAt(const int index)
{
if (compassDatasets().count() > index)
return compassDatasets().at(index);
return Q_NULLPTR;
}
/**
* Returns a pointer to the JSON group that implements a map widget
* with the given @a index
@ -192,6 +221,18 @@ JSON::Group *WidgetProvider::accelerometerGroupAt(const int index)
return Q_NULLPTR;
}
/**
* Returns the direction in degrees for the compass widget at the given @a index
*/
int WidgetProvider::compass(const int index)
{
auto compass = compassDatasetAt(index);
if (compass)
return compass->value().toInt();
return INT_MAX;
}
/**
* Returns the yaw angle for the gyro widget at the given @a index
*/
@ -397,9 +438,10 @@ double WidgetProvider::mapLongitude(const int index)
void WidgetProvider::resetData()
{
m_widgetCount = 0;
m_barDatasets.clear();
m_mapGroups.clear();
m_gyroGroups.clear();
m_barDatasets.clear();
m_compassDatasets.clear();
m_accelerometerGroups.clear();
emit dataChanged();
@ -412,9 +454,10 @@ void WidgetProvider::resetData()
void WidgetProvider::updateModels()
{
// Clear current groups
m_barDatasets.clear();
m_mapGroups.clear();
m_gyroGroups.clear();
m_barDatasets.clear();
m_compassDatasets.clear();
m_accelerometerGroups.clear();
// Check if frame is valid
@ -425,11 +468,19 @@ void WidgetProvider::updateModels()
m_mapGroups = getWidgetGroup("map");
m_gyroGroups = getWidgetGroup("gyro");
m_barDatasets = getWidgetDatasets("bar");
m_compassDatasets = getWidgetDatasets("compass");
m_accelerometerGroups = getWidgetGroup("accelerometer");
// Check if widget count has changed
auto count = mapGroupCount() + gyroGroupCount() + barDatasetCount()
+ accelerometerGroupCount();
// Calculate total widget count
// clang-format off
auto count = mapGroupCount() +
gyroGroupCount() +
barDatasetCount() +
compassDatasetCount() +
accelerometerGroupCount();
// clang-format on
// Tell UI to regenerate widget models if widget count has changed from last frame
if (count != m_widgetCount)
{
m_widgetCount = count;

View File

@ -49,6 +49,7 @@ public:
QList<JSON::Group *> mapGroup() const;
QList<JSON::Group *> gyroGroup() const;
QList<JSON::Dataset *> barDatasets() const;
QList<JSON::Dataset *> compassDatasets() const;
QList<JSON::Group *> accelerometerGroup() const;
int totalWidgetCount() const;
@ -56,13 +57,17 @@ public:
Q_INVOKABLE int mapGroupCount() const;
Q_INVOKABLE int gyroGroupCount() const;
Q_INVOKABLE int barDatasetCount() const;
Q_INVOKABLE int compassDatasetCount() const;
Q_INVOKABLE int accelerometerGroupCount() const;
Q_INVOKABLE JSON::Group *mapGroupAt(const int index);
Q_INVOKABLE JSON::Group *gyroGroupAt(const int index);
Q_INVOKABLE JSON::Dataset *barDatasetAt(const int index);
Q_INVOKABLE JSON::Dataset *compassDatasetAt(const int index);
Q_INVOKABLE JSON::Group *accelerometerGroupAt(const int index);
Q_INVOKABLE int compass(const int index);
Q_INVOKABLE double gyroYaw(const int index);
Q_INVOKABLE double gyroRoll(const int index);
Q_INVOKABLE double gyroPitch(const int index);
@ -92,6 +97,7 @@ private:
QList<JSON::Group *> m_mapGroups;
QList<JSON::Group *> m_gyroGroups;
QList<JSON::Dataset *> m_barDatasets;
QList<JSON::Dataset *> m_compassDatasets;
QList<JSON::Group *> m_accelerometerGroups;
};
}