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