diff --git a/configparams.h b/configparams.h index 417d0b6..47f0eb4 100644 --- a/configparams.h +++ b/configparams.h @@ -100,7 +100,7 @@ public: bool setXML(QXmlStreamReader &stream, QString configName); Q_INVOKABLE bool saveXml(QString fileName, QString configName); Q_INVOKABLE bool loadXml(QString fileName, QString configName); - QString xmlStatus(); + Q_INVOKABLE QString xmlStatus(); void getParamsXML(QXmlStreamWriter &stream); bool setParamsXML(QXmlStreamReader &stream); diff --git a/qml/Controls/MenuItemDelegate.qml b/qml/Controls/MenuItemDelegate.qml index 71e41a3..26803ee 100644 --- a/qml/Controls/MenuItemDelegate.qml +++ b/qml/Controls/MenuItemDelegate.qml @@ -53,7 +53,8 @@ ItemDelegate { } background: Rectangle { - color: control.pressed ? Palette.pressedButtonColor : - control.hovered ? Palette.hoveredButtonColor : Palette.buttonColor + color: control.pressed || control.highlighted ? + Palette.pressedButtonColor : control.hovered ? + Palette.hoveredButtonColor : Palette.buttonColor } } diff --git a/qml/Controls/ScrollBar.qml b/qml/Controls/ScrollBar.qml index a8fd1f4..932cdca 100644 --- a/qml/Controls/ScrollBar.qml +++ b/qml/Controls/ScrollBar.qml @@ -5,22 +5,36 @@ import Utils 1.0 ScrollBar { id: control - size: 0.3 - position: 0.2 - active: true - orientation: Qt.Vertical + + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) + + padding: 2 + visible: control.policy !== ScrollBar.AlwaysOff + minimumSize: orientation == Qt.Horizontal ? height / width : width / height contentItem: Rectangle { - implicitWidth: 12 - implicitHeight: 100 - radius: width / 2 - color: Palette.alternativeBackgroundColor - // Hide the ScrollBar when it's not needed. - opacity: control.policy === ScrollBar.AlwaysOn || (control.active && control.size < 1.0) ? 0.75 : 0 + implicitWidth: control.interactive ? 6 : 2 + implicitHeight: control.interactive ? 6 : 2 - // Animate the changes in opacity (default duration is 250 ms). - Behavior on opacity { - NumberAnimation {} + radius: width / 2 + color: control.pressed ? Palette.alternativeBackgroundColor : Qt.lighter(Palette.alternativeBackgroundColor, 1.1) + opacity: 0.0 + + states: State { + name: "active" + when: control.policy === ScrollBar.AlwaysOn || (control.active && control.size < 1.0) + PropertyChanges { target: control.contentItem; opacity: 0.75 } + } + + transitions: Transition { + from: "active" + SequentialAnimation { + PauseAnimation { duration: 450 } + NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 } + } } } } diff --git a/qml/Controls/ScrollIndicator.qml b/qml/Controls/ScrollIndicator.qml new file mode 100644 index 0000000..beb4b4f --- /dev/null +++ b/qml/Controls/ScrollIndicator.qml @@ -0,0 +1,40 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +import Utils 1.0 + +ScrollIndicator { + id: control + + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) + + padding: 2 + + contentItem: Rectangle { + implicitWidth: 2 + implicitHeight: 2 + + color: Palette.alternativeBackgroundColor + visible: control.size < 1.0 + opacity: 0.0 + + states: State { + name: "active" + when: control.active + PropertyChanges { target: control.contentItem; opacity: 0.75 } + } + + transitions: [ + Transition { + from: "active" + SequentialAnimation { + PauseAnimation { duration: 450 } + NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 } + } + } + ] + } +} diff --git a/qml/Controls/qmldir b/qml/Controls/qmldir index 866e050..d97719b 100644 --- a/qml/Controls/qmldir +++ b/qml/Controls/qmldir @@ -22,3 +22,4 @@ DialogHeader 1.0 DialogHeader.qml DialogBackground 1.0 DialogBackground.qml BusyIndicator 1.0 BusyIndicator.qml MenuItemDelegate 1.0 MenuItemDelegate.qml +ScrollIndicator 1.0 ScrollIndicator.qml diff --git a/qml/MainWindow.qml b/qml/MainWindow.qml index a1e89ae..0bef1c2 100644 --- a/qml/MainWindow.qml +++ b/qml/MainWindow.qml @@ -71,6 +71,8 @@ ApplicationWindow { ListView { id: menuView + clip: true + boundsBehavior: Flickable.StopAtBounds property var menuModel: [ {"text": qsTr("AKB monitor"), "icon": "qrc:/Icons/akb-monitor.svg"}, @@ -87,6 +89,7 @@ ApplicationWindow { width: ListView.view.width text: menuView.menuModel[modelData].text icon.source: menuView.menuModel[modelData].icon + highlighted: ListView.isCurrentItem minimized: pane.minimized onClicked: menuView.currentIndex = index } @@ -291,7 +294,7 @@ ApplicationWindow { } Layout.preferredWidth: languagesLayout.implicitWidth - Layout.fillHeight: true + Layout.preferredHeight: languagesLayout.implicitHeight } } @@ -331,6 +334,7 @@ ApplicationWindow { } Screens.DebugInformationScreen { + id: debugScreen } Screens.BmsServiceScreen { @@ -351,6 +355,8 @@ ApplicationWindow { serialLabel.text = "-" firmwareLabel.text = "-" } + + debugScreen.printMessage(BmsInterface.getConnectedPortName(), true) } onMessageDialog: { @@ -494,5 +500,6 @@ ApplicationWindow { Component.onCompleted: { connectionDialog.open() + Qt.callLater(debugScreen.printMessage, qsTr("Tool started"), true) } } diff --git a/qml/Screens/AkbMonitorScreen.qml b/qml/Screens/AkbMonitorScreen.qml index 93c4c1f..099f275 100644 --- a/qml/Screens/AkbMonitorScreen.qml +++ b/qml/Screens/AkbMonitorScreen.qml @@ -332,9 +332,16 @@ Item { onVisibleChanged: getValues() + Timer { + id: refreshValuesTimer + interval: 5000 + onTriggered: getValues() + } + function getValues() { if (BmsInterface.isPortConnected() && visible) { BmsInterface.commands().getValues() + refreshValuesTimer.start() } } } diff --git a/qml/Screens/BmsServiceScreen.qml b/qml/Screens/BmsServiceScreen.qml index 71351b2..11da120 100644 --- a/qml/Screens/BmsServiceScreen.qml +++ b/qml/Screens/BmsServiceScreen.qml @@ -12,12 +12,20 @@ ColumnLayout { Keys.onEnterPressed: sendButton.clicked() Controls.Frame { - ScrollView { + Flickable { + id: outputFlickable + clip: true anchors.fill: parent - Controls.TextArea { + boundsBehavior: Flickable.StopAtBounds + + TextArea.flickable: Controls.TextArea { id: outputArea } + + ScrollBar.horizontal: Controls.ScrollBar {} + ScrollBar.vertical: Controls.ScrollBar {} } + Layout.fillWidth: true Layout.fillHeight: true } @@ -58,6 +66,9 @@ ColumnLayout { Connections { target: BmsInterface.commands() - onPrintReceived: outputArea.append(str) + onPrintReceived: { + outputArea.append(str) + outputArea.cursorPosition = outputArea.length + } } } diff --git a/qml/Screens/BmsSettingsScreen.qml b/qml/Screens/BmsSettingsScreen.qml index eeee39f..729124f 100644 --- a/qml/Screens/BmsSettingsScreen.qml +++ b/qml/Screens/BmsSettingsScreen.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQuick.Dialogs 1.2 +import Qt.labs.settings 1.1 import Controls 1.0 as Controls import Cubo 1.0 @@ -20,6 +21,7 @@ RowLayout { id: settingsFlickable clip: true contentHeight: configLayout.height + boundsBehavior: Flickable.StopAtBounds ColumnLayout { id: configLayout @@ -587,9 +589,17 @@ RowLayout { folder: shortcuts.documents nameFilters: [ qsTr("Configuration files (*.xml)"), qsTr("All files (*)") ] onAccepted: { - BmsInterface.bmsConfig().loadXml(loadFileDialog.fileUrl.toString().replace(/^(file:\/{3})/, ""), "bmsConfiguration") + let result = BmsInterface.bmsConfig().loadXml(loadFileDialog.fileUrl.toString().replace(/^(file:\/{3})/, ""), "bmsConfiguration") + if (!result) { + BmsInterface.emitStatusMessage(BmsInterface.bmsConfig().xmlStatus(), false) + } } } + + Settings { + category: "loadConfiguration" + property alias folder: loadFileDialog.folder + } } Controls.OutlineButton { @@ -604,15 +614,23 @@ RowLayout { folder: shortcuts.documents nameFilters: [ qsTr("Configuration files (*.xml)"), qsTr("All files (*)") ] onAccepted: { - BmsInterface.bmsConfig().saveXml(saveFileDialog.fileUrl.toString().replace(/^(file:\/{3})/, ""), "bmsConfiguration") + let result = BmsInterface.bmsConfig().saveXml(saveFileDialog.fileUrl.toString().replace(/^(file:\/{3})/, ""), "bmsConfiguration") + if (!result) { + BmsInterface.emitStatusMessage(BmsInterface.bmsConfig().xmlStatus(), false) + } else { + BmsInterface.emitStatusMessage(qsTr("BMS configuration saved to file"), true) + } } } + + Settings { + category: "saveConfiguration" + property alias folder: saveFileDialog.folder + } } } - ScrollBar.vertical: Controls.ScrollBar { -// policy: ScrollBar.AlwaysOn - } + ScrollBar.vertical: Controls.ScrollBar {} Layout.fillWidth: true Layout.fillHeight: true @@ -658,7 +676,10 @@ RowLayout { Controls.LinkLabel { text: qsTr("Current sensor value \"0\"") - onClicked: settingsFlickable.contentY = zeroSensorSettingsFrame.mapToItem(settingsFlickable.contentItem, 0, 0).y + onClicked: { + settingsFlickable.contentY = zeroSensorSettingsFrame.mapToItem(settingsFlickable.contentItem, 0, 0).y + settingsFlickable.returnToBounds() + } } Item { diff --git a/qml/Screens/CellMonitorScreen.qml b/qml/Screens/CellMonitorScreen.qml index 88195e8..48ce212 100644 --- a/qml/Screens/CellMonitorScreen.qml +++ b/qml/Screens/CellMonitorScreen.qml @@ -1,4 +1,5 @@ import QtQuick 2.12 +import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtGraphicalEffects 1.0 @@ -123,6 +124,7 @@ Item { header: cellListHeader delegate: cellListDelegate + ScrollBar.vertical: Controls.ScrollBar {} } Layout.fillWidth: true @@ -145,6 +147,7 @@ Item { header: cellListHeader delegate: cellListDelegate + ScrollBar.vertical: Controls.ScrollBar {} } Layout.fillWidth: true @@ -182,9 +185,16 @@ Item { onVisibleChanged: getValues() + Timer { + id: refreshValuesTimer + interval: 5000 + onTriggered: getValues() + } + function getValues() { if (BmsInterface.isPortConnected() && visible) { BmsInterface.commands().getCells() + refreshValuesTimer.start() } } } diff --git a/qml/Screens/DebugInformationScreen.qml b/qml/Screens/DebugInformationScreen.qml index 6c73a46..c59e51f 100644 --- a/qml/Screens/DebugInformationScreen.qml +++ b/qml/Screens/DebugInformationScreen.qml @@ -4,17 +4,27 @@ import QtQuick.Layouts 1.12 import Controls 1.0 as Controls import Cubo 1.0 +import Utils 1.0 ColumnLayout { spacing: 20 Controls.Frame { - ScrollView { + Flickable { + id: outputFlickable + clip: true anchors.fill: parent - Controls.TextArea { + boundsBehavior: Flickable.StopAtBounds + + TextArea.flickable: Controls.TextArea { id: outputArea + textFormat: Text.RichText } + + ScrollBar.horizontal: Controls.ScrollBar { } + ScrollBar.vertical: Controls.ScrollBar { } } + Layout.fillWidth: true Layout.fillHeight: true } @@ -27,9 +37,27 @@ ColumnLayout { Connections { target: BmsInterface + onStatusMessage: printMessage(msg, isGood) + } - onStatusMessage: { - outputArea.append(msg) + function printMessage(msg, isGood) { + var message = "" + + if (!isGood) { + message += "" } + + message += new Date().toLocaleString(Qt.locale("en-US"), "dd.MM.yyyy hh:mm:ss") + ": " + msg + + if (!isGood) { + message += "" + } + + message += "
" + + outputArea.insert(outputArea.length, message) + outputArea.cursorPosition = outputArea.length + + outputFlickable.contentX = 0 } } diff --git a/qml/Screens/VisualizationScreen.qml b/qml/Screens/VisualizationScreen.qml index 84b104f..ed10123 100644 --- a/qml/Screens/VisualizationScreen.qml +++ b/qml/Screens/VisualizationScreen.qml @@ -1,4 +1,5 @@ import QtQuick 2.12 +import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtCharts 2.3 @@ -169,6 +170,8 @@ ColumnLayout { model: seriesCount delegate: legendDelegate visible: !horizontalLegend + boundsBehavior: Flickable.StopAtBounds + ScrollBar.vertical: Controls.ScrollBar {} property Controls.ChartView chartItem: chart diff --git a/qml/qml_items.qrc b/qml/qml_items.qrc index ed200fa..f204e44 100644 --- a/qml/qml_items.qrc +++ b/qml/qml_items.qrc @@ -38,5 +38,6 @@ Utils/MathHelper.qml Controls/BusyIndicator.qml Controls/MenuItemDelegate.qml + Controls/ScrollIndicator.qml diff --git a/translations/cubo_en.ts b/translations/cubo_en.ts index fd3ca5b..1f2dd6a 100644 --- a/translations/cubo_en.ts +++ b/translations/cubo_en.ts @@ -209,17 +209,17 @@ BmsServiceScreen - + Clear - + Send - + Help @@ -227,226 +227,231 @@ BmsSettingsScreen - - + + Serial number - - + + Configuration - + Number of boards - + Number of cells - - + + SOC - + Number of cells connected in parallel - + Battery capacity - - + + Limits - + Maximum charge current, A - + Maximum load current, A - + Maximum temperature, °C - - + + Cell configuration - + Lower disable threshold, V - + Upper disable threshold, V - + Lower enable threshold (should be higher than disable), V - + Upper enable threshold (should be higher than disable), V - - + + Balancing configuration - + Balancing start voltage, V - + Cell voltage delta to start balancing, V - + Cell balancing interval, ms - - + + Output settings - + # 1 - + Use for storage management - + # 2 - + # 3 - + # 4 - + + BMS configuration saved to file + + + + Read default settings - + The settings are written to non-volatile memory. Wait, please. - + Normally closed - + Change in value during SOC - - + + Closes at t<, °C - - + + Opens at t>, °C - - + + Current sensor value "0" - + Calibrate "0" - + Load settings from file - - + + Select configuration file - - + + Configuration files (*.xml) - - + + All files (*) - + Save settings to file - + Read current settings from BMS - + Write to non-volatile memory of BMS - + Write current values to BMS @@ -454,22 +459,22 @@ Wait, please. CellMonitorScreen - + # - + Voltage - + Balancing - + V @@ -540,7 +545,7 @@ Wait, please. DebugInformationScreen - + Clear @@ -558,74 +563,79 @@ Wait, please. - - + + AKB monitor - - + + Cell monitor - + Configuration - - + + Visualization - + History - + BMS service - + Connection - + BMS settings - + Information output - + Terminal - - + + Disconnected - + Serial number - + Connected + + + Tool started + + MessageDialog @@ -677,140 +687,140 @@ Wait, please. VisualizationScreen - + Voltage - + Current - + Battery temperature - + BMS temperature - + Cell voltage - + Cell list - - - - - - + + + + + + Time, s - - - + + + Voltage, V - + Current, A - - + + Temperature, °C - + Pause data collection - + Resume data collection - + Clear data - + Reset zoom - - + + Cell # - - + + Voltage indicator - - + + Current indicator - - - - + + + + Maximum temperature - - - - + + + + Average temperature - - - - + + + + Minimum temperature - - + + Maximum voltage - - + + Average voltage - - + + Minimum voltage diff --git a/translations/cubo_it.ts b/translations/cubo_it.ts index e384e53..8a147be 100644 --- a/translations/cubo_it.ts +++ b/translations/cubo_it.ts @@ -209,17 +209,17 @@ BmsServiceScreen - + Clear - + Send - + Help @@ -227,226 +227,231 @@ BmsSettingsScreen - - + + Serial number - - + + Configuration - + Number of boards - + Number of cells - - + + SOC - + Number of cells connected in parallel - + Battery capacity - - + + Limits - + Maximum charge current, A - + Maximum load current, A - + Maximum temperature, °C - - + + Cell configuration - + Lower disable threshold, V - + Upper disable threshold, V - + Lower enable threshold (should be higher than disable), V - + Upper enable threshold (should be higher than disable), V - - + + Balancing configuration - + Balancing start voltage, V - + Cell voltage delta to start balancing, V - + Cell balancing interval, ms - - + + Output settings - + # 1 - + Use for storage management - + # 2 - + # 3 - + # 4 - + + BMS configuration saved to file + + + + Read default settings - + The settings are written to non-volatile memory. Wait, please. - + Normally closed - + Change in value during SOC - - + + Closes at t<, °C - - + + Opens at t>, °C - - + + Current sensor value "0" - + Calibrate "0" - + Load settings from file - - + + Select configuration file - - + + Configuration files (*.xml) - - + + All files (*) - + Save settings to file - + Read current settings from BMS - + Write to non-volatile memory of BMS - + Write current values to BMS @@ -454,22 +459,22 @@ Wait, please. CellMonitorScreen - + # - + Voltage - + Balancing - + V @@ -540,7 +545,7 @@ Wait, please. DebugInformationScreen - + Clear @@ -558,74 +563,79 @@ Wait, please. - - + + AKB monitor - - + + Cell monitor - + Configuration - - + + Visualization - + History - + BMS service - + Connection - + BMS settings - + Information output - + Terminal - - + + Disconnected - + Serial number - + Connected + + + Tool started + + MessageDialog @@ -677,140 +687,140 @@ Wait, please. VisualizationScreen - + Voltage - + Current - + Battery temperature - + BMS temperature - + Cell voltage - + Cell list - - - - - - + + + + + + Time, s - - - + + + Voltage, V - + Current, A - - + + Temperature, °C - + Pause data collection - + Resume data collection - + Clear data - + Reset zoom - - + + Cell # - - + + Voltage indicator - - + + Current indicator - - - - + + + + Maximum temperature - - - - + + + + Average temperature - - - - + + + + Minimum temperature - - + + Maximum voltage - - + + Average voltage - - + + Minimum voltage diff --git a/translations/cubo_ru.qm b/translations/cubo_ru.qm index 04eeb25..97fe8bb 100644 Binary files a/translations/cubo_ru.qm and b/translations/cubo_ru.qm differ diff --git a/translations/cubo_ru.ts b/translations/cubo_ru.ts index e830087..99d6f33 100644 --- a/translations/cubo_ru.ts +++ b/translations/cubo_ru.ts @@ -209,17 +209,17 @@ BmsServiceScreen - + Clear Очистить - + Send Отправить - + Help Помощь @@ -227,212 +227,217 @@ BmsSettingsScreen - - + + Serial number Серийный номер - - + + Configuration Конфигурация - + Number of boards Количество плат - + Number of cells Количество ячеек - - + + SOC SOC - + Number of cells connected in parallel Количество параллельно включенных ячеек - + Battery capacity Ёмкость батареи - - + + Limits Ограничения - + Maximum charge current, A Максимальный ток заряда, A - + Maximum load current, A Максимальный ток нагрузки, A - + Maximum temperature, °C Максимальная температура, C - - + + Cell configuration Конфигурация ячеек - + Lower disable threshold, V Нижний порог отключения, В - + Upper disable threshold, V Верхний порог отключения, В - + Lower enable threshold (should be higher than disable), V Нижний порог включения (должен быть выше отключения), В - + Upper enable threshold (should be higher than disable), V Верхний порог включения (должен быть выше отключения), В - - + + Balancing configuration Конфигурация балансировки - + Balancing start voltage, V Напряжение старта балансировки, В - + Cell voltage delta to start balancing, V Дельта напряжения ячеек для старта балансировки, В - + Cell balancing interval, ms Интервал балансировки ячейки, мс - - + + Output settings Настройка выходов - + # 1 № 1 - + Use for storage management Использовать для управления ЗУ - + # 2 № 2 - + # 3 № 3 - + # 4 № 4 - + + BMS configuration saved to file + БМС конфигурация сохранена в файл + + + Read default settings Загрузить настройки по-умолчанию - + The settings are written to non-volatile memory. Wait, please. Выполняется запись настроек в энергонезависимую память. Пожалуйста подождите. - + Normally closed Нормально замкнут - + Change in value during SOC Изменение значения при SOC - - + + Closes at t<, °C Замыкается при t<, °C - - + + Opens at t>, °C Размыкается при t>, °C - - + + Current sensor value "0" Значение датчика тока «0» - + Calibrate "0" Калибровать «0» - + Load settings from file Загрузить настройки из файла - - + + Select configuration file Выберите файл конфигурации - - + + Configuration files (*.xml) Файлы конфигурации (*.xml) - - + + All files (*) Все файлы (*) - + Save settings to file Сохранить настройки в файл @@ -441,17 +446,17 @@ Wait, please. Загрузить настройки из файла - + Read current settings from BMS Загрузить текущие настройки из BMS - + Write to non-volatile memory of BMS Записать в энергонезависимую память BMS - + Write current values to BMS Записать текущие значения в BMS @@ -459,22 +464,22 @@ Wait, please. CellMonitorScreen - + # - + Voltage Напряжение - + Balancing Балансировка - + V V @@ -545,7 +550,7 @@ Wait, please. DebugInformationScreen - + Clear Очистить @@ -563,75 +568,80 @@ Wait, please. Скрыть меню - - + + AKB monitor Монитор АКБ - - + + Cell monitor Монитор ячеек - + Configuration Конфигурация - - + + Visualization Визуализация - + History История - + BMS service Сервис BMS - + Connection Подключение - + BMS settings Настройка BMS - + Information output Вывод информации - + Terminal Терминал + + + Tool started + Утилита запущена + Exit Выход - - + + Disconnected Отключено - + Serial number Серийный номер - + Connected Подключено @@ -686,140 +696,140 @@ Wait, please. VisualizationScreen - + Voltage Напряжение - + Current Ток - + Battery temperature Температура батареи - + BMS temperature Температура BMS - + Cell voltage Вольтаж ячейки - + Cell list Список ячеек - - - - - - + + + + + + Time, s Время, c - - - + + + Voltage, V Напряжение, В - + Current, A Ток, А - - + + Temperature, °C Температура, °C - + Pause data collection Приостановить сбор данных - + Resume data collection Продолжить сбор данных - + Clear data Очистить данные - + Reset zoom Сбросить масштаб - - + + Cell # Ячейка № - - + + Voltage indicator Показатель вольтажа - - + + Current indicator Показатель тока - - - - + + + + Maximum temperature Максимальная температура - - - - + + + + Average temperature Средняя температура - - - - + + + + Minimum temperature Минимальная температура - - + + Maximum voltage Максимальное напряжение - - + + Average voltage Среднее напряжение - - + + Minimum voltage Минимальное напряжение diff --git a/translator.cpp b/translator.cpp index 54aec58..0e9620a 100644 --- a/translator.cpp +++ b/translator.cpp @@ -5,6 +5,13 @@ #include #include #include +#include + + +namespace +{ + const QString settingsKey = "translator/currentLanguage"; +} Translator::Translator(QQmlEngine *engine, QObject *parent) : QObject(parent), @@ -34,17 +41,26 @@ Translator::Translator(QQmlEngine *engine, QObject *parent) : QCoreApplication::installTranslator(mCurrentTranslator); - if (QLocale::system().language() == QLocale::Russian) + QSettings settings; + + if (!settings.contains(::settingsKey)) { - setCurrentLanguage(Language::Russian); - } - else if (QLocale::system().language() == QLocale::Italian) - { - setCurrentLanguage(Language::Italian); + if (QLocale::system().language() == QLocale::Russian) + { + setCurrentLanguage(Language::Russian); + } + else if (QLocale::system().language() == QLocale::Italian) + { + setCurrentLanguage(Language::Italian); + } + else + { + setCurrentLanguage(Language::English); + } } else { - setCurrentLanguage(Language::English); + setCurrentLanguage(static_cast(settings.value(::settingsKey).toInt())); } } @@ -74,6 +90,8 @@ void Translator::setCurrentLanguage(Language language) emit currentLanguageChanged(); emit currentLanguageNameChanged(); emit currentLanguageIconChanged(); + + QSettings().setValue(::settingsKey, static_cast(mCurrentLanguage)); } QString Translator::currentLanguageName() const