diff --git a/qml/Controls/ComboBox.qml b/qml/Controls/ComboBox.qml index cd831f7..b6bdea1 100644 --- a/qml/Controls/ComboBox.qml +++ b/qml/Controls/ComboBox.qml @@ -9,6 +9,7 @@ ComboBox { leftPadding: 16 rightPadding: 16 + font.pixelSize: 16 delegate: ItemDelegate { width: control.width diff --git a/qml/Controls/MenuItemDelegate.qml b/qml/Controls/MenuItemDelegate.qml index 26803ee..053a2ff 100644 --- a/qml/Controls/MenuItemDelegate.qml +++ b/qml/Controls/MenuItemDelegate.qml @@ -10,12 +10,14 @@ ItemDelegate { implicitHeight: 52 padding: 0 leftPadding: control.minimized ? 0 : 40 + font.pixelSize: 18 font.weight: Font.Bold icon.color: "transparent" icon.width: 24 icon.height: 24 property bool minimized: false + property bool mirroredIcon: false contentItem: RowLayout { spacing: control.minimized ? 0 : 25 @@ -29,6 +31,7 @@ ItemDelegate { source: control.icon.source sourceSize.width: control.icon.width sourceSize.height: control.icon.height + mirror: control.mirroredIcon Layout.alignment: Qt.AlignCenter ColorOverlay { diff --git a/qml/Controls/OutlineButton.qml b/qml/Controls/OutlineButton.qml index 111dc9d..cad7810 100644 --- a/qml/Controls/OutlineButton.qml +++ b/qml/Controls/OutlineButton.qml @@ -10,7 +10,7 @@ Button { text: control.text font.pixelSize: 16 font.weight: Font.Bold - opacity: enabled ? 1.0 : 0.3 + opacity: enabled ? 1.0 : 0.7 color: control.hovered ? Palette.alternativeTextColor : Palette.textColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter @@ -22,7 +22,7 @@ Button { background: Rectangle { implicitWidth: 200 implicitHeight: 52 - opacity: enabled ? 1 : 0.3 + opacity: enabled ? 1 : 0.7 color: control.pressed ? Palette.pressedButtonColor : control.hovered ? Palette.hoveredButtonColor : Palette.outlineButtonColor border.color: control.pressed ? Palette.pressedButtonColor : diff --git a/qml/Controls/OutlineImageButton.qml b/qml/Controls/OutlineImageButton.qml new file mode 100644 index 0000000..1c903d2 --- /dev/null +++ b/qml/Controls/OutlineImageButton.qml @@ -0,0 +1,38 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtGraphicalEffects 1.0 + +import Utils 1.0 + +Button { + id: control + + icon.width: 24 + icon.height: 24 + + contentItem: Image { + source: control.icon.source + sourceSize.width: control.icon.width + sourceSize.height: control.icon.height + fillMode: Image.PreserveAspectFit + + ColorOverlay { + anchors.fill: parent + source: parent + color: "#FFFFFF" + visible: control.hovered + } + } + + background: Rectangle { + implicitWidth: 44 + implicitHeight: 44 + color: control.enabled ? (control.pressed ? Palette.pressedButtonColor : + control.hovered ? Palette.hoveredButtonColor : Palette.backgroundColor) : + Palette.hoveredBackgroundColor + border.color: control.pressed ? Palette.pressedButtonColor : + control.hovered ? Palette.hoveredButtonColor : Palette.borderColor + border.width: 1 + radius: 5 + } +} diff --git a/qml/Controls/TextField.qml b/qml/Controls/TextField.qml index 8e4022a..e5af946 100644 --- a/qml/Controls/TextField.qml +++ b/qml/Controls/TextField.qml @@ -5,6 +5,7 @@ import Utils 1.0 TextField { implicitHeight: 58 + font.pixelSize: 16 color: Palette.textColor selectByMouse: true selectionColor: Palette.selectedTextBackgroundColor diff --git a/qml/Controls/qmldir b/qml/Controls/qmldir index d97719b..426b3c6 100644 --- a/qml/Controls/qmldir +++ b/qml/Controls/qmldir @@ -23,3 +23,4 @@ DialogBackground 1.0 DialogBackground.qml BusyIndicator 1.0 BusyIndicator.qml MenuItemDelegate 1.0 MenuItemDelegate.qml ScrollIndicator 1.0 ScrollIndicator.qml +OutlineImageButton 1.0 OutlineImageButton.qml diff --git a/qml/Icons/refresh.svg b/qml/Icons/refresh.svg new file mode 100644 index 0000000..858a8f0 --- /dev/null +++ b/qml/Icons/refresh.svg @@ -0,0 +1,3 @@ + + + diff --git a/qml/MainWindow.qml b/qml/MainWindow.qml index 0bef1c2..0bb3a30 100644 --- a/qml/MainWindow.qml +++ b/qml/MainWindow.qml @@ -49,6 +49,7 @@ ApplicationWindow { font.weight: Font.Normal icon.source: "qrc:/Icons/hide-menu.svg" minimized: pane.minimized + mirroredIcon: pane.minimized onClicked: if (pane.implicitWidth === 300) { animation.from = 300 diff --git a/qml/Screens/ConnectionDialog.qml b/qml/Screens/ConnectionDialog.qml index 449afc9..cdff902 100644 --- a/qml/Screens/ConnectionDialog.qml +++ b/qml/Screens/ConnectionDialog.qml @@ -32,15 +32,31 @@ Dialog { Layout.fillHeight: true } - Label { + Controls.SubtitleLabel { text: qsTr("Select serial port") + maximumLineCount: 2 + wrapMode: Text.Wrap Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom } - Controls.ComboBox { - id: serialBox - model: BmsInterface.serialPortNames() + RowLayout { + spacing: 15 + + Controls.ComboBox { + id: serialBox + model: BmsInterface.serialPortNames() + Layout.fillWidth: true + } + + Controls.OutlineImageButton { + id: refreshButton + icon.source: "qrc:/Icons/refresh.svg" + icon.width: 30 + icon.height: 30 + onClicked: serialBox.model = BmsInterface.serialPortNames() + } + Layout.fillWidth: true Layout.alignment: Qt.AlignCenter } @@ -81,6 +97,7 @@ Dialog { onPortConnectedChanged: { connectButton.text = Qt.binding(function() { return BmsInterface.isPortConnected() ? qsTr("Disconnect") : qsTr("Connect") }) serialBox.enabled = !BmsInterface.isPortConnected() + refreshButton.enabled = !BmsInterface.isPortConnected() } } } diff --git a/qml/Screens/VisualizationScreen.qml b/qml/Screens/VisualizationScreen.qml index ed10123..2524440 100644 --- a/qml/Screens/VisualizationScreen.qml +++ b/qml/Screens/VisualizationScreen.qml @@ -19,6 +19,14 @@ ColumnLayout { property var cellVoltageData: [] property var cellListData: [] + // https://htmlcolorcodes.com/color-chart/ + property var chartColors: [ + "#c62828", "#6a1b9a", "#283593", "#0277bd", "#00695c", "#558b2f", "#f9a825", "#ef6c00", + "#4e342e", "#37474f", "#ad1457", "#4527a0", "#1565c0", "#00838f", "#2e7d32", "#9e9d24", + "#ff8f00", "#d84315", "#424242", "#ef5350", "#ab47bc", "#5c6bc0", "#29b6f6", "#26a69a", + "#9ccc65", "#ffee58", "#ffa726", "#8d6e63", "#78909c", "#ec407a", "#7e57c2", "#42a5f5", + ] + Controls.Frame { padding: 20 leftPadding: 1 @@ -86,9 +94,9 @@ ColumnLayout { onCheckedChanged: { if (checked) { - chartItem.series(modelData).color = seriesColor + chartItem.series(modelData).opacity = 1 } else { - chartItem.series(modelData).color = "transparent" + chartItem.series(modelData).opacity = 0 } } Layout.fillWidth: !horizontal @@ -400,6 +408,9 @@ ColumnLayout { for (var i = cellListLoader.item.chart.count; i < cellCount; ++i) { cellListLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Cell #") + (i + 1).toString(), cellListLoader.item.chart.xAxis, cellListLoader.item.chart.yAxis) + if (i < chartColors.length) { + cellListLoader.item.chart.series(i).color = chartColors[i] + } cellListLoader.item.chart.axes[0].max = 10 cellListLoader.item.seriesCount = cellListLoader.item.chart.count } @@ -476,6 +487,7 @@ ColumnLayout { voltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Voltage indicator"), voltageLoader.item.chart.xAxis, voltageLoader.item.chart.yAxis) voltageLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Voltage indicator") }) + voltageLoader.item.chart.series(0).color = "#fbc02d" voltageLoader.item.chart.axes[0].max = 10 voltageLoader.item.seriesCount = voltageLoader.item.chart.count @@ -483,6 +495,7 @@ ColumnLayout { currentLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Current indicator"), currentLoader.item.chart.xAxis, currentLoader.item.chart.yAxis) currentLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Current indicator") }) + currentLoader.item.chart.series(0).color = "#e64a19" currentLoader.item.chart.axes[0].max = 10 currentLoader.item.seriesCount = currentLoader.item.chart.count @@ -493,9 +506,14 @@ ColumnLayout { batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis) batteryTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"), batteryTemperatureLoader.item.chart.xAxis, batteryTemperatureLoader.item.chart.yAxis) + batteryTemperatureLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum temperature") }) batteryTemperatureLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average temperature") }) batteryTemperatureLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum temperature") }) + batteryTemperatureLoader.item.chart.series(0).color = "#e64a19" + batteryTemperatureLoader.item.chart.series(1).color = "#fbc02d" + batteryTemperatureLoader.item.chart.series(2).color = "#388e3c" + batteryTemperatureLoader.item.chart.axes[0].max = 10 batteryTemperatureLoader.item.seriesCount = batteryTemperatureLoader.item.chart.count @@ -506,9 +524,14 @@ ColumnLayout { bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis) bmsTemperatureLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum temperature"), bmsTemperatureLoader.item.chart.xAxis, bmsTemperatureLoader.item.chart.yAxis) + bmsTemperatureLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum temperature") }) bmsTemperatureLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average temperature") }) bmsTemperatureLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum temperature") }) + bmsTemperatureLoader.item.chart.series(0).color = "#e64a19" + bmsTemperatureLoader.item.chart.series(1).color = "#fbc02d" + bmsTemperatureLoader.item.chart.series(2).color = "#388e3c" + bmsTemperatureLoader.item.chart.axes[0].max = 10 bmsTemperatureLoader.item.seriesCount = bmsTemperatureLoader.item.chart.count @@ -519,9 +542,14 @@ ColumnLayout { cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis) cellVoltageLoader.item.chart.createSeries(ChartView.SeriesTypeLine, qsTr("Minimum voltage"), cellVoltageLoader.item.chart.xAxis, cellVoltageLoader.item.chart.yAxis) + cellVoltageLoader.item.chart.series(0).color = "#e64a19" + cellVoltageLoader.item.chart.series(1).color = "#fbc02d" + cellVoltageLoader.item.chart.series(2).color = "#388e3c" + cellVoltageLoader.item.chart.series(0).name = Qt.binding(function(){ return qsTr("Maximum voltage") }) cellVoltageLoader.item.chart.series(1).name = Qt.binding(function(){ return qsTr("Average voltage") }) cellVoltageLoader.item.chart.series(2).name = Qt.binding(function(){ return qsTr("Minimum voltage") }) + cellVoltageLoader.item.chart.axes[0].max = 10 cellVoltageLoader.item.seriesCount = cellVoltageLoader.item.chart.count } diff --git a/qml/qml_icons.qrc b/qml/qml_icons.qrc index 0c55858..e4e65f8 100644 --- a/qml/qml_icons.qrc +++ b/qml/qml_icons.qrc @@ -17,5 +17,6 @@ Icons/english-flag.svg Icons/italian-flag.svg Icons/russian-flag.svg + Icons/refresh.svg diff --git a/qml/qml_items.qrc b/qml/qml_items.qrc index f204e44..304e3b4 100644 --- a/qml/qml_items.qrc +++ b/qml/qml_items.qrc @@ -39,5 +39,6 @@ Controls/BusyIndicator.qml Controls/MenuItemDelegate.qml Controls/ScrollIndicator.qml + Controls/OutlineImageButton.qml diff --git a/translations/qt_en.qm b/translations/qt_en.qm new file mode 100644 index 0000000..9dad8df Binary files /dev/null and b/translations/qt_en.qm differ diff --git a/translations/qt_it.qm b/translations/qt_it.qm new file mode 100644 index 0000000..a2433c6 Binary files /dev/null and b/translations/qt_it.qm differ diff --git a/translations/qt_ru.qm b/translations/qt_ru.qm new file mode 100644 index 0000000..e3bfffc Binary files /dev/null and b/translations/qt_ru.qm differ diff --git a/translations/qtbase_en.qm b/translations/qtbase_en.qm new file mode 100644 index 0000000..be651ee --- /dev/null +++ b/translations/qtbase_en.qm @@ -0,0 +1 @@ +<¸dÊÍ!¿`¡½Ý \ No newline at end of file diff --git a/translations/qtbase_it.qm b/translations/qtbase_it.qm new file mode 100644 index 0000000..ebc73af Binary files /dev/null and b/translations/qtbase_it.qm differ diff --git a/translations/qtbase_ru.qm b/translations/qtbase_ru.qm new file mode 100644 index 0000000..e85c37e Binary files /dev/null and b/translations/qtbase_ru.qm differ diff --git a/translations/qtserialport_en.qm b/translations/qtserialport_en.qm new file mode 100644 index 0000000..be651ee --- /dev/null +++ b/translations/qtserialport_en.qm @@ -0,0 +1 @@ +<¸dÊÍ!¿`¡½Ý \ No newline at end of file diff --git a/translations/qtserialport_ru.qm b/translations/qtserialport_ru.qm new file mode 100644 index 0000000..b24c405 Binary files /dev/null and b/translations/qtserialport_ru.qm differ diff --git a/translations/translations.qrc b/translations/translations.qrc index 37f042f..6384028 100644 --- a/translations/translations.qrc +++ b/translations/translations.qrc @@ -3,5 +3,13 @@ cubo_en.qm cubo_it.qm cubo_ru.qm + qt_en.qm + qt_it.qm + qt_ru.qm + qtbase_en.qm + qtbase_it.qm + qtbase_ru.qm + qtserialport_en.qm + qtserialport_ru.qm diff --git a/translator.cpp b/translator.cpp index 0e9620a..f97cf84 100644 --- a/translator.cpp +++ b/translator.cpp @@ -16,7 +16,10 @@ namespace Translator::Translator(QQmlEngine *engine, QObject *parent) : QObject(parent), mQmlEngine(engine), - mCurrentTranslator(new QTranslator(this)) + mCurrentTranslator(new QTranslator(this)), + mCurrentQtTranslator(new QTranslator(this)), + mCurrentQtBaseTranslator(new QTranslator(this)), + mCurrentQtSerialTranslator(new QTranslator(this)) { mNamesMap = { @@ -39,7 +42,31 @@ Translator::Translator(QQmlEngine *engine, QObject *parent) : {Language::Italian, ":/cubo_it.qm"} }; + mQtTranslationsMap = + { + {Language::English, ":/qt_en.qm"}, + {Language::Russian, ":/qt_ru.qm"}, + {Language::Italian, ":/qt_it.qm"} + }; + + mQtBaseTranslationsMap = + { + {Language::English, ":/qtbase_en.qm"}, + {Language::Russian, ":/qtbase_ru.qm"}, + {Language::Italian, ":/qtbase_it.qm"} + }; + + mQtSerialTranslationsMap = + { + {Language::English, ":/qtserialport_en.qm"}, + {Language::Russian, ":/qtserialport_ru.qm"}, + {Language::Italian, ":/qtserialport_en.qm"} + }; + QCoreApplication::installTranslator(mCurrentTranslator); + QCoreApplication::installTranslator(mCurrentQtTranslator); + QCoreApplication::installTranslator(mCurrentQtBaseTranslator); + QCoreApplication::installTranslator(mCurrentQtSerialTranslator); QSettings settings; @@ -81,10 +108,12 @@ Translator::Language Translator::currentLanguage() const void Translator::setCurrentLanguage(Language language) { - if (mCurrentTranslator->load(mTranslationsMap.value(language))) - { - QTimer::singleShot(0, this, [this]{ mQmlEngine->retranslate();} ); - } + mCurrentTranslator->load(mTranslationsMap.value(language)); + mCurrentQtTranslator->load(mQtTranslationsMap.value(language)); + mCurrentQtBaseTranslator->load(mQtBaseTranslationsMap.value(language)); + mCurrentQtSerialTranslator->load(mQtSerialTranslationsMap.value(language)); + + QTimer::singleShot(0, this, [this]{ mQmlEngine->retranslate();} ); mCurrentLanguage = language; emit currentLanguageChanged(); diff --git a/translator.h b/translator.h index 0e23e3b..44c7d6a 100644 --- a/translator.h +++ b/translator.h @@ -43,11 +43,19 @@ signals: private: Language mCurrentLanguage = Language::English; + QQmlEngine* mQmlEngine = nullptr; QTranslator* mCurrentTranslator = nullptr; + QTranslator* mCurrentQtTranslator = nullptr; + QTranslator* mCurrentQtBaseTranslator = nullptr; + QTranslator* mCurrentQtSerialTranslator = nullptr; + QMap mNamesMap; QMap mIconsMap; QMap mTranslationsMap; + QMap mQtTranslationsMap; + QMap mQtBaseTranslationsMap; + QMap mQtSerialTranslationsMap; }; #endif // TRANSLATOR_H