import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import Core 1.0 import Controls 1.0 as CustomControls import Palette 1.0 Rectangle { radius: 14 color: Palette.controlBackgroundColor property BatteryController battery: null property int batteryIndex: 0 onBatteryIndexChanged: { if (battery) { battery.batteryIndex = batteryIndex } } ColumnLayout { anchors.fill: parent anchors.margins: 20 spacing: 10 RowLayout { CustomControls.Label { text: "АКБ %1".arg(batteryIndex + 1) font.pixelSize: 20 font.weight: Font.DemiBold Layout.fillWidth: true } CustomControls.Button { id: modeButton text: chargeTypeToString(battery ? battery.chargeType : 0) backgroundColor: workingModeToColor(battery ? battery.workingMode : 0) Layout.preferredWidth: 180 onClicked: { battery ? battery.actionButtonClicked() : null enabled = false enableTimer.start() } Timer { id: enableTimer interval: 2000 onTriggered: { modeButton.enabled = true } } } } GridLayout { columns: 2 rowSpacing: 8 columnSpacing: 16 Layout.fillWidth: true CustomControls.Label { text: "БК" horizontalAlignment: Text.AlignHCenter Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.Label { text: "УКБП" horizontalAlignment: Text.AlignHCenter Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertIntToString(battery.controlCurrent) : "—" indicatorText: "А" Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertIntToString(battery.measuredCurrent) : "—" indicatorText: "А" Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertDoubleToString(battery.controlVoltage) : "—" indicatorText: "В" implicitWidth: 1 Layout.fillWidth: true } CustomControls.TextField { text: battery ? convertDoubleToString(battery.measuredVoltage) : "—" indicatorText: "В" Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertIntToString(battery.controlTemperature) : "—" indicatorText: "°C" Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertIntToString(battery.measuredTemperature) : "—" indicatorText: "°C" implicitWidth: 1 Layout.fillWidth: true } CustomControls.TextField { text: battery ? convertDoubleToString(battery.controlCapacity) : "—" indicatorText: "Ач" Layout.fillWidth: true Layout.preferredWidth: 1 } CustomControls.TextField { text: battery ? convertDoubleToString(battery.measuredCapacity) : "—" indicatorText: "Ач" Layout.fillWidth: true Layout.preferredWidth: 1 } } ListView { id: statusView clip: true spacing: 5 boundsBehavior: Flickable.StopAtBounds flickableDirection: Flickable.HorizontalAndVerticalFlick model: battery ? battery.statues : null delegate: CustomControls.ColoredLabel { text: modelData.description backgroundColor: statusSeverityToColor(modelData.severity) font.pixelSize: 12 width: parent.width } ScrollBar.vertical: ScrollBar {} Layout.fillWidth: true Layout.fillHeight: true } } function convertIntToString(value) { if (value === undefined || value === null) { return "—" } return parseInt(value).toString() } function convertDoubleToString(value) { if (value === undefined || value === null) { return "—" } return parseFloat(value).toFixed(1) } function chargeTypeToString(type) { switch (type) { case 1: return "Контрольный разряд" case 2: return "Повторный заряд" case 3: return "Завершение заряда" case 0: default: return "Первичный подзаряд" } } function workingModeToColor(mode) { switch (mode) { case 1: return Palette.greenButtonColor case 2: return Palette.redButtonColor case 3: return Palette.yellowButtonColor case 0: default: return Palette.blueButtonColor } } function statusSeverityToColor(severity) { switch (severity) { case BatteryController.Good: return Palette.goodColor case BatteryController.Warning: return Palette.warningColor case BatteryController.Error: return Palette.errorColor case BatteryController.Info: default: return Palette.infoColor } } }