Files
CuboBmsTool/qml/MainWindow.qml

428 lines
13 KiB
QML

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtGraphicalEffects 1.0
import Controls 1.0 as Controls
import Screens 1.0 as Screens
import Cubo 1.0
import Utils 1.0
ApplicationWindow {
id: window
title: qsTr("Cubo Verde BMS Tool")
width: 1366
height: 768
visible: true
RowLayout {
anchors.fill: parent
spacing: 0
Rectangle {
id: pane
color: Palette.alternativeBackgroundColor
implicitWidth: 300
property bool minimized: false
ColumnLayout {
anchors.fill: parent
spacing: 0
Item {
Layout.preferredHeight: 40
}
Image {
source: "qrc:/Icons/cubo-logo.svg"
sourceSize.width: pane.minimized ? 70 : 115
sourceSize.height: pane.minimized ? 70 : 115
Layout.alignment: Qt.AlignCenter
}
Item {
Layout.preferredHeight: pane.minimized ? 85 : 40
}
ItemDelegate {
leftPadding: pane.minimized ? 0 : 40
contentItem: RowLayout {
height: 50
spacing: 25
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: "qrc:/Icons/hide-menu.svg"
mirror: pane.minimized
Layout.alignment: Qt.AlignCenter
}
Label {
text: qsTr("Hide menu")
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: "transparent"
}
onClicked: if (pane.implicitWidth === 300) {
animation.from = 300
animation.to = 100
animation.running = true
pane.minimized = true
} else {
animation.from = 100
animation.to = 300
animation.running = true
pane.minimized = false
}
Layout.preferredHeight: 52
Layout.fillWidth: true
}
Item {
Layout.preferredHeight: 70
}
ListView {
id: menuView
model: [
{"text": qsTr("AKB monitor"), "icon": "qrc:/Icons/akb-monitor.svg"},
{"text": qsTr("Cell monitor"), "icon": "qrc:/Icons/cell-monitor.svg"},
{"text": qsTr("Configuration"), "icon": "qrc:/Icons/bms-configuration.svg"},
{"text": qsTr("Visualization"), "icon": "qrc:/Icons/visualization.svg"},
{"text": qsTr("History"), "icon": "qrc:/Icons/history.svg"},
{"text": qsTr("BMS service"), "icon": "qrc:/Icons/bms-service.svg"},
// {"text": qsTr("Exit"), "icon": "qrc:/Icons/exit.svg"},
]
delegate: ItemDelegate {
id: menuDelegate
width: ListView.view.width
height: 52
leftPadding: pane.minimized ? 0 : 40
highlighted: ListView.isCurrentItem
onClicked: menuView.currentIndex = index
contentItem: RowLayout {
spacing: pane.minimized ? 0 : 25
height: 50
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: modelData.icon
Layout.alignment: Qt.AlignCenter
}
Label {
text: modelData.text
font.weight: Font.Bold
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: menuDelegate.highlighted ? Palette.pressedButtonColor : Palette.buttonColor
}
}
Layout.fillHeight: true
Layout.fillWidth: true
}
ItemDelegate {
leftPadding: pane.minimized ? 0 : 40
onClicked: connectionDialog.open()
contentItem: RowLayout {
spacing: pane.minimized ? 0 : 25
height: 50
Item {
visible: pane.minimized
Layout.fillWidth: true
}
Image {
source: "qrc:/Icons/connection.svg"
sourceSize.width: 24
sourceSize.height: 24
Layout.alignment: Qt.AlignCenter
ColorOverlay {
anchors.fill: parent
source: parent
color: "#FFFFFF"
}
}
Label {
text: qsTr("Connection")
font.weight: Font.Bold
color: Palette.alternativeTextColor
visible: !pane.minimized
}
Item {
Layout.fillWidth: true
}
}
background: Rectangle {
color: parent.down ? Palette.pressedButtonColor : Palette.buttonColor
}
Layout.fillWidth: true
}
Item {
Layout.preferredHeight: 40
}
}
PropertyAnimation {
id: animation
target: pane
property: "implicitWidth"
duration: 200
easing.type: Easing.InQuad
}
Layout.preferredWidth: implicitWidth
Layout.fillHeight: true
}
ColumnLayout {
RowLayout {
id: topBar
property var labels: [
qsTr("AKB monitor"),
qsTr("Cell monitor"),
qsTr("BMS settings"),
qsTr("Visualization"),
qsTr("Information output"),
qsTr("Terminal"),
qsTr("Exit"),
]
Label {
text: topBar.labels[stack.currentIndex]
font.pixelSize: 38
font.weight: Font.Bold
}
Item {
Layout.fillWidth: true
}
RowLayout {
ColumnLayout {
RowLayout {
Controls.ContentLabel {
id: connectionStatusLabel
text: qsTr("Disconnected")
Layout.alignment: Qt.AlignRight
}
Controls.AvailabilityIndicator {
id: connectionStatusIndicator
enabled: false
Layout.alignment: Qt.AlignCenter
}
Controls.ContentLabel {
id: firmwareLabel
text: "-"
Layout.alignment: Qt.AlignRight
}
Layout.alignment: Qt.AlignRight
}
RowLayout {
Controls.ContentLabel {
text: qsTr("Serial number") + ":"
Layout.alignment: Qt.AlignRight
}
Controls.SubtitleLabel {
id: serialLabel
text: "-"
Layout.alignment: Qt.AlignRight
}
Layout.alignment: Qt.AlignRight
}
}
}
Layout.leftMargin: 45
Layout.rightMargin: 45
}
StackLayout {
id: stack
currentIndex: menuView.currentIndex
Layout.fillWidth: true
Layout.fillHeight: true
Layout.leftMargin: 45
Layout.rightMargin: 45
Layout.bottomMargin: 30
Screens.AkbMonitorScreen {
}
Screens.CellMonitorScreen {
}
Screens.BmsSettingsScreen {
}
Screens.VisualizationScreen {
}
Screens.DebugInformationScreen {
}
Screens.BmsServiceScreen {
}
}
}
}
Connections {
target: BmsInterface
onPortConnectedChanged: {
connectionStatusLabel.text = BmsInterface.isPortConnected() ? qsTr("Connected") : qsTr("Disconnected")
connectionStatusIndicator.enabled = BmsInterface.isPortConnected()
if (BmsInterface.isPortConnected()) {
BmsInterface.commands().getBMSconf()
} else {
serialLabel.text = "-"
firmwareLabel.text = "-"
}
}
onMessageDialog: {
if (!messageDialog.visible) {
messageDialog.title = title
messageDialog.description = msg
messageDialog.good = isGood
messageDialog.open()
} else {
messageDialog.queue.push({"title": title, "description": msg, "good": isGood})
}
}
onStatusMessage: {
for (var i = 0; i < statusPopup.filteredStatuses.length; ++i) {
if (msg === statusPopup.filteredStatuses[i]) {
return
}
}
if (!statusPopup.visible) {
statusPopup.text = msg
statusPopup.good = isGood
statusPopup.open()
hideStatusTimer.start()
} else {
if (statusPopup.text !== msg) {
statusPopup.queue.push({"text": msg, "good": isGood})
}
}
}
}
Connections {
target: BmsInterface.bmsConfig()
onUpdated: {
serialLabel.text = Number(BmsInterface.bmsConfig().getParamDouble("notUsedCurrentThreshold")).toFixed()
}
}
Connections {
target: BmsInterface.commands()
onFwVersionReceived: {
firmwareLabel.text = major + "." + minor
}
}
Screens.ConnectionDialog {
id: connectionDialog
}
Screens.MessageDialog {
id: messageDialog
property var queue: []
onClosed: {
if (queue.length > 0) {
var message = queue.pop()
messageDialog.title = message.title
messageDialog.description = message.description
messageDialog.good = message.good
messageDialog.open()
}
}
}
Screens.StatusPopup {
id: statusPopup
property var filteredStatuses: []//[qsTr("BMS configuration updated")]
property var queue: []
onClosed: {
if (queue.length > 0) {
var message = queue.pop()
statusPopup.text = message.text
statusPopup.good = message.good
statusPopup.open()
hideStatusTimer.start()
}
}
}
Timer {
id: hideStatusTimer
interval: 3000
onTriggered: statusPopup.close()
}
background: Rectangle {
color: Palette.screenBackgroundColor
}
Component.onCompleted: {
// BmsInterface.bmsConfig().loadParamsXml("://res/config.xml")
// BmsInterface.infoConfig().loadParamsXml("://res/info.xml")
connectionDialog.open()
}
}