mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 23:05:36 +08:00
[skip ci] WIP new UI
This commit is contained in:
12
src/ui/CMakeLists.txt
Normal file
12
src/ui/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
add_executable(swift
|
||||
main.cpp
|
||||
QmlContextNetwork.cpp
|
||||
QmlContextNetwork.h
|
||||
QmlContextSimulator.h
|
||||
PageController.cpp
|
||||
resources.qrc
|
||||
SimSelection.h
|
||||
)
|
||||
|
||||
target_link_libraries(swift PUBLIC core misc config Qt::Core Qt::Qml Qt::Gui)
|
||||
|
||||
6
src/ui/PageController.cpp
Normal file
6
src/ui/PageController.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
//
|
||||
// Created by lars on 12/23/24.
|
||||
//
|
||||
|
||||
#include "PageController.h"
|
||||
|
||||
52
src/ui/PageController.h
Normal file
52
src/ui/PageController.h
Normal file
@@ -0,0 +1,52 @@
|
||||
//
|
||||
// Created by lars on 12/23/24.
|
||||
//
|
||||
|
||||
#ifndef PAGECONTROLLER_H
|
||||
#define PAGECONTROLLER_H
|
||||
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "core/context/contextsimulator.h"
|
||||
|
||||
class PageController : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString component READ getComponent NOTIFY componentChanged)
|
||||
public:
|
||||
|
||||
PageController()
|
||||
{
|
||||
swift::misc::CSetting<swift::core::application::TEnabledSimulator> enabledSimulator { this };
|
||||
};
|
||||
virtual ~PageController() {};
|
||||
QString getComponent() const
|
||||
{
|
||||
return m_component;
|
||||
}
|
||||
|
||||
Q_INVOKABLE void navigateToHome()
|
||||
{
|
||||
m_component = "../pages/MainPage.qml";
|
||||
emit componentChanged();
|
||||
}
|
||||
Q_INVOKABLE void navigateToConnection()
|
||||
{
|
||||
m_component = "../pages/ConnectionPage.qml";
|
||||
emit componentChanged();
|
||||
}
|
||||
|
||||
signals:
|
||||
void componentChanged();
|
||||
|
||||
private:
|
||||
|
||||
QString m_component = "../pages/MainPage.qml";
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
#endif // QMLCONTEXTSIMULATOR_H
|
||||
9
src/ui/QmlContextNetwork.cpp
Normal file
9
src/ui/QmlContextNetwork.cpp
Normal file
@@ -0,0 +1,9 @@
|
||||
//
|
||||
// Created by lars on 12/23/24.
|
||||
//
|
||||
|
||||
#include "QmlContextNetwork.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "core/context/contextnetwork.h"
|
||||
41
src/ui/QmlContextNetwork.h
Normal file
41
src/ui/QmlContextNetwork.h
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Created by lars on 12/23/24.
|
||||
//
|
||||
|
||||
#ifndef QMLCONTEXTNETWORK_H
|
||||
#define QMLCONTEXTNETWORK_H
|
||||
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "core/context/contextnetwork.h"
|
||||
|
||||
namespace swift::core::context
|
||||
{
|
||||
class IContextNetwork;
|
||||
}
|
||||
class QmlContextNetwork : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(bool connectionStatus READ getConnectionStatus NOTIFY connectionStatusChanged)
|
||||
public:
|
||||
QmlContextNetwork(swift::core::context::IContextNetwork *network) : network_(network)
|
||||
{
|
||||
connect(network_, &swift::core::context::IContextNetwork::connectionStatusChanged, this,
|
||||
&QmlContextNetwork::connectionStatusChanged);
|
||||
}
|
||||
|
||||
bool getConnectionStatus() { return network_->isConnected(); }
|
||||
|
||||
signals:
|
||||
void connectionStatusChanged();
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
swift::core::context::IContextNetwork *network_;
|
||||
};
|
||||
|
||||
#endif // QMLCONTEXTNETWORK_H
|
||||
65
src/ui/QmlContextSimulator.h
Normal file
65
src/ui/QmlContextSimulator.h
Normal file
@@ -0,0 +1,65 @@
|
||||
//
|
||||
// Created by lars on 12/23/24.
|
||||
//
|
||||
|
||||
#ifndef QMLCONTEXTSIMULATOR_H
|
||||
#define QMLCONTEXTSIMULATOR_H
|
||||
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "core/context/contextsimulator.h"
|
||||
|
||||
class QmlContextSimulator : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QStringList availableSimulators READ getAvailableSimulators NOTIFY availableSimulatorsChanged)
|
||||
Q_PROPERTY(bool simulatorPluginSelected READ isSimulatorPluginSelected NOTIFY simulatorPluginSelected)
|
||||
// Q_PROPERTY(bool connectionStatus READ getConnectionStatus NOTIFY connectionStatusChanged)
|
||||
public:
|
||||
QmlContextSimulator(swift::core::context::IContextSimulator *simulator) : simulator_(simulator)
|
||||
{
|
||||
connect(simulator_, &swift::core::context::IContextSimulator::simulatorPluginSelected, this,
|
||||
&QmlContextSimulator::simulatorPluginSelected);
|
||||
}
|
||||
|
||||
QStringList getAvailableSimulators() const
|
||||
{
|
||||
auto availableSimulators = simulator_->getAvailableSimulatorPlugins();
|
||||
QStringList sims;
|
||||
std::transform(availableSimulators.begin(), availableSimulators.end(), std::back_inserter(sims),
|
||||
[](const auto &val) { return val.getName(); });
|
||||
return sims;
|
||||
}
|
||||
|
||||
bool isSimulatorPluginSelected() const { return simulator_->isSimulatorPluginSelected(); }
|
||||
|
||||
Q_INVOKABLE void setPluginIdentifier(const QString &identifier, bool store)
|
||||
{
|
||||
auto available = simulator_->getAvailableSimulatorPlugins();
|
||||
auto it =
|
||||
std::find_if(available.begin(), available.end(), [&](const auto &v) { return v.getName() == identifier; });
|
||||
|
||||
assert(it != available.end());
|
||||
simulator_->setPlugin(*it);
|
||||
|
||||
if (store) { m_enabledSimulator.setAndSave(it->getIdentifier()); }
|
||||
}
|
||||
|
||||
Q_INVOKABLE void clearSimulator() { m_enabledSimulator.setAndSave(""); }
|
||||
|
||||
// bool getConnectionStatus() { return simulator_->isConnected(); }
|
||||
|
||||
signals:
|
||||
void availableSimulatorsChanged();
|
||||
void connectionStatusChanged();
|
||||
void simulatorPluginSelected();
|
||||
|
||||
private:
|
||||
swift::core::context::IContextSimulator *simulator_;
|
||||
swift::misc::CSetting<swift::core::application::TEnabledSimulator> m_enabledSimulator { this };
|
||||
};
|
||||
|
||||
#endif // QMLCONTEXTSIMULATOR_H
|
||||
18
src/ui/SimSelection.h
Normal file
18
src/ui/SimSelection.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// Created by lars on 12/31/24.
|
||||
//
|
||||
|
||||
#ifndef SIMSELECTION_H
|
||||
#define SIMSELECTION_H
|
||||
|
||||
struct SimSelection : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString simName MEMBER m_simName)
|
||||
Q_PROPERTY(bool remember MEMBER m_remember)
|
||||
public:
|
||||
QString m_simName;
|
||||
bool m_remember = false;
|
||||
};
|
||||
|
||||
#endif //SIMSELECTION_H
|
||||
124
src/ui/components/AtcPanel.qml
Normal file
124
src/ui/components/AtcPanel.qml
Normal file
@@ -0,0 +1,124 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Rectangle {
|
||||
color: "black"
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
RowLayout {
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 2
|
||||
|
||||
labelText: "CTR"
|
||||
active: true
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "APP"
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "TWR"
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "GND"
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "DEL"
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "OTHER"
|
||||
}
|
||||
AvionicButton {
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
labelText: "ATIS"
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
implicitWidth: parent.width - 20
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
height: 2
|
||||
color: "gray"
|
||||
}
|
||||
Rectangle {
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
Layout.bottomMargin: 10
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
|
||||
|
||||
Rectangle {
|
||||
width: parent.width * 0.4
|
||||
height: parent.height
|
||||
id: atcList
|
||||
color: "black"
|
||||
|
||||
ScrollView {
|
||||
clip: true
|
||||
anchors.fill: parent
|
||||
|
||||
|
||||
ListView {
|
||||
id: atcListView
|
||||
anchors.fill: parent
|
||||
boundsMovement: Flickable.StopAtBounds
|
||||
model: TestModel {}
|
||||
|
||||
property int selectedIndex: -1
|
||||
delegate: Rectangle {
|
||||
width: atcListView.width
|
||||
height: label.implicitHeight
|
||||
color: index === atcListView.selectedIndex ? "green" : "black"
|
||||
Text {
|
||||
id: label
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
text: name + " - " + frequency
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: atcListView.selectedIndex = index
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: atisView
|
||||
border.color: "gray"
|
||||
anchors.left: atcList.right
|
||||
width: parent.width * 0.6
|
||||
height: parent.height
|
||||
color: "black"
|
||||
|
||||
Text {
|
||||
anchors.margins: 5
|
||||
anchors.fill: parent
|
||||
text: "Joe Doe\nCallsign BREMEN GROUND\nAirport Briefing vats.im/edww | NO PDC/DCL\nSubmit your feedback at feedback.vatger.de"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
25
src/ui/components/AvionicButton.qml
Normal file
25
src/ui/components/AvionicButton.qml
Normal file
@@ -0,0 +1,25 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
property string labelText: ""
|
||||
property bool active: false
|
||||
|
||||
id: control
|
||||
implicitWidth: contentLabel.implicitWidth * 1.1
|
||||
implicitHeight: contentLabel.implicitHeight * 1.1
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
contentItem: Label {
|
||||
id: contentLabel
|
||||
text: labelText
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
color: active ? "#00ff00" : "#ffffff"
|
||||
|
||||
}
|
||||
background: Rectangle {
|
||||
implicitWidth: contentLabel.implicitWidth
|
||||
implicitHeight: contentLabel.implicitHeight
|
||||
color: "#555555"
|
||||
}
|
||||
}
|
||||
79
src/ui/components/ComPanel.qml
Normal file
79
src/ui/components/ComPanel.qml
Normal file
@@ -0,0 +1,79 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height * 0.2
|
||||
color: "black"
|
||||
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
Text {
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
text: "COM1"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
font.pointSize: 20
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "122.800"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Text {
|
||||
text: "TX"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
Text {
|
||||
text: "RX"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
|
||||
Text {
|
||||
text: "COM2"
|
||||
color: "white"
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "121.500"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.rightMargin: 10
|
||||
Text {
|
||||
text: "TX"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
Text {
|
||||
text: "RX"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
97
src/ui/components/LogPanel.qml
Normal file
97
src/ui/components/LogPanel.qml
Normal file
@@ -0,0 +1,97 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Rectangle {
|
||||
color: "black"
|
||||
width: parent.width
|
||||
height: parent.height * 0.4
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
RowLayout {
|
||||
AvionicButton {
|
||||
labelText: "LOG"
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 2
|
||||
active: true
|
||||
}
|
||||
AvionicButton {
|
||||
labelText: "COM"
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
}
|
||||
AvionicButton {
|
||||
labelText: "DLH123"
|
||||
Layout.leftMargin: 2
|
||||
Layout.rightMargin: 2
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
implicitWidth: parent.width - 20
|
||||
implicitHeight: 2
|
||||
color: "gray"
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
Layout.bottomMargin: 5
|
||||
|
||||
width: parent.width * 0.4
|
||||
height: parent.height
|
||||
id: atcList
|
||||
color: "black"
|
||||
|
||||
ScrollView {
|
||||
clip: true
|
||||
anchors.fill: parent
|
||||
|
||||
|
||||
ListView {
|
||||
id: atcListView
|
||||
anchors.fill: parent
|
||||
boundsMovement: Flickable.StopAtBounds
|
||||
model: TestModelLogs {}
|
||||
verticalLayoutDirection: ListView.BottomToTop
|
||||
property int selectedIndex: -1
|
||||
delegate: Text {
|
||||
id: label
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
text: timestamp + ": " + log
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
height: 20
|
||||
Layout.fillWidth: true
|
||||
color: "#242424"
|
||||
border.color: chatInput.activeFocus ? "green" : "white"
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
Layout.topMargin: 0
|
||||
Layout.bottomMargin: 10
|
||||
|
||||
TextInput {
|
||||
id: chatInput
|
||||
anchors.leftMargin: 5
|
||||
anchors.rightMargin: 5
|
||||
anchors.topMargin: 1
|
||||
anchors.bottomMargin: 1
|
||||
anchors.fill: parent
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
60
src/ui/components/NavigationBar.qml
Normal file
60
src/ui/components/NavigationBar.qml
Normal file
@@ -0,0 +1,60 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Rectangle {
|
||||
id: bottombar
|
||||
color: "#2f2f2f"
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
StatusLight {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
labelText: "CONN"
|
||||
active: controller.component === "../pages/ConnectionPage.qml"
|
||||
onClick: controller.navigateToConnection()
|
||||
}
|
||||
StatusLight {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
|
||||
labelText: "MAIN"
|
||||
active: controller.component === "../pages/MainPage.qml"
|
||||
onClick: controller.navigateToHome()
|
||||
}
|
||||
StatusLight {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
|
||||
labelText: "CSTM"
|
||||
}
|
||||
StatusLight {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
|
||||
labelText: "SETT"
|
||||
}
|
||||
StatusLight {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
|
||||
labelText: "ADV"
|
||||
onClick: advancedMenu.popup()
|
||||
}
|
||||
|
||||
Menu {
|
||||
id: advancedMenu
|
||||
MenuItem { text: "FPL" }
|
||||
MenuItem { text: "RADAR" }
|
||||
MenuItem { text: "SIM" }
|
||||
}
|
||||
}
|
||||
}
|
||||
22
src/ui/components/SimulatorButton.qml
Normal file
22
src/ui/components/SimulatorButton.qml
Normal file
@@ -0,0 +1,22 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
property string labelText: ""
|
||||
|
||||
id: control
|
||||
implicitWidth: parent.width * 0.5
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
contentItem: Label {
|
||||
text: labelText
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
color: "white"
|
||||
|
||||
}
|
||||
background: Rectangle {
|
||||
implicitWidth: parent.width * 0.5
|
||||
implicitHeight: 20
|
||||
color: control.down ? "#111111" : "#000000"
|
||||
}
|
||||
}
|
||||
73
src/ui/components/StatusBar.qml
Normal file
73
src/ui/components/StatusBar.qml
Normal file
@@ -0,0 +1,73 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Rectangle {
|
||||
id: topbar
|
||||
color: "#2f2f2f"
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
StatusLight {
|
||||
Layout.margins: 10
|
||||
labelText: "S"
|
||||
disabledColor: "#323232"
|
||||
|
||||
}
|
||||
StatusLight {
|
||||
labelText: "SIM"
|
||||
disabledColor: "#323232"
|
||||
Layout.margins: 10
|
||||
}
|
||||
StatusLight {
|
||||
labelText: "NET"
|
||||
disabledColor: "#323232"
|
||||
active: network.connectionStatus
|
||||
Layout.margins: 10
|
||||
}
|
||||
StatusLight {
|
||||
labelText: "PTT"
|
||||
disabledColor: "#323232"
|
||||
Layout.margins: 10
|
||||
}
|
||||
StatusLight {
|
||||
labelText: "STS"
|
||||
disabledColor: "#323232"
|
||||
Layout.margins: 10
|
||||
}
|
||||
|
||||
|
||||
Text {
|
||||
id: callsign
|
||||
text: "-----"
|
||||
color: "white"
|
||||
font.bold: true
|
||||
Layout.margins: 10
|
||||
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
|
||||
Rectangle {
|
||||
Layout.alignment: Qt.AlignRight
|
||||
Layout.margins: 10
|
||||
Layout.preferredWidth: 25
|
||||
Layout.preferredHeight: 25
|
||||
color: "red"
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "X"
|
||||
font.pointSize: 16
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: Qt.quit()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
29
src/ui/components/StatusLight.qml
Normal file
29
src/ui/components/StatusLight.qml
Normal file
@@ -0,0 +1,29 @@
|
||||
import QtQuick 2.15
|
||||
|
||||
|
||||
Rectangle {
|
||||
width: text.text.length === 1 ? text.width * 2.5 : text.width * 1.2;
|
||||
height: 30
|
||||
property string labelText: ""
|
||||
property string disabledColor: "white"
|
||||
|
||||
property bool active: false
|
||||
|
||||
signal click()
|
||||
|
||||
color: "black"
|
||||
MouseArea {
|
||||
id: area
|
||||
anchors.fill: parent
|
||||
onClicked: parent.click()
|
||||
}
|
||||
Text {
|
||||
id: text
|
||||
anchors.margins: 20
|
||||
anchors.centerIn: parent
|
||||
text: labelText
|
||||
color: active ? "#26ff00" : disabledColor
|
||||
font.pointSize: 12
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
}
|
||||
36
src/ui/components/TestModel.qml
Normal file
36
src/ui/components/TestModel.qml
Normal file
@@ -0,0 +1,36 @@
|
||||
import QtQuick
|
||||
|
||||
ListModel {
|
||||
ListElement {
|
||||
name: "EDGG_1_CTR"
|
||||
frequency: "135.655"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_2_CTR"
|
||||
frequency: "122.800"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_3_CTR"
|
||||
frequency: "122.805"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_4_CTR"
|
||||
frequency: "122.810"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_5_CTR"
|
||||
frequency: "122.815"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_6_CTR"
|
||||
frequency: "122.825"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_7_CTR"
|
||||
frequency: "122.830"
|
||||
}
|
||||
ListElement {
|
||||
name: "EDGG_8_CTR"
|
||||
frequency: "122.835"
|
||||
}
|
||||
}
|
||||
12
src/ui/components/TestModelLogs.qml
Normal file
12
src/ui/components/TestModelLogs.qml
Normal file
@@ -0,0 +1,12 @@
|
||||
import QtQuick
|
||||
|
||||
ListModel {
|
||||
ListElement {
|
||||
log: "Plugin loaded"
|
||||
timestamp: "08:12:23"
|
||||
}
|
||||
ListElement {
|
||||
log: "swift started"
|
||||
timestamp: "08:12:22"
|
||||
}
|
||||
}
|
||||
48
src/ui/main.cpp
Normal file
48
src/ui/main.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlContext>
|
||||
#include <QSettings>
|
||||
|
||||
#include "PageController.h"
|
||||
#include "QmlContextNetwork.h"
|
||||
#include "QmlContextSimulator.h"
|
||||
#include "SimSelection.h"
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/context/context.h"
|
||||
#include "core/context/contextnetwork.h"
|
||||
#include "core/context/contextsimulator.h"
|
||||
#include "core/pluginmanagersimulator.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication::setOrganizationName("swift project");
|
||||
QCoreApplication::setApplicationName("pilotclient");
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
// Init swift core
|
||||
swift::core::CApplication swiftApp(swift::misc::CApplicationInfo::PilotClient);
|
||||
// swiftApp.addDBusAddressOption() // TODO Core mode
|
||||
swiftApp.addAudioOptions();
|
||||
swiftApp.addNetworkOptions();
|
||||
swiftApp.parseCommandLineArgsAndLoadSetup();
|
||||
|
||||
swift::core::CCoreFacadeConfig config(swift::core::CCoreFacadeConfig::Local);
|
||||
swiftApp.initContextsAndStartCoreFacade(config);
|
||||
|
||||
PageController controller;
|
||||
QmlContextNetwork net(swiftApp.getIContextNetwork());
|
||||
QmlContextSimulator sim(swiftApp.getIContextSimulator());
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
|
||||
// Setup context for QML
|
||||
engine.rootContext()->setContextProperty("network", &net);
|
||||
engine.rootContext()->setContextProperty("simulator", &sim);
|
||||
engine.rootContext()->setContextProperty("controller", &controller);
|
||||
|
||||
engine.load(QUrl(QStringLiteral("qrc:/main/main.qml")));
|
||||
|
||||
if (engine.rootObjects().isEmpty()) { return -1; }
|
||||
return app.exec();
|
||||
}
|
||||
31
src/ui/main/MainLayout.qml
Normal file
31
src/ui/main/MainLayout.qml
Normal file
@@ -0,0 +1,31 @@
|
||||
import QtQuick 2.15
|
||||
import "../components"
|
||||
import "../pages"
|
||||
import QtQuick.Layouts 2.15
|
||||
|
||||
ColumnLayout {
|
||||
visible: false
|
||||
spacing: 0
|
||||
anchors.fill: parent
|
||||
StatusBar {
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: 50
|
||||
id: topbar
|
||||
}
|
||||
Rectangle {
|
||||
id: main
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: parent.height - topbar.Layout.preferredHeight - bottombar.Layout.preferredHeight
|
||||
color: "#000000"
|
||||
Loader {
|
||||
id: dataArea
|
||||
anchors.fill: parent
|
||||
source: controller.component
|
||||
}
|
||||
}
|
||||
NavigationBar {
|
||||
id: bottombar
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 50
|
||||
}
|
||||
}
|
||||
36
src/ui/main/SimSelection.qml
Normal file
36
src/ui/main/SimSelection.qml
Normal file
@@ -0,0 +1,36 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuick.Layouts 2.15
|
||||
import "../components"
|
||||
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#323232"
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
Text {
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
id: simselecttext
|
||||
|
||||
text: "SELECT YOUR SIMULATOR"
|
||||
color: "white"
|
||||
font.family: "Mono" // TODO Use correct font
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: simulator.availableSimulators
|
||||
SimulatorButton {
|
||||
required property string modelData
|
||||
labelText: modelData
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
onClicked: {
|
||||
simulator.setPluginIdentifier(modelData, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
22
src/ui/main/main.qml
Normal file
22
src/ui/main/main.qml
Normal file
@@ -0,0 +1,22 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
ApplicationWindow {
|
||||
visible: true
|
||||
id: root
|
||||
width: 700
|
||||
height: 500
|
||||
title: "swift"
|
||||
|
||||
SimSelection {
|
||||
anchors.fill: parent
|
||||
visible: !simulator.simulatorPluginSelected
|
||||
}
|
||||
|
||||
MainLayout {
|
||||
anchors.fill: parent
|
||||
visible: simulator.simulatorPluginSelected
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
13
src/ui/pages/ConnectionPage.qml
Normal file
13
src/ui/pages/ConnectionPage.qml
Normal file
@@ -0,0 +1,13 @@
|
||||
import QtQuick 2.15
|
||||
|
||||
Rectangle {
|
||||
color: "black"
|
||||
anchors.fill: parent
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
text: "Connection"
|
||||
color: "white"
|
||||
}
|
||||
}
|
||||
23
src/ui/pages/MainPage.qml
Normal file
23
src/ui/pages/MainPage.qml
Normal file
@@ -0,0 +1,23 @@
|
||||
import QtQuick 2.15
|
||||
import "../components"
|
||||
|
||||
Rectangle {
|
||||
color: "black"
|
||||
anchors.fill: parent
|
||||
|
||||
ComPanel {
|
||||
id: comPanel
|
||||
}
|
||||
|
||||
AtcPanel {
|
||||
id: atcPanel
|
||||
anchors.top: comPanel.bottom
|
||||
width: parent.width
|
||||
height: parent.height * 0.4
|
||||
}
|
||||
|
||||
LogPanel {
|
||||
anchors.top: atcPanel.bottom
|
||||
id: logPanel
|
||||
}
|
||||
}
|
||||
21
src/ui/resources.qrc
Normal file
21
src/ui/resources.qrc
Normal file
@@ -0,0 +1,21 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>main/main.qml</file>
|
||||
<file>main/SimSelection.qml</file>
|
||||
<file>main/MainLayout.qml</file>
|
||||
<file>components/StatusLight.qml</file>
|
||||
<file>components/NavigationBar.qml</file>
|
||||
<file>components/ComPanel.qml</file>
|
||||
<file>components/AtcPanel.qml</file>
|
||||
<file>components/LogPanel.qml</file>
|
||||
<file>components/AvionicButton.qml</file>
|
||||
<file>components/TestModel.qml</file>
|
||||
<file>components/TestModelLogs.qml</file>
|
||||
|
||||
<file>components/SimulatorButton.qml</file>
|
||||
<file>components/StatusBar.qml</file>
|
||||
<file>pages/MainPage.qml</file>
|
||||
<file>pages/ConnectionPage.qml</file>
|
||||
|
||||
</qresource>
|
||||
</RCC>
|
||||
Reference in New Issue
Block a user